Project

General

Profile

Download (17.9 KB) Statistics
| Branch: | Tag: | Revision:

calebasse / calebasse / personnes / models.py @ 6188a681

1 1097fd0a Benjamin Dauvergne
# -*- coding: utf-8 -*-
2
3 1eab6c73 Frédéric Péters
from datetime import datetime, date, time as datetime_time
4 7a0a30d7 Benjamin Dauvergne
5 1097fd0a Benjamin Dauvergne
from django.db import models
6 f7d9fa12 Benjamin Dauvergne
from django.db.models import query
7 1097fd0a Benjamin Dauvergne
from django.contrib.auth.models import User
8 706c6be7 Benjamin Dauvergne
from django.template.defaultfilters import date as date_filter
9 f8f903c3 Benjamin Dauvergne
from django import forms
10 1097fd0a Benjamin Dauvergne
11 366eb65a Benjamin Dauvergne
import reversion
12 37093bfa Benjamin Dauvergne
from model_utils.managers import InheritanceManager
13 366eb65a Benjamin Dauvergne
14 ee47faa1 Jérôme Schneider
from calebasse.models import PhoneNumberField
15 aceeeca7 Mikaël Ates
from calebasse.ressources.models import Service, NamedAbstractModel
16 688c7fbe Mikaël Ates
from calebasse.models import (BaseModelMixin, WeekRankField,
17
    PhoneNumberField, ZipCodeField)
18 f8f903c3 Benjamin Dauvergne
from calebasse.utils import weeks_since_epoch, weekday_ranks
19 7a0a30d7 Benjamin Dauvergne
20
from interval import Interval
21 1097fd0a Benjamin Dauvergne
22 1a43d77a Benjamin Dauvergne
from model_utils import Choices
23 f7d9fa12 Benjamin Dauvergne
from model_utils.managers import PassThroughManager
24
25 aceeeca7 Mikaël Ates
class Role(NamedAbstractModel):
26
    users = models.ManyToManyField(User,
27
                verbose_name=u'Utilisateurs', blank=True)
28
29 9e738c5d Benjamin Dauvergne
class People(BaseModelMixin, models.Model):
30 8e6fe119 Jérôme Schneider
    GENDERS =  Choices(
31 b8b97c77 Mikaël Ates
            (1, 'Masculin'),
32
            (2, 'Féminin'),
33 f8f903c3 Benjamin Dauvergne
    )
34 8e6fe119 Jérôme Schneider
35 37093bfa Benjamin Dauvergne
    objects = InheritanceManager()
36 f10536ea Jérôme Schneider
    last_name = models.CharField(max_length=128, verbose_name=u'Nom',
37
            db_index=True)
38 1178f357 Mikaël Ates
    first_name = models.CharField(max_length=128, verbose_name=u'Prénom(s)',
39 cd8a83dc Jérôme Schneider
        blank=True, null=True)
40 9e738c5d Benjamin Dauvergne
    display_name = models.CharField(max_length=256,
41 08a6bedd Benjamin Dauvergne
            verbose_name=u'Nom complet', editable=False, db_index=True)
42 1a43d77a Benjamin Dauvergne
    gender = models.IntegerField(verbose_name=u"Genre", choices=GENDERS,
43 1a9b2fe9 Jérôme Schneider
            max_length=1, blank=True, null=True)
44 ee47faa1 Jérôme Schneider
    email = models.EmailField(blank=True, null=True)
45
    phone = PhoneNumberField(verbose_name=u"Téléphone", blank=True, null=True)
46 1097fd0a Benjamin Dauvergne
47 e39efb4a Jérôme Schneider
    def save(self, **kwargs):
48 1178f357 Mikaël Ates
        if self.first_name:
49
            self.display_name = self.first_name + ' ' + self.last_name.upper()
50
        else:
51
            self.display_name = self.last_name.upper()
52 e39efb4a Jérôme Schneider
        super(People, self).save(**kwargs)
53 1097fd0a Benjamin Dauvergne
54 9e738c5d Benjamin Dauvergne
    def __unicode__(self):
