diff --git a/sigi/apps/servicos/admin.py b/sigi/apps/servicos/admin.py index 27fe9cb..fb11eb0 100644 --- a/sigi/apps/servicos/admin.py +++ b/sigi/apps/servicos/admin.py @@ -1,10 +1,7 @@ -from datetime import date, timedelta -import resource from django.contrib import admin from django.urls import reverse from django.utils.encoding import force_str from django.utils.safestring import mark_safe -from django.forms.models import ModelForm from django.http import Http404, HttpResponseRedirect from django.utils.translation import gettext as _ from import_export.fields import Field @@ -12,6 +9,9 @@ from sigi.apps.casas.admin import FuncionariosInline, GerentesInterlegisFilter from sigi.apps.casas.models import Orgao from sigi.apps.servicos.models import (Servico, LogServico, CasaAtendida, TipoServico) +from sigi.apps.servicos.filters import ServicoAtivoFilter, DataUtimoUsoFilter +from sigi.apps.servicos.forms import ServicoFormAdmin +from sigi.apps.utils.filters import DateRangeFilter from sigi.apps.utils.mixins import CartExportMixin, LabeledResourse class ServicoExportResourse(LabeledResourse): @@ -35,103 +35,29 @@ class ServicoExportResourse(LabeledResourse): else: return _("Não") - class LogServicoInline(admin.StackedInline): model = LogServico Fieldset = ((None, {'fields': (('data', 'descricao'), 'log')})) extra = 1 -class ServicoFormAdmin(ModelForm): - class Meta: - model = Servico - fields = '__all__' - - def __init__(self, *args, **kwargs): - super(ServicoFormAdmin, self).__init__(*args, **kwargs) - - self.fields['contato_tecnico'].choices = () - self.fields['contato_administrativo'].choices = () - - if self.instance.casa_legislativa_id: - id_casa = self.instance.casa_legislativa_id - elif 'initial' in kwargs and 'id_casa' in kwargs['initial']: - id_casa = kwargs['initial']['id_casa'] - self.instance.casa_legislativa_id = id_casa - else: - id_casa = None +class ContatosInline(FuncionariosInline): + can_delete = False # Equipe do SEIT não pode excluir pessoas de contato + # SEIT see all contacts, including President + def get_queryset(self, request): + return self.model.objects.all() - if id_casa: - casa = CasaAtendida.objects.get(pk=id_casa) - contatos = [ - (f.id, force_str(f)) for f in casa.funcionario_set.all() - ] - self.fields['contato_tecnico'].choices = contatos - self.fields['contato_administrativo'].choices = contatos + def get_queryset(self, request): + return (self.model.objects.exclude(desativado=True) + .extra(select={'ult_null': 'ult_alteracao is null'}) + .order_by('ult_null', '-ult_alteracao') + # A função extra foi usada para quando existir um registro com o campo igual a null não aparecer na frente dos mais novos + ) @admin.register(TipoServico) class TipoServicoAdmin(admin.ModelAdmin): list_display = ('id', 'sigla', 'nome', 'qtde_casas_atendidas', ) ordering = ['id'] -class DataUtimoUsoFilter(admin.SimpleListFilter): - title = _("Atualização") - parameter_name = 'atualizacao' - - def lookups(self, request, model_admin): - return ( - ('err', _("Erro na verificação")), - ('year', _("Sem atualização há um ano ou mais")), - ('semester', _("Sem atualização de seis meses a um ano")), - ('quarter', _("Sem atualização de três a seis meses")), - ('month', _("Sem atualização de um a três meses")), - ('week', _("Sem atualização de uma semana a um mês")), - ('updated', _("Atualizado na última semana")), - ) - - def queryset(self, request, queryset): - if self.value() is not None: - queryset = queryset.exclude(tipo_servico__string_pesquisa="") - if self.value() == 'err': - queryset = queryset.exclude(erro_atualizacao="") - elif self.value() == 'year': - limite = date.today() - timedelta(days=365) - queryset = queryset.filter(data_ultimo_uso__lte=limite) - else: - de = date.today() - ( - timedelta(days=365) if self.value() == 'semester' else - timedelta(days=6*30) if self.value() == 'quarter' else - timedelta(days=3*30) if self.value() == 'month' else - timedelta(days=30) if self.value() == 'week' else - timedelta(days=0) - ) - ate = date.today() - ( - timedelta(days=6*30) if self.value() == 'semester' else - timedelta(days=3*30) if self.value() == 'quarter' else - timedelta(days=30) if self.value() == 'month' else - timedelta(days=7) if self.value() == 'week' else - timedelta(days=0) - ) - queryset = queryset.filter(data_ultimo_uso__range=(de, ate)) - return queryset - -class ServicoAtivoFilter(admin.SimpleListFilter): - title = _("Serviço ativo") - parameter_name = 'ativo' - - def lookups(self, request, model_admin): - return ( - ('ativo', _("Ativo")), - ('desativado', _("Desativado")), - ) - - def queryset(self, request, queryset): - if self.value() is not None: - if self.value() == 'ativo': - queryset = queryset.filter(data_desativacao__isnull=True) - else: - queryset = queryset.filter(data_desativacao__isnull=False) - return queryset - @admin.register(Servico) class ServicoAdmin(CartExportMixin, admin.ModelAdmin): form = ServicoFormAdmin @@ -158,7 +84,8 @@ class ServicoAdmin(CartExportMixin, admin.ModelAdmin): list_filter = ( 'tipo_servico', 'hospedagem_interlegis', - ServicoAtivoFilter, + ('data_ativacao', DateRangeFilter), + ('data_desativacao', ServicoAtivoFilter), DataUtimoUsoFilter, ('casa_legislativa__gerentes_interlegis', GerentesInterlegisFilter), 'casa_legislativa__municipio__uf', @@ -200,21 +127,6 @@ class ServicoAdmin(CartExportMixin, admin.ModelAdmin): get_link_erro.short_description = _("Erro na atualização") get_link_erro.admin_order_field = 'erro_atualizacao' - # def adicionar_servicos(self, request, queryset): - # if 'carrinho_servicos' in request.session: - # q1 = len(request.session['carrinho_servicos']) - # else: - # q1 = 0 - # adicionar_servicos_carrinho(request, queryset=queryset) - # q2 = len(request.session['carrinho_servicos']) - # quant = q2 - q1 - # if quant: - # self.message_user(request, str(q2 - q1) + _(" Serviços adicionados no carrinho")) - # else: - # self.message_user(request, _("Os Serviços selecionados já foram adicionadas anteriormente")) - # return HttpResponseRedirect('.') - # adicionar_servicos.short_description = _("Armazenar serviços no carrinho para exportar") - def calcular_data_uso(self, request, queryset): for servico in queryset: servico.atualiza_data_uso() @@ -289,34 +201,6 @@ class ServicoAdmin(CartExportMixin, admin.ModelAdmin): extra_context={'query_str': '?' + request.META['QUERY_STRING']} ) - # def adicionar_servicos(self, request, queryset): - # if 'carrinho_servicos' in request.session: - # q1 = len(request.session['carrinho_servicos']) - # else: - # q1 = 0 - # adicionar_servicos_carrinho(request, queryset=queryset) - # q2 = len(request.session['carrinho_servicos']) - # quant = q2 - q1 - # if quant: - # self.message_user(request, str(q2 - q1) + _(" Convênios adicionados no carrinho")) - # else: - # self.message_user(request, _("Os Convênios selecionados já foram adicionadas anteriormente")) - # return HttpResponseRedirect('.') - # adicionar_servicos.short_description = _("Armazenar Serviços no carrinho para exportar") - -class ContatosInline(FuncionariosInline): - can_delete = False # Equipe do SEIT não pode excluir pessoas de contato - # SEIT see all contacts, including President - def get_queryset(self, request): - return self.model.objects.all() - - def get_queryset(self, request): - return (self.model.objects.exclude(desativado=True) - .extra(select={'ult_null': 'ult_alteracao is null'}) - .order_by('ult_null', '-ult_alteracao') - # A função extra foi usada para quando existir um registro com o campo igual a null não aparecer na frente dos mais novos - ) - @admin.register(CasaAtendida) class CasaAtendidaAdmin(admin.ModelAdmin): actions = None diff --git a/sigi/apps/servicos/filters.py b/sigi/apps/servicos/filters.py new file mode 100644 index 0000000..ba432b1 --- /dev/null +++ b/sigi/apps/servicos/filters.py @@ -0,0 +1,96 @@ +from datetime import date, timedelta +from django.utils.translation import gettext as _ +from django.contrib import admin + +class ServicoAtivoFilter(admin.FieldListFilter): + parameter_name = None + + def __init__(self, field, request, params, model, model_admin, field_path): + self.model = model + self.model_admin = model_admin + self.parameter_name = f'{field_path}__isnull' + + super().__init__(field, request, params, model, model_admin, field_path) + + self.title = _("Serviço ativo") + + if self.parameter_name in params: + value = params.pop(self.parameter_name) + self.used_parameters[self.parameter_name] = value + lookup_choices = self.lookups(request, model_admin) + + if lookup_choices is None: + lookup_choices = () + self.lookup_choices = list(lookup_choices) + + def lookups(self, request, model_admin): + return ( + ('True', _('Ativo')), + ('False', _('Inativo')) + ) + + def has_output(self): + return self.model.objects.exists() + + def value(self): + return self.used_parameters.get(self.parameter_name) + + def expected_parameters(self): + return [self.parameter_name,] + + def choices(self, changelist): + yield { + 'selected': self.value() is None, + 'query_string': changelist.get_query_string( + remove=[self.parameter_name]), + 'display': _('All'), + } + for lookup, title in self.lookup_choices: + yield { + 'selected': str(self.value()) == str(lookup), + 'query_string': changelist.get_query_string( + {self.parameter_name: lookup} + ), + 'display': title, + } + +class DataUtimoUsoFilter(admin.SimpleListFilter): + title = _("Atualização") + parameter_name = 'atualizacao' + + def lookups(self, request, model_admin): + return ( + ('err', _("Erro na verificação")), + ('year', _("Sem atualização há um ano ou mais")), + ('semester', _("Sem atualização de seis meses a um ano")), + ('quarter', _("Sem atualização de três a seis meses")), + ('month', _("Sem atualização de um a três meses")), + ('week', _("Sem atualização de uma semana a um mês")), + ('updated', _("Atualizado na última semana")), + ) + + def queryset(self, request, queryset): + if self.value() is not None: + queryset = queryset.exclude(tipo_servico__string_pesquisa="") + if self.value() == 'err': + queryset = queryset.exclude(erro_atualizacao="") + elif self.value() == 'year': + limite = date.today() - timedelta(days=365) + queryset = queryset.filter(data_ultimo_uso__lte=limite) + else: + de = date.today() - ( + timedelta(days=365) if self.value() == 'semester' else + timedelta(days=6*30) if self.value() == 'quarter' else + timedelta(days=3*30) if self.value() == 'month' else + timedelta(days=30) if self.value() == 'week' else + timedelta(days=0) + ) + ate = date.today() - ( + timedelta(days=6*30) if self.value() == 'semester' else + timedelta(days=3*30) if self.value() == 'quarter' else + timedelta(days=30) if self.value() == 'month' else + timedelta(days=7) if self.value() == 'week' else + timedelta(days=0) + ) + queryset = queryset.filter(data_ultimo_uso__range=(de, ate)) + return queryset diff --git a/sigi/apps/servicos/forms.py b/sigi/apps/servicos/forms.py new file mode 100644 index 0000000..c584451 --- /dev/null +++ b/sigi/apps/servicos/forms.py @@ -0,0 +1,30 @@ +from django.forms.models import ModelForm +from django.utils.encoding import force_str +from sigi.apps.servicos.models import Servico, CasaAtendida + +class ServicoFormAdmin(ModelForm): + class Meta: + model = Servico + fields = '__all__' + + def __init__(self, *args, **kwargs): + super(ServicoFormAdmin, self).__init__(*args, **kwargs) + + self.fields['contato_tecnico'].choices = () + self.fields['contato_administrativo'].choices = () + + if self.instance.casa_legislativa_id: + id_casa = self.instance.casa_legislativa_id + elif 'initial' in kwargs and 'id_casa' in kwargs['initial']: + id_casa = kwargs['initial']['id_casa'] + self.instance.casa_legislativa_id = id_casa + else: + id_casa = None + + if id_casa: + casa = CasaAtendida.objects.get(pk=id_casa) + contatos = [ + (f.id, force_str(f)) for f in casa.funcionario_set.all() + ] + self.fields['contato_tecnico'].choices = contatos + self.fields['contato_administrativo'].choices = contatos