Browse Source

Filtro por serviço ativo, reorganização do admin

revisaoSidenav
Sesostris Vieira 3 years ago
parent
commit
cbda826d2a
  1. 148
      sigi/apps/servicos/admin.py
  2. 96
      sigi/apps/servicos/filters.py
  3. 30
      sigi/apps/servicos/forms.py

148
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

96
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

30
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
Loading…
Cancel
Save