Repository: interlegis/sapl

Issue:
Usar crud em Norma



Discussion:

Resolving patch:
diff --git a/norma/forms.py b/norma/forms.py
--- a/norma/forms.py
+++ b/norma/forms.py
@@ -1,3 +1,5 @@
+from datetime import datetime
+
 from crispy_forms.helper import FormHelper
 from crispy_forms.layout import Fieldset, Layout
 from django import forms
@@ -94,23 +96,20 @@ class NormaJuridicaForm(ModelForm):
 
     # Campos de MateriaLegislativa
     tipo_materia = forms.ModelChoiceField(
-        label='Matéria Legislativa',
+        label='Matéria',
         required=False,
         queryset=TipoMateriaLegislativa.objects.all(),
         empty_label='Selecione'
     )
-    numero_materia = forms.CharField(label='Número',
-                                     required=False)
-    ano_materia = forms.ChoiceField(label='Ano',
-                                    required=False,
-                                    choices=RANGE_ANOS)
-
-    def clean_texto_integral(self):
-        texto_integral = self.cleaned_data.get('texto_integral', False)
-        if texto_integral:
-            if texto_integral.size > MAX_DOC_UPLOAD_SIZE:
-                raise ValidationError("Arquivo muito grande. ( > 5mb )")
-            return texto_integral
+    numero_materia = forms.CharField(
+        label='Número Matéria',
+        required=False
+    )
+    ano_materia = forms.ChoiceField(
+        label='Ano Matéria',
+        required=False,
+        choices=RANGE_ANOS,
+    )
 
     class Meta:
         model = NormaJuridica
@@ -130,55 +129,39 @@ class Meta:
                   'ementa',
                   'indexacao',
                   'observacao',
-                  'texto_integral',
-                  ]
+                  'texto_integral']
 
     def clean(self):
-        data = super(NormaJuridicaForm, self).clean()
+        cleaned_data = self.cleaned_data
+
+        if (cleaned_data['tipo_materia'] and
+            cleaned_data['numero_materia'] and
+                cleaned_data['ano_materia']):
 
-        if self.cleaned_data['tipo_materia']:
             try:
-                MateriaLegislativa.objects.get(
-                    tipo=self.cleaned_data['tipo_materia'],
-                    numero=self.cleaned_data['numero_materia'],
-                    ano=self.cleaned_data['ano_materia'])
+                materia = MateriaLegislativa.objects.get(
+                    tipo_id=cleaned_data['tipo_materia'],
+                    numero=cleaned_data['numero_materia'],
+                    ano=cleaned_data['ano_materia'])
             except ObjectDoesNotExist:
-                msg = 'Matéria adicionada não existe!'
-                raise forms.ValidationError(msg)
+                raise forms.ValidationError("Matéria escolhida não existe!")
+            else:
+                cleaned_data['materia'] = materia
 
-        return data
+        else:
+            cleaned_data['materia'] = None
+        return cleaned_data
 
-    def __init__(self, *args, **kwargs):
-
-        row1 = crispy_layout_mixin.to_row(
-            [('tipo', 4), ('numero', 4), ('ano', 4)])
-
-        row2 = crispy_layout_mixin.to_row(
-            [('data', 4), ('esfera_federacao', 4), ('complemento', 4)])
-
-        row3 = crispy_layout_mixin.to_row(
-            [('tipo_materia', 4), ('numero_materia', 4), ('ano_materia', 4)])
-
-        row4 = crispy_layout_mixin.to_row(
-            [('data_publicacao', 3), ('veiculo_publicacao', 3),
-             ('pagina_inicio_publicacao', 3), ('pagina_fim_publicacao', 3)])
-
-        row5 = crispy_layout_mixin.to_row(
-            [('texto_integral', 12)])
-
-        row6 = crispy_layout_mixin.to_row(
-            [('ementa', 12)])
-
-        row7 = crispy_layout_mixin.to_row(
-            [('indexacao', 12)])
-
-        row8 = crispy_layout_mixin.to_row(
-            [('observacao', 12)])
+    def clean_texto_integral(self):
+        texto_integral = self.cleaned_data.get('texto_integral', False)
+        if texto_integral:
+            if texto_integral.size > MAX_DOC_UPLOAD_SIZE:
+                raise ValidationError("Arquivo muito grande. ( > 5mb )")
+            return texto_integral
 
