Skip to content

Instantly share code, notes, and snippets.

@JonnatasCabral
Created September 23, 2016 16:48
Show Gist options
  • Save JonnatasCabral/b0bf23f092f10c3a9d778d724d8995bb to your computer and use it in GitHub Desktop.
Save JonnatasCabral/b0bf23f092f10c3a9d778d724d8995bb to your computer and use it in GitHub Desktop.
from datetime import datetime
from datetime import timedelta
class FilterMixin(object):
filter_fields = []
data_field = None
def set_filters(self):
"""
implementar funcao que retorne uma lista de tuplas com
[(nomedofiltro, dict_or_list de escolhas), ].
E para vizualizar esses filtros use:
o 'load filters' e use a tag 'filter'
"""
return []
def get_context_data(self, **kwargs):
context = super(FilterMixin, self).get_context_data(**kwargs)
context['filters'] = self.set_filters()
context['data_field'] = self.data_field
kwargs = self.request.GET.dict()
context.update(kwargs)
return context
def remove_blank_arg(self, dic):
new_dic = {}
for k, v in dic.items():
if v != '':
new_dic.update({k: v})
return new_dic
def get_queryset(self):
queryset = super(FilterMixin, self).get_queryset()
# pega os kwargs dos filtros e remove os com value=''
request_kwargs = self.request.GET.dict()
request_kwargs = self.remove_blank_arg(request_kwargs)
request_args_keys = set(list(request_kwargs.keys()))
# os campos a serem filtrados estao definidos em: {filter_fields}
intersec = request_args_keys.intersection(self.filter_fields)
# filtro por range de data
data_ini = request_kwargs.get('data_ini')
data_fim = request_kwargs.get('data_fim')
if data_ini and data_fim:
request_kwargs.pop('data_ini')
request_kwargs.pop('data_fim')
# É obrigado definir o campo do modelo que filtrará por data
data_field = None
if self.data_field:
data_field = getattr(self.model, self.data_field)
if data_ini and data_fim and data_field:
data_ini = datetime.strptime(data_ini, '%d/%m/%Y')
data_fim = datetime.strptime(data_fim, '%d/%m/%Y')
queryset = queryset.filter(**{
self.data_field + '__range': (data_ini, data_fim)
})
if len(intersec) > 0:
return queryset.filter(**request_kwargs)
return queryset
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment