Django 사용자 지정 필터:DateFieldListFilter 다시 쓰기

4586 단어 Django
class MyDateTimeFilter(admin.filters.DateFieldListFilter):
    def __init__(self, *args, **kwargs):
        super(MyDateTimeFilter, self).__init__(*args, **kwargs)

        now = timezone.now()
        # When time zone support is enabled, convert "now" to the user's time
        # zone so Django's definition of "Today" matches what the user expects.
        if timezone.is_aware(now):
            now = timezone.localtime(now)

        filter_end_date = now.replace(hour=0, minute=0, second=0, microsecond=0)

        filter_start_date_for_one_week = filter_end_date - datetime.timedelta(days=7)

        month_with_day31 = [1,3,5,7,8,10,12]
        if filter_end_date.month in month_with_day31 and filter_end_date.day == 31 and filter_end_date.month != 3:
            if filter_end_date.month == 1:
                filter_start_date_for_one_month = filter_end_date.replace(year=filter_end_date.year-1, month=12)
            else:
                filter_start_date_for_one_month = filter_end_date.replace(month=filter_end_date.month-1, day=30)
        elif filter_end_date.month == 3 and filter_end_date.day in [29, 30, 31]:
            if is_leap_year(filter_end_date.year):
                filter_start_date_for_one_month = filter_end_date.replace(month=filter_end_date.month-1, day=29)
            else:
                filter_start_date_for_one_month = filter_end_date.replace(month=filter_end_date.month-1, day=28)
        else:
            if filter_end_date.month == 1:
                filter_start_date_for_one_month = filter_end_date.replace(year=filter_end_date.year-1, month=12)
            else:
                filter_start_date_for_one_month = filter_end_date.replace(month=filter_end_date.month-1)
        
        filter_start_date_for_six_month = ''
        filter_start_date_for_six_month_month = (filter_end_date.month - 6 + 12) % 12
        if filter_start_date_for_six_month_month == 0:
            filter_start_date_for_six_month_month = 12
        if filter_start_date_for_six_month_month in month_with_day31:
            if filter_end_date.month > 6:
                filter_start_date_for_six_month = filter_end_date.replace(month=filter_start_date_for_six_month_month)
            else:
                filter_start_date_for_six_month = filter_end_date.replace(year=filter_end_date.year-1, month=filter_start_date_for_six_month_month)
        elif filter_start_date_for_six_month_month == 2:
            if filter_end_date.day in [29, 30, 31]:
                if is_leap_year(filter_end_date.year):
                    filter_start_date_for_six_month = filter_end_date.replace(month=filter_start_date_for_six_month_month, day=29)
                else:
                    filter_start_date_for_six_month = filter_end_date.replace(month=filter_start_date_for_six_month_month, day=28)
            else:
                filter_start_date_for_six_month = filter_end_date.replace(month=filter_start_date_for_six_month_month)
        else:
            if filter_end_date.day == 31 and filter_end_date.month >6:
                filter_start_date_for_six_month = filter_end_date.replace(month=filter_start_date_for_six_month_month, day=30)
            elif filter_end_date.day == 31 and filter_end_date.month <=6:
                filter_start_date_for_six_month = filter_end_date.replace(year=filter_end_date.year-1, month=filter_start_date_for_six_month_month, day=30)
            elif filter_end_date.day <31 and filter_end_date.month >6:
                filter_start_date_for_six_month = filter_end_date.replace(month=filter_start_date_for_six_month_month)
            else:
                filter_start_date_for_six_month = filter_end_date.replace(year=filter_end_date.year-1, month=filter_start_date_for_six_month_month)

        filter_end_date =  filter_end_date + datetime.timedelta(days=1)

        self.links = ((
            ('------', {}),
            ('Past week', {
                self.lookup_kwarg_since: str(filter_start_date_for_one_week),
                self.lookup_kwarg_until: str(filter_end_date),
            }),
            ('Past month', {
                self.lookup_kwarg_since: str(filter_start_date_for_one_month),
                self.lookup_kwarg_until: str(filter_end_date),
            }),
            ('Past 6 months', {
                self.lookup_kwarg_since: str(filter_start_date_for_six_month),
                self.lookup_kwarg_until: str(filter_end_date),
            }),
            ('All', {}),
        ))

좋은 웹페이지 즐겨찾기