-        self.helper = FormHelper()
-        self.helper.layout = Layout(
-            Fieldset('Identificação Básica',
-                     row1, row2, row3, row4, row5, row6, row7, row8),
-            form_actions()
-        )
-        super(NormaJuridicaForm, self).__init__(*args, **kwargs)
+    def save(self, commit=False):
+        norma = super(NormaJuridicaForm, self).save(commit)
+        norma.timestamp = datetime.now()
+        norma.materia = self.cleaned_data['materia']
+        norma.save()
+        return norma
diff --git a/norma/urls.py b/norma/urls.py
--- a/norma/urls.py
+++ b/norma/urls.py
@@ -1,7 +1,7 @@
 from django.conf.urls import include, url
 
-from norma.views import (AssuntoNormaCrud, NormaEditView, NormaIncluirView,
-                         NormaPesquisaView, NormaTaView, NormaTemporarioCrud,
+from norma.views import (AssuntoNormaCrud, NormaCrud, NormaPesquisaView,
+                         NormaTaView, NormaTemporarioCrud,
                          PesquisaNormaListView, TipoNormaCrud)
 
 from .apps import AppConfig
@@ -24,14 +24,10 @@
 ]
 
 urlpatterns = [
-    url(r'^norma/', include(norma_url_patterns)),
+    url(r'^norma/', include(NormaCrud.get_urls())),
 
     url(r'^sistema/norma/tipo/', include(TipoNormaCrud.get_urls())),
     url(r'^sistema/norma/assunto/', include(AssuntoNormaCrud.get_urls())),
-
-    url(r'^norma/incluir$', NormaIncluirView.as_view(), name='norma_incluir'),
-    url(r'^norma/(?P<pk>[0-9]+)/editar$',
-        NormaEditView.as_view(), name='norma_editar'),
     url(r'^norma/pesquisa$',
         NormaPesquisaView.as_view(), name='norma_pesquisa'),
     url(r'^norma/pesquisa-resultado$',
diff --git a/norma/views.py b/norma/views.py
--- a/norma/views.py
+++ b/norma/views.py
@@ -1,13 +1,11 @@
 from datetime import datetime
 
-from django.core.urlresolvers import reverse_lazy
-from django.http import HttpResponseRedirect
 from django.shortcuts import redirect
-from django.views.generic import CreateView, FormView, ListView, UpdateView
+from django.views.generic import FormView, ListView
 
+import crud.base
 from compilacao.views import IntegracaoTaView
 from crud.base import Crud, make_pagination
-from materia.models import MateriaLegislativa
 
 from .forms import NormaJuridicaForm, NormaJuridicaPesquisaForm
 from .models import (AssuntoNorma, LegislacaoCitada, NormaJuridica,
@@ -15,11 +13,40 @@
 
 AssuntoNormaCrud = Crud.build(AssuntoNorma, 'assunto_norma_juridica')
 TipoNormaCrud = Crud.build(TipoNormaJuridica, 'tipo_norma_juridica')
-NormaCrud = Crud.build(NormaJuridica, '')
 NormaTemporarioCrud = Crud.build(NormaJuridica, 'norma')
 LegislacaoCitadaCrud = Crud.build(LegislacaoCitada, '')
 
 
+class NormaCrud(Crud):
+    model = NormaJuridica
+    help_path = 'norma_juridica'
+
+    class UpdateView(crud.base.CrudUpdateView):
+        form_class = NormaJuridicaForm
+
+        @property
+        def layout_key(self):
+            return 'NormaJuridicaCreate'
+
+        def get_initial(self):
+            norma = NormaJuridica.objects.get(id=self.kwargs['pk'])
+            if norma.materia:
+                self.initial['tipo_materia'] = norma.materia.tipo
+                self.initial['ano_materia'] = norma.materia.ano
+                self.initial['numero_materia'] = norma.materia.numero
+            return self.initial.copy()
+
+    class CreateView(crud.base.CrudCreateView):
+        form_class = NormaJuridicaForm
+
+        @property
+        def layout_key(self):
+            return 'NormaJuridicaCreate'
+
+    class BaseMixin(crud.base.BaseMixin):
+        list_field_names = ['tipo', 'numero', 'ano', 'ementa']
+
+
 class NormaPesquisaView(FormView):
     template_name = "norma/pesquisa.html"
     success_url = "norma:norma_pesquisa"
@@ -110,57 +137,6 @@ def get_context_data(self, **kwargs):
         return context
 
 
-class NormaIncluirView(CreateView):
-    template_name = "norma/normajuridica_incluir.html"
-    form_class = NormaJuridicaForm
-    success_url = reverse_lazy('norma:normajuridica_list')
-
-    def get_success_url(self):
-        return reverse_lazy('norma:norma_pesquisa')
-
-    def form_valid(self, form):
-        norma = form.save(commit=False)
-        norma.timestamp = datetime.now()
-        if form.cleaned_data['tipo_materia']:
-            materia = MateriaLegislativa.objects.get(
-                tipo_id=form.data['tipo_materia'],
-                numero=form.data['numero_materia'],
-                ano=form.data['ano_materia'])
-            norma.materia = materia
-        norma.save()
-        return HttpResponseRedirect(self.get_success_url())
-
-
-class NormaEditView(UpdateView):
-    template_name = "norma/normajuridica_incluir.html"
-    form_class = NormaJuridicaForm
-    model = NormaJuridica
-    success_url = reverse_lazy('norma:pesquisa_norma')
-
-    def get_initial(self):
-        data = super(NormaEditView, self).get_initial()
-        norma = NormaJuridica.objects.get(id=self.kwargs['pk'])
-        if norma.materia:
-            data.update({
-                'tipo_materia': norma.materia.tipo,
-                'numero_materia': norma.materia.numero,
-                'ano_materia': norma.materia.ano,
-            })
-        return data
-
-    def form_valid(self, form):
-        norma = form.save(commit=False)
-        norma.timestamp = datetime.now()
-        if form.cleaned_data['tipo_materia']:
-            materia = MateriaLegislativa.objects.get(
-                tipo_id=form.data['tipo_materia'],
-                numero=form.data['numero_materia'],
-                ano=form.data['ano_materia'])
-            norma.materia = materia
-        norma.save()
-        return HttpResponseRedirect(self.get_success_url())
-
-
 class NormaTaView(IntegracaoTaView):
     model = NormaJuridica
     model_type_foreignkey = TipoNormaJuridica


Test patch:
diff --git a/norma/test_norma.py b/norma/test_norma.py
--- a/norma/test_norma.py
+++ b/norma/test_norma.py
@@ -13,7 +13,7 @@ def test_incluir_norma_submit(client):
                       descricao='Teste')
 
     # Testa POST
-    response = client.post(reverse('norma:norma_incluir'),
+    response = client.post(reverse('norma:normajuridica_create'),
                            {'tipo': tipo.pk,
                             'numero': '1',
                             'ano': '2016',
@@ -33,7 +33,7 @@ def test_incluir_norma_submit(client):
 @pytest.mark.django_db(transaction=False)
 def test_incluir_norma_errors(client):
 
-    response = client.post(reverse('norma:norma_incluir'),
+    response = client.post(reverse('norma:normajuridica_create'),
                            {'salvar': 'salvar'},
                            follow=True)