def do_t_due(self, line): """Set task's due date t_due <id> <date> Date can be specified as a relative offset: - +5M: in 5 minutes - +3H: in 3 hours - +1D: in 1 day - +6W: in 6 weeks As a day in the week: - tomorrow: tomorrow, same hour - tuesday 12:10: next tuesday, at 12:10 - fr 15:30: next friday, at 15:30 Or as an absolute date or time: - 10:38: at 10:38 today - 25/09/2010 12:10: on the 25th of September, 2010, at 12:10 - 23/02/2010: on the 23th of February, 2010 - 01/04: on the 1st of April - 12: on the 12th of current month To reset a due date, use "none".""" if len(line.split())<2: raise YokadiException("Give a task id and time, date or date & time") taskId, line=line.strip().split(" ", 1) task=dbutils.getTaskFromId(taskId) if line.lower()=="none": task.dueDate=None print "Due date for task '%s' reset" % task.title else: task.dueDate = dateutils.parseHumaneDateTime(line) print "Due date for task '%s' set to %s" % (task.title, task.dueDate.ctime())
def testParseHumaneDateTime(self): for date in ("+5M", "+1m", "+2H", "+3h", "+9D", "+14d", "+432W", "+0w", "01/01/2009", "10/10/2008 12", "7/7/2007 10:15", "1/2/2003 1:2:3"): dateutils.parseHumaneDateTime(date) for invalidDate in ("2008", "01/2009", "01//02/01", "02/20/2009", "", "-23d", "+3e", "lkjljlkjlkj", "200/200/2009"): self.assertRaises(YokadiException, dateutils.parseHumaneDateTime, invalidDate) # Fake today to a fixed date. This is a saturday (weekday=5). today = datetime(2009, 1, 3) testData = [ ("06/02/2009", datetime(2009, 2, 6)), ("06/02/2009 12:30", datetime(2009, 2, 6, 12, 30)), ("tomorrow 18:00", today + timedelta(days=1, hours=18)), ("sunday", datetime(2009, 1, 4)), ("tu 11:45", datetime(2009, 1, 6, 11, 45)), ] for text, expected in testData: output = dateutils.parseHumaneDateTime(text, today=today) self.assertEquals(expected, output)
def do_t_recurs(self, line): """Make a task recurs t_recurs <id> yearly <dd/mm> <HH:MM> t_recurs <id> monthly <dd> <HH:MM> t_recurs <id> monthly <first/second/third/last> <mo, tu, we, th, fr, sa, su> <hh:mm> t_recurs <id> quarterly <dd> <HH:MM> t_recurs <id> quarterly <first/second/third/last> <mo, tu, we, th, fr, sa, su> <hh:mm> t_recurs <id> weekly <mo, tu, we, th, fr, sa, su> <hh:mm> t_recurs <id> daily <HH:MM> t_recurs <id> none (remove recurrence)""" tokens = line.split() if len(tokens) < 2: raise YokadiException("You should give at least two arguments: <task id> <recurrence>") task = dbutils.getTaskFromId(tokens[0]) # Define recurrence: freq = byminute = byhour = byweekday = bymonthday = bymonth = None tokens[1] = tokens[1].lower() if tokens[1] == "none": if task.recurrence: task.recurrence.destroySelf() task.recurrence = None return elif tokens[1] == "daily": if len(tokens) != 3: raise YokadiException("You should give time for daily task") freq = rrule.DAILY byhour, byminute = dateutils.getHourAndMinute(tokens[2]) elif tokens[1] == "weekly": freq = rrule.WEEKLY if len(tokens) != 4: raise YokadiException("You should give day and time for weekly task") byweekday = dateutils.getWeekDayNumberFromDay(tokens[2].lower()) byhour, byminute = dateutils.getHourAndMinute(tokens[3]) elif tokens[1] in ("monthly","quarterly"): if tokens[1] == "monthly": freq = rrule.MONTHLY else: # quarterly freq = rrule.YEARLY bymonth = [1,4,7,10] if len(tokens) < 4: raise YokadiException("You should give day and time for %s task" % (tokens[1],)) try: bymonthday = int(tokens[2]) byhour, byminute = dateutils.getHourAndMinute(tokens[3]) except ValueError: POSITION = { "first" : 1, "second" : 2, "third" : 3, "fourth" : 4, "last" : -1 } if tokens[2].lower() in POSITION.keys() and len(tokens) == 5: byweekday = rrule.weekday(dateutils.getWeekDayNumberFromDay(tokens[3].lower()), POSITION[tokens[2]]) byhour, byminute = dateutils.getHourAndMinute(tokens[4]) bymonthday = None # Default to current day number - need to be blanked else: raise YokadiException("Unable to understand date. See help t_recurs for details") elif tokens[1] == "yearly": freq = rrule.YEARLY rDate = dateutils.parseHumaneDateTime(" ".join(tokens[2:])) bymonth = rDate.month bymonthday = rDate.day byhour = rDate.hour byminute = rDate.minute else: raise YokadiException("Unknown frequency. Available: daily, weekly, monthly and yearly") if task.recurrence is None: task.recurrence = Recurrence() rr = rrule.rrule(freq, byhour=byhour, byminute=byminute, byweekday=byweekday, bymonthday=bymonthday, bymonth=bymonth) task.recurrence.setRrule(rr) task.dueDate = task.recurrence.getNext()