API-Manager/apimanager/base/filters.py

84 lines
2.5 KiB
Python
Raw Permalink Normal View History

2016-11-09 13:54:47 +00:00
# -*- coding: utf-8 -*-
2016-11-21 13:55:35 +00:00
"""
Base filters
"""
2016-11-09 13:54:47 +00:00
from datetime import datetime, timedelta
from django.conf import settings
2016-11-21 13:55:35 +00:00
2016-11-09 13:54:47 +00:00
class BaseFilter(object):
2016-11-21 13:55:35 +00:00
"""Base for custom filter classes"""
filter_type = None
2016-11-09 13:54:47 +00:00
def __init__(self, context, request_get):
self.context = context
self.request_get = request_get
def _apply(self, data, filter_value):
2016-11-21 13:55:35 +00:00
"""
Actual application of filter
Needs to be implemented by child class!
"""
2016-11-09 13:54:47 +00:00
raise AttributeError('Not implemented yet!')
def apply(self, data):
2016-11-21 13:55:35 +00:00
"""
Apply filter to given data
Also setup of context variables for templates
"""
2016-11-09 13:54:47 +00:00
filter_all = 'active_{}_all'.format(self.filter_type)
self.context[filter_all] = True
filter_active_value = 'active_{}'.format(self.filter_type)
self.context[filter_active_value] = 'All'
2016-11-09 13:54:47 +00:00
2017-11-09 11:26:55 +00:00
if self.filter_type not in self.request_get:
2016-11-09 13:54:47 +00:00
return data
filter_value = self.request_get[self.filter_type]
if not filter_value or filter_value == 'All':
2016-11-09 13:54:47 +00:00
return data
self.context[filter_all] = False
self.context[filter_active_value] = filter_value
2016-11-09 13:54:47 +00:00
filter_active = 'active_{}_{}'.format(self.filter_type, filter_value)
self.context[filter_active] = True
return self._apply(data, filter_value)
class FilterTime(BaseFilter):
2016-11-21 13:55:35 +00:00
"""Filter items by datetime"""
2016-11-09 13:54:47 +00:00
filter_type = 'time'
def __init__(self, context, request_get, time_fieldname):
super().__init__(context, request_get)
self.time_fieldname = time_fieldname
def _apply(self, data, filter_value):
if filter_value == 'minute':
delta = timedelta(minutes=1)
elif filter_value == 'hour':
delta = timedelta(hours=1)
elif filter_value == 'day':
delta = timedelta(days=1)
elif filter_value == 'week':
delta = timedelta(days=7)
elif filter_value == 'month':
delta = timedelta(days=30)
elif filter_value == 'year':
delta = timedelta(days=365)
else:
return data
now = datetime.utcnow()
2016-11-09 13:54:47 +00:00
filtered = []
print("FILTERED")
print(filtered)
2016-11-09 13:54:47 +00:00
for item in data:
item_date = datetime.strptime(
item[self.time_fieldname], settings.API_DATE_FORMAT_WITH_SECONDS )
2016-11-09 13:54:47 +00:00
if now - item_date <= delta:
filtered.append(item)
return filtered