def _conv_alarm(self, v, dd): try: alarm_date = bptime.BPTime(v['value'].split(';')[0]) start_date = bptime.BPTime(dd['start']) if alarm_date.get() < start_date.get(): dd['alarm_value'] = (start_date - alarm_date).seconds / 60 return True return False except: return False
def _conv_start_date(self, v, dd): _dt = bptime.BPTime(v['value']).get(default=(0, 0, 0, None, None)) if _dt[-1] is None: # all day event dd['allday'] = True _dt = _dt[:3] + (0, 0) return _dt
def _convert(self, vcal, d): global module_debug for i in vcal: try: dd = {'start': None, 'end': None} for j in self._calendar_keys: if i.has_key(j[0]): k = i[j[0]] if j[2] is not None: dd[j[1]] = j[2](self, k, dd) else: dd[j[1]] = k['value'] if dd['start'] is None and dd['end'] is None: # no start or end, drop this one continue if dd['start'] is None: dd['start'] = dd['end'] elif dd['end'] is None: dd['end'] = dd['start'] if dd.get('allday', False) and dd['end'] > dd['start']: # All day event, adjust the end time as necessary dd['end']=(bptime.BPTime(dd['end'])-\ bptime.timedelta(days=1)).get()[:3]+(0, 0) if module_debug: print dd d.append(dd) except: if module_debug: raise
def _process_monthly_rule(self, v, dd): global module_debug try: # acceptable format: MD1 <day number> <end date | #duration> # or MP1 <[1-4]+ | 1-> <SU-SA> <end date | #duration> s = v['value'].split(' ') if s[0][:2] != 'MD' and s[0][:2] != 'MP': return False dd['repeat_interval2'] = int(s[0][2:]) if s[0][:2] == 'MP': # every nth *day of every month n = s[1] if n in ['1+', '2+', '3+', '4+', '1-']: if n[1] == '-': dd['repeat_interval'] = 5 else: dd['repeat_interval'] = int(n[0]) else: return False dd['repeat_dow'] = self._rrule_dow.get(s[2], 0) else: dd['repeat_interval'] = dd['repeat_dow'] = 0 dd['repeat_type'] = 'monthly' n = s[-1] if len(n) > 7 and n[:8].isdigit(): # end date/time specified dd['repeat_end'] = bptime.BPTime(n).get() elif n[0] == '#': dd['repeat_num'] = int(n[1:]) return True except: if module_debug: raise return False
def _write_times_single(self, keyword, v, event, tzid): # write the DTSTART/DTEND property for a single # (non-recurrent) event _start=bptime.BPTime(event.start) _end=bptime.BPTime(event.end) if event.allday: # all day event _params=('VALUE=DATE',) _res=out_line('DTSTART', _params, _start.iso_str(no_time=True), None) _end+=bptime.timedelta(days=1) _res+=out_line('DTEND', _params, _end.iso_str(no_time=True), None) else: _params=('TZID=%s'%tzid,) _res=out_line('DTSTART', _params, _start.iso_str(no_seconds=False), None) _res+=out_line('DTEND', _params, _end.iso_str(no_seconds=False), None) return _res
def _write_start(self, event, tzid): # write the DTSTART/DURATION property for a recurrent event _start=bptime.BPTime(event.start) _end=bptime.BPTime(event.end) if event.allday: # all day event, can only handle sameday allday event (for now) _params=('VALUE=DATE',) _res=out_line('DTSTART', _params, _start.iso_str(no_time=True), None) _end+=bptime.timedelta(days=1) _res+=out_line('DTEND', _params, _end.iso_str(no_time=True), None) else: # can only handle 24hr-long event (for now) _new_end=_start+(_end-_start).seconds _params=('TZID=%s'%tzid,) _res=out_line('DTSTART', _params, _start.iso_str(no_seconds=False), None) _res+=out_line('DTEND', _params, _new_end.iso_str(no_seconds=False), None) return _res
def _conv_exceptions(self, v, _): r = [] try: _val = v if isinstance(v, (list, tuple)) else [v] for _item in _val: for n in _item['value'].split(','): r.append(bptime.BPTime(n).get()) return r except: if __debug__: raise return []
def _conv_repeat(self, v, dd): _params = v.get('params', {}) _value = self._build_value_dict(v) _rep = self._funcs.get( _value.get('FREQ', [None])[0], lambda *_: False)(self, _value, dd) if _rep: if _value.get('COUNT', [None])[0]: dd['repeat_num'] = int(_value['COUNT'][0]) elif _value.get('UNTIL', [None])[0]: dd['repeat_end'] = bptime.BPTime(_value['UNTIL'][0]).get() dd['repeat_wkst'] = _value.get('WKST', ['MO'])[0] return _rep
def _process_daily_rule(self, v, dd): # the rule is Dx #y or Dx YYYYMMDDTHHMM s = v['value'].split(' ') dd['repeat_interval'] = int(s[0][1:]) if len(s) == 1: # no duration/end date return True if s[1][0] == '#': # duration dd['repeat_num'] = int(s[1][1:]) else: # end date dd['repeat_end'] = bptime.BPTime(s[1]).get() dd['repeat_type'] = 'daily' return True
def _process_yearly_rule(self, v, dd): global module_debug try: # acceptable format YM1 <Month number> <end date | #duration> s = v['value'].split(' ') if s[0] != 'YM1': return False n = s[-1] if len(n) > 7 and n[:8].isdigit(): # end date/time specified dd['repeat_end'] = bptime.BPTime(n).get() elif n[0] == '#': dd['repeat_num'] = int(n[1:]) dd['repeat_type'] = 'yearly' return True except: if module_debug: raise return False
def _process_weekly_rule(self, v, dd): # the rule is Wx | Wx <#y|YYYYMMDDTHHMMSS> | Wx MO TU s = v['value'].split(' ') dd['repeat_interval'] = int(s[0][1:]) dow = 0 for i in range(1, len(s)): n = s[i] if n[0].isdigit(): dd['repeat_end'] = bptime.BPTime(n).get() elif n[0] == '#': dd['repeat_num'] = int(n[1:]) else: # day-of-week dow = dow | self._rrule_dow.get(n, 0) if dow: dd['repeat_dow'] = dow dd['repeat_type'] = 'weekly' return True
def _export_mbox(self, fp, sms): # export SMS data to mbox format _email_generator=Generator(fp, True) _lfs='\n\n' _keys=sms.keys() _keys.sort() for k in _keys: e=sms[k] try: _msg=MIMEText(e.text) _msg['From']=e._from or 'self' _msg['To']=e._to or 'self' _msg['Subject']=e.subject if e.datetime: _msg['Date']=formatdate(bptime.BPTime(e.datetime).mktime(), True) _email_generator.flatten(_msg, True) _email_generator.write(_lfs) except: if __debug__: raise
def _conv_date(self, v, dd): if v.get('params', {}).get('VALUE', None) == 'DATE': # allday event dd['allday'] = True return bptime.BPTime(v['value']).get()
def _datetime_str(self, v): if v: _dt = bptime.BPTime(v) return _dt.date_str() + ' ' + _dt.time_str() return ''
def _conv_date(self, v, _): return bptime.BPTime(v['value']).get()
def _conv_end_date(self, v, _): return bptime.BPTime(v['value']).get(default=(0, 0, 0, 23, 59))
def set_date_isostr(self, iso_string): n = bptime.BPTime(iso_string) self._data['date'] = n.date.strftime('%b %d, %Y') + n.time.strftime( ' %H:%M')
def _decode_date(self, dt_str): _date = bptime.BPTime(dt_str).mktime() return _date, time.strftime("%x %X", time.gmtime(_date))