55
        return self.display_name
56
57 b60abafc Frédéric Péters
    def get_initials(self):
58
        initials = []
59
        if self.first_name:
60 43a788f8 Mikaël Ates
            initials = [name[0].upper() for name in ' '.join(self.first_name.split('-')).split()]
61
        initials += [name[0].upper() for name in ' '.join(self.last_name.split('-')).split()]
62 b60abafc Frédéric Péters
        return ''.join(initials)
63
64 957da834 Benjamin Dauvergne
    class Meta:
65
        ordering = ['last_name', 'first_name']
66
67 f7d9fa12 Benjamin Dauvergne
class WorkerQuerySet(query.QuerySet):
68 0f0cacbb Jérôme Schneider
    def for_service(self, service, type=None):
69
        if type:
70 c0f82cd1 Frédéric Péters
            return self.filter(enabled=True, services__in=[service], type=type)
71 0f0cacbb Jérôme Schneider
        else:
72 c0f82cd1 Frédéric Péters
            return self.filter(enabled=True, services__in=[service])
73 0f0cacbb Jérôme Schneider
74 6e58dbc4 Mikaël Ates
75 96f613c6 Benjamin Dauvergne
class Worker(People):
76 f7d9fa12 Benjamin Dauvergne
    objects = PassThroughManager.for_queryset_class(WorkerQuerySet)()
77 97bee351 Jérôme Schneider
78 7967cb73 Jérôme Schneider
    initials = models.CharField(max_length=5, verbose_name=u'Initiales', default='', blank=True)
79 9e738c5d Benjamin Dauvergne
    type = models.ForeignKey('ressources.WorkerType',
80
            verbose_name=u'Type de personnel')
81 38d1b4f8 Mikaël Ates
    services = models.ManyToManyField('ressources.Service', blank=True, null=True)
82 6e58dbc4 Mikaël Ates
    enabled = models.BooleanField(verbose_name=u'Actif',
83
                default=True)
84
    old_camsp_id = models.CharField(max_length=256,
85
            verbose_name=u'Ancien ID au CAMSP', blank=True, null=True)
86
    old_cmpp_id = models.CharField(max_length=256,
87
            verbose_name=u'Ancien ID au CMPP', blank=True, null=True)
88
    old_sessad_dys_id = models.CharField(max_length=256,
89
            verbose_name=u'Ancien ID au SESSAD TED', blank=True, null=True)
90
    old_sessad_ted_id = models.CharField(max_length=256,
91
            verbose_name=u'Ancien ID au SESSAD DYS', blank=True, null=True)
92
93 97bee351 Jérôme Schneider
    def save(self, **kwargs):
94
        if not self.initials:
95
            self.initials = self.get_initials()
96
        super(Worker, self).save(**kwargs)
97
98 6e58dbc4 Mikaël Ates
    def is_active(self):
99
        return self.enabled
100 9e738c5d Benjamin Dauvergne
101 957da834 Benjamin Dauvergne
    def is_away(self):
102 f8f903c3 Benjamin Dauvergne
        if self.timetable_set.filter(weekday=date.today().weekday()).exists():
103 957da834 Benjamin Dauvergne
            return False
104
        return True
105
106 b478e27e Benjamin Dauvergne
    @models.permalink
107
    def get_absolute_url(self):
108
        return ('worker_update', (), {
109
            'service': self.services.all()[0].name.lower(),
110
            'pk': self.pk })
111
112 96f613c6 Benjamin Dauvergne
    class Meta:
113
        verbose_name = u'Personnel'
114
        verbose_name_plural = u'Personnels'
115 1097fd0a Benjamin Dauvergne
116 688c7fbe Mikaël Ates
117 366eb65a Benjamin Dauvergne
reversion.register(Worker, follow=['people_ptr'])
118 b478e27e Benjamin Dauvergne
reversion.register(User)
119 04022fee Benjamin Dauvergne
120 688c7fbe Mikaël Ates
class ExternalWorker(People):
121
    description = models.TextField(blank=True, null=True, default=None)
