Browse Source

Prepara app Convenios para migração

revisaoSidenav
Sesostris Vieira 3 years ago
parent
commit
d81518b289
  1. 1
      requirements/requirements.txt
  2. 103
      sigi/apps/convenios/admin.py
  3. 6
      sigi/apps/convenios/apps.py
  4. 15
      sigi/apps/convenios/migrations/0001_initial.py
  5. 1
      sigi/apps/convenios/migrations/0002_convenio_duracao.py
  6. 3
      sigi/apps/convenios/migrations/0003_auto_20210406_1945.py
  7. 3
      sigi/apps/convenios/migrations/0004_auto_20210407_1928.py
  8. 1
      sigi/apps/convenios/migrations/0005_auto_20210409_0842.py
  9. 1
      sigi/apps/convenios/migrations/0006_auto_20210416_0841.py
  10. 1
      sigi/apps/convenios/migrations/0007_auto_20210416_0918.py
  11. 1
      sigi/apps/convenios/migrations/0008_auto_20210422_1907.py
  12. 1
      sigi/apps/convenios/migrations/0009_auto_20210611_0946.py
  13. 1
      sigi/apps/convenios/migrations/0010_auto_20210819_0833.py
  14. 1
      sigi/apps/convenios/migrations/0011_convenio_data_termino_vigencia.py
  15. 1
      sigi/apps/convenios/migrations/0012_auto_20210831_0844.py
  16. 1
      sigi/apps/convenios/migrations/0013_remove_convenio_duracao.py
  17. 1
      sigi/apps/convenios/migrations/0014_gescon.py
  18. 1
      sigi/apps/convenios/migrations/0015_remove_convenio_search_text.py
  19. 1
      sigi/apps/convenios/migrations/0016_auto_20210909_0732.py
  20. 1
      sigi/apps/convenios/migrations/0017_convenio_id_contrato_gescon.py
  21. 1
      sigi/apps/convenios/migrations/0018_auto_20211208_1256.py
  22. 93
      sigi/apps/convenios/migrations/0019_alter_anexo_arquivo_alter_anexo_descricao_and_more.py
  23. 140
      sigi/apps/convenios/models.py
  24. 1
      sigi/apps/convenios/reports.py
  25. 3
      sigi/apps/convenios/tests.py
  26. 1
      sigi/apps/convenios/urls.py
  27. 31
      sigi/apps/convenios/views.py
  28. 1
      sigi/settings/base.py

1
requirements/requirements.txt

@ -8,3 +8,4 @@ psycopg2==2.9.3
django-bootstrap5==21.3 django-bootstrap5==21.3
Pillow==9.0.0 Pillow==9.0.0
django-localflavor==3.1 django-localflavor==3.1
requests==2.27.1

103
sigi/apps/convenios/admin.py

