Project

General

Profile

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

calebasse / calebasse / personnes / models.py @ a5bdc8ec

1
# -*- coding: utf-8 -*-
2

    
3
from datetime import datetime, date
4

    
5
from django.db import models
6
from django.db.models import query
7
from django.contrib.auth.models import User
8
from django.template.defaultfilters import date as date_filter
9

    
10
import reversion
11

    
12
from calebasse.ressources.models import Service
13
from calebasse.models import WeekdayField, BaseModelMixin
14

    
15
from interval import Interval
16

    
17
from model_utils.managers import PassThroughManager
18

    
19
class People(BaseModelMixin, models.Model):
20
    last_name = models.CharField(max_length=128, verbose_name=u'Nom')
21
    first_name = models.CharField(max_length=128, verbose_name=u'Prénom(s)')
22
    display_name = models.CharField(max_length=256,
23
            verbose_name=u'Nom complet', editable=False)
24

    
25
    def save(self, **kwargs):
26
        self.display_name = self.first_name + ' ' + self.last_name
27
        super(People, self).save(**kwargs)
28

    
29
    def __unicode__(self):
30
        return self.display_name
31

    
32
    class Meta:
33
        ordering = ['last_name', 'first_name']
34

    
35
class WorkerQuerySet(query.QuerySet):
36
    def for_service(self, service, type=None):
37
        if type:
38
            return self.filter(services__in=[service]).filter(type=type)
39
        else:
40
            return self.filter(services__in=[service])
41

    
42
class Worker(People):
43
    objects = PassThroughManager.for_queryset_class(WorkerQuerySet)()
44
    # TODO : use manytomany here ?
45
    type = models.ForeignKey('ressources.WorkerType',
46
            verbose_name=u'Type de personnel')
47
    services = models.ManyToManyField('ressources.Service')
48

    
49
    def is_away(self):
50
        day = WeekdayField.WEEKDAYS[date.today().weekday()]
51
        if self.timetable_set.filter(weekday=day).exists():
52
            return False
53
        return True
54

    
55
    class Meta:
56
        verbose_name = u'Personnel'
57
        verbose_name_plural = u'Personnels'
58

    
59
reversion.register(Worker, follow=['people_ptr'])
60

    
61
class UserWorker(BaseModelMixin, User):
62
    worker = models.ForeignKey('Worker',
63
            verbose_name=u'Personnel')
64

    
65
    def __unicode__(self):
66
        return u'Lien entre la personne %s et l\'utilisateur %s' % (
67
                self.people, super(UserWorker, self).__unicode__())
68

    
69
reversion.register(UserWorker, follow=['user_ptr'])
70

    
71
class SchoolTeacher(People):
72
    schools = models.ManyToManyField('ressources.School')
73
    role = models.ForeignKey('ressources.SchoolTeacherRole')
74

    
75
reversion.register(SchoolTeacher, follow=['user_ptr'])
76

    
77
class TimeTableQuerySet(query.QuerySet):
78
    def current(self):
79
        today = date.today()
80
        return self.filter(start_date__lte=today, end_date__gte=today)
81

    
82
class TimeTable(BaseModelMixin, models.Model):
83
    objects = PassThroughManager.for_queryset_class(TimeTableQuerySet)()
84
    worker = models.ForeignKey(Worker,
85
            verbose_name=u'Intervenant')
86
    service = models.ForeignKey('ressources.Service')
87
    weekday = WeekdayField(
88
            verbose_name=u'Jour')
89
    start_time = models.TimeField(
90
        verbose_name=u'Heure de début')
91
    end_time = models.TimeField(
92
        verbose_name=u'Heure de fin')
93
    start_date = models.DateField(
94
        verbose_name=u'Début')
95
    end_date = models.DateField(
96
        verbose_name=u'Fin', blank=True, null=True)
97

    
98
    def __unicode__(self):
99
        s = u'%s pour le %s le %s de %s à %s' % \
100
                (self.worker, self.service, self.weekday, self.start_time,
101
                        self.end_time)
102
        if self.end_time:
103
            s += u' à partir du %s' % self.start_date
104
        else:
105
            s += u' du %s au %s' % (self.start_data, self.end_date)
106
        return s
107

    
108
    class Meta:
109
        verbose_name = u'Emploi du temps'
110
        verbose_name_plural = u'Emplois du temps'
111

    
112
    def to_interval(self, date):
113
        return Interval(datetime.combine(date, self.start_time),
114
                datetime.combine(date, self.end_time))
115

    
116
class HolidayQuerySet(query.QuerySet):
117
    def for_worker(self, worker):
118
        filter_query = models.Q(worker=worker) \
119
              | models.Q(worker__isnull=True,
120
                           service=worker.services.all())
121
        return self.filter(filter_query)
122

    
123
    def for_service(self, service):
124
        return self.filter(worker__isnull=True) \
125
                   .filter(models.Q(service=service)
126
                          |models.Q(service__isnull=True)) \
127

    
128
    def for_service_workers(self, service):
129
        return self.filter(worker__services=service)
130

    
131
    def future(self):
132
        return self.filter(end_date__gte=date.today())
133

    
134
    def today(self):
135
        today = date.today()
136
        return self.filter(start_date__lte=today,
137
                end_date__gte=today)
138

    
139
    def for_period(self, start_date, end_date):
140
        return self.filter(start_date__lte=end_date, end_date__gte=start_date)
141

    
142
def time2french(time):
143
    if time.minute:
144
        return '{0}h{1}'.format(time.hour, time.minute)
145
    return '{0}h'.format(time.hour)
146

    
147
class Holiday(BaseModelMixin, models.Model):
148
    objects = PassThroughManager().for_queryset_class(HolidayQuerySet)()
149

    
150
    worker = models.ForeignKey(Worker, blank=True, null=True,
151
            verbose_name=u"Personnel")
152
    service = models.ForeignKey(Service, blank=True, null=True,
153
            verbose_name=u"Service")
154
    start_date = models.DateField(verbose_name=u"Date de début")
155
    end_date = models.DateField(verbose_name=u"Date de fin")
156
    start_time = models.TimeField(verbose_name=u"Horaire de début", blank=True,
157
            null=True)
158
    end_time = models.TimeField(verbose_name=u"Horaire de fin", blank=True,
159
            null=True)
160

    
161
    class Meta:
162
        verbose_name = u'Congé'
163
        verbose_name_plural = u'Congés'
164
        ordering = ('start_date', 'start_time')
165

    
166
    def is_current(self):
167
        return self.start_date <= date.today() <= self.end_date
168

    
169
    def __unicode__(self):
170
        ret = ''
171
        if self.start_date == self.end_date:
172
            ret = u'le {0}'.format(date_filter(self.start_date, 'j F Y'))
173
            if self.start_time and self.end_time:
174
                ret += u', de {0} à {1}'.format(time2french(self.start_time),
175
                time2french(self.end_time))
176
        else:
177
            ret = u'du {0} au {1}'.format(
178
                    date_filter(self.start_date, 'j F'),
179
                    date_filter(self.end_date, 'j F Y'))
180
        return ret
181

    
(4-4/7)