122
    address = models.CharField(max_length=120,
123
            verbose_name=u"Adresse", blank=True, null=True, default=None)
124
    address_complement = models.CharField(max_length=120,
125
            blank=True,
126
            null=True,
127
            default=None,
128
            verbose_name=u"Complément d'adresse")
129
    zip_code = ZipCodeField(verbose_name=u"Code postal",
130
        blank=True, null=True, default=None)
131
    city = models.CharField(max_length=80, verbose_name=u"Ville",
132
        blank=True, null=True, default=None)
133
    phone_work = PhoneNumberField(verbose_name=u"Téléphone du travail",
134
        blank=True, null=True, default=None)
135
    fax = models.CharField(max_length=30,
136
            blank=True, null=True, default=None)
137
    type = models.ForeignKey('ressources.WorkerType',
138 26a5dbc0 Jérôme Schneider
            verbose_name=u'Spécialité', default=18)
139 688c7fbe Mikaël Ates
    old_id = models.CharField(max_length=256,
140
            verbose_name=u'Ancien ID', blank=True, null=True)
141
    old_service = models.CharField(max_length=256,
142
            verbose_name=u'Ancien Service', blank=True, null=True)
143
    class Meta:
144
        verbose_name = u'Intervenant extérieur'
145
        verbose_name_plural = u'Intervenants extérieurs'
146
147
reversion.register(ExternalWorker, follow=['people_ptr'])
148
149
class ExternalTherapist(People):
150
    description = models.TextField(blank=True, null=True, default=None)
151
    address = models.CharField(max_length=120,
152
            verbose_name=u"Adresse", blank=True, null=True, default=None)
153
    address_complement = models.CharField(max_length=120,
154
            blank=True,
155
            null=True,
156
            default=None,
157
            verbose_name=u"Complément d'adresse")
158
    zip_code = ZipCodeField(verbose_name=u"Code postal",
159
        blank=True, null=True, default=None)
160
    city = models.CharField(max_length=80, verbose_name=u"Ville",
161
        blank=True, null=True, default=None)
162
    phone_work = PhoneNumberField(verbose_name=u"Téléphone du travail",
163
        blank=True, null=True, default=None)
164
    fax = models.CharField(max_length=30,
165
            blank=True, null=True, default=None)
166
    type = models.ForeignKey('ressources.WorkerType',
167 26a5dbc0 Jérôme Schneider
            verbose_name=u'Spécialité', default=18)
168 688c7fbe Mikaël Ates
    old_id = models.CharField(max_length=256,
169
            verbose_name=u'Ancien ID', blank=True, null=True)
170
    old_service = models.CharField(max_length=256,
171
            verbose_name=u'Ancien Service', blank=True, null=True)
172
    old_id = models.CharField(max_length=256,
173
            verbose_name=u'Ancien ID', blank=True, null=True)
174
    old_service = models.CharField(max_length=256,
175
            verbose_name=u'Ancien Service', blank=True, null=True)
176
    class Meta:
177
        verbose_name = u'Médecin extérieur'
178
        verbose_name_plural = u'Médecins extérieurs'
179
180
reversion.register(ExternalTherapist, follow=['people_ptr'])
181
182 65141e8b Benjamin Dauvergne
class UserWorker(BaseModelMixin, models.Model):
183
    user = models.OneToOneField('auth.User')
184 9e738c5d Benjamin Dauvergne
    worker = models.ForeignKey('Worker',
185
            verbose_name=u'Personnel')
186 96f613c6 Benjamin Dauvergne
187 9e738c5d Benjamin Dauvergne
    def __unicode__(self):
188 65141e8b Benjamin Dauvergne
        return u'Lien entre la personne {0} et l\'utilisateur {1}'.format(
189
                self.worker, self.user)
