+ mesurable = self.read(cr, uid, ids, ['state'], context, context)
+ if mesurable['state'] != 'encours':
+ return
+ self.write(
+ cr,
+ uid,
+ ids,
+ {'state': 'termine'},
+ context,
+ )
+ return self
+
+ def abandonner(self, cr, uid, ids, context=None):
+ if type(ids) == list:
+ if len(ids) != 1:
+ return # TODO: message d'avertissement
+ ids = ids[0]
+
+ mesurable = self.read(cr, uid, ids, ['state'], context, context)
+ if not ('encours', 'cree').__contains__(mesurable['state']):
+ return
+ self.write(
+ cr,
+ uid,
+ ids,
+ {'state': 'abandonne'},
+ context,
+ )
+ return self
+
+ def reprendre(self, cr, uid, ids, context=None):
+ if type(ids) == list:
+ if len(ids) != 1:
+ return # TODO: message d'avertissement
+ ids = ids[0]
+
+ mesurable = self.read(cr, uid, ids, ['state'], context, context)
+ if mesurable['state'] != 'suspendu':
+ return
+ self.write(
+ cr,
+ uid,
+ ids,
+ {'state': 'encours'},
+ context,
+ )
+ return self
+
+#------------ TRAVAIL CALCUL JOURS OUVRES ------------
+ @staticmethod
+ def _get_date_paques(annee):
+ """
+ Retourne la date du dimanque de pâques pour une année donnée
+ sous la forme d'un objet date.
+ """
+ a = annee % 19
+ b = annee // 100
+ c = annee % 100
+ d = (19 * a + b - b // 4 - ((b - (b + 8) // 25 + 1) // 3) + 15) % 30
+ e = (32 + 2 * (b % 4) + 2 * (c // 4) - d - (c % 4)) % 7
+ f = d + e - 7 * ((a + 11 * d + 22 * e) // 451) + 114
+ mois = f // 31
+ jours = f % 31 + 1
+ return date(annee, mois, jours)
+
+
+ @staticmethod
+ def _get_jours_feries(annee):
+ """
+ Retourne une liste contenant les jours fériés d'une année donnée.
+ """
+ date_paques = Mesurable._get_date_paques(annee)
+ return [
+ date_paques+timedelta(days=1), # Lundi de Pâques
+ date_paques+timedelta(days=39), # Jeudi de l'Ascension
+ date_paques+timedelta(days=50), # Lundi de Pentecôte
+ date(annee, 1, 1), # Jour de l'An
+ date(annee, 5, 1), # Fête du travail
+ date(annee, 5, 8), # Armistice 1945
+ date(annee, 7, 14), # Fête Nationale
+ date(annee, 8, 15), # Assomption
+ date(annee, 11, 1), # Toussaint
+ date(annee, 11, 11), # Armistice 1918
+ date(annee, 12, 25), # Noël
+ ]
+
+
+ @staticmethod
+ def _jour_ouvre(d):
+ """ Retourne vrai si la date est un jour ouvre, faux sinon."""
+ if (5,6).__contains__(d.weekday()) or Mesurable._get_jours_feries(d.year).__contains__(d):
+ return False
+ else:
+ return True
+
+
+ @staticmethod
+ def _nb_jours_ouvre_entre_2_dates(d1, d2):
+ """
+ Retourne le nombre de jours ouvres entre deux dates données.
+
+ >>> nb_jours_ouvre_entre_2_dates(date(2013, 5, 1), date(2013, 7, 31))
+ 62
+ >>> nb_jours_ouvre_entre_2_dates(date(2013, 7, 31), date(2013, 5, 1))
+ 62
+ """
+ if not d1 or not d2:
+ return 0
+ if d1>d2:
+ d1, d2 = d2, d1 #Switch les 2 dates pour que d1 soit la plus petite
+ tmp = d1
+ jour_ouvres = 0
+ while tmp <= d2:
+ if Mesurable._jour_ouvre(tmp): # Si tmp est un jour ouvre
+ jour_ouvres += 1
+ tmp += timedelta(days=1)
+ return jour_ouvres
+
+
+
+# ================================= PALIER ================================== #