diff --git a/apps/enm/filters.py b/apps/enm/filters.py index 61ce79d2..f5e6d428 100644 --- a/apps/enm/filters.py +++ b/apps/enm/filters.py @@ -1,8 +1,12 @@ from django_filters import rest_framework as filters from apps.enm.models import MpointStat, EnStat +from datetime import datetime +from django.db.models import F, Q class MpointStatFilter(filters.FilterSet): has_create_by = filters.BooleanFilter(method='filter_has_create_by') + start_time = filters.CharFilter(method='filter_start_time') + end_time = filters.CharFilter(method='filter_end_time') class Meta: model = MpointStat fields = { @@ -31,9 +35,58 @@ class MpointStatFilter(filters.FilterSet): else: queryset = queryset.filter(create_by=None) return queryset - + + def filter_start_time(self, queryset, name, value): + query = self.data + start_time = datetime.strptime(value, '%Y-%m-%d %H:%M:%S') + start_year, start_month, start_day, start_hour = start_time.year, start_time.month, start_time.day, start_time.hour + if query['type'] in ['hour_s']: + queryset = queryset.filter( + Q(year_s__gt=start_year) | + Q(year_s=start_year, month_s__gt=start_month) | + Q(year_s=start_year, month_s=start_month, day_s__gt=start_day) | + Q(year_s=start_year, month_s=start_month, day_s=start_day, hour__gte=start_hour)) + elif query['type'] in ['sflog', 'day_s']: + queryset = queryset.filter( + Q(year_s__gt=start_year) | + Q(year_s=start_year, month_s__gt=start_month) | + Q(year_s=start_year, month_s=start_month, day_s__gte=start_day)) + elif query['type'] in ['month_s', 'month_st']: + queryset = queryset.filter( + Q(year_s__gt=start_year) | + Q(year_s=start_year, month_s__gte=start_month)) + elif query['type'] in ['year_s']: + queryset = queryset.filter( + Q(year_s__gte=start_year)) + return queryset + + def filter_end_time(self, queryset, name, value): + query = self.data + end_time = datetime.strptime(value, '%Y-%m-%d %H:%M:%S') + end_year, end_month, end_day, end_hour = end_time.year, end_time.month, end_time.day, end_time.hour + if query['type'] in ['hour_s']: + queryset = queryset.filter( + Q(year_s__lt=end_year) | + Q(year_s=end_year, month_s__lt=end_month) | + Q(year_s=end_year, month_s=end_month, day_s__lt=end_day) | + Q(year_s=end_year, month_s=end_month, day_s=end_day, hour__lte=end_hour)) + elif query['type'] in ['sflog', 'day_s']: + queryset = queryset.filter( + Q(year_s__lt=end_year) | + Q(year_s=end_year, month_s__lt=end_month) | + Q(year_s=end_year, month_s=end_month, day_s__lte=end_day)) + elif query['type'] in ['month_s', 'month_st']: + queryset = queryset.filter( + Q(year_s__lt=end_year) | + Q(year_s=end_year, month_s__lte=end_month)) + elif query['type'] in ['year_s']: + queryset = queryset.filter( + Q(year_s__lte=end_year)) + return queryset class EnStatFilter(filters.FilterSet): + start_time = filters.CharFilter(method='filter_start_time') + end_time = filters.CharFilter(method='filter_end_time') class Meta: model = EnStat fields = { @@ -48,5 +101,55 @@ class EnStatFilter(filters.FilterSet): "year_s": ["exact"], "year": ["exact"], "month": ['exact'], + "day_s": ["exact"], + "day": ["exact"], "hour": ['exact'] - } \ No newline at end of file + } + + def filter_start_time(self, queryset, name, value): + query = self.data + start_time = datetime.strptime(value, '%Y-%m-%d %H:%M:%S') + start_year, start_month, start_day, start_hour = start_time.year, start_time.month, start_time.day, start_time.hour + if query['type'] in ['hour_s']: + queryset = queryset.filter( + Q(year_s__gt=start_year) | + Q(year_s=start_year, month_s__gt=start_month) | + Q(year_s=start_year, month_s=start_month, day_s__gt=start_day) | + Q(year_s=start_year, month_s=start_month, day_s=start_day, hour__gte=start_hour)) + elif query['type'] in ['sflog', 'day_s']: + queryset = queryset.filter( + Q(year_s__gt=start_year) | + Q(year_s=start_year, month_s__gt=start_month) | + Q(year_s=start_year, month_s=start_month, day_s__gte=start_day)) + elif query['type'] in ['month_s', 'month_st']: + queryset = queryset.filter( + Q(year_s__gt=start_year) | + Q(year_s=start_year, month_s__gte=start_month)) + elif query['type'] in ['year_s']: + queryset = queryset.filter( + Q(year_s__gte=start_year)) + return queryset + + def filter_end_time(self, queryset, name, value): + query = self.data + end_time = datetime.strptime(value, '%Y-%m-%d %H:%M:%S') + end_year, end_month, end_day, end_hour = end_time.year, end_time.month, end_time.day, end_time.hour + if query['type'] in ['hour_s']: + queryset = queryset.filter( + Q(year_s__lt=end_year) | + Q(year_s=end_year, month_s__lt=end_month) | + Q(year_s=end_year, month_s=end_month, day_s__lt=end_day) | + Q(year_s=end_year, month_s=end_month, day_s=end_day, hour__lte=end_hour)) + elif query['type'] in ['sflog', 'day_s']: + queryset = queryset.filter( + Q(year_s__lt=end_year) | + Q(year_s=end_year, month_s__lt=end_month) | + Q(year_s=end_year, month_s=end_month, day_s__lte=end_day)) + elif query['type'] in ['month_s', 'month_st']: + queryset = queryset.filter( + Q(year_s__lt=end_year) | + Q(year_s=end_year, month_s__lte=end_month)) + elif query['type'] in ['year_s']: + queryset = queryset.filter( + Q(year_s__lte=end_year)) + return queryset \ No newline at end of file