def get_date_range(cls, start, end): # Just filter out future duties. or_query = \ Q(recurrent = True) \ & Q(date__lte = end) if (end - start).days >= 7: # Entire week, nothing complicated, we already have it. pass elif end.weekday() > start.weekday(): # we are not crossing a week boundary, so just a simple gt/lt or_query = or_query \ & Q(normalized_date__gte = h.normalized_week(start)) \ & Q(normalized_date__lte = h.normalized_week(end)) else: # We crossed the week boundary, so make it a bit complicated: # rather than inclusion, make it exclusion and search outside. or_query = or_query \ & Q(normalized_date__lte = h.normalized_week(start)) \ & Q(normalized_date__gte = h.normalized_week(end)) return h.filter_date_range( cls.objects, 'date', start, end, or_query = or_query )
def filter_date_in(cls, days, skip=1): """ Get list of all duties in the next X days. By default it skips 1 day to start search tomorrow. Can be altered with skip=N. """ since = now().date() + datetime.timedelta(days=skip) to = now().date() + datetime.timedelta(days=days) # Just filter out future duties. or_query = \ Q(recurrent = True) \ & Q(date__lte = to) if (to - since).days >= 7: # Entire week, nothing complicated, we already have it. pass elif to.weekday() > since.weekday(): # we are not crossing a week boundary, so just a simple gt/lt or_query = or_query \ & Q(normalized_date__gte = h.normalized_week(since)) \ & Q(normalized_date__lte = h.normalized_week(to)) else: # We crossed the week boundary, so make it a bit complicated: # rather than inclusion, make it exclusion and search outside. or_query = or_query \ & Q(normalized_date__lte = h.normalized_week(since)) \ & Q(normalized_date__gte = h.normalized_week(to)) return h.filter_date_range( cls.objects, 'date', since, to, or_query = or_query )
def save(self, *args, **kwargs): """ Override save, to add normalized_date for recurrent events. """ if self.recurrent: # get the day into the normalized week self.normalized_date = h.normalized_week(self.date) else: self.normalized_date = None super(Duty, self).save(*args, **kwargs)
def duty_today(self): if self.recurrent: return now().date() >= self.date and \ h.normalized_week(now()) == self.normalized_date return now().date() == self.date