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