Browse Source

Permitir editar serviços na tela de Orgão

pull/159/head
Sesostris Vieira 3 years ago
parent
commit
6c054c37a4
  1. 45
      sigi/apps/casas/admin.py
  2. 109
      sigi/apps/casas/models.py
  3. 255
      sigi/apps/servicos/admin.py
  4. 31
      sigi/apps/servicos/forms.py
  5. 41
      sigi/apps/servicos/migrations/0010_delete_casaatendida_alter_tiposervico_options_and_more.py
  6. 48
      sigi/apps/servicos/migrations/0011_remove_servico_contato_administrativo_and_more.py
  7. 67
      sigi/apps/servicos/models.py
  8. 166
      sigi/menu_conf.yaml

45
sigi/apps/casas/admin.py

@ -293,51 +293,16 @@ class ServicoInline(admin.TabularInline):
model = Servico model = Servico
fields = ( fields = (
"tipo_servico", "tipo_servico",
"link_url", "url",
"hospedagem_interlegis", "hospedagem_interlegis",
"data_ativacao", "data_ativacao",
"data_alteracao", "data_alteracao",
"data_desativacao", "data_desativacao",
"link_servico", "motivo_desativacao",
) )
readonly_fields = [ readonly_fields = ["data_alteracao"]
"tipo_servico", extra = 1
"link_url", ordering = ("tipo_servico", "-data_alteracao")
"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 ""
opts = self.opts
url = reverse(
f"admin:{opts.app_label}_{opts.model_name}_change", args=[obj.pk]
)
return mark_safe(
f'<a href="{url}"><i class="material-icons Tiny">edit</i></a>'
)
link_servico.short_description = _("Editar Serviço")
def has_add_permission(self, request, obj):
return False
class OcorrenciaInline(admin.TabularInline): class OcorrenciaInline(admin.TabularInline):

109
sigi/apps/casas/models.py

@ -183,115 +183,6 @@ class Orgao(models.Model):
except Funcionario.DoesNotExist: except Funcionario.DoesNotExist:
return None return None
def gerarCodigoInterlegis(self):
codigo = self.codigo_interlegis
if codigo == "":
if self.tipo.sigla == "AL": # Assembléias são tratadas a parte
codigo = "A" + self.municipio.uf.sigla
if Orgao.objects.filter(codigo_interlegis=codigo).count() <= 0:
# Só grava o código se ele for inédito
self.codigo_interlegis = codigo
self.save()
return codigo
# Se já existe, então trata a Assembleia como uma Casa qualquer.
cityName = normalize("NFKD", self.municipio.nome).encode(
"ascii", "ignore"
)
cityName = cityName.upper().strip()
cityName = cityName.replace(" DA ", " ")
cityName = cityName.replace(" DE ", " ")
cityName = cityName.replace(" DO ", " ")
cityName = filter(lambda x: x in ascii_uppercase + " ", cityName)
# estratégia 1 - Pegar as 1ª letra de cada nome da cidade
codigo = "".join([x[0] for x in cityName.split(" ")[:3]])
# Se o código ficou com menos que três letras, pegar as 2 primeiras
if len(codigo) < 3:
codigo = "".join([x[0:2] for x in cityName.split(" ")[:3]])[:3]
# Se ainda ficou com menos de três letras, então o nome da cidade só
# tem uma palavra. Pegue as três primeiras letras da palavra
if len(codigo) < 3:
codigo = cityName[:3]
# Se o código já existir, substituir a última letra do código pela
# última letra do nome da cidade, e ir recuando, letra a letra,
# até achar um novo código.
cityName = cityName.replace(" ", "")
ultima = len(cityName)
while (
Orgao.objects.filter(codigo_interlegis=codigo).count() > 0
and ultima > 0
):
codigo = codigo[:2] + cityName[ultima - 1 : ultima]
ultima -= 1
# Se usou todas as letras do nome na última posição e ainda assim
# não gerou um código único, então vamos compor o nome usando as
# três primeiras consoantes.
if Orgao.objects.filter(codigo_interlegis=codigo).count() > 0:
codigo_cons = (
cityName.replace("A", "")
.replace("E", "")
.replace("I", "")
.replace("O", "")
.replace("", "")[:3]
)
if (
len(codigo_cons) == 3
and Orgao.objects.filter(codigo_interlegis=codigo).count()
> 0
):
codigo = codigo_cons
# Se ainda não gerou um nome único, vamos colocar dígitos no
# último caractere, de A a Z
i = "A"
while (
Orgao.objects.filter(codigo_interlegis=codigo).count() > 0
and i <= "Z"
):
codigo = codigo[:2] + str(i)
i = chr(ord(i) + 1)
# Se não encontrou, comece a gerar strings com 3 letras aleatórias
# tiradas do nome da cidade, até gerar uma que não existe. Tentar
# 100 vezes apenas
i = 0
while (
Orgao.objects.filter(codigo_interlegis=codigo).count() > 0
and i < 100
):
codigo = (
random.choice(cityName)
+ random.choice(cityName)
+ random.choice(cityName)
)
i += 1
# Caramba! Só resta então gerar o código com 3 letras aleatórias
# quaisquer do alfabeto!
i = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
while Orgao.objects.filter(codigo_interlegis=codigo).count() > 0:
codigo = random.choice(i) + random.choice(i) + random.choice(i)
self.codigo_interlegis = codigo
self.save()
return codigo
def __str__(self): def __str__(self):
return self.nome return self.nome

255
sigi/apps/servicos/admin.py

@ -5,16 +5,9 @@ from django.utils.safestring import mark_safe
from django.http import Http404, HttpResponseRedirect from django.http import Http404, HttpResponseRedirect
from django.utils.translation import gettext as _ from django.utils.translation import gettext as _
from import_export.fields import Field from import_export.fields import Field
from sigi.apps.casas.admin import FuncionariosInline, GerentesInterlegisFilter from sigi.apps.casas.admin import GerentesInterlegisFilter
from sigi.apps.casas.models import Orgao from sigi.apps.servicos.models import Servico, LogServico, TipoServico
from sigi.apps.servicos.models import (
Servico,
LogServico,
CasaAtendida,
TipoServico,
)
from sigi.apps.servicos.filters import ServicoAtivoFilter, DataUtimoUsoFilter 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.filters import DateRangeFilter
from sigi.apps.utils.mixins import CartExportMixin, LabeledResourse from sigi.apps.utils.mixins import CartExportMixin, LabeledResourse
@ -31,9 +24,6 @@ class ServicoExportResourse(LabeledResourse):
"casa_legislativa__municipio__uf__sigla", "casa_legislativa__municipio__uf__sigla",
"casa_legislativa__email", "casa_legislativa__email",
"telefone_casa", "telefone_casa",
"contato_tecnico__nome",
"contato_tecnico__email",
"contato_tecnico__nota",
"tipo_servico__nome", "tipo_servico__nome",
"url", "url",
"hospedagem_interlegis", "hospedagem_interlegis",
@ -61,21 +51,6 @@ class LogServicoInline(admin.StackedInline):
extra = 1 extra = 1
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(TipoServico) @admin.register(TipoServico)
class TipoServicoAdmin(admin.ModelAdmin): class TipoServicoAdmin(admin.ModelAdmin):
list_display = ( list_display = (
@ -89,15 +64,13 @@ class TipoServicoAdmin(admin.ModelAdmin):
@admin.register(Servico) @admin.register(Servico)
class ServicoAdmin(CartExportMixin, admin.ModelAdmin): class ServicoAdmin(CartExportMixin, admin.ModelAdmin):
form = ServicoFormAdmin
actions = [ actions = [
"calcular_data_uso", "calcular_data_uso",
] ]
list_display = ( list_display = (
"tipo_servico",
"casa_legislativa", "casa_legislativa",
"get_codigo_interlegis",
"get_uf", "get_uf",
"tipo_servico",
"hospedagem_interlegis", "hospedagem_interlegis",
"data_ativacao", "data_ativacao",
"data_desativacao", "data_desativacao",
@ -105,47 +78,17 @@ class ServicoAdmin(CartExportMixin, admin.ModelAdmin):
"data_ultimo_uso", "data_ultimo_uso",
"get_link_erro", "get_link_erro",
) )
fieldsets = ( fields = [
( "casa_legislativa",
None, "tipo_servico",
{ "url",
"fields": ( "hospedagem_interlegis",
"casa_legislativa", "data_ativacao",
"data_ativacao", "data_alteracao",
) "data_desativacao",
}, "motivo_desativacao",
), ]
( readonly_fields = ["data_alteracao"]
_("Serviço"),
{
"fields": (
"tipo_servico",
("url", "hospedagem_interlegis"),
("nome_servidor", "porta_servico", "senha_inicial"),
)
},
),
(
_("Contatos"),
{
"fields": (
"contato_tecnico",
"contato_administrativo",
)
},
),
(
_("Alterações"),
{
"fields": (
"data_alteracao",
"data_desativacao",
"motivo_desativacao",
)
},
),
)
readonly_fields = ("casa_legislativa", "data_ativacao", "data_alteracao")
list_filter = ( list_filter = (
"tipo_servico", "tipo_servico",
"hospedagem_interlegis", "hospedagem_interlegis",
@ -155,7 +98,6 @@ class ServicoAdmin(CartExportMixin, admin.ModelAdmin):
("casa_legislativa__gerentes_interlegis", GerentesInterlegisFilter), ("casa_legislativa__gerentes_interlegis", GerentesInterlegisFilter),
"casa_legislativa__municipio__uf", "casa_legislativa__municipio__uf",
) )
list_display_links = []
ordering = ( ordering = (
"casa_legislativa__municipio__uf", "casa_legislativa__municipio__uf",
"casa_legislativa", "casa_legislativa",
@ -165,14 +107,6 @@ class ServicoAdmin(CartExportMixin, admin.ModelAdmin):
search_fields = ("casa_legislativa__search_text",) search_fields = ("casa_legislativa__search_text",)
resource_class = ServicoExportResourse resource_class = ServicoExportResourse
def get_codigo_interlegis(self, obj):
return obj.casa_legislativa.codigo_interlegis
get_codigo_interlegis.short_description = _("Código Interlegis")
get_codigo_interlegis.admin_order_field = (
"casa_legislativa__codigo_interlegis"
)
def get_uf(self, obj): def get_uf(self, obj):
return "%s" % (obj.casa_legislativa.municipio.uf) return "%s" % (obj.casa_legislativa.municipio.uf)
@ -225,87 +159,6 @@ class ServicoAdmin(CartExportMixin, admin.ModelAdmin):
"casa_legislativa__municipio__uf__codigo_ibge__exact", "casa_legislativa__municipio__uf__codigo_ibge__exact",
] ]
def add_view(self, request, form_url="", extra_context=None):
id_casa = request.GET.get("id_casa", None)
if not id_casa:
raise Http404
return super(ServicoAdmin, self).add_view(
request, form_url, extra_context=extra_context
)
def response_add(self, request, obj):
opts = obj._meta
msg = _('The %(name)s "%(obj)s" was added successfully.') % {
"name": force_str(opts.verbose_name),
"obj": force_str(obj),
}
if "_addanother" in request.POST:
self.message_user(
request,
msg
+ " "
+ (
_("You may add another %s below.")
% force_str(opts.verbose_name)
),
)
return HttpResponseRedirect(
request.path + "?id_casa=%s" % (obj.casa_legislativa.id,)
)
elif "_save" in request.POST:
self.message_user(request, msg)
return HttpResponseRedirect(
reverse(
"admin:servicos_casaatendida_change",
args=[obj.casa_legislativa.id],
)
)
return super(ServicoAdmin, self).response_add(request, obj)
def response_change(self, request, obj):
opts = obj._meta
msg = _('The %(name)s "%(obj)s" was changed successfully.') % {
"name": force_str(opts.verbose_name),
"obj": force_str(obj),
}
if "_addanother" in request.POST:
self.message_user(
request,
msg
+ " "
+ (
_("You may add another %s below.")
% force_str(opts.verbose_name)
),
)
return HttpResponseRedirect(
"../add/?id_casa=%s" % (obj.casa_legislativa.id,)
)
elif "_save" in request.POST:
self.message_user(request, msg)
return HttpResponseRedirect(
reverse(
"admin:servicos_casaatendida_change",
args=[obj.casa_legislativa.id],
)
)
return super(ServicoAdmin, self).response_change(request, obj)
def save_form(self, request, form, change):
obj = super(ServicoAdmin, self).save_form(request, form, change)
if not change:
id_casa = request.GET.get("id_casa", None)
if not id_casa:
raise Http404
obj.casa_legislativa = Orgao.objects.get(pk=id_casa)
return obj
def changelist_view(self, request, extra_context=None): def changelist_view(self, request, extra_context=None):
from sigi.apps.convenios.views import normaliza_data from sigi.apps.convenios.views import normaliza_data
@ -318,83 +171,3 @@ class ServicoAdmin(CartExportMixin, admin.ModelAdmin):
request, request,
extra_context={"query_str": "?" + request.META["QUERY_STRING"]}, extra_context={"query_str": "?" + request.META["QUERY_STRING"]},
) )
@admin.register(CasaAtendida)
class CasaAtendidaAdmin(admin.ModelAdmin):
actions = None
list_display = (
"codigo_interlegis",
"nome",
"get_servicos",
)
ordering = ["nome"]
fieldsets = (
(
"Casa Legislativa",
{
"fields": (
("codigo_interlegis", "nome"),
("logradouro", "bairro", "municipio", "cep"),
("email", "pagina_web"),
)
},
),
)
readonly_fields = ("nome", "logradouro", "bairro", "municipio", "cep")
inlines = (ContatosInline,)
list_filter = (
"tipo",
"servico__tipo_servico",
"municipio__uf__nome",
"servico__casa_legislativa__convenio__projeto",
)
search_fields = (
"search_text",
"cnpj",
"bairro",
"logradouro",
"cep",
"municipio__nome",
"municipio__uf__nome",
"municipio__codigo_ibge",
"pagina_web",
"observacoes",
)
def get_servicos(self, obj):
result = [
f"{servico.tipo_servico.nome} ({servico.status_servico}). "
f"Contato: {servico.contato_administrativo.nome}"
for servico in obj.servico_set.all()
]
return mark_safe("<ul><li>" + "</li><li>".join(result) + "</li></ul>")
get_servicos.short_description = _("Serviços")
def lookup_allowed(self, lookup, value):
return super(CasaAtendidaAdmin, self).lookup_allowed(
lookup, value
) or lookup in [
"municipio__uf__codigo_ibge__exact",
"servico__tipo_servico__id__exact",
]
def change_view(self, request, object_id, extra_context=None):
# Se a Casa ainda não é atendida, gerar o código interlegis para ela
# Assim ela passa a ser uma casa atendida
casa = Orgao.objects.get(id=object_id)
if casa.codigo_interlegis == "":
casa.gerarCodigoInterlegis()
return super(CasaAtendidaAdmin, self).change_view(
request, object_id, extra_context=extra_context
)
def has_add_permission(self, request):
return False # Nunca é permitido inserir uma nova Casa Legislativa por aqui
def has_delete_permission(self, request, obj=None):
return False # Nunca deletar casas por aqui

31
sigi/apps/servicos/forms.py

@ -1,31 +0,0 @@
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

41
sigi/apps/servicos/migrations/0010_delete_casaatendida_alter_tiposervico_options_and_more.py

@ -0,0 +1,41 @@
# Generated by Django 4.0.4 on 2022-05-16 15:22
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('servicos', '0009_alter_casamanifesta_email_alter_casamanifesta_id_and_more'),
]
operations = [
migrations.DeleteModel(
name='CasaAtendida',
),
migrations.AlterModelOptions(
name='tiposervico',
options={'verbose_name': 'tipo de serviço', 'verbose_name_plural': 'tipos de serviço'},
),
migrations.AlterField(
model_name='servico',
name='tipo_servico',
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='servicos.tiposervico', verbose_name='tipo de serviço'),
),
migrations.AlterField(
model_name='tiposervico',
name='template_email_altera',
field=models.TextField(blank=True, help_text='Use:<br/>\n {url} para incluir a URL do serviço,<br/>\n {senha} para incluir a senha inicial do serviço', verbose_name='template de email de alteração'),
),
migrations.AlterField(
model_name='tiposervico',
name='template_email_ativa',
field=models.TextField(blank=True, help_text='Use:<br/>\n {url} para incluir a URL do serviço,<br/>\n {senha} para incluir a senha inicial do serviço', verbose_name='template de email de ativação'),
),
migrations.AlterField(
model_name='tiposervico',
name='template_email_desativa',
field=models.TextField(blank=True, help_text='Use:<br/>\n {url} para incluir a URL do serviço,<br/>\n {senha} para incluir a senha inicial do serviço<br/>{motivo} para incluir o motivo da desativação do serviço', verbose_name='template de email de desativação'),
),
]