190 1097fd0a Benjamin Dauvergne
191 65141e8b Benjamin Dauvergne
reversion.register(UserWorker)
192 366eb65a Benjamin Dauvergne
193 96f613c6 Benjamin Dauvergne
class SchoolTeacher(People):
194
    schools = models.ManyToManyField('ressources.School')
195 1cba0446 Benjamin Dauvergne
    role = models.ForeignKey('ressources.SchoolTeacherRole')
196 1097fd0a Benjamin Dauvergne
197 366eb65a Benjamin Dauvergne
reversion.register(SchoolTeacher, follow=['user_ptr'])
198
199 f7d9fa12 Benjamin Dauvergne
class TimeTableQuerySet(query.QuerySet):
200 f8f903c3 Benjamin Dauvergne
    def current(self, today=None):
201
        if today is None:
202
            today = date.today()
203 33e71e35 Benjamin Dauvergne
        return self.filter(models.Q(start_date__lte=today) | models.Q(start_date__isnull=True)) \
204
                    .filter(models.Q(end_date__gte=today) | models.Q(end_date__isnull=True))
205 04022fee Benjamin Dauvergne
206 f8f903c3 Benjamin Dauvergne
    def for_today(self, today=None):
207
        if today is None:
208
            today = date.today()
209
        qs = self.current(today)
210 3fae7dcc Benjamin Dauvergne
        qs = qs.filter(weekday=today.weekday())
211 f8f903c3 Benjamin Dauvergne
        filters = []
212
        # week periods
213
        for week_period in range(1,5):
214
            filters.append(models.Q(week_period=week_period,
215
                week_offset=weeks_since_epoch(today) % week_period))
216
        # week parity
217 797b7721 Benjamin Dauvergne
        parity = today.isocalendar()[1] % 2
218 f8f903c3 Benjamin Dauvergne
        filters.append(models.Q(week_parity=parity))
219
        # week ranks
220
        filters.append(models.Q(week_rank__in=weekday_ranks(today)))
221
        qs = qs.filter(reduce(models.Q.__or__, filters))
222
        return qs
223
224 eeb26fe2 Mikaël Ates
PERIODICITIES = (
225
        (1, u'Toutes les semaines'),
226
        (2, u'Une semaine sur deux'),
227
        (3, u'Une semaine sur trois'),
228
        (4, u'Une semaine sur quatre'),
229
        (5, u'Une semaine sur cinq'),
230
        (6, u'La première semaine du mois'),
231
        (7, u'La deuxième semaine du mois'),
232
        (8, u'La troisième semaine du mois'),
233
        (9, u'La quatrième semaine du mois'),
234
        (10, u'La dernière semaine du mois'),
235
        (11, u'Les semaines paires'),
236
        (12, u'Les semaines impaires')
237
)
238
239 f8f903c3 Benjamin Dauvergne
240 9e738c5d Benjamin Dauvergne
class TimeTable(BaseModelMixin, models.Model):
241 f7d9fa12 Benjamin Dauvergne
    objects = PassThroughManager.for_queryset_class(TimeTableQuerySet)()
242 9e738c5d Benjamin Dauvergne
    worker = models.ForeignKey(Worker,
243
            verbose_name=u'Intervenant')
244 52d3b722 Benjamin Dauvergne
    services = models.ManyToManyField('ressources.Service')
245 f8f903c3 Benjamin Dauvergne
    WEEKDAYS = Choices(*enumerate(('lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi',
246
        'samedi', 'dimanche')))
247 aceeeca7 Mikaël Ates
248 f8f903c3 Benjamin Dauvergne
    weekday = models.PositiveIntegerField(
249
        verbose_name=u"Jour de la semaine",
250
        choices=WEEKDAYS)
251 9e738c5d Benjamin Dauvergne
    start_time = models.TimeField(
252
        verbose_name=u'Heure de début')
253
    end_time = models.TimeField(
254
        verbose_name=u'Heure de fin')
255
    start_date = models.DateField(
256 3f7c000d Benjamin Dauvergne
        verbose_name=u'Début',
257
        help_text=u'format: jj/mm/aaaa')