@ -1,35 +1,23 @@
# -*- coding: utf-8 -*-
from django.contrib import admin from django.contrib import admin
from django.http import HttpResponse, HttpResponseRedirect from django.http import HttpResponse, HttpResponseRedirect
from django.utils.translation import gettext as _ from django.utils.translation import gettext as _
from geraldo.generators import PDFGenerator from django.utils.safestring import mark_safe
from sigi.apps.convenios.models import (Projeto, StatusConvenio, from sigi.apps.convenios.models import (Projeto, StatusConvenio,
TipoSolicitacao, Convenio, TipoSolicitacao, Convenio,
EquipamentoPrevisto, Anexo, Tramitacao, EquipamentoPrevisto, Anexo, Tramitacao,
Gescon) Gescon)
from sigi.apps.convenios.reports import ConvenioReport # from sigi.apps.convenios.reports import ConvenioReport
from sigi.apps.convenios.views import adicionar_convenios_carrinho # from sigi.apps.convenios.views import adicionar_convenios_carrinho
from sigi.apps.utils import queryset_ascii from sigi.apps.utils import queryset_ascii
from sigi.apps.utils.base_admin import BaseModelAdmin
from sigi.apps.servidores.models import Servidor from sigi.apps.servidores.models import Servidor
from sigi.apps.casas.admin import GerentesInterlegisFilter from sigi.apps.casas.admin import GerentesInterlegisFilter
# class TramitacaoInline(admin.TabularInline):
# model = Tramitacao
# extra = 1
class AnexosInline(admin.TabularInline): class AnexosInline(admin.TabularInline):
model = Anexo model = Anexo
extra = 2 extra = 2
exclude = ['data_pub', ] exclude = ['data_pub', ]
# class EquipamentoPrevistoInline(admin.TabularInline): class AnexoAdmin(admin.ModelAdmin):
# model = EquipamentoPrevisto
# extra = 2
# raw_id_fields = ('equipamento',)
class AnexoAdmin(BaseModelAdmin):
date_hierarchy = 'data_pub' date_hierarchy = 'data_pub'
exclude = ['data_pub', ] exclude = ['data_pub', ]
list_display = ('arquivo', 'descricao', 'data_pub', 'convenio') list_display = ('arquivo', 'descricao', 'data_pub', 'convenio')
@ -44,7 +32,8 @@ class AcompanhaFilter(admin.filters.RelatedFieldListFilter):
convenio__isnull=False).order_by('nome_completo').distinct() convenio__isnull=False).order_by('nome_completo').distinct()
self.lookup_choices = [(x.id, x) for x in servidores] self.lookup_choices = [(x.id, x) for x in servidores]
class ConvenioAdmin(BaseModelAdmin): @admin.register(Convenio)
class ConvenioAdmin(admin.ModelAdmin):
change_list_template = 'convenios/change_list.html' change_list_template = 'convenios/change_list.html'
fieldsets = ( fieldsets = (
(None, (None,
@ -65,8 +54,9 @@ class ConvenioAdmin(BaseModelAdmin):
{'fields': ('atualizacao_gescon', 'observacao_gescon', 'link_gescon')} {'fields': ('atualizacao_gescon', 'observacao_gescon', 'link_gescon')}
), ),
) )
readonly_fields = ('data_sigi', 'atualizacao_gescon', 'observacao_gescon', 'link_gescon') readonly_fields = ('data_sigi', 'atualizacao_gescon', 'observacao_gescon',
actions = ['adicionar_convenios'] 'link_gescon')
# actions = ['adicionar_convenios']
inlines = (AnexosInline,) inlines = (AnexosInline,)
list_display = ('num_convenio', 'projeto','casa_legislativa', 'get_uf', list_display = ('num_convenio', 'projeto','casa_legislativa', 'get_uf',
'status_convenio', 'link_sigad', 'data_retorno_assinatura', 'status_convenio', 'link_sigad', 'data_retorno_assinatura',
@ -76,7 +66,6 @@ class ConvenioAdmin(BaseModelAdmin):
GerentesInterlegisFilter), 'projeto', GerentesInterlegisFilter), 'projeto',
'casa_legislativa__tipo', 'conveniada','equipada', 'casa_legislativa__tipo', 'conveniada','equipada',
'casa_legislativa__municipio__uf',) 'casa_legislativa__municipio__uf',)
#date_hierarchy = 'data_adesao'
ordering = ('casa_legislativa', '-data_retorno_assinatura') ordering = ('casa_legislativa', '-data_retorno_assinatura')
raw_id_fields = ('casa_legislativa',) raw_id_fields = ('casa_legislativa',)
get_queryset = queryset_ascii get_queryset = queryset_ascii
@ -102,28 +91,24 @@ class ConvenioAdmin(BaseModelAdmin):
label = r"warning" label = r"warning"
else: else:
label = r"info" label = r"info"
return mark_safe(f'<p class="label label-{label}">{status}</p>')
return '<p class="label label-{label}">{status}</p>'.format(label=label, status=status)
status_convenio.short_description = _("Status do convênio") status_convenio.short_description = _("Status do convênio")
status_convenio.allow_tags = True
def link_sigad(self, obj): def link_sigad(self, obj):
if obj.pk is None: if obj.pk is None:
return "" return ""
return obj.get_sigad_url() return mark_safe(obj.get_sigad_url())
link_sigad.short_description = _("Processo no Senado") link_sigad.short_description = _("Processo no Senado")
link_sigad.allow_tags = True
def link_gescon(self, obj): def link_gescon(self, obj):
if not obj.id_contrato_gescon: if not obj.id_contrato_gescon:
return "" return ""
return ( return mark_safe(
"<a href='https://adm.senado.gov.br/gestao-contratos/api/" f"<a href='https://adm.senado.gov.br/gestao-contratos/api/"
"contratos/buscaTexto/{id}'>https://adm.senado.gov.br/" f"contratos/buscaTexto/{obj.id_contrato_gescon}'>"
"gestao-contratos/api/{id}</a>").format(id=obj.id_contrato_gescon) f"https://adm.senado.gov.br/gestao-contratos/api/"
f"{obj.id_contrato_gescon}</a>")
link_gescon.short_description = _("Download MINUTA ASSINADA do Gescon") link_gescon.short_description = _("Download MINUTA ASSINADA do Gescon")
link_gescon.allow_tags = True
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
@ -143,28 +128,28 @@ class ConvenioAdmin(BaseModelAdmin):
extra_context={'query_str': '?' + request.META['QUERY_STRING']} extra_context={'query_str': '?' + request.META['QUERY_STRING']}
) )
def relatorio(self, request, queryset): # def relatorio(self, request, queryset):
# queryset.order_by('casa_legislativa__municipio__uf') # # queryset.order_by('casa_legislativa__municipio__uf')
response = HttpResponse(content_type='application/pdf') # response = HttpResponse(content_type='application/pdf')
report = ConvenioReport(queryset=queryset) # report = ConvenioReport(queryset=queryset)
report.generate_by(PDFGenerator, filename=response) # report.generate_by(PDFGenerator, filename=response)
return response # return response
relatorio.short_description = _('Exportar convênios selecionados para PDF') # relatorio.short_description = _('Exportar convênios selecionados para PDF')
def adicionar_convenios(self, request, queryset): # def adicionar_convenios(self, request, queryset):
if 'carrinho_convenios' in request.session: # if 'carrinho_convenios' in request.session:
q1 = len(request.session['carrinho_convenios']) # q1 = len(request.session['carrinho_convenios'])
else: # else:
q1 = 0 # q1 = 0
adicionar_convenios_carrinho(request, queryset=queryset) # adicionar_convenios_carrinho(request, queryset=queryset)
q2 = len(request.session['carrinho_convenios']) # q2 = len(request.session['carrinho_convenios'])
quant = q2 - q1 # quant = q2 - q1
if quant: # if quant:
self.message_user(request, str(q2 - q1) + _(" Convênios adicionados no carrinho")) # self.message_user(request, str(q2 - q1) + _(" Convênios adicionados no carrinho"))
else: # else:
self.message_user(request, _("Os Convênios selecionados já foram adicionadas anteriormente")) # self.message_user(request, _("Os Convênios selecionados já foram adicionadas anteriormente"))
return HttpResponseRedirect('.') # return HttpResponseRedirect('.')
adicionar_convenios.short_description = _("Armazenar convênios no carrinho para exportar") # adicionar_convenios.short_description = _("Armazenar convênios no carrinho para exportar")
def get_actions(self, request): def get_actions(self, request):
actions = super(ConvenioAdmin, self).get_actions(request) actions = super(ConvenioAdmin, self).get_actions(request)
@ -172,12 +157,12 @@ class ConvenioAdmin(BaseModelAdmin):
del actions['delete_selected'] del actions['delete_selected']
return actions return actions
def lookup_allowed(self, lookup, value): # def lookup_allowed(self, lookup, value):
return super(ConvenioAdmin, self).lookup_allowed(lookup, value) or \ # return super(ConvenioAdmin, self).lookup_allowed(lookup, value) or \
lookup in ['casa_legislativa__municipio__uf__codigo_ibge__exact'] # lookup in ['casa_legislativa__municipio__uf__codigo_ibge__exact']
class EquipamentoPrevistoAdmin(BaseModelAdmin): @admin.register(EquipamentoPrevisto)
class EquipamentoPrevistoAdmin(admin.ModelAdmin):
list_display = ('convenio', 'equipamento', 'quantidade') list_display = ('convenio', 'equipamento', 'quantidade')
list_display_links = ('convenio', 'equipamento') list_display_links = ('convenio', 'equipamento')
ordering = ('convenio', 'equipamento') ordering = ('convenio', 'equipamento')
@ -193,5 +178,3 @@ class GesconAdmin(admin.ModelAdmin):
admin.site.register(Projeto) admin.site.register(Projeto)
admin.site.register(StatusConvenio) admin.site.register(StatusConvenio)
admin.site.register(TipoSolicitacao) admin.site.register(TipoSolicitacao)
admin.site.register(Convenio, ConvenioAdmin)
admin.site.register(EquipamentoPrevisto, EquipamentoPrevistoAdmin)

