def new_event(locale, dtstart=None, dtend=None, summary=None, timezone=None, allday=False, description=None, location=None, categories=None, repeat=None, until=None, alarms=None): """create a new event :param dtstart: starttime of that event :type dtstart: datetime :param dtend: end time of that event, if this is a *date*, this value is interpreted as being the last date the event is scheduled on, i.e. the VEVENT DTEND will be *one day later* :type dtend: datetime :param summary: description of the event, used in the SUMMARY property :type summary: unicode :param timezone: timezone of the event (start and end) :type timezone: pytz.timezone :param allday: if set to True, we will not transform dtstart and dtend to datetime :type allday: bool :returns: event :rtype: icalendar.Event """ if dtstart is None: raise ValueError("no start given") if dtend is None: raise ValueError("no end given") if summary is None: raise ValueError("no summary given") if not allday and timezone is not None: dtstart = timezone.localize(dtstart) dtend = timezone.localize(dtend) event = icalendar.Event() event.add('dtstart', dtstart) event.add('dtend', dtend) event.add('dtstamp', dt.datetime.now()) event.add('summary', summary) event.add('uid', generate_random_uid()) # event.add('sequence', 0) if description: event.add('description', description) if location: event.add('location', location) if categories: event.add('categories', categories) if repeat and repeat != "none": rrule = parse_datetime.rrulefstr(repeat, until, locale) event.add('rrule', rrule) if alarms: for alarm in alarms.split(","): alarm = alarm.strip() alarm_trig = -1 * parse_datetime.guesstimedeltafstr(alarm) new_alarm = icalendar.Alarm() new_alarm.add('ACTION', 'DISPLAY') new_alarm.add('TRIGGER', alarm_trig) new_alarm.add('DESCRIPTION', description) event.add_component(new_alarm) return event
def test_multi(self): assert dt.timedelta(days=1, hours=-3, minutes=10) == \ guesstimedeltafstr(' 1d -3H 10min ')
def test_negative(self): assert dt.timedelta(minutes=-10) == guesstimedeltafstr('-10m')
def test_seconds(self): assert dt.timedelta(seconds=10) == guesstimedeltafstr('10s')
def test_single(self): assert dt.timedelta(minutes=10) == guesstimedeltafstr('10m')
def edit_event(event, collection, locale, allow_quit=False, width=80): options = OrderedDict() if allow_quit: options["no"] = {"short": "n"} options["quit"] = {"short": "q"} else: options["done"] = {"short": "n"} options["summary"] = {"short": "s", "attr": "summary"} options["description"] = { "short": "d", "attr": "description", "none": True } options["datetime range"] = {"short": "t"} options["repeat"] = {"short": "p"} options["location"] = {"short": "l", "attr": "location", "none": True} options["categories"] = {"short": "c", "attr": "categories", "none": True} options["alarm"] = {"short": "a"} options["Delete"] = {"short": "D"} now = dt.datetime.now() while True: choice = present_options(options, prefix="Edit?", width=width) if choice is None: echo("unknown choice") continue if choice == 'no': return True if choice in ['quit', 'done']: return False edited = False if choice == "Delete": if confirm("Delete all occurences of event?"): collection.delete(event.href, event.etag, event.calendar) return True elif choice == "datetime range": current = event.format("{start} {end}", relative_to=now) value = prompt("datetime range", default=current) try: start, end, allday = parse_datetime.guessrangefstr( value, locale) event.update_start_end(start, end) edited = True except: echo("error parsing range") elif choice == "repeat": recur = event.recurobject freq = recur["freq"] if "freq" in recur else "" until = recur["until"] if "until" in recur else "" if not freq: freq = 'None' freq = prompt('frequency (or "None")', freq) if freq == 'None': event.update_rrule(None) else: until = prompt('until (or "None")', until) if until == 'None': until = None rrule = parse_datetime.rrulefstr(freq, until, locale) event.update_rrule(rrule) edited = True elif choice == "alarm": default_alarms = [] for a in event.alarms: s = parse_datetime.timedelta2str(-1 * a[0]) default_alarms.append(s) default = ', '.join(default_alarms) if not default: default = 'None' alarm = prompt('alarm (or "None")', default) if alarm == "None": alarm = "" alarm_list = [] for a in alarm.split(","): alarm_trig = -1 * parse_datetime.guesstimedeltafstr(a.strip()) new_alarm = (alarm_trig, event.description) alarm_list += [new_alarm] event.update_alarms(alarm_list) edited = True else: attr = options[choice]["attr"] default = getattr(event, attr) question = choice allow_none = False if "none" in options[choice] and options[choice]["none"]: question += ' (or "None")' allow_none = True if not default: default = 'None' value = prompt(question, default) if allow_none and value == "None": value = "" getattr(event, "update_" + attr)(value) edited = True if edited: event.increment_sequence() collection.update(event)
def test_seconds(self): assert dt.timedelta(seconds=10) == guesstimedeltafstr('10s')
def test_moregarbage(self): with pytest.raises(ValueError): guesstimedeltafstr('foo10m')
def test_same(self): assert dt.timedelta(minutes=20) == \ guesstimedeltafstr('10min 10minutes')
def test_moregarbage(self): with pytest.raises(ValueError): guesstimedeltafstr('foo10m')
def test_garbage(self): with pytest.raises(ValueError): guesstimedeltafstr('10mbar')
def test_multi_nospace(self): assert dt.timedelta(days=1, hours=-3, minutes=10) == \ guesstimedeltafstr('1D-3hour10m')
def test_multi(self): assert dt.timedelta(days=1, hours=-3, minutes=10) == \ guesstimedeltafstr(' 1d -3H 10min ')
def test_negative(self): assert dt.timedelta(minutes=-10) == guesstimedeltafstr('-10m')
def test_multi_nospace(self): assert dt.timedelta(days=1, hours=-3, minutes=10) == \ guesstimedeltafstr('1D-3hour10m')
def test_garbage(self): with pytest.raises(ValueError): guesstimedeltafstr('10mbar')
def new_event(locale, dtstart=None, dtend=None, summary=None, timezone=None, allday=False, description=None, location=None, categories=None, repeat=None, until=None, alarms=None): """create a new event :param dtstart: starttime of that event :type dtstart: datetime :param dtend: end time of that event, if this is a *date*, this value is interpreted as being the last date the event is scheduled on, i.e. the VEVENT DTEND will be *one day later* :type dtend: datetime :param summary: description of the event, used in the SUMMARY property :type summary: unicode :param timezone: timezone of the event (start and end) :type timezone: pytz.timezone :param allday: if set to True, we will not transform dtstart and dtend to datetime :type allday: bool :returns: event :rtype: icalendar.Event """ if dtstart is None: raise ValueError("no start given") if dtend is None: raise ValueError("no end given") if summary is None: raise ValueError("no summary given") if not allday and timezone is not None: dtstart = timezone.localize(dtstart) dtend = timezone.localize(dtend) event = icalendar.Event() event.add('dtstart', dtstart) event.add('dtend', dtend) event.add('dtstamp', dt.datetime.now()) event.add('summary', summary) event.add('uid', generate_random_uid()) # event.add('sequence', 0) if description: event.add('description', description) if location: event.add('location', location) if categories: event.add('categories', categories) if repeat and repeat != "none": rrule = parse_datetime.rrulefstr(repeat, until, locale) event.add('rrule', rrule) if alarms: for alarm in alarms.split(","): alarm = alarm.strip() alarm_trig = -1 * parse_datetime.guesstimedeltafstr(alarm) new_alarm = icalendar.Alarm() new_alarm.add('ACTION', 'DISPLAY') new_alarm.add('TRIGGER', alarm_trig) new_alarm.add('DESCRIPTION', description) event.add_component(new_alarm) return event
def test_same(self): assert dt.timedelta(minutes=20) == \ guesstimedeltafstr('10min 10minutes')
def test_single(self): assert dt.timedelta(minutes=10) == guesstimedeltafstr('10m')