258 9e738c5d Benjamin Dauvergne
    end_date = models.DateField(
259 3f7c000d Benjamin Dauvergne
        verbose_name=u'Fin', blank=True, null=True,
260
        help_text=u'format: jj/mm/aaaa')
261 1097fd0a Benjamin Dauvergne
262 eaf1d7af Mikaël Ates
    periodicity = models.PositiveIntegerField(
263
            choices=PERIODICITIES,
264
            verbose_name=u"Périodicité",
265
            default=1,
266
            blank=True,
267
            null=True)
268
269 f8f903c3 Benjamin Dauvergne
    PERIODS = (
270
            (1, u'Toutes les semaines'),
271
            (2, u'Une semaine sur deux'),
272
            (3, u'Une semaine sur trois'),
273 eaf1d7af Mikaël Ates
            (4, u'Une semaine sur quatre'),
274
            (5, u'Une semaine sur cinq')
275 f8f903c3 Benjamin Dauvergne
    )
276
    OFFSET = range(0,4)
277
    week_offset = models.PositiveIntegerField(
278
            choices=zip(OFFSET, OFFSET),
279 aceeeca7 Mikaël Ates
            verbose_name=u"Décalage en semaines par rapport au 1/1/1970 pour le calcul de période",
280 f8f903c3 Benjamin Dauvergne
            default=0)
281
    week_period = models.PositiveIntegerField(
282
            choices=PERIODS,
283 aceeeca7 Mikaël Ates
            verbose_name=u"Période en semaines",
284 eeb26fe2 Mikaël Ates
            blank=True, null=True)
285 f8f903c3 Benjamin Dauvergne
286
    PARITIES = (
287 eaf1d7af Mikaël Ates
            (0, u'Les semaines paires'),
288
            (1, u'Les semaines impaires')
289 f8f903c3 Benjamin Dauvergne
    )
290
    week_parity = models.PositiveIntegerField(
291
            choices=PARITIES,
292
            verbose_name=u"Parité des semaines",
293
            blank=True, null=True)
294
295
    WEEK_RANKS = (
296
            (0, u'La première semaine du mois'),
297
            (1, u'La deuxième semaine du mois'),
298
            (2, u'La troisième semaine du mois'),
299
            (3, u'La quatrième semaine du mois'),
300
            (4, u'La dernière semaine du mois')
301
    )
302
303 eeb26fe2 Mikaël Ates
    week_rank = models.PositiveIntegerField(
304 f8f903c3 Benjamin Dauvergne
            verbose_name=u"Rang de la semaine dans le mois",
305
            choices=WEEK_RANKS,
306 eeb26fe2 Mikaël Ates
            blank=True, null=True)
307 f8f903c3 Benjamin Dauvergne
308
    def clean(self):
309
        if (self.week_period is None) + (self.week_parity is None) + \
310
                (self.week_rank is None) != 2:
311 eeb26fe2 Mikaël Ates
            raise forms.ValidationError('Only one periodicity criteria can be used')
312 f8f903c3 Benjamin Dauvergne
        if self.week_period and self.start_date:
313
            self.week_offset = weeks_since_epoch(self.start_date) % self.week_period
314
315 9e738c5d Benjamin Dauvergne
    def __unicode__(self):
316 52d3b722 Benjamin Dauvergne
        s = u'%s pour au %s le %s de %s à %s' % \
317
                (self.worker, ', '.join(map(unicode, self.services.all())), self.weekday, self.start_time,
318 9e738c5d Benjamin Dauvergne
                        self.end_time)
319
        if self.end_time:
320
            s += u' à partir du %s' % self.start_date
321
        else:
322
            s += u' du %s au %s' % (self.start_data, self.end_date)
323
        return s
324 1097fd0a Benjamin Dauvergne
325 9e738c5d Benjamin Dauvergne
    class Meta:
326
        verbose_name = u'Emploi du temps'
327
        verbose_name_plural = u'Emplois du temps'
328 7a0a30d7 Benjamin Dauvergne
329
    def to_interval(self, date):
