Project

General

Profile

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

calebasse / calebasse / agenda / managers.py @ 74ba9776

1

    
2
from datetime import datetime, timedelta
3
from dateutil import rrule
4

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

    
8
from calebasse.agenda.conf import default
9
from calebasse.exceptions import CalebasseException
10
from calebasse import agenda
11

    
12
__all__ = (
13
    'EventManager',
14
    'OccurrenceManager',
15
)
16

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

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

    
39
        return event
40

    
41

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

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

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

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

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

    
82
class OccurrenceManager(models.Manager):
83

    
84
    #use_for_related_fields = True
85

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

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

    
114
        if participants:
115
            qs = qs.filter(event__participants__in=participants)
116
        if services:
117
            qs = qs.filter(services__in=services)
118
        return qs
119

    
120
    def daily_disponiblity(self, date, participants):
121
        start_datetime = datetime(date.year, date.month, date.day, 8, 0)
122
        end_datetime = datetime(date.year, date.month, date.day, 8, 15)
123
        result = dict()
124
        quater = 0
125
        while (start_datetime.hour <= 19):
126
            for participant in participants:
127
                if not result.has_key(start_datetime.hour):
128
                    result[start_datetime.hour] = [0, 1, 2, 3]
129
                    result[start_datetime.hour][0] = []
130
                    result[start_datetime.hour][1] = []
131
                    result[start_datetime.hour][2] = []
132
                    result[start_datetime.hour][3] = []
133
                    quater = 0
134
                qs = self.filter(
135
                    models.Q(
136
                        start_time__gte=start_datetime,
137
                        start_time__lt=end_datetime,
138
                        ) |
139
                    models.Q(
140
                        end_time__gt=start_datetime,
141
                        end_time__lte=end_datetime,
142
                        ) |
143
                    models.Q(
144
                        start_time__lt=start_datetime,
145
                        end_time__gt=end_datetime,
146
                        )
147
                    ).filter(event__participants__in=[participant])
148

    
149
                if qs:
150
                    result[start_datetime.hour][quater].append({'id': participant.id, 'dispo': 'busy'})
151
                else:
152
                    result[start_datetime.hour][quater].append({'id': participant.id, 'dispo': 'free'})
153
            quater += 1
154
            start_datetime += timedelta(minutes=15)
155
            end_datetime += timedelta(minutes=15)
156
        return result
157

    
158
    def smallest_start_in_range(self, start_datetime, end_datetime, participants=None, services=None):
159
        """ """
160
        qs = self.filter(
161
            models.Q(
162
                start_time__gte=start_datetime,
163
                start_time__lt=end_datetime,
164
            ) 
165
        )
166
        if participants:
167
            qs = qs.filter(event__participants__in=participants)
168
        if services:
169
            qs = qs.filter(services__in=services)
170
        qs = qs.order_by('start_time')
171
        if qs:
172
            return qs[0]
173
        else:
174
            return None
175

    
176

    
177
    def biggest_end_in_range(self, start_datetime, end_datetime, participants=None, services=None):
178
        """ """
179
        qs = self.filter(
180
            models.Q(
181
                end_time__gt=start_datetime,
182
                end_time__lte=end_datetime,
183
            ) 
184
        )
185
        if participants:
186
            qs = qs.filter(event__participants__in=participants)
187
        if services:
188
            qs = qs.filter(services__in=services)
189
        qs = qs.order_by('-end_time')
190
        if qs:
191
            return qs[0]
192
        else:
193
            return None
194

    
(6-6/10)