-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathclasses.py
165 lines (137 loc) · 4.42 KB
/
classes.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
"""
Simple iCal model: Groups, Calendars and Events.
@todo: add Week, Day, Month cross references. Maybe Forever, too. one class with type.
"""
import datetime
def _sort_dict_by_key(d, reverse=False):
""" proposed in PEP 265, using the itemgetter """
return sorted(d.iteritems(), key=itemgetter(0), reverse=True)
class Group(object):
"""
Corresponds to iCal group of calendars
"""
def __init__(self, name):
self.name = name
self.calendars = []
def add_calendar(self, calendar):
"""
called by Calendar.add_group()
"""
self.calendars.append(calendar)
class Calendar(object):
"""
Corresponds to iCal calendar
"""
def __init__(self, name, color):
self.name = name
self.color = color
self.group = None
self.events = []
self.events_by_time_period = {}
def ordered_time_periods(self):
ret = []
for start in sorted(TimePeriod.All_Periods):
tp = TimePeriod.All_Periods[start]
if tp in self.events_by_time_period:
ret.append( (tp, self.events_by_time_period[tp]) )
else:
ret.append( (tp, []) )
return ret
def add_event(self, event):
"""
called by Event initializer
"""
self.events.append(event)
def add_event_with_time_period(self, event, time_period):
if not time_period in self.events_by_time_period:
self.events_by_time_period[time_period] = []
self.events_by_time_period[time_period].append(event)
def add_group(self, group):
"""
calls Group.add_calendar()
"""
self.group = group
group.add_calendar(self)
def __str__(self):
return "%s (%s)" % (self.name, len(self.events))
def __cmp__(self, calendar):
if self.name == "sleep":
return -1
if self.name > calendar.name:
return 1
elif self.name == calendar.name:
return 0
else:
return -1
class Event(object):
"""
Corresponds to iCal event
@todo: handle re-occurring events
"""
def __init__(self, start, end, summary, calendar):
"""
Instance fields are added using self.add_field().
Expected fields are:
* start (datetime)
* end (datetime)
* summary (string)
"""
self.start = start
self.end = end
self.summary = summary
self.calendar = calendar
if self.calendar:
calendar.add_event(self)
self.time_period = None
if self.end and self.start:
self.duration = (self.end - self.start).seconds
else:
self.duration = 0
#def __cmp__(self, x):
# return self.start < x.start
def assign_timeperiod(self, time_period):
self.time_period = time_period
self.time_period.add_event(self)
if self.calendar:
self.calendar.add_event_with_time_period(self, time_period)
def __str__(self):
return "%s hrs (%s --- %s) %s" % (self.duration / 3600, self.start, self.end, self.calendar)
def __cmp__(self, event):
if self.start > event.start:
return 1
elif self.start == event.start:
return 0
else:
return -1
class TimePeriod(object):
#### {start: [inst, inst, ...]}
# {start: inst, }
All_Periods = {}
@classmethod
def get_containing_time_period(klass, start):
for s in klass.All_Periods:
tp = klass.All_Periods[s]
if start >= tp.start and start <= tp.end:
return tp
return None
@classmethod
def get_or_create(klass, start, end):
if not start in klass.All_Periods:
tp = TimePeriod(start, end)
klass.All_Periods[start] = tp
return klass.All_Periods[start]
@classmethod
def get_ordered_periods(klass):
ret = []
for tp in sorted(klass.All_Periods):
ret.append( (tp, klass.All_Periods[tp]) )
return ret
def __init__(self, start, end):
self.start = start
self.end = end
self.events = []
def add_event(self, event):
# called by Calendar
self.events.append(event)
def __str__(self):
return "%s --- %s" % (self.start, self.end)