48
sigi/apps/servicos/migrations/0011_remove_servico_contato_administrativo_and_more.py

@ -0,0 +1,48 @@
# Generated by Django 4.0.4 on 2022-05-16 18:36
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('servicos', '0010_delete_casaatendida_alter_tiposervico_options_and_more'),
]
operations = [
migrations.RemoveField(
model_name='servico',
name='contato_administrativo',
),
migrations.RemoveField(
model_name='servico',
name='contato_tecnico',
),
migrations.RemoveField(
model_name='servico',
name='nome_servidor',
),
migrations.RemoveField(
model_name='servico',
name='porta_servico',
),
migrations.RemoveField(
model_name='servico',
name='senha_inicial',
),
migrations.AlterField(
model_name='tiposervico',
name='template_email_altera',
field=models.TextField(blank=True, help_text='Use a marcação {url} para incluir a URL do serviço,<br/>', verbose_name='template de email de alteração'),
),
migrations.AlterField(
model_name='tiposervico',
name='template_email_ativa',
field=models.TextField(blank=True, help_text='Use a marcação {url} para incluir a URL do serviço,<br/>', verbose_name='template de email de ativação'),
),
migrations.AlterField(
model_name='tiposervico',
name='template_email_desativa',
field=models.TextField(blank=True, help_text='Use a marcação {url} para incluir a URL do serviço,<br/><br/>{motivo} para incluir o motivo da desativação do serviço', verbose_name='template de email de desativação'),
),
]

