From 77f5a3d77739eb141dee5525f33b8e9aca7f9748 Mon Sep 17 00:00:00 2001 From: Alicia FLOREZ Date: Wed, 29 May 2013 17:20:34 +0200 Subject: [PATCH] =?utf8?q?Ajout=20calcul=20de=20jours=20ouvr=C3=A9=20pour=20?= =?utf8?q?un=20mesurable?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- axes.py | 150 +++++++++++++++++++++++++++++------------------------- views/projet.xml | 1 + 2 files changed, 83 insertions(+), 68 deletions(-) diff --git a/axes.py b/axes.py index f448c07..3236651 100644 --- a/axes.py +++ b/axes.py @@ -3,7 +3,7 @@ ''' from openerp.osv import osv, fields -from datetime import * +from datetime import date, timedelta, datetime class Mesurable(osv.Model): @@ -13,6 +13,14 @@ class Mesurable(osv.Model): ("termine", "Terminé"), ("abandonne", "Abandonné"), ("suspendu", "Suspendu"), ("generique", "Générique")] + def _nb_jours_init(self, cr, uid, ids, field, arg, context=None): + result = {} + for m in self.browse(cr, uid, ids, context=context): + result[m.id] = Mesurable._nb_jours_ouvre_entre_2_dates( + datetime.strptime(m.date_init_deb, "%Y-%m-%d").date(), + datetime.strptime(m.date_init_fin, "%Y-%m-%d").date()) + return result + _columns = { "name": fields.char(string="Title", size=64, required=True), "description": fields.text(string="Description"), @@ -26,6 +34,9 @@ class Mesurable(osv.Model): "date_plan_fin": fields.date(string="Date plannifiée de fin"), "date_reel_deb": fields.date(string="Data réelle début"), "date_reel_fin": fields.date(string="Data réelle fin"), + "nb_jours_projets": fields.function(_nb_jours_init, + type="integer", + string="Nombre de jour"), } _sql_constraints = [ @@ -47,73 +58,76 @@ class Mesurable(osv.Model): ] -#=============== TODO TRAVAIL CALCUL JOURS OUVRES ============================== -# def _annee_bissextile(self, annee): # TODO vérifier le besoin de self -# """ Retourne vrai si l'année est bissextile, faux sinon. """ -# return (annee % 4 == 0 and annee % 100 != 0 or annee % 400 == 0) -# -# -# def _get_date_paques(self, annee): # TODO vérifier le besoin de self -# """ -# 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) -# -# -# def get_jours_feries(self, annee): -# """ -# Retourne une liste contenant les jours fériés d'une année donnée. -# """ -# date_paques = _get_date_paques(self, 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 -# ] -# -# def _jour_ouvre(self, d): -# """ Retourne vrai si la date est un jour ouvre, faux sinon.""" -# if (5,6).__contains__(d.weekday()) or _get_jours_feries(d.year).__contains__(d): -# return False -# else: -# return True -# -# def _nb_jours_ouvre_entre_2_dates(self, 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 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 _jour_ouvre(self, tmp): # Si tmp est un jour ouvre -# jour_ouvres += 1 -# tmp += timedelta(days=1) -# return jour_ouvres -#=============================================================================== +#=============== TODO TRAVAIL CALCUL JOURS OUVRES ============================= + + @staticmethod + def _get_date_paques(annee): # TODO vérifier le besoin de self + """ + 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 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 + +#============================================================================== class Chantier(osv.Model): diff --git a/views/projet.xml b/views/projet.xml index fe3641f..452aa9b 100644 --- a/views/projet.xml +++ b/views/projet.xml @@ -86,6 +86,7 @@ + -- 1.7.10.4