6
sigi/apps/convenios/apps.py

@ -0,0 +1,6 @@
from django.apps import AppConfig
from django.utils.translation import gettext_lazy as _
class ConveniosConfig(AppConfig):
name = 'sigi.apps.convenios'
verbose_name = _('convênios')

15
sigi/apps/convenios/migrations/0001_initial.py

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import models, migrations from django.db import models, migrations
@ -45,7 +44,7 @@ class Migration(migrations.Migration):
('observacao', models.CharField(max_length=100, null=True, blank=True)), ('observacao', models.CharField(max_length=100, null=True, blank=True)),
('conveniada', models.BooleanField(default=False)), ('conveniada', models.BooleanField(default=False)),
('equipada', models.BooleanField(default=False)), ('equipada', models.BooleanField(default=False)),
('casa_legislativa', models.ForeignKey(verbose_name='Casa Legislativa', to='casas.CasaLegislativa')), ('casa_legislativa', models.ForeignKey(verbose_name='Casa Legislativa', to='casas.CasaLegislativa', on_delete=models.CASCADE)),
], ],
options={ options={
'ordering': ('id',), 'ordering': ('id',),
@ -59,8 +58,8 @@ class Migration(migrations.Migration):
fields=[ fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('quantidade', models.PositiveSmallIntegerField(default=1)), ('quantidade', models.PositiveSmallIntegerField(default=1)),
('convenio', models.ForeignKey(verbose_name='conv\xeanio', to='convenios.Convenio')), ('convenio', models.ForeignKey(verbose_name='conv\xeanio', to='convenios.Convenio', on_delete=models.CASCADE)),
('equipamento', models.ForeignKey(to='inventario.Equipamento')), ('equipamento', models.ForeignKey(to='inventario.Equipamento', on_delete=models.CASCADE)),
], ],
options={ options={
'verbose_name': 'equipamento previsto', 'verbose_name': 'equipamento previsto',
@ -85,7 +84,7 @@ class Migration(migrations.Migration):
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('data', models.DateField()), ('data', models.DateField()),
('observacao', models.CharField(max_length=b'512', null=True, verbose_name='observa\xe7\xe3o', blank=True)), ('observacao', models.CharField(max_length=b'512', null=True, verbose_name='observa\xe7\xe3o', blank=True)),
('convenio', models.ForeignKey(verbose_name='conv\xeanio', to='convenios.Convenio')), ('convenio', models.ForeignKey(verbose_name='conv\xeanio', to='convenios.Convenio', on_delete=models.CASCADE)),
], ],
options={ options={
'verbose_name_plural': 'Tramita\xe7\xf5es', 'verbose_name_plural': 'Tramita\xe7\xf5es',
@ -106,19 +105,19 @@ class Migration(migrations.Migration):
migrations.AddField( migrations.AddField(
model_name='tramitacao', model_name='tramitacao',
name='unid_admin', name='unid_admin',
field=models.ForeignKey(verbose_name='Unidade Administrativa', to='convenios.UnidadeAdministrativa'), field=models.ForeignKey(verbose_name='Unidade Administrativa', to='convenios.UnidadeAdministrativa', on_delete=models.CASCADE),
preserve_default=True, preserve_default=True,
), ),
migrations.AddField( migrations.AddField(
model_name='convenio', model_name='convenio',
name='projeto', name='projeto',
field=models.ForeignKey(to='convenios.Projeto'), field=models.ForeignKey(to='convenios.Projeto', on_delete=models.CASCADE),
preserve_default=True, preserve_default=True,
), ),
migrations.AddField( migrations.AddField(
model_name='anexo', model_name='anexo',
name='convenio', name='convenio',
field=models.ForeignKey(verbose_name='conv\xeanio', to='convenios.Convenio'), field=models.ForeignKey(verbose_name='conv\xeanio', to='convenios.Convenio', on_delete=models.CASCADE),
preserve_default=True, preserve_default=True,
), ),
] ]

1
sigi/apps/convenios/migrations/0002_convenio_duracao.py

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import models, migrations from django.db import models, migrations

3
sigi/apps/convenios/migrations/0003_auto_20210406_1945.py

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import models, migrations from django.db import models, migrations
@ -15,7 +14,7 @@ class Migration(migrations.Migration):
migrations.AlterField( migrations.AlterField(
model_name='convenio', model_name='convenio',
name='casa_legislativa', name='casa_legislativa',
field=models.ForeignKey(verbose_name='Casa Legislativa', to='casas.Orgao'), field=models.ForeignKey(verbose_name='Casa Legislativa', to='casas.Orgao', on_delete=models.CASCADE),
preserve_default=True, preserve_default=True,
), ),
] ]