67
sigi/apps/servicos/models.py

@ -6,9 +6,7 @@ from django.utils.translation import gettext as _
class TipoServico(models.Model): class TipoServico(models.Model):
MODO_CHOICES = (("H", _("Hospedagem")), ("R", _("Registro"))) MODO_CHOICES = (("H", _("Hospedagem")), ("R", _("Registro")))
email_help = """Use:<br/> email_help = "Use a marcação {url} para incluir a URL do serviço,<br/>"
{url} para incluir a URL do serviço,<br/>
{senha} para incluir a senha inicial do serviço"""
string_pesquisa_help = ( string_pesquisa_help = (
"Parâmetros da pesquisa para averiguar a data da " "Parâmetros da pesquisa para averiguar a data da "
"última atualização do serviço. Formato:<br/>" "última atualização do serviço. Formato:<br/>"
@ -24,13 +22,13 @@ class TipoServico(models.Model):
_("string de pesquisa"), blank=True, help_text=string_pesquisa_help _("string de pesquisa"), blank=True, help_text=string_pesquisa_help
) )
template_email_ativa = models.TextField( template_email_ativa = models.TextField(
_("Template de email de ativação"), help_text=email_help, blank=True _("template de email de ativação"), help_text=email_help, blank=True
) )
template_email_altera = models.TextField( template_email_altera = models.TextField(
_("Template de email de alteração"), help_text=email_help, blank=True _("template de email de alteração"), help_text=email_help, blank=True
) )
template_email_desativa = models.TextField( template_email_desativa = models.TextField(
_("Template de email de desativação"), _("template de email de desativação"),
help_text=email_help help_text=email_help
+ _("<br/>{motivo} para incluir o motivo da desativação do serviço"), + _("<br/>{motivo} para incluir o motivo da desativação do serviço"),
blank=True, blank=True,
@ -42,8 +40,8 @@ class TipoServico(models.Model):
return self.servico_set.filter(data_desativacao=None).count() return self.servico_set.filter(data_desativacao=None).count()
class Meta: class Meta:
verbose_name = _("Tipo de serviço") verbose_name = _("tipo de serviço")
verbose_name_plural = _("Tipos de serviço") verbose_name_plural = _("tipos de serviço")
def __str__(self): def __str__(self):
return self.nome return self.nome
@ -54,39 +52,12 @@ class Servico(models.Model):
Orgao, on_delete=models.PROTECT, verbose_name=_("Casa Legislativa") Orgao, on_delete=models.PROTECT, verbose_name=_("Casa Legislativa")
) )
tipo_servico = models.ForeignKey( tipo_servico = models.ForeignKey(
TipoServico, on_delete=models.PROTECT, verbose_name=_("Tipo de serviço") TipoServico, on_delete=models.PROTECT, verbose_name=_("tipo de serviço")
)
contato_tecnico = models.ForeignKey(
Funcionario,
on_delete=models.PROTECT,
verbose_name=_("Contato técnico"),
related_name="contato_tecnico",
)
contato_administrativo = models.ForeignKey(
Funcionario,
on_delete=models.PROTECT,
verbose_name=_("Contato administrativo"),
related_name="contato_administrativo",
) )
url = models.URLField(_("URL do serviço"), blank=True) url = models.URLField(_("URL do serviço"), blank=True)
hospedagem_interlegis = models.BooleanField( hospedagem_interlegis = models.BooleanField(
_("Hospedagem no Interlegis?"), default=False _("Hospedagem no Interlegis?"), default=False
) )
nome_servidor = models.CharField(
_("Hospedado em"),
max_length=60,
blank=True,
help_text=_(
"Se hospedado no Interlegis, informe o nome do servidor."
"<br/>Senão, informe o nome do provedor de serviços."
),
)
porta_servico = models.PositiveSmallIntegerField(
_("Porta de serviço (instância)"), blank=True, null=True
)
senha_inicial = models.CharField(
_("Senha inicial"), max_length=33, blank=True
)
data_ativacao = models.DateField(_("Data de ativação"), default=date.today) data_ativacao = models.DateField(_("Data de ativação"), default=date.today)
data_alteracao = models.DateField( data_alteracao = models.DateField(
_("Data da última alteração"), blank=True, null=True, auto_now=True _("Data da última alteração"), blank=True, null=True, auto_now=True
@ -285,10 +256,7 @@ class Servico(models.Model):
body = self.tipo_servico.template_email_desativa body = self.tipo_servico.template_email_desativa
elif ( elif (
self.tipo_servico != original.tipo_servico self.tipo_servico != original.tipo_servico
or self.contato_tecnico != original.contato_tecnico
or self.url != original.url or self.url != original.url
or self.nome_servidor != original.nome_servidor
or self.senha_inicial != original.senha_inicial
): ):
# Serviço foi alterado # Serviço foi alterado
subject = _("INTERLEGIS - Alteração de serviço %s") % ( subject = _("INTERLEGIS - Alteração de serviço %s") % (
@ -301,10 +269,8 @@ class Servico(models.Model):
return # sem enviar email return # sem enviar email
# Prepara e envia o email # Prepara e envia o email
body = ( body = body.replace("{url}", self.url).replace(
body.replace("{url}", self.url) "{motivo}", self.motivo_desativacao
.replace("{senha}", self.senha_inicial)
.replace("{motivo}", self.motivo_desativacao)
) )
# send_mail(subject, body, DEFAULT_FROM_EMAIL, \ # send_mail(subject, body, DEFAULT_FROM_EMAIL, \
@ -332,21 +298,6 @@ class LogServico(models.Model):
verbose_name_plural = _("Logs do serviço") verbose_name_plural = _("Logs do serviço")
class CasaAtendidaManager(models.Manager):
def get_queryset(self):
qs = super(CasaAtendidaManager, self).get_queryset()
qs = qs.exclude(codigo_interlegis="")
return qs
class CasaAtendida(Orgao):
class Meta:
proxy = True
verbose_name_plural = _("Casas atendidas")
objects = CasaAtendidaManager()
class CasaManifesta(models.Model): class CasaManifesta(models.Model):
casa_legislativa = models.OneToOneField(Orgao, on_delete=models.CASCADE) casa_legislativa = models.OneToOneField(Orgao, on_delete=models.CASCADE)
data_manifestacao = models.DateTimeField(auto_now_add=True) data_manifestacao = models.DateTimeField(auto_now_add=True)

166
sigi/menu_conf.yaml

@ -2,116 +2,114 @@ admin_menu:
- title: Superusuários - title: Superusuários
icon: settings icon: settings
children: children:
- title: Usuários - title: Usuários
view_name: admin:auth_user_changelist view_name: admin:auth_user_changelist
- title: Grupos - title: Grupos
view_name: admin:auth_group_changelist view_name: admin:auth_group_changelist
- title: Importar Gescon - title: Importar Gescon
view_name: importar-gescon view_name: importar-gescon
main_menu: main_menu:
- title: Municípios - title: Municípios
icon: location_city icon: location_city
children: children:
- title: Municípios - title: Municípios
view_name: admin:contatos_municipio_changelist view_name: admin:contatos_municipio_changelist
- title: Unidades Federativas - title: Unidades Federativas
view_name: admin:contatos_unidadefederativa_changelist view_name: admin:contatos_unidadefederativa_changelist
- title: Mesorregiões - title: Mesorregiões
view_name: admin:contatos_mesorregiao_changelist view_name: admin:contatos_mesorregiao_changelist
- title: Casas e órgãos - title: Casas e órgãos
icon: account_balance icon: account_balance
children: children:
- title: Todo legislativo - title: Todo legislativo
view_name: admin:casas_orgao_changelist view_name: admin:casas_orgao_changelist
querystr: tipo__legislativo__exact=1 querystr: tipo__legislativo__exact=1
- title: Câmaras Municipais - title: Câmaras Municipais
view_name: admin:casas_orgao_changelist view_name: admin:casas_orgao_changelist
querystr: tipo__sigla__exact=CM querystr: tipo__sigla__exact=CM
- title: Assembléias Legislativas - title: Assembléias Legislativas
view_name: admin:casas_orgao_changelist view_name: admin:casas_orgao_changelist
querystr: tipo__sigla__exact=AL querystr: tipo__sigla__exact=AL
- title: Demais órgãos - title: Demais órgãos
view_name: admin:casas_orgao_changelist view_name: admin:casas_orgao_changelist
querystr: tipo__legislativo__exact=0 querystr: tipo__legislativo__exact=0
- title: Gerência Interlegis - title: Gerência Interlegis
icon: people icon: people
children: children:
- title: Carteira de relacionamentos - title: Carteira de relacionamentos
view_name: view_name:
- title: Organizar relacionamentos - title: Organizar relacionamentos
view_name: view_name:
- title: Lista de gerentes - title: Lista de gerentes
view_name: view_name:
- title: Convênios - title: Convênios
icon: assignment icon: assignment
children: children:
- title: Convênios - title: Convênios
view_name: admin:convenios_convenio_changelist view_name: admin:convenios_convenio_changelist
- title: Serviços SEIT - title: Serviços SEIT
icon: cloud_done icon: cloud_done
children: children:
- title: Casas atendidas - title: Lista de serviços
view_name: admin:servicos_casaatendida_changelist view_name: admin:servicos_servico_changelist
- title: Lista de serviços
view_name: admin:servicos_servico_changelist
- title: Ocorrências - title: Ocorrências
icon: comment icon: comment
children: children:
- title: Painel de ocorrências - title: Painel de ocorrências
view_name: painel-ocorrencias view_name: painel-ocorrencias
- title: Registro de ocorrências - title: Registro de ocorrências
view_name: admin:ocorrencias_ocorrencia_changelist view_name: admin:ocorrencias_ocorrencia_changelist
querystr: minhas=S&status__in=1,2 querystr: minhas=S&status__in=1,2
- title: Eventos - title: Eventos
icon: school icon: school
children: children:
- title: Todos os eventos - title: Todos os eventos
view_name: admin:eventos_evento_changelist view_name: admin:eventos_evento_changelist
- title: Cursos - title: Cursos
view_name: admin:eventos_evento_changelist view_name: admin:eventos_evento_changelist
querystr: tipo_evento__categoria__exact=C querystr: tipo_evento__categoria__exact=C
- title: Encontros - title: Encontros
view_name: admin:eventos_evento_changelist view_name: admin:eventos_evento_changelist
querystr: tipo_evento__categoria__exact=E querystr: tipo_evento__categoria__exact=E
- title: Oficinas - title: Oficinas
view_name: admin:eventos_evento_changelist view_name: admin:eventos_evento_changelist
querystr: tipo_evento__categoria__exact=O querystr: tipo_evento__categoria__exact=O
- title: Seminários - title: Seminários
view_name: admin:eventos_evento_changelist view_name: admin:eventos_evento_changelist
querystr: tipo_evento__categoria__exact=S querystr: tipo_evento__categoria__exact=S
- title: Visitas Interlegis - title: Visitas Interlegis
view_name: admin:eventos_evento_changelist view_name: admin:eventos_evento_changelist
querystr: tipo_evento__categoria__exact=V querystr: tipo_evento__categoria__exact=V
- title: Calendário mensal - title: Calendário mensal
view_name: view_name:
- title: Alocação de equipe - title: Alocação de equipe
view_name: view_name:
- title: Servidores - title: Servidores
icon: account_circle icon: account_circle
children: children:
- title: Serviços (unidades do ILB) - title: Serviços (unidades do ILB)
view_name: admin:servidores_servico_changelist view_name: admin:servidores_servico_changelist
- title: Servidores e colaboradores - title: Servidores e colaboradores
view_name: admin:servidores_servidor_changelist view_name: admin:servidores_servidor_changelist
- title: Tabelas auxiliares - title: Tabelas auxiliares
icon: settings icon: settings
children: children:
- title: Tipos de órgãos - title: Tipos de órgãos
view_name: admin:casas_tipoorgao_changelist view_name: admin:casas_tipoorgao_changelist
- title: Acompanhamento convênios - title: Acompanhamento convênios
view_name: admin:convenios_statusconvenio_changelist view_name: admin:convenios_statusconvenio_changelist
- title: Tipos de serviço SEIT - title: Tipos de serviço SEIT
view_name: admin:servicos_tiposervico_changelist view_name: admin:servicos_tiposervico_changelist
- title: Tipos de projeto - title: Tipos de projeto
view_name: admin:convenios_projeto_changelist view_name: admin:convenios_projeto_changelist
- title: Categorias de ocorrências - title: Categorias de ocorrências
view_name: admin:ocorrencias_categoria_changelist view_name: admin:ocorrencias_categoria_changelist
- title: Tipos de contato - title: Tipos de contato
view_name: admin:ocorrencias_tipocontato_changelist view_name: admin:ocorrencias_tipocontato_changelist
- title: Tipos de evento - title: Tipos de evento
view_name: admin:eventos_tipoevento_changelist view_name: admin:eventos_tipoevento_changelist
- title: Funções na equipe de eventos - title: Funções na equipe de eventos
view_name: admin:eventos_funcao_changelist view_name: admin:eventos_funcao_changelist
- title: Modelos de declaração - title: Modelos de declaração
view_name: admin:eventos_modelodeclaracao_changelist view_name: admin:eventos_modelodeclaracao_changelist

Loading…
Cancel
Save