Пример #1
0
    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
        )
Пример #2
0
    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
            )
Пример #3
0
    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)
Пример #4
0
 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