Browse Source

Merge pull request #323 from interlegis/311-Crud-norma

fix #311 crud norma
pull/336/head
Edward 9 years ago
parent
commit
7e08381bd5
  1. 97
      norma/forms.py
  2. 13
      norma/layouts.yaml
  3. 4
      norma/test_norma.py
  4. 10
      norma/urls.py
  5. 88
      norma/views.py
  6. 4
      templates/norma/list_pesquisa.html
  7. 28
      templates/norma/normajuridica_detail.html
  8. 3
      templates/norma/normajuridica_incluir.html
  9. 36
      templates/norma/normajuridica_list.html
  10. 16
      templates/norma/pesquisa.html

97
norma/forms.py

@ -1,3 +1,5 @@
from datetime import datetime
from crispy_forms.helper import FormHelper from crispy_forms.helper import FormHelper
from crispy_forms.layout import Fieldset, Layout from crispy_forms.layout import Fieldset, Layout
from django import forms from django import forms
@ -94,23 +96,20 @@ class NormaJuridicaForm(ModelForm):
# Campos de MateriaLegislativa # Campos de MateriaLegislativa
tipo_materia = forms.ModelChoiceField( tipo_materia = forms.ModelChoiceField(
label='Matéria Legislativa', label='Matéria',
required=False, required=False,
queryset=TipoMateriaLegislativa.objects.all(), queryset=TipoMateriaLegislativa.objects.all(),
empty_label='Selecione' empty_label='Selecione'
) )
numero_materia = forms.CharField(label='Número', numero_materia = forms.CharField(
required=False) label='Número Matéria',
ano_materia = forms.ChoiceField(label='Ano', required=False
required=False, )
choices=RANGE_ANOS) ano_materia = forms.ChoiceField(
label='Ano Matéria',
def clean_texto_integral(self): required=False,
texto_integral = self.cleaned_data.get('texto_integral', False) choices=RANGE_ANOS,
if texto_integral: )
if texto_integral.size > MAX_DOC_UPLOAD_SIZE:
raise ValidationError("Arquivo muito grande. ( > 5mb )")
return texto_integral
class Meta: class Meta:
model = NormaJuridica model = NormaJuridica
@ -130,55 +129,39 @@ class NormaJuridicaForm(ModelForm):
'ementa', 'ementa',
'indexacao', 'indexacao',
'observacao', 'observacao',
'texto_integral', 'texto_integral']
]
def clean(self): 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: try:
MateriaLegislativa.objects.get( materia = MateriaLegislativa.objects.get(
tipo=self.cleaned_data['tipo_materia'], tipo_id=cleaned_data['tipo_materia'],
numero=self.cleaned_data['numero_materia'], numero=cleaned_data['numero_materia'],
ano=self.cleaned_data['ano_materia']) ano=cleaned_data['ano_materia'])
except ObjectDoesNotExist: except ObjectDoesNotExist:
msg = 'Matéria adicionada não existe!' raise forms.ValidationError("Matéria escolhida não existe!")
raise forms.ValidationError(msg) else:
cleaned_data['materia'] = materia
return data else:
cleaned_data['materia'] = None
return cleaned_data
def __init__(self, *args, **kwargs): def clean_texto_integral(self):
texto_integral = self.cleaned_data.get('texto_integral', False)
row1 = crispy_layout_mixin.to_row( if texto_integral:
[('tipo', 4), ('numero', 4), ('ano', 4)]) if texto_integral.size > MAX_DOC_UPLOAD_SIZE:
raise ValidationError("Arquivo muito grande. ( > 5mb )")
row2 = crispy_layout_mixin.to_row( return texto_integral
[('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)])
self.helper = FormHelper() def save(self, commit=False):
self.helper.layout = Layout( norma = super(NormaJuridicaForm, self).save(commit)
Fieldset('Identificação Básica', norma.timestamp = datetime.now()
row1, row2, row3, row4, row5, row6, row7, row8), norma.materia = self.cleaned_data['materia']
form_actions() norma.save()
) return norma
super(NormaJuridicaForm, self).__init__(*args, **kwargs)

13
norma/layouts.yaml

@ -11,17 +11,22 @@ NormaJuridica:
Identificação Básica: Identificação Básica:
- tipo numero ano - tipo numero ano
- data esfera_federacao complemento - data esfera_federacao complemento
- tip_id_basica_FIXME num_ident_basica_FIXME ano_ident_basica_FIXME
- data_publicacao veiculo_publicacao pagina_inicio_publicacao pagina_fim_publicacao - data_publicacao veiculo_publicacao pagina_inicio_publicacao pagina_fim_publicacao
- file_FIXME tip_situacao_norma_FIXME - texto_integral
- ementa - ementa
- indexacao - indexacao
- observacao - observacao
NormaJuridica: NormaJuridicaCreate:
Identificação Básica: Identificação Básica:
- tipo:5 numero:2 ano:2 data - tipo numero ano
- data esfera_federacao complemento
- tipo_materia numero_materia ano_materia
- data_publicacao veiculo_publicacao pagina_inicio_publicacao pagina_fim_publicacao
- texto_integral
- ementa - ementa
- indexacao
- observacao
LegislacaoCitada: LegislacaoCitada:
Legislação Citada: Legislação Citada:

4
norma/test_norma.py

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

10
norma/urls.py

@ -1,7 +1,7 @@
from django.conf.urls import include, url from django.conf.urls import include, url
from norma.views import (AssuntoNormaCrud, NormaEditView, NormaIncluirView, from norma.views import (AssuntoNormaCrud, NormaCrud, NormaPesquisaView,
NormaPesquisaView, NormaTaView, NormaTemporarioCrud, NormaTaView, NormaTemporarioCrud,
PesquisaNormaListView, TipoNormaCrud) PesquisaNormaListView, TipoNormaCrud)
from .apps import AppConfig from .apps import AppConfig
@ -24,14 +24,10 @@ norma_url_patterns = NormaTemporarioCrud.get_urls() + [
] ]
urlpatterns = [ 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/tipo/', include(TipoNormaCrud.get_urls())),
url(r'^sistema/norma/assunto/', include(AssuntoNormaCrud.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$', url(r'^norma/pesquisa$',
NormaPesquisaView.as_view(), name='norma_pesquisa'), NormaPesquisaView.as_view(), name='norma_pesquisa'),
url(r'^norma/pesquisa-resultado$', url(r'^norma/pesquisa-resultado$',

88
norma/views.py

@ -1,13 +1,11 @@
from datetime import datetime from datetime import datetime
from django.core.urlresolvers import reverse_lazy
from django.http import HttpResponseRedirect
from django.shortcuts import redirect 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 compilacao.views import IntegracaoTaView
from crud.base import Crud, make_pagination from crud.base import Crud, make_pagination
from materia.models import MateriaLegislativa
from .forms import NormaJuridicaForm, NormaJuridicaPesquisaForm from .forms import NormaJuridicaForm, NormaJuridicaPesquisaForm
from .models import (AssuntoNorma, LegislacaoCitada, NormaJuridica, from .models import (AssuntoNorma, LegislacaoCitada, NormaJuridica,
@ -15,11 +13,40 @@ from .models import (AssuntoNorma, LegislacaoCitada, NormaJuridica,
AssuntoNormaCrud = Crud.build(AssuntoNorma, 'assunto_norma_juridica') AssuntoNormaCrud = Crud.build(AssuntoNorma, 'assunto_norma_juridica')
TipoNormaCrud = Crud.build(TipoNormaJuridica, 'tipo_norma_juridica') TipoNormaCrud = Crud.build(TipoNormaJuridica, 'tipo_norma_juridica')
NormaCrud = Crud.build(NormaJuridica, '')
NormaTemporarioCrud = Crud.build(NormaJuridica, 'norma') NormaTemporarioCrud = Crud.build(NormaJuridica, 'norma')
LegislacaoCitadaCrud = Crud.build(LegislacaoCitada, '') 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): class NormaPesquisaView(FormView):
template_name = "norma/pesquisa.html" template_name = "norma/pesquisa.html"
success_url = "norma:norma_pesquisa" success_url = "norma:norma_pesquisa"
@ -110,57 +137,6 @@ class PesquisaNormaListView(ListView):
return context 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): class NormaTaView(IntegracaoTaView):
model = NormaJuridica model = NormaJuridica
model_type_foreignkey = TipoNormaJuridica model_type_foreignkey = TipoNormaJuridica

4
templates/norma/list_pesquisa.html

@ -4,11 +4,11 @@
{% block actions %}{% endblock %} {% block actions %}{% endblock %}
{% block detail_content %} {% block detail_content %}
<div class="actions btn-group pull-right" role="group"> <div class="actions btn-group pull-right" role="group">
<a href="{% url 'norma:norma_incluir' %}" class="btn btn-default">Adicionar Norma Jurídica</a> <a href="{% url 'norma:normajuridica_create' %}" class="btn btn-default">Adicionar Norma Jurídica</a>
</div> </div>
<br /><br /><br /> <br /><br /><br />
{% if object_list %} {% if object_list %}
<table class="table table-striped table-bordered"> <table class="table table-striped">
<thead class="thead-default"> <thead class="thead-default">
<tr> <tr>
<th>Tipo da Norma Juridica</th> <th>Tipo da Norma Juridica</th>

28
templates/norma/normajuridica_detail.html

@ -1,28 +0,0 @@
{% extends "crud/detail.html" %}
{% load i18n %}
{% block sections_nav %}
<ul class="nav nav-pills navbar-right">
<li>
<a href="{% url 'norma:normajuridica_detail' object.pk %}">{% trans 'Início' %}</a>
</li>
{% comment %}
Opção adicionada para chamar o TextoArticulado da norma.
para integração foram necessárias apenas criar a url norma_ta em urls.py
e a view NormaTa(IntegracaoTaView) em views.py
Em nada mais a integração interfere em Norma Jurídica
{% endcomment %}
<li><a href="{% url 'norma:ta' object.pk %}">{% trans 'Texto da Norma' %}</a></li>
</ul>
{% endblock sections_nav %}
<div class="clearfix">
{% block actions %}
<div class="actions btn-group pull-right" role="group">
<a href="{% url 'norma:norma_editar' object.id %}" class="btn btn-default">{% trans 'Editar' %}</a>
<a href="{{ view.delete_url }}" class="btn btn-default">{% trans 'Excluir' %}</a>
</div>
{% endblock actions %}
</div>

3
templates/norma/normajuridica_incluir.html

@ -1,3 +0,0 @@
{% extends "crud/form.html" %}
{% load i18n %}
{% load crispy_forms_tags %}

36
templates/norma/normajuridica_list.html

@ -1,36 +0,0 @@
{% extends "crud/list.html" %}
{% load i18n %}
{% load crispy_forms_tags %}
{% block base_content %}
<div class="actions btn-group pull-right" role="group">
<a href="{% url 'norma:norma_incluir' %}" class="btn btn-default">
{% blocktrans with verbose_name=view.verbose_name %} Adicionar {{ verbose_name }} {% endblocktrans %}
</a>
</div>
<br /><br /><br />
{% if object_list %}
<table class="table table-striped table-bordered">
<thead class="thead-default">
<tr>
<th>Tipo da Norma Juridica</th>
<th>Número</th>
<th>Ano</th>
<th>Data</th>
<th>Ementa</th>
</tr>
</thead>
{% for obj in object_list %}
<tr>
<td><a href="{% url 'norma:normajuridica_detail' obj.id %}">{{obj.tipo}}</a></td>
<td>{{obj.numero}}</td>
<td>{{obj.ano}}</td>
<td>{{obj.data}}</td>
<td>{{obj.ementa|safe}}</td>
</tr>
{% endfor %}
</table>
{% include "paginacao.html" %}
{% else %}
<h2>Nenhum Registro recuperado</h2>
{% endif %}
{% endblock %}

16
templates/norma/pesquisa.html

@ -1,3 +1,17 @@
{% extends "crud/form.html" %} {% extends "crud/detail.html" %}
{% load i18n %} {% load i18n %}
{% load crispy_forms_tags %} {% load crispy_forms_tags %}
{% block base_content %}
{% block actions %}
<div class="actions btn-group pull-right" role="group">
<a href="{% url 'norma:normajuridica_create' %}" class="btn btn-default">{% trans 'Adicionar Norma Juridica' %}</a>
</div>
<br /><br />
{% endblock %}
{% block detail_content %}
{% crispy form %}
{% endblock %}
{% endblock %}

Loading…
Cancel
Save