Project

General

Profile

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

calebasse / calebasse / agenda / managers.py @ ad9330e1

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.exceptions import CalebasseException
11
from calebasse import agenda
12

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

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

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

    
40
        return event
41

    
42

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

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

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

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

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

    
83
class OccurrenceManager(models.Manager):
84

    
85
    def daily_occurrences(self, date=None, participants=None, services=None,
86
            event_type=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.select_related('event').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(event__services__in=services)
118
        if event_type:
119
            qs = qs.filter(event__event_type=event_type)
120
        return qs
121

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

    
140
                interval = IntervalSet.between(start_datetime, end_datetime)
141
                delta = interval - occurrences_set[participant.id]
142
                if delta and delta[0].upper_bound == interval[0].upper_bound and \
143
                        delta[0].lower_bound and interval[0].upper_bound :
144
                    result[start_datetime.hour][quater].append({'id': participant.id, 'dispo': 'free'})
145
                else:
146
                    result[start_datetime.hour][quater].append({'id': participant.id, 'dispo': 'busy'})
147
            quater += 1
148
            start_datetime += timedelta(minutes=15)
149
            end_datetime += timedelta(minutes=15)
150
        return result
151

    
(6-6/10)