Browse Source

Fix #939 fk protocoloadm em docadm (#940)

* Coloca FK para ProtocoloAdm em DocAdm e faz script de substituicao

* Trata e salva o Protocolo na criação e edição de DocAdm

* Mostra documentos relacionados ao protocolo ordenados

* Adiciona Protocolo a listagem de Docs Adm
pull/945/merge
eduardocalil 8 years ago
committed by Edward
parent
commit
51dc6b2d54
  1. 29
      sapl/protocoloadm/forms.py
  2. 26
      sapl/protocoloadm/migrations/0012_auto_20170315_1211.py
  3. 105
      sapl/protocoloadm/models.py
  4. 16
      sapl/protocoloadm/views.py
  5. 4
      sapl/templates/protocoloadm/documentoadministrativo_filter.html
  6. 22
      scripts/fk_protocoloadm_docadm.py

29
sapl/protocoloadm/forms.py

@ -554,14 +554,39 @@ class DocumentoAdministrativoForm(ModelForm):
'data_fim_prazo', 'data_fim_prazo',
'observacao', 'observacao',
'texto_integral', '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): 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 return documento
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
row1 = to_row( row1 = to_row(
[('tipo', 4), ('numero', 4), ('ano', 4)]) [('tipo', 4), ('numero', 4), ('ano', 4)])

26
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'),
),
]

105
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() @reversion.register()
class DocumentoAdministrativo(models.Model): class DocumentoAdministrativo(models.Model):
tipo = models.ForeignKey( tipo = models.ForeignKey(
@ -54,6 +107,10 @@ class DocumentoAdministrativo(models.Model):
numero = models.PositiveIntegerField(verbose_name=_('Número')) numero = models.PositiveIntegerField(verbose_name=_('Número'))
ano = models.PositiveSmallIntegerField(verbose_name=_('Ano'), ano = models.PositiveSmallIntegerField(verbose_name=_('Ano'),
choices=RANGE_ANOS) choices=RANGE_ANOS)
protocolo = models.ForeignKey(
Protocolo,
blank=True,
null=True)
data = models.DateField(verbose_name=_('Data')) data = models.DateField(verbose_name=_('Data'))
numero_protocolo = models.PositiveIntegerField( numero_protocolo = models.PositiveIntegerField(
blank=True, null=True, verbose_name=_('Núm. Protocolo')) blank=True, null=True, verbose_name=_('Núm. Protocolo'))
@ -160,54 +217,6 @@ class DocumentoAcessorioAdministrativo(models.Model):
update_fields=update_fields) 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() @reversion.register()
class StatusTramitacaoAdministrativo(models.Model): class StatusTramitacaoAdministrativo(models.Model):
INDICADOR_CHOICES = Choices( INDICADOR_CHOICES = Choices(

16
sapl/protocoloadm/views.py

@ -93,6 +93,12 @@ class DocumentoAdministrativoCrud(Crud):
class ListView(DocumentoAdministrativoMixin, Crud.ListView): class ListView(DocumentoAdministrativoMixin, Crud.ListView):
pass pass
class CreateView(DocumentoAdministrativoMixin, Crud.CreateView):
form_class = DocumentoAdministrativoForm
class UpdateView(DocumentoAdministrativoMixin, Crud.UpdateView):
form_class = DocumentoAdministrativoForm
class DetailView(DocumentoAdministrativoMixin, Crud.DetailView): class DetailView(DocumentoAdministrativoMixin, Crud.DetailView):
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs) context = super().get_context_data(**kwargs)
@ -322,14 +328,10 @@ class ProtocoloMostrarView(PermissionRequiredMixin, TemplateView):
context['materia'] = None context['materia'] = None
else: else:
context['materia'] = materia context['materia'] = materia
elif protocolo.tipo_documento: elif protocolo.tipo_documento:
try: context[
documentos = DocumentoAdministrativo.objects.filter( 'documentos'] = protocolo.documentoadministrativo_set.all().order_by('-ano', '-numero')
numero_protocolo=protocolo.numero, ano=protocolo.ano)
except ObjectDoesNotExist:
context['documentos'] = None
else:
context['documentos'] = documentos
context['protocolo'] = protocolo context['protocolo'] = protocolo
return context return context

4
sapl/templates/protocoloadm/documentoadministrativo_filter.html

@ -39,6 +39,10 @@
<strong><a href="{% url 'protocoloadm:documentoadministrativo_detail' d.id %}">{{d.tipo.sigla}} {{d.numero}}/{{d.ano}} - {{d.tipo}}</strong></a></br> <strong><a href="{% url 'protocoloadm:documentoadministrativo_detail' d.id %}">{{d.tipo.sigla}} {{d.numero}}/{{d.ano}} - {{d.tipo}}</strong></a></br>
<strong>Interessado:</strong>&nbsp;{{ d.interessado|default_if_none:"Não Informado"}}</br> <strong>Interessado:</strong>&nbsp;{{ d.interessado|default_if_none:"Não Informado"}}</br>
<strong>Assunto:</strong>&nbsp;{{ d.assunto|safe }}</br> <strong>Assunto:</strong>&nbsp;{{ d.assunto|safe }}</br>
{% if d.protocolo %}
<strong>Protocolo:</strong>&nbsp;<a href="{% url 'sapl.protocoloadm:protocolo_mostrar' d.protocolo.id %}">{{ d.protocolo}}</a></br>
{% endif %}
</td> </td>
</tr> </tr>
{% endfor %} {% endfor %}

22
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()
Loading…
Cancel
Save