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', {}),
))