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 import os
43 import os.path
44 import re
45 import datetime
46 import time
47
50 '''
51 iCal.ICalReader([dataList])
52
53 Initializes the iCal reader and parses the list type object for events.
54 The list type object with iCal contents is optional.
55 You can call readFiles(file name list) and readEvents(iCal data lines) separately.
56 '''
57 self.events = []
58 if dataLines:
59 self.readEvents(dataLines)
60
62 '''
63 readFiles(fileList)
64
65 This function accepts ARRAY with list of local file names.
66 We put contents of the files into one big list and feed to readEvents()
67 We only work with files, no folders or wildcards.
68 '''
69 dataLines = []
70 for item in range(fileList.__len__()):
71 if os.path.isfile(fileList[item]):
72 tempFile = open(fileList[item], 'r')
73 dataLines.extend(tempFile.readlines())
74 tempFile.close()
75 if dataLines:
76 self.readEvents(dataLines)
77
79 '''
80 Put rutine to fetch and convert a resource into lines and feed it to readEvents()
81 '''
82 dataLines = None
83 if str(url).lower().startswith('http') or str(url).lower().startswith('www'):
84 try:
85 import urllib2
86 except: print 'Please install urllib2'
87 tempFile = urllib2.urlopen(url)
88 dataLines = tempFile.readlines()
89 tempFile.close()
90 else:
91
92 tempFile = open(url,'r')
93 dataLines = tempFile.readlines()
94 tempFile.close()
95 if dataLines:
96 self.readEvents(dataLines)
97
99 if emptyEvents:
100 self.events = []
101
102
103
104 mask = {}
105 mask['BEGIN'] = re.compile("^BEGIN:VEVENT")
106 mask['END'] = re.compile("^END:VEVENT")
107 inEvent= False
108 for line in lines:
109 if mask['BEGIN'].match(line):
110 eventLines = []
111 inEvent = True
112 elif mask['END'].match(line) and inEvent:
113
114 self.events.append(self.parseEvent(eventLines))
115 inEvent = False
116 elif inEvent:
117 eventLines.append(line)
118
120 event = ICalEvent()
121 startDate = None
122 rule = None
123 endDate = None
124
125 event.summary = ''
126 mask={}
127 mask['Summary']=re.compile("^SUMMARY:(.*)")
128 mask['DTStart']=re.compile("^DTSTART;.*:(.*).*")
129 mask['DTEnd']=re.compile("^DTEND;.*:(.*).*")
130 mask['DTStartTZ']=re.compile("^DTSTART:(.*)T.*Z")
131 mask['DTEndTZ']=re.compile("^DTEND:(.*)T.*Z")
132 mask['ExDate']=re.compile("^EXDATE.*:(.*)")
133 mask['RRule']=re.compile("^RRULE:(.*)")
134 timed = '1'
135 for line in lines:
136 if mask['Summary'].match(line):
137 event.summary = mask['Summary'].match(line).group(1)
138
139 elif mask['DTStart'].match(line):
140 startDate = self.parseDate(mask['DTStart'].match(line).group(1))
141 timed = '0'
142 elif mask['DTEnd'].match(line):
143 endDate = self.parseDate(mask['DTEnd'].match(line).group(1))
144 timed = '0'
145
146 elif mask['DTStartTZ'].match(line):
147 startDate = self.parseDate(mask['DTStartTZ'].match(line).group(1))
148 elif mask['DTEndTZ'].match(line):
149 endDate = self.parseDate(mask['DTEndTZ'].match(line).group(1))
150 elif mask['ExDate'].match(line):
151 event.addExceptionDate(self.parseDate(mask['ExDate'].match(line).group(1)))
152 elif mask['RRule'].match(line):
153 rule = mask['RRule'].match(line).group(1)
154 event.startDate = startDate
155 event.endDate = endDate
156 event.timed = timed
157 if rule:
158 event.addRecurrenceRule(rule)
159 return event
160
161
162
163
164
165
167 year = int(dateStr[0:4])
168 if year < 1970:
169 year = 1970
170 month = int(dateStr[4:4+2])
171 day = int(dateStr[6:6+2])
172 try:
173 hour = int(dateStr[9:9+2])
174 minute = int(dateStr[11:11+2])
175 except:
176 hour = 0
177 minute = 0
178 return datetime.datetime(year, month, day, hour, minute)
179
181 note = datetime.datetime.today()
182 self.events.sort()
183 events = filter(selectFunction, self.events)
184 return events
185
188
191
194
196 note = datetime.datetime.today()
197 self.events.sort()
198 ret = []
199 for event in self.events:
200
201 if event.occursOn(date):
202 ret.append(event)
203 return ret
204
205 year = int(dateStr[0:4])
206 if year < 1970:
207 year = 1970
208
209 month = int(dateStr[4:4+2])
210 day = int(dateStr[6:6+2])
211 try:
212 hour = int(dateStr[9:9+2])
213 minute = int(dateStr[11:11+2])
214 except:
215 hour = 0
216 minute = 0
217
220 self.exceptionDates = []
221 self.dateSet = None
222
225
226 - def __eq__(self, otherEvent):
227 return self.startDate == otherEvent.startDate
228
230 self.exceptionDates.append(date)
231
233 self.dateSet = DateSet(self.startDate, self.endDate, rule)
234
236 return self.startsOn(datetime.datetime.today())
237
239 tomorrow = datetime.datetime.fromtimestamp(time.time() + 86400)
240 return self.startsOn(tomorrow)
241
244
246 return (self.startDate.year == date.year and
247 self.startDate.month == date.month and
248 self.startDate.day == date.day or
249 (self.dateSet and self.dateSet.includes(date)))
250
252 if (self.timed == '0'):
253 return (self.startsOn(date) or (self.startDate < date and self.endDate >= date) and self.endDate != date)
254 else:
255 return (self.startsOn(date) or (self.startDate < date and self.endDate >= date))
256
258 return (self.startDate > date)
259
261 return self.startDate
262
263
264
265
266
268 year = int(dateStr[0:4])
269 if year < 1970:
270 year = 1970
271
272 month = int(dateStr[4:4+2])
273 day = int(dateStr[6:6+2])
274 try:
275 hour = int(dateStr[9:9+2])
276 minute = int(dateStr[11:11+2])
277 except:
278 hour = 0
279 minute = 0
280 return datetime.datetime(year, month, day, hour, minute)
281
282
284 - def __init__(self, startDate, endDate, rule):
285 self.startDate = startDate
286 self.endDate = endDate
287 self.startWeekNumber = startDate.isocalendar()[1]
288 self.frequency = None
289 self.count = None
290 self.interval = 1
291 self.untilDate = None
292 self.byMonth = None
293 self.byDate = None
294 self.parseRecurrenceRule(rule)
295
297 if re.compile("FREQ=(.*?);").match(rule):
298 self.frequency = re.compile("FREQ=(.*?);").match(rule).group(1)
299
300 if re.compile("COUNT=(\d*)").search(rule):
301 self.count = int(re.compile("COUNT=(\d*)").search(rule).group(1))
302
303 if re.compile("UNTIL=(.*?);").search(rule):
304
305 self.untilDate = parse(re.compile("UNTIL=(.*?);").search(rule).group(1))
306 if re.compile("INTERVAL=(\d*);").search(rule):
307 self.interval = int(re.compile("INTERVAL=(\d*);").search(rule).group(1))
308
309 if re.compile("BYMONTH=(.*?);").search(rule):
310 self.byMonth = re.compile("BYMONTH=(.*?);").search(rule).group(1)
311
312 if re.compile("BYDAY=(.*?);").search(rule):
313 self.byDay = re.compile("BYDAY=(.*?);").search(rule).group(1)
314
315
316
318 if date == self.startDate:
319 return True
320
321 if self.untilDate and date > self.untilDate:
322 return False
323
324 if self.frequency == 'DAILY':
325 if self.interval:
326 increment = self.interval
327 else:
328 increment = 1
329 d = self.startDate
330 counter = 0
331 while(d < date):
332 if self.count:
333 counter += 1
334 if counter >= self.count:
335 return False
336
337 d = d.replace(day=d.day+1)
338
339 if (d.day == date.day and
340 d.year == date.year and
341 d.month == date.month):
342 return True
343
344 elif self.frequency == 'WEEKLY':
345 if self.startDate.weekday() == date.weekday():
346
347 if self.startWeekNumber % self.interval == date.isocalendar()[1] % self.interval:
348 return True
349 else:
350 return False
351 else:
352 if self.endDate:
353 for n in range(0, self.endDate.day - self.startDate.day):
354 newDate = self.startDate.replace(day=self.startDate.day+n)
355 if newDate.weekday() == date.weekday():
356 return True
357
358 elif self.frequency == 'MONTHLY':
359 pass
360
361 elif self.frequency == 'YEARLY':
362 pass
363
364 return False
365
366
367 if __name__ == '__main__':
368 reader = ICalReader()
369
370 reader.readURL('file:///home/dd/musor/icalout.ics')
371 for event in reader.events:
372 print event
373