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 queryset(self, request, queryset): if self.value() == 'today': # for 'today' it is simple... return queryset.filter(date = now().date()) if self.value() == 'week': future_date = (now() + datetime.timedelta(days=7)).date() return h.filter_date_range( queryset, 'date', now().date(), future_date )
def filter_birthday_in(cls, days, skip=1): """ Get list of all people with birthday in the next X days. By default it skips 1 day to start search tomorrow. Can be altered with skip=N. """ future_date = (now() + datetime.timedelta(days=days)).date() start = (now() + datetime.timedelta(days=skip)).date() return h.filter_date_range( cls.objects, 'birthday', h.bday(start.month, start.day), h.bday(future_date.month, future_date.day) )
def queryset(self, request, queryset): # select by date... Patient.objects.filter(birthday__month=4, birthday__day=1) if self.value() == 'today': return queryset.filter( birthday = h.bday(now=True) ) if self.value() == 'week': future_date = (now() + datetime.timedelta(days=7)).date() return h.filter_date_range( queryset, 'birthday', h.bday(now=True), h.bday(future_date.month, future_date.day) )