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. 95
      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

95
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',
numero_materia = forms.CharField(
label='Número Matéria',
required=False
)
ano_materia = forms.ChoiceField(
label='Ano Matéria',
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
choices=RANGE_ANOS,
)
class Meta:
model = NormaJuridica
@ -130,55 +129,39 @@ class NormaJuridicaForm(ModelForm):
'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)
return data
def __init__(self, *args, **kwargs):
row1 = crispy_layout_mixin.to_row(
[('tipo', 4), ('numero', 4), ('ano', 4)])
raise forms.ValidationError("Matéria escolhida não existe!")
else:
cleaned_data['materia'] = materia
row2 = crispy_layout_mixin.to_row(
[('data', 4), ('esfera_federacao', 4), ('complemento', 4)])
else:
cleaned_data['materia'] = None
return cleaned_data
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

13
norma/layouts.yaml

@ -11,17 +11,22 @@ NormaJuridica:
Identificação Básica:
- tipo numero ano
- 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
- file_FIXME tip_situacao_norma_FIXME
- texto_integral
- ementa
- indexacao
- observacao
NormaJuridica:
NormaJuridicaCreate:
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
- indexacao
- observacao
LegislacaoCitada:
Legislação Citada:

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

10
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 @@ norma_url_patterns = NormaTemporarioCrud.get_urls() + [
]
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$',

88
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 @@ from .models import (AssuntoNorma, LegislacaoCitada, NormaJuridica,
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 @@ class PesquisaNormaListView(ListView):
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

4
templates/norma/list_pesquisa.html

@ -4,11 +4,11 @@
{% block actions %}{% endblock %}
{% block detail_content %}
<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>
<br /><br /><br />
{% if object_list %}
<table class="table table-striped table-bordered">
<table class="table table-striped">
<thead class="thead-default">
<tr>
<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 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