diff --git a/sapl/protocoloadm/forms.py b/sapl/protocoloadm/forms.py index 3ee1599fa..53b336d12 100644 --- a/sapl/protocoloadm/forms.py +++ b/sapl/protocoloadm/forms.py @@ -554,14 +554,39 @@ class DocumentoAdministrativoForm(ModelForm): 'data_fim_prazo', 'observacao', 'texto_integral', + 'protocolo', ] + widgets = {'protocolo': forms.HiddenInput()} + + def clean(self): + numero_protocolo = self.data['numero_protocolo'] + ano = self.data['ano'] + + if numero_protocolo and ano: + try: + self.fields['protocolo'].initial = Protocolo.objects.get( + numero=numero_protocolo, + ano=ano).pk + except ObjectDoesNotExist: + msg = _('Protocolo %s/%s inexistente' % ( + numero_protocolo, ano)) + raise ValidationError(str(msg)) + + return self.cleaned_data + def save(self, commit=True): - documento = super(DocumentoAdministrativoForm, self).save(commit) + documento = super(DocumentoAdministrativoForm, self).save(False) + + if self.fields['protocolo'].initial: + documento.protocolo = Protocolo.objects.get( + id=int(self.fields['protocolo'].initial)) + + documento.save() + return documento def __init__(self, *args, **kwargs): - row1 = to_row( [('tipo', 4), ('numero', 4), ('ano', 4)]) diff --git a/sapl/protocoloadm/migrations/0012_auto_20170315_1211.py b/sapl/protocoloadm/migrations/0012_auto_20170315_1211.py new file mode 100644 index 000000000..25ffbdf7b --- /dev/null +++ b/sapl/protocoloadm/migrations/0012_auto_20170315_1211.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2017-03-15 12:11 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('protocoloadm', '0011_merge'), + ] + + operations = [ + migrations.AddField( + model_name='documentoadministrativo', + name='protocolo', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='protocoloadm.Protocolo'), + ), + migrations.AlterField( + model_name='documentoadministrativo', + name='observacao', + field=models.TextField(blank=True, null=True, verbose_name='Observação'), + ), + ] diff --git a/sapl/protocoloadm/models.py b/sapl/protocoloadm/models.py index 78cfc7fd3..4f6014733 100644 --- a/sapl/protocoloadm/models.py +++ b/sapl/protocoloadm/models.py @@ -47,6 +47,59 @@ def texto_upload_path(instance, filename): """ +@reversion.register() +class Protocolo(models.Model): + numero = models.PositiveIntegerField( + blank=False, null=False, verbose_name=_('Número de Protocolo')) + ano = models.PositiveSmallIntegerField(blank=False, + null=False, + choices=RANGE_ANOS, + verbose_name=_('Ano do Protocolo')) + data = models.DateField() + hora = models.TimeField() + # TODO transformar campo timestamp em auto_now_add + timestamp = models.DateTimeField() + tipo_protocolo = models.PositiveIntegerField( + blank=True, null=True, verbose_name=_('Tipo de Protocolo')) + tipo_processo = models.PositiveIntegerField() + interessado = models.CharField( + max_length=60, blank=True, verbose_name=_('Interessado')) + autor = models.ForeignKey(Autor, blank=True, null=True) + assunto_ementa = models.TextField(blank=True) + tipo_documento = models.ForeignKey( + TipoDocumentoAdministrativo, + blank=True, + null=True, + verbose_name=_('Tipo de documento')) + tipo_materia = models.ForeignKey( + TipoMateriaLegislativa, + blank=True, + null=True, + verbose_name=_('Tipo Matéria')) + numero_paginas = models.PositiveIntegerField( + blank=True, null=True, verbose_name=_('Número de Páginas')) + observacao = models.TextField( + blank=True, verbose_name=_('Observação')) + anulado = models.BooleanField() + user_anulacao = models.CharField(max_length=20, blank=True) + ip_anulacao = models.CharField(max_length=15, blank=True) + justificativa_anulacao = models.CharField( + max_length=60, blank=True, verbose_name='Motivo') + timestamp_anulacao = models.DateTimeField(blank=True, null=True) + + class Meta: + verbose_name = _('Protocolo') + verbose_name_plural = _('Protocolos') + permissions = ( + ('action_anular_protocolo', _('Permissão para Anular Protocolo')), + ) + + def __str__(self): + return _('%(numero)s/%(ano)s') % { + 'numero': self.numero, 'ano': self.ano + } + + @reversion.register() class DocumentoAdministrativo(models.Model): tipo = models.ForeignKey( @@ -54,6 +107,10 @@ class DocumentoAdministrativo(models.Model): numero = models.PositiveIntegerField(verbose_name=_('Número')) ano = models.PositiveSmallIntegerField(verbose_name=_('Ano'), choices=RANGE_ANOS) + protocolo = models.ForeignKey( + Protocolo, + blank=True, + null=True) data = models.DateField(verbose_name=_('Data')) numero_protocolo = models.PositiveIntegerField( blank=True, null=True, verbose_name=_('Núm. Protocolo')) @@ -160,54 +217,6 @@ class DocumentoAcessorioAdministrativo(models.Model): update_fields=update_fields) -@reversion.register() -class Protocolo(models.Model): - numero = models.PositiveIntegerField( - blank=False, null=False, verbose_name=_('Número de Protocolo')) - ano = models.PositiveSmallIntegerField(blank=False, - null=False, - choices=RANGE_ANOS, - verbose_name=_('Ano do Protocolo')) - data = models.DateField() - hora = models.TimeField() - # TODO transformar campo timestamp em auto_now_add - timestamp = models.DateTimeField() - tipo_protocolo = models.PositiveIntegerField( - blank=True, null=True, verbose_name=_('Tipo de Protocolo')) - tipo_processo = models.PositiveIntegerField() - interessado = models.CharField( - max_length=60, blank=True, verbose_name=_('Interessado')) - autor = models.ForeignKey(Autor, blank=True, null=True) - assunto_ementa = models.TextField(blank=True) - tipo_documento = models.ForeignKey( - TipoDocumentoAdministrativo, - blank=True, - null=True, - verbose_name=_('Tipo de documento')) - tipo_materia = models.ForeignKey( - TipoMateriaLegislativa, - blank=True, - null=True, - verbose_name=_('Tipo Matéria')) - numero_paginas = models.PositiveIntegerField( - blank=True, null=True, verbose_name=_('Número de Páginas')) - observacao = models.TextField( - blank=True, verbose_name=_('Observação')) - anulado = models.BooleanField() - user_anulacao = models.CharField(max_length=20, blank=True) - ip_anulacao = models.CharField(max_length=15, blank=True) - justificativa_anulacao = models.CharField( - max_length=60, blank=True, verbose_name='Motivo') - timestamp_anulacao = models.DateTimeField(blank=True, null=True) - - class Meta: - verbose_name = _('Protocolo') - verbose_name_plural = _('Protocolos') - permissions = ( - ('action_anular_protocolo', _('Permissão para Anular Protocolo')), - ) - - @reversion.register() class StatusTramitacaoAdministrativo(models.Model): INDICADOR_CHOICES = Choices( diff --git a/sapl/protocoloadm/views.py b/sapl/protocoloadm/views.py index a854040a9..7fd906f1c 100644 --- a/sapl/protocoloadm/views.py +++ b/sapl/protocoloadm/views.py @@ -93,6 +93,12 @@ class DocumentoAdministrativoCrud(Crud): class ListView(DocumentoAdministrativoMixin, Crud.ListView): pass + class CreateView(DocumentoAdministrativoMixin, Crud.CreateView): + form_class = DocumentoAdministrativoForm + + class UpdateView(DocumentoAdministrativoMixin, Crud.UpdateView): + form_class = DocumentoAdministrativoForm + class DetailView(DocumentoAdministrativoMixin, Crud.DetailView): def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) @@ -322,14 +328,10 @@ class ProtocoloMostrarView(PermissionRequiredMixin, TemplateView): context['materia'] = None else: context['materia'] = materia + elif protocolo.tipo_documento: - try: - documentos = DocumentoAdministrativo.objects.filter( - numero_protocolo=protocolo.numero, ano=protocolo.ano) - except ObjectDoesNotExist: - context['documentos'] = None - else: - context['documentos'] = documentos + context[ + 'documentos'] = protocolo.documentoadministrativo_set.all().order_by('-ano', '-numero') context['protocolo'] = protocolo return context diff --git a/sapl/templates/protocoloadm/documentoadministrativo_filter.html b/sapl/templates/protocoloadm/documentoadministrativo_filter.html index 3559b5d56..978e63416 100644 --- a/sapl/templates/protocoloadm/documentoadministrativo_filter.html +++ b/sapl/templates/protocoloadm/documentoadministrativo_filter.html @@ -39,6 +39,10 @@ {{d.tipo.sigla}} {{d.numero}}/{{d.ano}} - {{d.tipo}}
Interessado: {{ d.interessado|default_if_none:"Não Informado"}}
Assunto: {{ d.assunto|safe }}
+ + {% if d.protocolo %} + Protocolo: {{ d.protocolo}}
+ {% endif %} {% endfor %} diff --git a/scripts/fk_protocoloadm_docadm.py b/scripts/fk_protocoloadm_docadm.py new file mode 100644 index 000000000..cb66a74bd --- /dev/null +++ b/scripts/fk_protocoloadm_docadm.py @@ -0,0 +1,22 @@ +# Esse script foi feito para substituir a referência a Protocolo +# em algum Documento, que antes era numero e ano, para uma FK + + +from django.core.exceptions import ObjectDoesNotExist +from sapl.protocoloadm.models import DocumentoAdministrativo, Protocolo + + +def substitui(): + for d in DocumentoAdministrativo.objects.all(): + if d.numero_protocolo: + try: + d.protocolo = Protocolo.objects.get( + ano=d.ano, + numero=d.numero_protocolo) + d.save() + except ObjectDoesNotExist: + return + + +if __name__ == '__main__': + substitui()