Project

General

Profile

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

calebasse / calebasse / agenda / managers.py @ 5f372104

1

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

    
5
from django.db import models
6

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

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

    
16
class EventManager(models.Manager):
17
    """ This class allows you to manage events, appointment, ...
18
    """
19

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

    
37
        return event
38

    
39

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

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

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

    
67
        return self._set_event(event, participants, services = services,
68
                start_datetime = start_datetime, end_datetime = end_datetime,
69
                **rrule_params)
70

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

    
80
class OccurrenceManager(models.Manager):
81

    
82
    #use_for_related_fields = True
83

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

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

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

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

    
146
                if qs:
147
                    result[start_datetime.hour][quater].append({'id': participant.id, 'dispo': 'busy'})
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

    
155

    
(4-4/8)