330
        return Interval(datetime.combine(date, self.start_time),
331
                datetime.combine(date, self.end_time))
332 04022fee Benjamin Dauvergne
333 f7d9fa12 Benjamin Dauvergne
class HolidayQuerySet(query.QuerySet):
334 61fd471b Mikaël Ates
    # To grab group holidays:
335
    # No worker AND
336
    # Either the holiday has no service, that means for all
337
    # Or the user must be in the service of the holiday
338 04022fee Benjamin Dauvergne
    def for_worker(self, worker):
339 f7d9fa12 Benjamin Dauvergne
        filter_query = models.Q(worker=worker) \
340 04022fee Benjamin Dauvergne
              | models.Q(worker__isnull=True,
341 5b90c12e Serghei MIHAI
                           services = None) \
342 61fd471b Mikaël Ates
              | models.Q(worker__isnull=True,
343 5b90c12e Serghei MIHAI
                           services__in = worker.services.all())
344 f16d675e Serghei MIHAI
        return self.filter(filter_query).distinct()
345 04022fee Benjamin Dauvergne
346 61fd471b Mikaël Ates
    def for_worker_id(self, worker_id):
347
        worker = None
348
        try:
349
            worker = Worker.objects.get(pk=worker_id)
350
        except:
351
            return None
352
        filter_query = models.Q(worker=worker) \
353
              | models.Q(worker__isnull=True,
354 5b90c12e Serghei MIHAI
                           services = None) \
355 61fd471b Mikaël Ates
              | models.Q(worker__isnull=True,
356 5b90c12e Serghei MIHAI
                           services__in = worker.services.all())
357 61fd471b Mikaël Ates
        return self.filter(filter_query)
358
359
    def for_type(self, holiday_type):
360 5b90c12e Serghei MIHAI
        return self.filter(holiday_type = holiday_type)
361 61fd471b Mikaël Ates
362 04022fee Benjamin Dauvergne
    def for_service(self, service):
363 5b90c12e Serghei MIHAI
        return self.filter(worker__isnull = True) \
364
                   .filter(models.Q(services = service)
365
                          |models.Q(services__isnull = True))
366 04022fee Benjamin Dauvergne
367 1dba86d1 Benjamin Dauvergne
    def for_service_workers(self, service):
368 5b90c12e Serghei MIHAI
        return self.filter(models.Q(worker__services = [service])
369
                |models.Q(services__in = [service])
370
                |models.Q(worker__isnull=True, services__isnull = True))
371 a5bdc8ec Benjamin Dauvergne
372
    def future(self):
373
        return self.filter(end_date__gte=date.today())
374
375 bcb35e14 Benjamin Dauvergne
    def today(self, today=None):
376
        today = today or date.today()
377 a5bdc8ec Benjamin Dauvergne
        return self.filter(start_date__lte=today,
378
                end_date__gte=today)
379
380
    def for_period(self, start_date, end_date):
381
        return self.filter(start_date__lte=end_date, end_date__gte=start_date)
382 04022fee Benjamin Dauvergne
383 e6b125bd Mikaël Ates
    def for_timed_period(self, date, start_time, end_time):
384
        filter_query = models.Q(start_date__lt=date, end_date__gt=date) \
385
            | models.Q(start_date=date, start_time__isnull=True, end_date__gt=date) \
386
            | models.Q(start_date=date, start_time__lt=end_time, end_date__gt=date) \
387
            | models.Q(start_date__lt=date, end_date=date, end_time__isnull=True) \
388
            | models.Q(start_date__lt=date, end_date=date, end_time__gt=start_time) \
389
            | models.Q(start_date=date, end_date=date, start_time__isnull=True, end_time__isnull=True) \
390
            | models.Q(start_date=date, end_date=date, start_time__isnull=True, end_time__gt=start_time) \
391
            | models.Q(start_date=date, end_date=date, start_time__lt=end_time, end_time__isnull=True) \
392
            | models.Q(start_date=date, end_date=date, start_time__lte=start_time, end_time__gt=start_time) \
