Repository: interlegis/sapl

Issue:
PROTOCOLAR MATÉRIA E DOCUMENTO
É interessante ao protocolar documento ou matéria puder vincular a alguma matéria existente no SAPL. 


Discussion:

Resolving patch:
diff --git a/sapl/protocoloadm/forms.py b/sapl/protocoloadm/forms.py
--- a/sapl/protocoloadm/forms.py
+++ b/sapl/protocoloadm/forms.py
@@ -15,7 +15,7 @@
 from sapl.materia.models import (MateriaLegislativa, TipoMateriaLegislativa,
                                  UnidadeTramitacao)
 from sapl.utils import (RANGE_ANOS, AnoNumeroOrderingFilter,
-                        RangeWidgetOverride, autor_label, autor_modal)
+                        RangeWidgetOverride, autor_label, autor_modal, YES_NO_CHOICES)
 
 from .models import (DocumentoAcessorioAdministrativo, DocumentoAdministrativo,
                      Protocolo, TipoDocumentoAdministrativo,
@@ -363,6 +363,17 @@ class ProtocoloMateriaForm(ModelForm):
         empty_label='Selecione',
     )
 
+
+    numero_materia = forms.CharField(
+        label=_('Número matéria'), required=False)
+
+    ano_materia = forms.CharField(
+        label=_('Ano matéria'), required=False)
+
+    vincular_materia = forms.ChoiceField(label=_('Vincular a matéria existente?'),
+                                         widget=forms.RadioSelect(),
+                                         choices= YES_NO_CHOICES)
+
     numero_paginas = forms.CharField(label=_('Núm. Páginas'), required=True)
 
     observacao = forms.CharField(required=False,
@@ -378,7 +389,11 @@ class Meta:
                   'autor',
                   'tipo_autor',
                   'assunto_ementa',
-                  'observacao']
+                  'observacao',
+                  'numero_materia',
+                  'ano_materia',
+                  'vincular_materia'
+                  ]
 
     def clean_autor(self):
         autor_field = self.cleaned_data['autor']
@@ -390,6 +405,26 @@ def clean_autor(self):
             autor_field = autor
         return autor_field
 
+    def clean(self):
+        super(ProtocoloMateriaForm, self).clean()
+
+        data = self.cleaned_data
+        if self.is_valid():
+            if data['vincular_materia'] == 'True':
+                try:
+                    self.materia = MateriaLegislativa.objects.get(ano=data['ano_materia'],
+                                                                  numero=data['numero_materia'],
+                                                                  tipo=data['tipo_materia'])
+                    if self.materia.numero_protocolo:
+                        raise ValidationError(_('Matéria Legislativa informada já possui o protocolo {}/{} vinculado.'
+                                                .format(self.materia.numero_protocolo, self.materia.ano)))
+                except ObjectDoesNotExist:
+                    raise ValidationError(_('Matéria Legislativa informada não existente.'))
+
+        return data
+
+
+
     def __init__(self, *args, **kwargs):
 
         row1 = to_row(
@@ -397,6 +432,10 @@ def __init__(self, *args, **kwargs):
              ('numero_paginas', 2),
              ('tipo_autor', 3),
              ('autor', 3)])
+        row2 = to_row(
+            [('vincular_materia', 4),
+             ('numero_materia', 4),
+             ('ano_materia', 4),])
         row3 = to_row(
             [('assunto_ementa', 12)])
         row4 = to_row(
@@ -405,7 +444,7 @@ def __init__(self, *args, **kwargs):
         self.helper = FormHelper()
         self.helper.layout = Layout(
             Fieldset(_('Identificação da Matéria'),
-                     row1, row3,
+                     row1, row2, row3,
                      row4, form_actions(label='Protocolar Matéria')))
 
         super(ProtocoloMateriaForm, self).__init__(
diff --git a/sapl/protocoloadm/views.py b/sapl/protocoloadm/views.py
--- a/sapl/protocoloadm/views.py
+++ b/sapl/protocoloadm/views.py
@@ -468,6 +468,13 @@ def form_valid(self, form):
         protocolo.assunto_ementa = self.request.POST['assunto_ementa']
 
         protocolo.save()
+        data = form.cleaned_data
+        materia = MateriaLegislativa.objects.get(ano=data['ano_materia'],
+                                                 numero=data['numero_materia'],
+                                                 tipo=data['tipo_materia'])
+        materia.numero_protocolo = protocolo.numero
+        materia.save()
+
         return redirect(self.get_success_url(protocolo))
 
     def get_context_data(self, **kwargs):


Test patch:
diff --git a/sapl/protocoloadm/tests/test_protocoloadm.py b/sapl/protocoloadm/tests/test_protocoloadm.py
--- a/sapl/protocoloadm/tests/test_protocoloadm.py
+++ b/sapl/protocoloadm/tests/test_protocoloadm.py
@@ -411,5 +411,6 @@ def test_protocolo_materia_invalido():
     assert errors['tipo_materia'] == [_('Este campo é obrigatório.')]
     assert errors['numero_paginas'] == [_('Este campo é obrigatório.')]
     assert errors['autor'] == [_('Este campo é obrigatório.')]
+    assert errors['vincular_materia'] == [_('Este campo é obrigatório.')]
 
-    assert len(errors) == 5
+    assert len(errors) == 6