mirror of https://github.com/jumpserver/jumpserver
47 lines
1.4 KiB
Python
47 lines
1.4 KiB
Python
from django.utils import timezone
|
|
from rest_framework.request import Request
|
|
|
|
from common.utils import lazyproperty
|
|
from common.utils.timezone import local_zero_hour, local_now
|
|
|
|
|
|
class DateRangeMixin:
|
|
request: Request
|
|
days_param = 'days'
|
|
default_days = 1
|
|
|
|
@lazyproperty
|
|
def days(self) -> int:
|
|
raw = self.request.query_params.get(self.days_param, self.default_days)
|
|
try:
|
|
return int(raw)
|
|
except (ValueError, TypeError):
|
|
return self.default_days
|
|
|
|
@property
|
|
def start_datetime(self):
|
|
if self.days == 1:
|
|
return local_zero_hour()
|
|
return local_now() - timezone.timedelta(days=self.days)
|
|
|
|
@property
|
|
def date_range_bounds(self) -> tuple:
|
|
start = self.start_datetime.date()
|
|
end = (local_now() + timezone.timedelta(days=1)).date()
|
|
return start, end
|
|
|
|
@lazyproperty
|
|
def date_range_list(self) -> list:
|
|
return [
|
|
(local_now() - timezone.timedelta(days=i)).date()
|
|
for i in range(self.days - 1, -1, -1)
|
|
]
|
|
|
|
def filter_by_date_range(self, queryset, field_name: str):
|
|
start, end = self.date_range_bounds
|
|
return queryset.filter(**{f'{field_name}__range': (start, end)})
|
|
|
|
@lazyproperty
|
|
def dates_metrics_date(self):
|
|
return [date.strftime('%m-%d') for date in self.date_range_list] or ['0']
|