Project

General

Profile

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

calebasse / calebasse / agenda / managers.py @ d8468991

1

    
2
from datetime import datetime, timedelta
3
from dateutil import rrule
4
from interval import IntervalSet, Interval
5

    
6
from django.db import models
7
from model_utils.managers import InheritanceManager
8

    
9
from calebasse.agenda.conf import default
10
from calebasse.personnes.models import TimeTable
11
from calebasse.exceptions import CalebasseException
12
from calebasse import agenda
13

    
14
__all__ = (
15
    'EventManager',
16
    'OccurrenceManager',
17
)
18

    
19
class EventManager(InheritanceManager):
20
    """ This class allows you to manage events, appointment, ...
21
    """
22

    
23
    def _set_event(self, event, participants=[], description='', services=[],
24
            start_datetime=None, end_datetime=None, note=None, room=None, **rrule_params):
25
        """ Private method to configure an Event or an EventAct
26
        """
27
        event.description = description
28
        event.participants = participants
29
        event.services = services
30
        event.room = room
31
        if note is not None:
32
            event.notes.create(note=note)
33
        start_datetime = start_datetime or datetime.now().replace(
34
            minute=0, second=0, microsecond=0
35
        )
36
        occurence_duration = default.DEFAULT_OCCURRENCE_DURATION
37
        end_datetime = end_datetime or start_datetime + occurence_duration
38
        event.add_occurrences(start_datetime, end_datetime, **rrule_params)
39
        event.save()
40

    
41
        return event
42

    
43

    
44
    def create_event(self, title, event_type, participants=[], description='',
45
        services=[], start_datetime=None, end_datetime=None, room=None, note=None,
46
        **rrule_params):
47
        """
48
        Convenience function to create an ``Event``, optionally create an 
49
        ``EventType``, and associated ``Occurrence``s. ``Occurrence`` creation
50
        rules match those for ``Event.add_occurrences``.
51

    
52
        Args:
53
            event_type: can be either an ``EventType`` object or the label
54
            is either created or retrieved.
55
            participants: List of CalebasseUser
56
            start_datetime: will default to the current hour if ``None``
57
            end_datetime: will default to ``start_datetime`` plus
58
            default.DEFAULT_OCCURRENCE_DURATION hour if ``None``
59
            freq, count, rrule_params:
60
            follow the ``dateutils`` API (see http://labix.org/python-dateutil)
61
        Returns:
62
            Event object
63
        """
64

    
65
        if isinstance(event_type, str):
66
            event_type, created = agenda.models.EventType.objects.get_or_create(
67
                label=event_type
68
            )
69
        event = self.create(title=title, event_type=event_type)
70

    
71
        return self._set_event(event, participants, services = services,
72
                start_datetime = start_datetime, end_datetime = end_datetime,
73
                room=room, **rrule_params)
74

    
75
    def create_holiday(self, start_date, end_date, peoples=[], services=[], motive=''):
76
        event_type, created = agenda.models.EventType.objects.get_or_create(
77
                label=u"Vacances"
78
                )
79
        event = self.create(title="Conge", event_type=event_type)
80
        start_datetime = datetime(start_date.year, start_date.month, start_date.day)
81
        end_datetime = datetime(end_date.year, end_date.month, end_date.day, 23, 59)
82
        return self._set_event(event, peoples, motive, services, start_datetime, end_datetime)
83

    
84
class OccurrenceManager(models.Manager):
85

    
86
    def daily_occurrences(self, date=None, participants=None, services=None,
87
            event_type=None):
88
        '''
89
        Returns a queryset of for instances that have any overlap with a 
90
        particular day.
91

    
92
        Args:
93
            date: may be either a datetime.datetime, datetime.date object, or
94
            ``None``. If ``None``, default to the current day.
95
            participants: a list of CalebasseUser
96
        '''
97
        date = date or datetime.now()
98
        start = datetime(date.year, date.month, date.day)
99
        end = start.replace(hour=23, minute=59, second=59)
100
        qs = self.select_related('event').filter(
101
            models.Q(
102
                start_time__gte=start,
103
                start_time__lte=end,
104
            ) |
105
            models.Q(
106
                end_time__gte=start,
107
                end_time__lte=end,
108
            ) |
109
            models.Q(
110
                start_time__lt=start,
111
                end_time__gt=end,
112
            )
113
        )
114

    
115
        if participants:
116
            qs = qs.filter(event__participants__in=participants)
117
        if services:
118
            qs = qs.filter(event__services__in=services)
119
        if event_type:
120
            qs = qs.filter(event__event_type=event_type)
121
        return qs
122

    
123
    def daily_disponiblity(self, date, occurrences, participants, time_tables):
124
        result = dict()
125
        quater = 0
126
        occurrences_set = {}
127
        timetables_set = {}
128
        for participant in participants:
129
            occurrences_set[participant.id] = IntervalSet((o.to_interval() for o in occurrences[participant.id]))
130
            timetables_set[participant.id] = IntervalSet((t.to_interval(date) for t in time_tables[participant.id]))
131
        start_datetime = datetime(date.year, date.month, date.day, 8, 0)
132
        end_datetime = datetime(date.year, date.month, date.day, 8, 15)
133
        while (start_datetime.hour <= 19):
134
            for participant in participants:
135
                if not result.has_key(start_datetime.hour):
136
                    result[start_datetime.hour] = [0, 1, 2, 3]
137
                    result[start_datetime.hour][0] = []
138
                    result[start_datetime.hour][1] = []
139
                    result[start_datetime.hour][2] = []
140
                    result[start_datetime.hour][3] = []
141
                    quater = 0
142

    
143
                interval = IntervalSet.between(start_datetime, end_datetime)
144
                if interval.issubset(occurrences_set[participant.id]):
145
                    result[start_datetime.hour][quater].append({'id': participant.id, 'dispo': 'busy'})
146
                elif not interval.issubset(timetables_set[participant.id]):
147
                    result[start_datetime.hour][quater].append({'id': participant.id, 'dispo': 'away'})
148
                else:
149
                    result[start_datetime.hour][quater].append({'id': participant.id, 'dispo': 'free'})
150
            quater += 1
151
            start_datetime += timedelta(minutes=15)
152
            end_datetime += timedelta(minutes=15)
153
        return result
154

    
(6-6/10)