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()