예제 #1
0
    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)
예제 #2
0
  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],
    )
예제 #3
0
  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
    )
예제 #4
0
  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)))
예제 #5
0
 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))
예제 #6
0
  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 '))

      
예제 #7
0
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
예제 #8
0
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
예제 #9
0
    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],
        )