393
            | models.Q(start_date=date, end_date=date, start_time__lt=end_time, end_time__gte=end_time)
394
        return self.filter(filter_query)
395
396 706c6be7 Benjamin Dauvergne
def time2french(time):
397
    if time.minute:
398
        return '{0}h{1}'.format(time.hour, time.minute)
399
    return '{0}h'.format(time.hour)
400
401 04022fee Benjamin Dauvergne
class Holiday(BaseModelMixin, models.Model):
402 f7d9fa12 Benjamin Dauvergne
    objects = PassThroughManager().for_queryset_class(HolidayQuerySet)()
403 04022fee Benjamin Dauvergne
404 61fd471b Mikaël Ates
    holiday_type = models.ForeignKey('ressources.HolidayType',
405
            verbose_name=u'Type de congé')
406 04022fee Benjamin Dauvergne
    worker = models.ForeignKey(Worker, blank=True, null=True,
407
            verbose_name=u"Personnel")
408 fc35a6fd Serghei MIHAI
    services = models.ManyToManyField(Service, blank = False, null = False,
409
                                      verbose_name = u'Services')
410 3f7c000d Benjamin Dauvergne
    start_date = models.DateField(verbose_name=u"Date de début",
411
        help_text=u'format: jj/mm/aaaa')
412
    end_date = models.DateField(verbose_name=u"Date de fin",
413
        help_text=u'format: jj/mm/aaaa')
414 d5122c5e Benjamin Dauvergne
    start_time = models.TimeField(verbose_name=u"Horaire de début", blank=True,
415
            null=True)
416
    end_time = models.TimeField(verbose_name=u"Horaire de fin", blank=True,
417
            null=True)
418 a39c35ec Benjamin Dauvergne
    comment = models.TextField(verbose_name=u'Commentaire', blank=True)
419 04022fee Benjamin Dauvergne
420
    class Meta:
421
        verbose_name = u'Congé'
422
        verbose_name_plural = u'Congés'
423 5d69a81c Benjamin Dauvergne
        ordering = ('start_date', 'start_time')
424 04022fee Benjamin Dauvergne
425
    def is_current(self):
426
        return self.start_date <= date.today() <= self.end_date
427
428 5b90c12e Serghei MIHAI
    def for_all_services(self):
429
        return self.services.count() == Service.objects.count()
430
431 706c6be7 Benjamin Dauvergne
    def __unicode__(self):
432
        ret = ''
433
        if self.start_date == self.end_date:
434
            ret = u'le {0}'.format(date_filter(self.start_date, 'j F Y'))
435 61fd471b Mikaël Ates
            if self.start_time:
436
                ret += u', à partir de {0}'.format(time2french(self.start_time))
437
            if self.end_time:
438
                ret += u", jusqu'à {0}".format(time2french(self.end_time))
439 706c6be7 Benjamin Dauvergne
        else:
440 61fd471b Mikaël Ates
            ret = u'du {0}'.format(date_filter(self.start_date, 'j F Y'))
441
            if self.start_time:
442
                ret += u' (à partir de {0})'.format(time2french(self.start_time))
443
            ret += u' au {0}'.format(date_filter(self.end_date, 'j F Y'))
444
            if self.end_time:
445
                ret += u" (jusqu'à {0})".format(time2french(self.end_time))
446 706c6be7 Benjamin Dauvergne
        return ret
447 428081e0 Jérôme Schneider
448 84614733 Benjamin Dauvergne
    def to_interval(self, date=None):
449 1eab6c73 Frédéric Péters
        if date == self.start_date:
450
            start_time = self.start_time or datetime_time(8, 0)
451
        else:
452
            start_time = datetime_time(8, 0)
453
        if date == self.end_date:
454
            end_time = self.end_time or datetime_time(20, 0)
455
        else:
456
            end_time = datetime_time(20, 0)
457
        return Interval(datetime.combine(self.start_date, start_time),
458
                datetime.combine(self.end_date, end_time))