3
sigi/apps/convenios/migrations/0004_auto_20210407_1928.py

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import models, migrations from django.db import models, migrations
@ -42,7 +41,7 @@ class Migration(migrations.Migration):
migrations.AlterField( migrations.AlterField(
model_name='convenio', model_name='convenio',
name='casa_legislativa', name='casa_legislativa',
field=models.ForeignKey(verbose_name='\xf3rg\xe3o conveniado', to='casas.Orgao'), field=models.ForeignKey(verbose_name='\xf3rg\xe3o conveniado', to='casas.Orgao', on_delete=models.CASCADE),
preserve_default=True, preserve_default=True,
), ),
migrations.AlterField( migrations.AlterField(

1
sigi/apps/convenios/migrations/0005_auto_20210409_0842.py

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import models, migrations from django.db import models, migrations

1
sigi/apps/convenios/migrations/0006_auto_20210416_0841.py

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import models, migrations from django.db import models, migrations

1
sigi/apps/convenios/migrations/0007_auto_20210416_0918.py

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import models, migrations from django.db import models, migrations

1
sigi/apps/convenios/migrations/0008_auto_20210422_1907.py

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import models, migrations from django.db import models, migrations

1
sigi/apps/convenios/migrations/0009_auto_20210611_0946.py

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import models, migrations from django.db import models, migrations

1
sigi/apps/convenios/migrations/0010_auto_20210819_0833.py

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import models, migrations from django.db import models, migrations

1
sigi/apps/convenios/migrations/0011_convenio_data_termino_vigencia.py

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import models, migrations from django.db import models, migrations

1
sigi/apps/convenios/migrations/0012_auto_20210831_0844.py

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals from __future__ import unicode_literals
from datetime import date from datetime import date
from django.db import models, migrations from django.db import models, migrations

1
sigi/apps/convenios/migrations/0013_remove_convenio_duracao.py

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import models, migrations from django.db import models, migrations

1
sigi/apps/convenios/migrations/0014_gescon.py

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import models, migrations from django.db import models, migrations

1
sigi/apps/convenios/migrations/0015_remove_convenio_search_text.py

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import models, migrations from django.db import models, migrations

1
sigi/apps/convenios/migrations/0016_auto_20210909_0732.py

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import models, migrations from django.db import models, migrations

1
sigi/apps/convenios/migrations/0017_convenio_id_contrato_gescon.py

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import models, migrations from django.db import models, migrations

1
sigi/apps/convenios/migrations/0018_auto_20211208_1256.py

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import models, migrations from django.db import models, migrations

93
sigi/apps/convenios/migrations/0019_alter_anexo_arquivo_alter_anexo_descricao_and_more.py

@ -0,0 +1,93 @@
# Generated by Django 4.0.1 on 2022-01-12 17:40
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('convenios', '0018_auto_20211208_1256'),
]
operations = [
migrations.AlterField(
model_name='anexo',
name='arquivo',
field=models.FileField(max_length=500, upload_to='apps/convenios/anexo/arquivo'),
),
migrations.AlterField(
model_name='anexo',
name='descricao',
field=models.CharField(max_length=70, verbose_name='descrição'),
),
migrations.AlterField(
model_name='anexo',
name='id',
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
migrations.AlterField(
model_name='convenio',
name='id',
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
migrations.AlterField(
model_name='convenio',
name='id_contrato_gescon',
field=models.CharField(blank=True, default='', editable=False, max_length=20, verbose_name='ID do contrato no Gescon'),
),
migrations.AlterField(
model_name='equipamentoprevisto',
name='id',
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
migrations.AlterField(
model_name='gescon',
name='email',
field=models.EmailField(help_text='Caixa de e-mail para onde o relatório diário de importação será enviado.', max_length=254, verbose_name='E-mail'),
),
migrations.AlterField(
model_name='gescon',
name='id',
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
migrations.AlterField(
model_name='projeto',
name='id',
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
migrations.AlterField(
model_name='statusconvenio',
name='id',
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
migrations.AlterField(
model_name='tiposolicitacao',
name='id',
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
migrations.AlterField(
model_name='tramitacao',
name='id',
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
migrations.AlterField(
model_name='tramitacao',
name='observacao',
field=models.CharField(blank=True, max_length=512, null=True, verbose_name='observação'),
),
migrations.AlterField(
model_name='unidadeadministrativa',
name='id',
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
migrations.AlterField(
model_name='unidadeadministrativa',
name='nome',
field=models.CharField(max_length=100),
),
migrations.AlterField(
model_name='unidadeadministrativa',
name='sigla',
field=models.CharField(max_length=10),
),
]

140
sigi/apps/convenios/models.py

@ -1,24 +1,21 @@
#-*- coding: utf-8 -*-
import re import re
import requests import requests
from datetime import datetime, date from datetime import datetime, date
from django.db import models from django.db import models
from django.db.models import Q, fields from django.db.models import Q, fields
from django.core.mail import send_mail from django.core.mail import send_mail
from django.core.urlresolvers import reverse from django.urls import reverse
from django.utils.translation import gettext as _ from django.utils.translation import gettext as _
from sigi.apps.utils import SearchField, to_ascii from sigi.apps.utils import to_ascii
from sigi.apps.casas.models import Orgao from sigi.apps.casas.models import Orgao
from sigi.apps.servidores.models import Servidor, Servico from sigi.apps.servidores.models import Servidor, Servico
class Projeto(models.Model): class Projeto(models.Model):
""" Modelo para representar os projetos do programa
Interlegis
"""
nome = models.CharField(max_length=50) nome = models.CharField(max_length=50)
sigla = models.CharField(max_length=10) sigla = models.CharField(max_length=10)
def __unicode__(self): def __str__(self):
return self.sigla return self.sigla
class Meta: class Meta:
@ -33,7 +30,7 @@ class StatusConvenio(models.Model):
verbose_name = _("Estado de convenios") verbose_name = _("Estado de convenios")
verbose_name_plural = _("Estados de convenios") verbose_name_plural = _("Estados de convenios")
def __unicode__(self): def __str__(self):
return self.nome return self.nome
class TipoSolicitacao(models.Model): class TipoSolicitacao(models.Model):
@ -44,7 +41,7 @@ class TipoSolicitacao(models.Model):
verbose_name = _("tipo de solicitação") verbose_name = _("tipo de solicitação")
verbose_name_plural = _("Tipos de solicitação") verbose_name_plural = _("Tipos de solicitação")
def __unicode__(self): def __str__(self):
return self.nome return self.nome
class Convenio(models.Model): class Convenio(models.Model):
@ -53,7 +50,6 @@ class Convenio(models.Model):
on_delete=models.PROTECT, on_delete=models.PROTECT,
verbose_name=_('órgão conveniado') verbose_name=_('órgão conveniado')
) )
# campo de busca em caixa baixa e sem acentos
projeto = models.ForeignKey( projeto = models.ForeignKey(
Projeto, Projeto,
on_delete=models.PROTECT, on_delete=models.PROTECT,
@ -225,21 +221,19 @@ class Convenio(models.Model):
return "" return ""
return obj.get_sigad_url() return obj.get_sigad_url()
link_sigad.short_description = _("Processo no Senado")
link_sigad.allow_tags = True
def get_sigad_url(self): def get_sigad_url(self):
m = re.match( m = re.match(
r'(?P<orgao>00100|00200)\.(?P<sequencial>\d{6})/(?P<ano>\d{4})-\d{2}', r'(?P<orgao>00100|00200)\.(?P<sequencial>\d{6})/(?P<ano>\d{4})-\d{2}',
self.num_processo_sf self.num_processo_sf
) )
if m: if m:
return (r'<a href="https://intra.senado.leg.br/' orgao, sequencial, ano = m.groups()
r'sigad/novo/protocolo/impressao.asp?area=processo' return (
r'&txt_numero_orgao={orgao}' f'<a href="https://intra.senado.leg.br/sigad/novo/protocolo/'
r'&txt_numero_sequencial={sequencial}' f'impressao.asp?area=processo&txt_numero_orgao={orgao}'
r'&txt_numero_ano={ano}"' f'&txt_numero_sequencial={sequencial}&txt_numero_ano={ano}" '
r' target="_blank">{processo}</a>').format(processo=self.num_processo_sf,**m.groupdict()) f'target="_blank">{self.num_processo_sf}</a>'
)
return self.num_processo_sf return self.num_processo_sf
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
@ -252,55 +246,35 @@ class Convenio(models.Model):
ordering = ('id',) ordering = ('id',)
verbose_name = _('convênio') verbose_name = _('convênio')
def __unicode__(self): def __str__(self):
# if self.data_retorno_assinatura is not None: from django.conf import settings
# return _("Convênio {project} nº {number} assinado em {date}. Status: {status}".format( SDF = settings.SHORT_DATE_FORMAT
# number=self.num_convenio, number = self.num_convenio
# project=self.projeto.sigla, project=self.projeto.sigla
# date=self.data_retorno_assinatura,
# status=self.get_status()))
# else:
# return _("Adesão ao projeto %(project)s, em %(date)s") % dict(
# project=self.projeto.sigla,
# date=self.data_adesao)
if ((self.data_retorno_assinatura is None) and if ((self.data_retorno_assinatura is None) and
(self.equipada and self.data_termo_aceite is not None)): (self.equipada and self.data_termo_aceite is not None)):
return _("{project}{number} - equipada em {date}" date=self.data_termo_aceite.strftime(SDF)
).format(number=self.num_convenio, return _(f"{project}{number} - equipada em {date}")
date=self.data_termo_aceite.strftime('%d/%m/%Y'),
project=self.projeto.sigla)
elif self.data_retorno_assinatura is None: elif self.data_retorno_assinatura is None:
return _("{project}, nº {number}, início " date = self.data_adesao.strftime(SDF) if self.data_adesao else ""
"em {date}").format(number=self.num_convenio, return _(f"{project}, nº {number}, início em {date}")
project=self.projeto.sigla,
date=self.data_adesao)
if ((self.data_retorno_assinatura is not None) and not if ((self.data_retorno_assinatura is not None) and not
(self.equipada and self.data_termo_aceite is not None)): (self.equipada and self.data_termo_aceite is not None)):
return _("{project}, nº {number}, inicio em " date=self.data_retorno_assinatura.strftime(SDF)
"{date}. Status: {status}").format( status=self.get_status()
number=self.num_convenio, return _(
project=self.projeto.sigla, f"{project}, nº {number}, inicio em {date}. Status: {status}"
date=self.data_retorno_assinatura.strftime('%d/%m/%Y'), )
status=self.get_status())
if ((self.data_retorno_assinatura is not None) and if ((self.data_retorno_assinatura is not None) and
(self.equipada and self.data_termo_aceite is not None)): (self.equipada and self.data_termo_aceite is not None)):
return _("{project}, nº {number}, início em {date}" date=self.data_retorno_assinatura.strftime(SDF)
" e equipada em {equipped_date}. Status: {status}" equipped_date=self.data_termo_aceite.strftime(SDF)
).format(number=self.num_convenio, return _(
project=self.projeto.sigla, f"{project}, nº {number}, início em {date} e equipada em "
date=self.data_retorno_assinatura.strftime( f"{equipped_date}. Status: {self.get_status()}"
'%d/%m/%Y'), )
equipped_date=self.data_termo_aceite.strftime(
'%d/%m/%Y'),
status=self.get_status())
class EquipamentoPrevisto(models.Model): class EquipamentoPrevisto(models.Model):
""" Modelo utilizado para registrar os equipamentos
disponibilizados para as Casas Legislativas
(foi usado na prmeira etapa do programa)
"""
convenio = models.ForeignKey( convenio = models.ForeignKey(
Convenio, Convenio,
on_delete=models.CASCADE, on_delete=models.CASCADE,
@ -316,15 +290,10 @@ class EquipamentoPrevisto(models.Model):
verbose_name = _('equipamento previsto') verbose_name = _('equipamento previsto')
verbose_name_plural = _('equipamentos previstos') verbose_name_plural = _('equipamentos previstos')
def __unicode__(self): def __str__(self):
return '%s %s(s)' % (self.quantidade, self.equipamento) return _(f"{self.quantidade} {self.equipamento}(s)")
class Anexo(models.Model): class Anexo(models.Model):
""" Modelo para giardar os documentos gerados
no processo de convênio
"""
convenio = models.ForeignKey( convenio = models.ForeignKey(
Convenio, Convenio,
on_delete=models.CASCADE, on_delete=models.CASCADE,
@ -332,7 +301,7 @@ class Anexo(models.Model):
) )
# caminho no sistema para o documento anexo # caminho no sistema para o documento anexo
arquivo = models.FileField(upload_to='apps/convenios/anexo/arquivo', max_length=500) arquivo = models.FileField(upload_to='apps/convenios/anexo/arquivo', max_length=500)
descricao = models.CharField(_('descrição'), max_length='70') descricao = models.CharField(_('descrição'), max_length=70)
data_pub = models.DateTimeField( data_pub = models.DateTimeField(
_('data da publicação do anexo'), _('data da publicação do anexo'),
default=datetime.now default=datetime.now
@ -341,28 +310,17 @@ class Anexo(models.Model):
class Meta: class Meta:
ordering = ('-data_pub',) ordering = ('-data_pub',)
def __unicode__(self): def __str__(self):
return unicode("%s publicado em %s" % (self.descricao, self.data_pub)) return _(f"{self.descricao} publicado em {self.data_pub}")
class UnidadeAdministrativa(models.Model): class UnidadeAdministrativa(models.Model):
sigla = models.CharField(max_length=10)
nome = models.CharField(max_length=100)
""" Modelo para representar uma Unidade Administrativa def __str__(self):
que pode ser um servivo do próprio Interlegis, assim como return self.sigla
uma unidade do Senado Federal
"""
sigla = models.CharField(max_length='10')
nome = models.CharField(max_length='100')
def __unicode__(self):
return unicode(self.sigla)
class Tramitacao(models.Model): class Tramitacao(models.Model):
""" Modelo para registrar as vias do processo de convênio e a Unidade
responsável pelo tramite (ex. colher assinaturas do secretário do senado)
"""
convenio = models.ForeignKey( convenio = models.ForeignKey(
Convenio, Convenio,
on_delete=models.CASCADE, on_delete=models.CASCADE,
@ -376,7 +334,7 @@ class Tramitacao(models.Model):
data = models.DateField() data = models.DateField()
observacao = models.CharField( observacao = models.CharField(
_('observação'), _('observação'),
max_length='512', max_length=512,
null=True, null=True,
blank=True, blank=True,
) )
@ -384,12 +342,12 @@ class Tramitacao(models.Model):
class Meta: class Meta:
verbose_name_plural = _('Tramitações') verbose_name_plural = _('Tramitações')
def __unicode__(self): def __str__(self):
in_date = _("em %(date)s") % dict(date=self.data) # for focused translation in_date = _(f"em {self.data}") # for focused translation
result = "%s %s" % (self.unid_admin, in_date) result = f"{self.unid_admin} {in_date}"
if self.observacao: if self.observacao:
result = result + " (%s)" % (self.observacao) result = f"{result} ({self.observacao})"
return unicode(result) # XXX is this unicode(...) really necessary??? return result
class Gescon(models.Model): class Gescon(models.Model):
url_gescon = models.URLField( url_gescon = models.URLField(
@ -435,7 +393,7 @@ class Gescon(models.Model):
verbose_name = _("Configuração do Gescon") verbose_name = _("Configuração do Gescon")
verbose_name_plural = _("Configurações do Gescon") verbose_name_plural = _("Configurações do Gescon")
def __unicode__(self): def __str__(self):
return self.url_gescon return self.url_gescon
def save(self, *args, **kwargs): def save(self, *args, **kwargs):

1
sigi/apps/convenios/reports.py

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
from django.utils.translation import gettext as _ from django.utils.translation import gettext as _
from geraldo import ReportBand, ObjectValue, Label, ReportGroup, FIELD_ACTION_SUM from geraldo import ReportBand, ObjectValue, Label, ReportGroup, FIELD_ACTION_SUM
from reportlab.lib.units import cm from reportlab.lib.units import cm

3
sigi/apps/convenios/tests.py

@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

1
sigi/apps/convenios/urls.py

@ -1,4 +1,3 @@
# coding: utf-8
from django.conf.urls import patterns, url from django.conf.urls import patterns, url

31
sigi/apps/convenios/views.py

@ -1,30 +1,29 @@
#-*- coding:utf-8 -*-
import csv import csv
import datetime import datetime
from django.contrib import messages from django.contrib import messages
from django.http.response import HttpResponseForbidden from django.http.response import HttpResponseForbidden
import ho.pisa as pisa # import ho.pisa as pisa
from django.conf import settings from django.conf import settings
from django.core.paginator import Paginator, InvalidPage, EmptyPage from django.core.paginator import Paginator, InvalidPage, EmptyPage
from django.http import HttpResponse, HttpResponseRedirect from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import render, get_list_or_404 from django.shortcuts import render, get_list_or_404
from django.template import Context, loader from django.template import Context, loader
from django.utils.translation import gettext as _ from django.utils.translation import gettext as _
from geraldo.generators import PDFGenerator # from geraldo.generators import PDFGenerator
from django.contrib.auth.decorators import login_required
from sigi.apps.casas.models import Orgao from sigi.apps.casas.models import Orgao
from sigi.apps.contatos.models import UnidadeFederativa from sigi.apps.contatos.models import UnidadeFederativa
from sigi.apps.convenios.models import Convenio, Gescon, Projeto from sigi.apps.convenios.models import Convenio, Gescon, Projeto
from sigi.apps.convenios.reports import (ConvenioReport, # from sigi.apps.convenios.reports import (ConvenioReport,
ConvenioReportSemAceite, # ConvenioReportSemAceite,
ConvenioPorCMReport, # ConvenioPorCMReport,
ConvenioPorALReport, # ConvenioPorALReport,
ConvenioReportSemAceiteAL, # ConvenioReportSemAceiteAL,
ConvenioReportSemAceiteCM) # ConvenioReportSemAceiteCM)
from django.contrib.auth.decorators import login_required
"""
def query_ordena(qs, o, ot): def query_ordena(qs, o, ot):
list_display = ('num_convenio', 'casa_legislativa', list_display = ('num_convenio', 'casa_legislativa',
'data_adesao', 'data_retorno_assinatura', 'data_termo_aceite', 'data_adesao', 'data_retorno_assinatura', 'data_termo_aceite',
@ -37,7 +36,7 @@ def query_ordena(qs, o, ot):
else: else:
qs = qs.order_by("-" + aux) qs = qs.order_by("-" + aux)
return qs return qs
"""
def normaliza_data(get, nome_param): def normaliza_data(get, nome_param):
import re import re
if nome_param in get: if nome_param in get:
@ -50,7 +49,7 @@ def normaliza_data(get, nome_param):
elif re.match('^\d*\D\d*$', value): # Year and month elif re.match('^\d*\D\d*$', value): # Year and month
# Complete with 1st day of month # Complete with 1st day of month
get[nome_param] = '%s-01' % value get[nome_param] = '%s-01' % value
"""
def get_for_qs(get, qs): def get_for_qs(get, qs):
kwargs = {} kwargs = {}
ids = 0 ids = 0
@ -82,9 +81,6 @@ def get_for_qs(get, qs):
def carrinhoOrGet_for_qs(request): def carrinhoOrGet_for_qs(request):
"""
Verifica se existe convênios na sessão se não verifica get e retorna qs correspondente.
"""
if 'carrinho_convenios' in request.session: if 'carrinho_convenios' in request.session:
ids = request.session['carrinho_convenios'] ids = request.session['carrinho_convenios']
qs = Convenio.objects.filter(pk__in=ids) qs = Convenio.objects.filter(pk__in=ids)
@ -388,3 +384,4 @@ def importar_gescon(request):
gescon.importa_contratos() gescon.importa_contratos()
return render(request, "convenios/importar_gescon.html", {'gescon': gescon}) return render(request, "convenios/importar_gescon.html", {'gescon': gescon})
"""

1
sigi/settings/base.py

@ -22,6 +22,7 @@ INSTALLED_APPS = [
'sigi.apps.servidores', 'sigi.apps.servidores',
'sigi.apps.contatos', 'sigi.apps.contatos',
'sigi.apps.casas', 'sigi.apps.casas',
'sigi.apps.convenios',
'sigi.apps.inventario', 'sigi.apps.inventario',
'django_bootstrap5', 'django_bootstrap5',
'localflavor', 'localflavor',

Loading…
Cancel
Save