Sistema de Informações Gerenciais do Interlegis
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

407 lines
16 KiB

from unicodedata import name
from django.contrib import admin
from django.contrib.admin.options import ModelAdmin
from django.contrib.contenttypes.admin import GenericTabularInline
from django.http import HttpResponseRedirect
from django.urls import reverse
from django.utils.safestring import mark_safe
from django.utils.translation import gettext as _
from import_export.fields import Field
from sigi.apps.casas.forms import OrgaoForm
from sigi.apps.casas.models import Orgao, Presidente, Funcionario, TipoOrgao
# from sigi.apps.casas.views import report_complete, labels_report, export_csv, \
# labels_report_sem_presidente, report, \
# adicionar_casas_carrinho
from sigi.apps.casas.filters import (GerentesInterlegisFilter, ConvenioFilter,
ExcluirConvenioFilter)
from sigi.apps.contatos.models import Telefone
from sigi.apps.convenios.models import Convenio, Projeto
# from sigi.apps.ocorrencias.models import Ocorrencia
# from sigi.apps.servicos.models import Servico, TipoServico
from sigi.apps.utils import field_label, queryset_ascii
from sigi.apps.utils.mixins import CartExportMixin, LabeledResourse
class OrgaoExportResourse(LabeledResourse):
presidente = Field(column_name='presidente')
telefone = Field(column_name='telefone')
num_parlamentares = Field(column_name='num_parlamentares')
# servicos_seit = Field(column_name='servicos_seit')
contato = Field(column_name='contato')
class Meta:
model = Orgao
fields = ('municipio__codigo_ibge', 'cnpj', 'municipio__codigo_tse',
'nome', 'municipio__nome', 'municipio__uf__sigla',
'presidente', 'logradouro', 'bairro', 'cep', 'telefone',
'pagina_web', 'email', 'num_parlamentares',
'ult_alt_endereco', 'contato')
export_order = fields
def dehydrate_presidente(self, orgao):
return orgao.presidente
def dehydrate_telefone(self, orgao):
return orgao.telefone
def dehydrate_num_parlamentares(self, orgao):
return orgao.num_parlamentares
# def dehydrate_servicos_seit(self, orgao):
# servicos = [s.tipo_servico.nome for s in orgao.servico_set.filter(
# data_desativacao__isnull=True)]
# return ", ".join(servicos)
def dehydrate_contato(self, orgao):
return ", ".join(
[f"{c.cargo if c.cargo else 'Sem cargo'}: {c.nome} ({c.email})"
for c in orgao.funcionario_set.filter(desativado=False)
]
)
class TelefonesInline(GenericTabularInline):
model = Telefone
readonly_fields = ('ult_alteracao',)
extra = 1
class PresidenteInline(admin.StackedInline):
model = Presidente
fields = ('nome', 'sexo', 'data_nascimento', 'nota', 'email',
'tempo_de_servico', 'ult_alteracao', 'endereco', 'municipio',
'bairro', 'cep', 'redes_sociais',)
raw_id_fields = ('municipio',)
readonly_fields = ('ult_alteracao',)
extra = 1
max_num = 1
verbose_name_plural = _('Presidente')
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
)
class ContatoInterlegisInline(admin.StackedInline):
model = Funcionario
fields = ('nome', 'sexo', 'data_nascimento', 'nota', 'email', 'cargo',
'funcao', 'setor', 'tempo_de_servico', 'ult_alteracao',
'endereco', 'municipio', 'bairro', 'cep', 'redes_sociais',
'desativado', 'observacoes')
raw_id_fields = ('municipio',)
readonly_fields = ('ult_alteracao',)
extra = 1
inlines = (TelefonesInline,)
verbose_name_plural = _('Contato(s) Interlegis Vigente(s)')
def get_queryset(self, request):
return (self.model.objects.filter(setor='contato_interlegis')
.extra(select={'ult_null': 'ult_alteracao is null'}).order_by(
'-ult_alteracao')
)
def get_extra(self, request, obj=None , **kwargs):
extra = 0
return extra
class FuncionariosInline(admin.StackedInline):
model = Funcionario
fields = ('nome', 'sexo', 'data_nascimento', 'nota', 'email', 'cargo',
'funcao', 'setor', 'tempo_de_servico', 'ult_alteracao',
'endereco', 'municipio', 'bairro', 'cep', 'redes_sociais',
'desativado', 'observacoes')
raw_id_fields = ('municipio',)
readonly_fields = ('ult_alteracao',)
extra = 1
inlines = (TelefonesInline,)
verbose_name_plural = _('Outros Contatos da Casa')
def get_queryset(self, request):
return (self.model.objects.exclude(cargo='Presidente',)
.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
)
class ConveniosInline(admin.TabularInline):
model = Convenio
fieldsets = (
(None, {'fields': (
('link_sigad', 'status_convenio', 'num_convenio',
'projeto', 'observacao'),
('data_retorno_assinatura', 'data_pub_diario',),
('get_anexos',),
('link_convenio',),
)}),
)
readonly_fields = ['link_convenio', 'link_sigad', 'status_convenio',
'num_convenio', 'projeto', 'observacao', 'data_adesao',
'data_retorno_assinatura', 'data_termo_aceite',
'data_pub_diario', 'data_devolucao_via',
'data_postagem_correio', 'data_devolucao_sem_assinatura',
'data_retorno_sem_assinatura', 'get_anexos']
extra = 0
can_delete = False
template = 'admin/casas/convenios_inline.html'
ordering = ('-data_retorno_assinatura',)
def has_add_permission(self, request):
return False
def get_anexos(self, obj):
return mark_safe('<br/>'.join(
[f'<a href="{a.arquivo.url}" target="_blank">{a}</a>'
for a in obj.anexo_set.all()])
)
get_anexos.short_description = _('Anexos')
def status_convenio(self, obj):
if obj.pk is None:
return ""
status = obj.get_status()
if status in ["Vencido", "Desistência", "Cancelado"]:
label = r"danger"
elif status == "Vigente":
label = r"success"
elif status == "Pendente":
label = r"warning"
else:
label = r"info"
return mark_safe(f'<p class="label label-{label}">{status}</p>')
status_convenio.short_description = _("Status do convênio")
def link_convenio(self, obj):
if obj.pk is None:
return ""
url = reverse(
f'admin:{obj._meta.app_label}_{obj._meta.module_name}_change',
args=[obj.pk]
) + '?_popup=1'
return mark_safe(
f'<input id="edit_convenio-{obj.pk}" type="hidden"/>'
f'<a id="lookup_edit_convenio-{obj.pk}" href="{url}"'
'class="changelink" '
'onclick="return showRelatedObjectLookupPopup(this)">'
f'{_("Editar")}</a>'
)
link_convenio.short_description = _('Editar convenio')
def link_sigad(self, obj):
if obj.pk is None:
return ""
return mark_safe(obj.get_sigad_url())
link_sigad.short_description = _("Processo no Senado")
# class ServicoInline(admin.TabularInline):
# model = Servico
# fields = ('link_url', 'contato_tecnico', 'contato_administrativo',
# 'hospedagem_interlegis', 'data_ativacao', 'data_alteracao',
# 'data_desativacao', 'link_servico')
# readonly_fields = ['link_url', 'contato_tecnico', 'contato_administrativo',
# 'hospedagem_interlegis', 'data_ativacao',
# 'data_alteracao', 'data_desativacao', 'link_servico']
# extra = 0
# max_num = 0
# can_delete = False
# ordering = ('-data_alteracao',)
# def link_url(self, servico):
# if servico.data_desativacao is not None:
# return servico.url
# return mark_safe(
# f'<a href="{servico.url}" target="_blank">{servico.url}</a>'
# )
# link_url.short_description = _('URL do serviço')
# def link_servico(self, obj):
# if obj.pk is None:
# return ""
# url = reverse(
# f'admin:{obj._meta.app_label}_{obj._meta.module_name_change}',
# args=[obj.pk]
# ) + '?_popup=1'
# return mark_safe(
# f'<input id="edit_convenio-{obj.pk}" type="hidden"/>'
# f'<a id="lookup_edit_convenio-{obj.pk}" href="{url}" '
# 'class="changelink" '
# 'onclick="return showRelatedObjectLookupPopup(this)">Editar</a>'
# )
# link_servico.short_description = _('Editar Serviço')
# def has_add_permission(self, request):
# return False
# class OcorrenciaInline(admin.TabularInline):
# model = Ocorrencia
# fields = ('data_criacao', 'assunto', 'prioridade', 'status',
# 'data_modificacao', 'setor_responsavel', 'link_editar',)
# readonly_fields = ('data_criacao', 'assunto', 'prioridade', 'status',
# 'data_modificacao', 'setor_responsavel', 'link_editar',)
# extra = 0
# max_num = 0
# can_delete = False
# template = 'admin/casas/ocorrencia_inline.html'
# ordering = ('-data_modificacao',)
# def link_editar(self, obj):
# if obj.pk is None:
# return ""
# url = reverse(
# f'admin:{obj._meta.app_label}_{obj._meta.module_name}_change',
# args=[obj.pk]
# )
# return mark_safe(
# f'<input id="edit_ocorrencia-{obj.pk}" type="hidden"/>'
# f'<a id="lookup_edit_ocorrencia-{obj.pk}" href="{url}" '
# 'class="button" target="_blank" '
# 'onclick="return showRelatedObjectLookupPopup(this);">'
# f'{_("Editar")}</a>'
# )
# link_editar.short_description = _('Editar')
@admin.register(Orgao)
class OrgaoAdmin(CartExportMixin, admin.ModelAdmin):
form = OrgaoForm
resource_class = OrgaoExportResourse
# actions = ['adicionar_casas', ]
inlines = (TelefonesInline, PresidenteInline, ContatoInterlegisInline,
FuncionariosInline, ) #ConveniosInline, ServicoInline,
# OcorrenciaInline,)
list_display = ('id', 'sigla', 'nome', 'get_uf', 'get_gerentes',
'get_convenios', 'get_servicos')
list_display_links = ('sigla', 'nome',)
# list_filter = ('tipo', ('gerentes_interlegis', GerentesInterlegisFilter),
# 'municipio__uf__nome', ConvenioFilter, ServicoAtivoFilter,
# ExcluirConvenioFilter, ServicoFilter, 'inclusao_digital',)
list_filter = ('tipo', ('gerentes_interlegis', GerentesInterlegisFilter),
'municipio__uf__nome', ConvenioFilter, ExcluirConvenioFilter,
'inclusao_digital',)
ordering = ('municipio__uf__nome', 'nome')
queryset = queryset_ascii
fieldsets = (
(None, {
'fields': ('tipo', 'nome', 'sigla', 'cnpj', 'num_parlamentares',
'gerentes_interlegis')
}),
(_('Endereço'), {
'fields': ('data_instalacao', 'logradouro', 'bairro',
'municipio', 'cep', 'ult_alt_endereco'),
}),
(_('Presença na Internet'), {
'fields': ('inclusao_digital', 'data_levantamento', 'pesquisador',
'pagina_web', 'email', 'obs_pesquisa',)
}),
(_('Outras informações'), {
'fields': ('observacoes', 'horario_funcionamento', 'foto',
'recorte'),
}),
)
raw_id_fields = ('municipio',)
readonly_fields = ['num_parlamentares', 'gerentes_interlegis',]
search_fields = ('search_text', 'sigla', 'cnpj', 'bairro', 'logradouro',
'cep', 'municipio__nome', 'municipio__uf__nome',
'municipio__codigo_ibge', 'pagina_web', 'observacoes')
def get_queryset(self, request):
queryset = super(OrgaoAdmin, self).get_queryset(request)
return queryset.prefetch_related('gerentes_interlegis', 'convenio_set')
def get_uf(self, obj):
return obj.municipio.uf.nome
get_uf.short_description = _('Unidade da Federação')
get_uf.admin_order_field = 'municipio__uf__nome'
def get_gerentes(self, obj):
return mark_safe(obj.lista_gerentes())
get_gerentes.short_description = _('Gerente Interlegis')
def get_convenios(self, obj):
return mark_safe(
'<ul>' +
''.join([f'<li>{c}</li>' for c in obj.convenio_set.all()]) +
'</ul>'
)
get_convenios.short_description = _('Convênios')
def get_servicos(self, obj):
#TODO: Descomentar após migrar a app Servicos
# return mark_safe(
# '<ul>' +
# ''.join(
# [f'<li><a href="{s.url}" target="_blank">{s}</a></li>'
# for s in obj.servico_set.filter(
# data_desativacao__isnull=True)
# ]
# ) +
# '</ul>'
# )
return "TODO: Descomentar após migrar a app Servicos"
get_servicos.short_description = _('Serviços')
def changelist_view(self, request, extra_context=None):
return super(OrgaoAdmin, self).changelist_view(
request,
extra_context={'query_str': '?' + request.META['QUERY_STRING']}
)
def lookup_allowed(self, lookup, value):
return (super(OrgaoAdmin, self).lookup_allowed(lookup, value) or
lookup in ['tipo__legislativo__exact',
'tipo__sigla__exact',
'municipio__uf__codigo_ibge__exact',
'convenio__projeto__id__exact'])
#TODO: Resolver depois - sigi-boys???
# def etiqueta(self, request, queryset):
# return labels_report(request, queryset=queryset)
# etiqueta.short_description = _("Gerar etiqueta(s) da(s) casa(s) "
# "selecionada(s)")
# def etiqueta_sem_presidente(self, request, queryset):
# return labels_report_sem_presidente(request, queryset=queryset)
# etiqueta_sem_presidente.short_description = _("Gerar etiqueta(s) sem "
# "presidente da(s) casa(s) "
# "selecionada(s)")
# def relatorio(self, request, queryset):
# return report(request, queryset=queryset)
# relatorio.short_description = _("Exportar a(s) casa(s) selecionada(s) "
# "para PDF")
# def relatorio_completo(self, request, queryset):
# return report_complete(request, queryset=queryset)
# relatorio_completo.short_description = _("Gerar relatório completo da(s) "
# "casa(s) selecionada(s)")
# def relatorio_csv(self, request, queryset):
# return export_csv(request)
# relatorio_csv.short_description = _("Exportar casa(s) selecionada(s) "
# "para CSV")
# def adicionar_casas(self, request, queryset):
# if 'carrinho_casas' in request.session:
# # if request.session.has_key('carrinho_casas'):
# q1 = len(request.session['carrinho_casas'])
# else:
# q1 = 0
# response = adicionar_casas_carrinho(request, queryset=queryset)
# q2 = len(request.session['carrinho_casas'])
# quant = q2 - q1
# if quant:
# self.message_user(request, str(q2 - q1) + " " +
# _("Casas Legislativas adicionadas no carrinho"))
# else:
# self.message_user(request, _("As Casas Legislativas selecionadas "
# "já foram adicionadas anteriormente"))
# return HttpResponseRedirect('.')
# adicionar_casas.short_description = _("Armazenar casas no carrinho para "
# "exportar")
def get_actions(self, request):
actions = super(OrgaoAdmin, self).get_actions(request)
if 'delete_selected' in actions:
del actions['delete_selected']
return actions