def get(self): record_user_history(self.dnzo_user, self.request) from util.human_time import parse_date, HUMAN_RANGES offset = 0 if self.dnzo_user.timezone_offset_mins: offset = self.dnzo_user.timezone_offset_mins given_range = self.request.get('range', None) start = self.request.get('start', None) start = parse_date(start, self.dnzo_user.timezone_offset_mins or 0, output_utc=True) stop = self.request.get('stop', None) stop = parse_date(stop, self.dnzo_user.timezone_offset_mins or 0, output_utc=True) filter_title = None if start is not None and stop is not None: from django.template.defaultfilters import date filter_title = '%s to %s' % (date(start, 'n-j-y'), date(stop, 'n-j-y')) else: range_slugs = [r['slug'] for r in HUMAN_RANGES] try: index = range_slugs.index(given_range) except: given_range = 'this-week' index = range_slugs.index(given_range) start, stop = HUMAN_RANGES[index]['range'](offset) filter_title = HUMAN_RANGES[index]['name'] from tasks_data.tasks import get_archived_tasks tasks = get_archived_tasks(self.dnzo_user, start, stop) self.render('tasks/archived.html', tasks=tasks, stop=stop, start=start, ranges=HUMAN_RANGES, chosen_range=given_range, filter_title=filter_title)
def get(self, task_list, project_index=None, context_name=None, due_date=None): record_user_history(self.dnzo_user, self.request) # FILTER filter_title = None view_project = None view_project_name = None if project_index: from tasks_data.misc import get_project_by_short_name view_project_name = get_project_by_short_name(self.dnzo_user, project_index) if view_project_name: filter_title = view_project_name view_project = project_index else: self.list_redirect(task_list) return view_context = None if context_name: view_context = context_name filter_title = "@%s" % context_name view_date = None if due_date: from util.human_time import parse_date view_date = parse_date(due_date) if view_date: filter_title = view_date.strftime('%m-%d-%Y') tasks = get_tasks(self.dnzo_user, task_list=task_list, context=view_context, project_index=view_project, due_date=view_date) # SHOW STATUS MESSAGE AND UNDO status, undo = self.get_status_undo() new_task_attrs = {'body': '', 'parent': self.dnzo_user} if view_context: new_task_attrs['contexts'] = [view_context] if view_project: new_task_attrs['project'] = view_project_name if view_date: new_task_attrs['due_date'] = view_date new_task = Task(**new_task_attrs) new_task.editing = True self.render('tasks/index.html', tasks=tasks, task_list=task_list, filter_title=filter_title, status=status, undo=undo, new_tasks=[new_task], )
def get(self): record_user_history(self.dnzo_user, self.request) from util.human_time import parse_date, HUMAN_RANGES offset=0 if self.dnzo_user.timezone_offset_mins: offset = self.dnzo_user.timezone_offset_mins given_range = self.request.get('range', None) start = self.request.get('start', None) start = parse_date(start, self.dnzo_user.timezone_offset_mins or 0, output_utc=True) stop = self.request.get('stop', None) stop = parse_date(stop, self.dnzo_user.timezone_offset_mins or 0, output_utc=True) filter_title = None if start is not None and stop is not None: from django.template.defaultfilters import date filter_title = '%s to %s' % (date(start,'n-j-y'), date(stop,'n-j-y')) else: range_slugs = [r['slug'] for r in HUMAN_RANGES] try: index = range_slugs.index(given_range) except: given_range = 'this-week' index = range_slugs.index(given_range) start, stop = HUMAN_RANGES[index]['range'](offset) filter_title = HUMAN_RANGES[index]['name'] from tasks_data.tasks import get_archived_tasks tasks = get_archived_tasks(self.dnzo_user, start, stop) self.render('tasks/archived.html', tasks=tasks, stop=stop, start=start, ranges=HUMAN_RANGES, chosen_range=given_range, filter_title=filter_title )
def test_parse_date(self): def get_date(date_tuple): if len(date_tuple) == 3: return datetime(*date_tuple) elif len(date_tuple) == 2: m, d = date_tuple y = self.today.timetuple()[0] if datetime(y, m, d) < self.today: y += 1 return datetime(y, m, d) return None should_parse = { '1 2 3': (2003, 1, 2), '2 2 2': (2002, 2, 2), '3 2 1': (2001, 3, 2), '3 13 2000': (2000, 3, 13), '13 12 2000': (2000, 12, 13), '12 13 2004': (2004, 12, 13), '12 30 2000': (2000, 12, 30), 'dec 30 2000': (2000, 12, 30), '30 dec 2000': (2000, 12, 30), '30 dec 1998': (1998, 12, 30), '30 dec 98': (1998, 12, 30), '13 12': (12, 13), '31 1': (1, 31), '31 jan': (1, 31), '28 feb': (2, 28), '29 feb 2008': (2008, 2, 29), '29 1 29': (2029, 1, 29), '29 1 75': (1975, 1, 29), } months = reduce(lambda x, y: x + y, [zip([(i + 1)] * len(month_names), month_names) for (i, month_names) in enumerate(self.months)]) for (i, month_name) in months: should_parse.update({ "%s-1-2009" % month_name : (2009, i, 1 ), " %s - 1 - 2009 " % month_name : (2009, i, 1 ), " 12 %s 2005" % month_name : (2005, i, 12), "12 %s 02 " % month_name : (2002, i, 12), " 12 %s 98" % month_name : (1998, i, 12), "12 %s 9" % month_name : (2009, i, 12), "2012/12/%s" % month_name : (2012, i, 12), "%s/1" % month_name : (i, 1), "1 %s" % month_name : (i, 1), }) datef = '%B %d %Y' for k in should_parse: parsed = parse_date(k) correct = get_date(should_parse[k]) self.assertEquals(correct, parsed, "'%s' should have been parsed as %s, but was %s!" % (k, correct.strftime(datef), parsed.strftime(datef)))
def test_not_parsable(self): not_parsable = ( '2000 2000 2000', 'abc 1 2009', 'poop a doop', 'feb 31', 'fe 28 2009', # fe is not a month # 'feb 29 2009', # not a leap year '31 31', '2 1 202', '2a2a2009', ) for bad in not_parsable: parsed = parse_date(bad) parsed = parsed and parsed.strftime('%B %d %Y') self.assertEqual(None, parsed, "'%s' should NOT have been parsed, but it was %s!" % (bad, parsed))
def test_special_days(self): for day in reduce(lambda x, y: x + y, self.days): parsed = parse_date(day) self.assert_(parsed > self.today, "Parsed day name ('%s') should be the next day of that day name, so it should be greater than today." % day) self.assert_(parsed <= self.today + timedelta(weeks=1), "Parsed day name ('%s') should be no farther than a week from today." % day) self.assertEqual(self.today, parse_date('today')) self.assertEqual(self.today, parse_date(' today ')) self.assertEqual(self.today + timedelta(days=1), parse_date('tomorrow')) self.assertEqual(self.today + timedelta(days=1), parse_date('tomorrow ')) self.assertEqual(self.today + timedelta(days=1), parse_date(' tomorrow '))
def update_task_with_params(user, task, params): from util.misc import param, slugify complete = param('complete', params, None) if complete is not None: if complete == "true": task.complete = True from datetime import datetime task.completed_at = datetime.utcnow() else: task.complete = False task.completed_at = None raw_body = param('body', params, None) if raw_body is not None: task.body = raw_body[:MAX_BODY_LENGTH] raw_project = param('project', params, None) if raw_project is not None: raw_project = raw_project.strip()[:MAX_PROJECT_LENGTH] if len(raw_project) > 0: task.project = raw_project task.project_index = slugify(raw_project) else: task.project = None task.project_index = None raw_contexts = param('contexts', params, None) if raw_contexts is not None: import re task.contexts = [] # if you update this, remember to change the logic # for updating the MRU contexts list in JavaScript. raw_contexts = re.split(r'[,;\s]+', raw_contexts) for raw_context in raw_contexts: slug = slugify(raw_context)[:MAX_CONTEXT_LENGTH] if len(slug) > 0: task.contexts.append(slug) task.contexts_index = " ".join(task.contexts) raw_due_date = param('due_date', params, None) if raw_due_date is not None: from util.human_time import parse_date task.due_date = None task.due_date = parse_date(raw_due_date, user.timezone_offset_mins) raw_sort_date = param('sort_date', params, None) if raw_sort_date is not None: import re import datetime try: date_pieces = [int(i) for i in re.split(r'\D+', raw_sort_date)] task.created_at = datetime.datetime(*date_pieces) except: import logging logging.exception("Invalid date string given as sort_date: %s", repr(raw_sort_date)) archived = param('archived', params, None) if archived is not None: if archived == "true": if not task.complete: raise AssertionError, "Cannot archive uncompleted task." task.archived = True else: task.archived = False
def get(self, task_list, project_index=None, context_name=None, due_date=None): record_user_history(self.dnzo_user, self.request) # FILTER filter_title = None view_project = None view_project_name = None if project_index: from tasks_data.misc import get_project_by_short_name view_project_name = get_project_by_short_name( self.dnzo_user, project_index) if view_project_name: filter_title = view_project_name view_project = project_index else: self.list_redirect(task_list) return view_context = None if context_name: view_context = context_name filter_title = "@%s" % context_name view_date = None if due_date: from util.human_time import parse_date view_date = parse_date(due_date) if view_date: filter_title = view_date.strftime('%m-%d-%Y') tasks = get_tasks(self.dnzo_user, task_list=task_list, context=view_context, project_index=view_project, due_date=view_date) # SHOW STATUS MESSAGE AND UNDO status, undo = self.get_status_undo() new_task_attrs = {'body': '', 'parent': self.dnzo_user} if view_context: new_task_attrs['contexts'] = [view_context] if view_project: new_task_attrs['project'] = view_project_name if view_date: new_task_attrs['due_date'] = view_date new_task = Task(**new_task_attrs) new_task.editing = True self.render( 'tasks/index.html', tasks=tasks, task_list=task_list, filter_title=filter_title, status=status, undo=undo, new_tasks=[new_task], )