Browse Source

Criar form de Dados Básicos da Edição Avançada

pull/299/head
LeandroRoberto 9 years ago
parent
commit
61d91b75e3
  1. 218
      compilacao/forms.py
  2. 4
      compilacao/models.py
  3. 6
      compilacao/urls.py
  4. 64
      compilacao/views.py
  5. 6
      crispy_layout_mixin.py
  6. 16
      templates/compilacao/dispositivo_form.html
  7. 6
      templates/compilacao/dispositivo_form_parents.html

218
compilacao/forms.py

@ -1,20 +1,24 @@
from crispy_forms.bootstrap import FieldWithButtons, FormActions, StrictButton from crispy_forms.bootstrap import FieldWithButtons, FormActions, StrictButton,\
InlineRadios, Alert
from crispy_forms.helper import FormHelper from crispy_forms.helper import FormHelper
from crispy_forms.layout import (HTML, Button, Column, Div, Field, Fieldset, from crispy_forms.layout import (HTML, Button, Column, Div, Field, Fieldset,
Layout, Row) Layout, Row)
from django import forms from django import forms
from django.core.exceptions import NON_FIELD_ERRORS from django.core.exceptions import NON_FIELD_ERRORS
from django.forms.models import ModelForm from django.forms.models import ModelForm
from django.template import defaultfilters
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from compilacao.models import (NOTAS_PUBLICIDADE_CHOICES, from compilacao.models import (NOTAS_PUBLICIDADE_CHOICES,
PARTICIPACAO_SOCIAL_CHOICES, Dispositivo, Nota, PARTICIPACAO_SOCIAL_CHOICES, Dispositivo, Nota,
Publicacao, TextoArticulado, TipoNota, Publicacao, TextoArticulado, TipoNota,
TipoPublicacao, TipoTextoArticulado, TipoVide, TipoPublicacao, TipoTextoArticulado, TipoVide,
VeiculoPublicacao, Vide) VeiculoPublicacao, Vide, TipoDispositivo)
from crispy_layout_mixin import SaplFormLayout, to_column, to_row from crispy_layout_mixin import SaplFormLayout, to_column, to_row
from sapl import utils
from sapl.utils import YES_NO_CHOICES from sapl.utils import YES_NO_CHOICES
error_messages = { error_messages = {
'required': _('Este campo é obrigatório'), 'required': _('Este campo é obrigatório'),
'invalid': _('URL inválida.') 'invalid': _('URL inválida.')
@ -257,6 +261,10 @@ class NotaForm(ModelForm):
super(NotaForm, self).__init__(*args, **kwargs) super(NotaForm, self).__init__(*args, **kwargs)
class DispositivoSearchFragmentForm(ModelForm):
pass
class VideForm(ModelForm): class VideForm(ModelForm):
dispositivo_base = forms.ModelChoiceField( dispositivo_base = forms.ModelChoiceField(
queryset=Dispositivo.objects.all(), queryset=Dispositivo.objects.all(),
@ -343,7 +351,7 @@ class VideForm(ModelForm):
'números ou algo' 'números ou algo'
' que estejam ' ' que estejam '
'no rótulo ou no texto.')), 'no rótulo ou no texto.')),
StrictButton("Buscar", css_class='btn-busca')), 12))), StrictButton(_('Buscar'), css_class='btn-busca')), 12))),
Row(to_column( Row(to_column(
(Div(css_class='container-busca'), 12))) (Div(css_class='container-busca'), 12)))
) )
@ -482,82 +490,156 @@ class DispositivoIntegerField(forms.IntegerField):
class DispositivoEdicaoBasicaForm(ModelForm): class DispositivoEdicaoBasicaForm(ModelForm):
texto = forms.CharField( class Meta:
widget=forms.Textarea, model = Dispositivo
required=False) fields = []
def __init__(self, *args, **kwargs):
layout = []
inst = kwargs['instance'] if 'instance' in kwargs else None
if inst and inst.tipo_dispositivo.formato_variacao0 in [
TipoDispositivo.FNC8, TipoDispositivo.FNCN]:
if 'rotulo' in DispositivoEdicaoBasicaForm.Meta.fields:
DispositivoEdicaoBasicaForm.Meta.fields.remove('rotulo')
for i in range(6):
DispositivoEdicaoBasicaForm.Meta.fields.remove(
'dispositivo%s' % i)
else:
if 'rotulo' not in DispositivoEdicaoBasicaForm.Meta.fields:
DispositivoEdicaoBasicaForm.Meta.fields.append('rotulo')
for i in range(6):
DispositivoEdicaoBasicaForm.Meta.fields.append(
'dispositivo%s' % i)
# adiciona campos de rótulo no formulário
self.dispositivo0 = forms.IntegerField(
min_value=0,
label=Dispositivo._meta.get_field('dispositivo0').verbose_name,
widget=forms.NumberInput(
attrs={'title': _('Valor 0(zero) é permitido apenas para '
'Dispositivos com tipos variáveis.'),
'onchange': 'atualizaRotulo()'}))
self.dispositivo1 = DispositivoIntegerField(
label=('1ª %s' % _('Variação')),
field_name='dispositivo1')
self.dispositivo2 = DispositivoIntegerField(
label=('2ª'),
field_name='dispositivo2')
self.dispositivo3 = DispositivoIntegerField(
label=('3ª'),
field_name='dispositivo3')
self.dispositivo4 = DispositivoIntegerField(
label=('4ª'),
field_name='dispositivo4')
self.dispositivo5 = DispositivoIntegerField(
label=('5ª'),
field_name='dispositivo5')
self.rotulo = forms.CharField(
required=False, label=_('Rótulo Resultante'))
rotulo_fieldset = to_row([
('dispositivo0', 3),
('dispositivo1', 2),
('dispositivo2', 1),
('dispositivo3', 1),
('dispositivo4', 1),
('dispositivo5', 1),
('rotulo', 3)])
layout.append(Fieldset(_('Construção do Rótulo'), rotulo_fieldset,
css_class="col-md-12"))
if inst and inst.tipo_dispositivo.dispositivo_de_articulacao:
if 'texto' in DispositivoEdicaoBasicaForm.Meta.fields:
DispositivoEdicaoBasicaForm.Meta.fields.remove('texto')
else:
if 'texto' not in DispositivoEdicaoBasicaForm.Meta.fields:
DispositivoEdicaoBasicaForm.Meta.fields.append('texto')
self.texto = forms.CharField(required=False,
label='',
widget=forms.Textarea())
row_texto = to_row([('texto', 12)])
layout.append(
Fieldset(Dispositivo._meta.get_field('texto').verbose_name,
row_texto,
css_class="col-md-12"))
fields = DispositivoEdicaoBasicaForm.Meta.fields
if fields:
self.base_fields.clear()
for f in fields:
self.base_fields.update({f: getattr(self, f)})
dispositivo1 = DispositivoIntegerField( self.helper = FormHelper()
label=('1ª %s' % _('Variação')), self.helper.layout = SaplFormLayout(
field_name='dispositivo1') *layout,
dispositivo2 = DispositivoIntegerField( label_cancel=_('Retornar para o Editor Sequencial'))
label=('2ª'),
field_name='dispositivo2') super(DispositivoEdicaoBasicaForm, self).__init__(*args, **kwargs)
dispositivo3 = DispositivoIntegerField(
label=('3ª'),
field_name='dispositivo3') class DispositivoEdicaoVigenciaForm(ModelForm):
dispositivo4 = DispositivoIntegerField(
label=('4ª'), inconstitucionalidade = forms.ChoiceField(
field_name='dispositivo4') label=Dispositivo._meta.get_field(
dispositivo5 = DispositivoIntegerField( 'inconstitucionalidade').verbose_name,
label=('5ª'), choices=utils.YES_NO_CHOICES,
field_name='dispositivo5') widget=forms.RadioSelect())
rotulo = forms.CharField(label=_('Rótulo Resultante'))
class Meta: class Meta:
model = Dispositivo model = Dispositivo
fields = ( fields = ['inicio_vigencia',
'dispositivo0', 'fim_vigencia',
'dispositivo1', 'inicio_eficacia',
'dispositivo2', 'fim_eficacia',
'dispositivo3', 'publicacao',
'dispositivo4', 'inconstitucionalidade'
'dispositivo5', ]
'rotulo',
'texto')
widgets = {
'dispositivo0': forms.NumberInput(
attrs={'title': _('Valor 0(zero) é permitido apenas '
'para Dispositivos com tipos variáveis.'),
'onchange': 'atualizaRotulo()'})}
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
layout = [] layout = []
rotulo_fieldset = to_row([ row_publicacao = to_row([
('dispositivo0', 3), ('publicacao', 6),
('dispositivo1', 2), (InlineRadios('inconstitucionalidade'), 3), ])
('dispositivo2', 1), row_publicacao.fields.append(
('dispositivo3', 1), Alert(
('dispositivo4', 1), css_class='alert-info col-md-3',
('dispositivo5', 1), content='<strong>%s</strong>%s' % (
('rotulo', 3) _('Dica!'), _('Inclua uma Nota de Dispositivo informando '
]) 'sobre a Inconstitucionalidade.'))))
layout.append( layout.append(
Fieldset( Fieldset(_('Registro de Publicação e Validade'),
_('Montagem do Rótulo'), row_publicacao,
rotulo_fieldset, css_class="col-md-12"))
css_class="col-md-12"))
row_datas = to_row([
# Campo Texto ('inicio_vigencia', 3),
row_texto = to_row([('texto', 12)]) ('fim_vigencia', 3),
css_class_texto = "col-md-12" ('inicio_eficacia', 3),
if 'instance' in kwargs and\ ('fim_eficacia', 3), ])
kwargs['instance'].tipo_dispositivo.dispositivo_de_articulacao:
css_class_texto = "col-md-12 hidden"
layout.append( layout.append(
Fieldset( Fieldset(_('Datas de Controle de Vigência'),
Dispositivo._meta.get_field('texto').verbose_name, row_datas,
row_texto, css_class="col-md-12"))
css_class=css_class_texto))
self.helper = FormHelper() self.helper = FormHelper()
if layout: self.helper.layout = SaplFormLayout(
self.helper.layout = SaplFormLayout(*layout) *layout,
else: label_cancel=_('Retornar para o Editor Sequencial'))
self.helper.layout = SaplFormLayout()
super(DispositivoEdicaoVigenciaForm, self).__init__(*args, **kwargs)
super(DispositivoEdicaoBasicaForm, self).__init__(*args, **kwargs)
pubs = Publicacao.objects.order_by(
'-data', '-hora').filter(ta=self.instance.ta)
self.fields['publicacao'].choices = [("", "---------")] + [(
p.pk, _('%s realizada em %s') % (
p.tipo_publicacao,
defaultfilters.date(
p.data, "d \d\e F \d\e Y"))) for p in pubs]

4
compilacao/models.py

@ -556,7 +556,7 @@ class Dispositivo(BaseModel, TimestampedMixin):
texto = models.TextField( texto = models.TextField(
blank=True, blank=True,
default='', default='',
verbose_name=_('Texto na Norma Original')) verbose_name=_('Texto Original'))
texto_atualizador = models.TextField( texto_atualizador = models.TextField(
blank=True, blank=True,
default='', default='',
@ -575,7 +575,7 @@ class Dispositivo(BaseModel, TimestampedMixin):
inconstitucionalidade = models.BooleanField( inconstitucionalidade = models.BooleanField(
default=False, default=False,
choices=utils.YES_NO_CHOICES, choices=utils.YES_NO_CHOICES,
verbose_name=_('Declaração de Inconstitucionalidade')) verbose_name=_('Declarado Inconstitucional'))
# Relevant attribute only in altering norms # Relevant attribute only in altering norms
visibilidade = models.BooleanField( visibilidade = models.BooleanField(
default=False, default=False,

6
compilacao/urls.py

@ -33,9 +33,13 @@ urlpatterns_compilacao = [
url(r'^(?P<ta_id>[0-9]+)/text/(?P<dispositivo_id>[0-9]+)/refresh', url(r'^(?P<ta_id>[0-9]+)/text/(?P<dispositivo_id>[0-9]+)/refresh',
views.DispositivoSimpleEditView.as_view(), name='dispositivo_refresh'), views.DispositivoSimpleEditView.as_view(), name='dispositivo_refresh'),
url(r'^(?P<ta_id>[0-9]+)/text/(?P<pk>[0-9]+)/edit', url(r'^(?P<ta_id>[0-9]+)/text/(?P<pk>[0-9]+)/edit$',
views.DispositivoEdicaoBasicaView.as_view(), name='dispositivo_edit'), views.DispositivoEdicaoBasicaView.as_view(), name='dispositivo_edit'),
url(r'^(?P<ta_id>[0-9]+)/text/(?P<pk>[0-9]+)/edit/vigencia',
views.DispositivoEdicaoVigenciaView.as_view(),
name='dispositivo_edit_vigencia'),
url(r'^(?P<ta_id>[0-9]+)/text/(?P<dispositivo_id>[0-9]+)/actions', url(r'^(?P<ta_id>[0-9]+)/text/(?P<dispositivo_id>[0-9]+)/actions',

64
compilacao/views.py

@ -1,6 +1,6 @@
import sys
from collections import OrderedDict from collections import OrderedDict
from datetime import datetime, timedelta from datetime import datetime, timedelta
import sys
from braces.views import FormMessagesMixin from braces.views import FormMessagesMixin
from django import forms from django import forms
@ -21,7 +21,8 @@ from django.views.generic.edit import CreateView, DeleteView, UpdateView
from django.views.generic.list import ListView from django.views.generic.list import ListView
from compilacao.forms import (DispositivoEdicaoBasicaForm, NotaForm, from compilacao.forms import (DispositivoEdicaoBasicaForm, NotaForm,
PublicacaoForm, TaForm, TipoTaForm, VideForm) PublicacaoForm, TaForm, TipoTaForm, VideForm,
DispositivoEdicaoVigenciaForm)
from compilacao.models import (Dispositivo, Nota, from compilacao.models import (Dispositivo, Nota,
PerfilEstruturalTextoArticulado, Publicacao, PerfilEstruturalTextoArticulado, Publicacao,
TextoArticulado, TipoDispositivo, TipoNota, TextoArticulado, TipoDispositivo, TipoNota,
@ -29,6 +30,7 @@ from compilacao.models import (Dispositivo, Nota,
VeiculoPublicacao, Vide) VeiculoPublicacao, Vide)
from crud.base import Crud, CrudListView, make_pagination from crud.base import Crud, CrudListView, make_pagination
DISPOSITIVO_SELECT_RELATED = ( DISPOSITIVO_SELECT_RELATED = (
'tipo_dispositivo', 'tipo_dispositivo',
'ta_publicado', 'ta_publicado',
@ -1772,12 +1774,6 @@ class VideDeleteView(VideMixin, TemplateView):
class DispositivoSearchFragmentFormView(ListView): class DispositivoSearchFragmentFormView(ListView):
template_name = 'compilacao/dispositivo_search_fragment_form.html' template_name = 'compilacao/dispositivo_search_fragment_form.html'
@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
return super(
DispositivoSearchFragmentFormView,
self).dispatch(*args, **kwargs)
def get_queryset(self): def get_queryset(self):
try: try:
busca = '' busca = ''
@ -2003,8 +1999,8 @@ class DispositivoEdicaoBasicaView(UpdateView):
'compilacao:dispositivo_edit', 'compilacao:dispositivo_edit',
kwargs={'ta_id': self.kwargs['ta_id'], 'pk': self.kwargs['pk']}) kwargs={'ta_id': self.kwargs['ta_id'], 'pk': self.kwargs['pk']})
def get_context_data(self, **kwargs): def get_url_this_view(self):
return UpdateView.get_context_data(self, **kwargs) return 'compilacao:dispositivo_edit'
def run_actions(self, request): def run_actions(self, request):
if 'action' in request.GET and\ if 'action' in request.GET and\
@ -2018,10 +2014,32 @@ class DispositivoEdicaoBasicaView(UpdateView):
d.dispositivo4 = int(request.GET['dispositivo4']) d.dispositivo4 = int(request.GET['dispositivo4'])
d.dispositivo5 = int(request.GET['dispositivo5']) d.dispositivo5 = int(request.GET['dispositivo5'])
d.rotulo = d.rotulo_padrao() d.rotulo = d.rotulo_padrao()
numero = d.get_numero_completo()[1:]
zerar = False
for i in range(len(numero)):
if not numero[i]:
zerar = True
if zerar:
numero[i] = 0
if zerar:
d.set_numero_completo([d.dispositivo0, ] + numero)
d.rotulo = d.rotulo_padrao()
except: except:
return True, JsonResponse({'message': str( return True, JsonResponse({'message': str(
_('Ocorreu erro na atualização do rótulo'))}, safe=False) _('Ocorreu erro na atualização do rótulo'))}, safe=False)
return True, JsonResponse({'rotulo': d.rotulo}, safe=False) return True, JsonResponse({
'rotulo': d.rotulo,
'dispositivo0': d.dispositivo0,
'dispositivo1': d.dispositivo1,
'dispositivo2': d.dispositivo2,
'dispositivo3': d.dispositivo3,
'dispositivo4': d.dispositivo4,
'dispositivo5': d.dispositivo5}, safe=False)
return False, '' return False, ''
@ -2032,3 +2050,27 @@ class DispositivoEdicaoBasicaView(UpdateView):
return render_json_response return render_json_response
return UpdateView.get(self, request, *args, **kwargs) return UpdateView.get(self, request, *args, **kwargs)
class DispositivoEdicaoVigenciaView(DispositivoEdicaoBasicaView):
model = Dispositivo
form_class = DispositivoEdicaoVigenciaForm
def get_url_this_view(self):
return 'compilacao:dispositivo_edit_vigencia'
def get_success_url(self):
return reverse_lazy(
'compilacao:dispositivo_edit_vigencia',
kwargs={'ta_id': self.kwargs['ta_id'], 'pk': self.kwargs['pk']})
def run_actions(self, request):
if 'action' in request.GET and\
request.GET['action'] == 'atualiza_rotulo':
try:
pass
except:
return True, JsonResponse({'message': str(
_('Ocorreu erro na atualização do rótulo'))}, safe=False)
return True, JsonResponse({}, safe=False)
return False, ''

6
crispy_layout_mixin.py

@ -1,11 +1,11 @@
from math import ceil from math import ceil
from os.path import dirname, join from os.path import dirname, join
import rtyaml
from crispy_forms.bootstrap import FormActions from crispy_forms.bootstrap import FormActions
from crispy_forms.helper import FormHelper from crispy_forms.helper import FormHelper
from crispy_forms.layout import HTML, Div, Fieldset, Layout, Submit from crispy_forms.layout import HTML, Div, Fieldset, Layout, Submit
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
import rtyaml
def heads_and_tails(list_of_lists): def heads_and_tails(list_of_lists):
@ -39,10 +39,10 @@ def form_actions(more=[], save_label=_('Salvar')):
class SaplFormLayout(Layout): class SaplFormLayout(Layout):
def __init__(self, *fields): def __init__(self, *fields, label_cancel=_('Cancelar')):
buttons = form_actions(more=[ buttons = form_actions(more=[
HTML('<a href="{{ view.cancel_url }}"' HTML('<a href="{{ view.cancel_url }}"'
' class="btn btn-inverse">%s</a>' % _('Cancelar'))]) ' class="btn btn-inverse">%s</a>' % label_cancel)])
_fields = list(to_fieldsets(fields)) + [to_row([(buttons, 12)])] _fields = list(to_fieldsets(fields)) + [to_row([(buttons, 12)])]
super(SaplFormLayout, self).__init__(*_fields) super(SaplFormLayout, self).__init__(*_fields)

16
templates/compilacao/dispositivo_form.html

@ -7,6 +7,16 @@
{% block head_content %}{{block.super}} {% block head_content %}{{block.super}}
<link rel="stylesheet" href="{% sass_src 'styles/compilacao.scss' %}" type="text/css"> <link rel="stylesheet" href="{% sass_src 'styles/compilacao.scss' %}" type="text/css">
{% endblock %} {% endblock %}
{% block sections_nav %}
<ul class="nav nav-pills navbar-right">
{% url 'compilacao:dispositivo_edit' object.ta_id object.pk as edit_url%}
{% url 'compilacao:dispositivo_edit_vigencia' object.ta_id object.pk as edit_vigencia_url %}
<li {% if request.get_full_path == edit_url %}class="active"{%endif%}><a href="{{ edit_url }}">{% trans 'Dados Básicos' %}</a></li>
<li {% if request.get_full_path == edit_vigencia_url %}class="active"{%endif%}><a href="{{ edit_vigencia_url }}" >{% trans 'Vigência' %}</a></li>
<li><a href="#">{% trans 'Dispositivo Alterado' %}</a></li>
<li><a href="#">{% trans 'Dispositivo Alterador' %}</a></li>
</ul>
{% endblock sections_nav %}
{% block title %} {% block title %}
<h1><small>{{object.ta}}</small><br>{% trans 'Edição de Dispositivo' %}</h1> <h1><small>{{object.ta}}</small><br>{% trans 'Edição de Dispositivo' %}</h1>
@ -52,6 +62,12 @@
$.get(url, formData).done(function(data) { $.get(url, formData).done(function(data) {
if (data.rotulo != undefined) { if (data.rotulo != undefined) {
$('[name="rotulo"]').val(data.rotulo); $('[name="rotulo"]').val(data.rotulo);
$('[name="dispositivo0"]').val(data.dispositivo0);
$('[name="dispositivo1"]').val(data.dispositivo1);
$('[name="dispositivo2"]').val(data.dispositivo2);
$('[name="dispositivo3"]').val(data.dispositivo3);
$('[name="dispositivo4"]').val(data.dispositivo4);
$('[name="dispositivo5"]').val(data.dispositivo5);
return; return;
} }
}); });

6
templates/compilacao/dispositivo_form_parents.html

@ -2,13 +2,13 @@
{% load compilacao_filters %} {% load compilacao_filters %}
{% if not node.dispositivos_filhos_set.exists %} {% if not node.dispositivos_filhos_set.exists %}
<a href="{% url 'compilacao:dispositivo_edit' node.ta_id node.pk %}" class="btn btn-default {%if active%}btn-primary{%endif%}"> <a href="{% url view.get_url_this_view node.ta_id node.pk %}" class="btn btn-default {%if active%}btn-primary{%endif%}">
{{node|nomenclatura}} {{node|nomenclatura}}
</a> </a>
{% else %} {% else %}
<div class="cp-nav-parents btn-group btn-group-sm" role="group"> <div class="cp-nav-parents btn-group btn-group-sm" role="group">
<a href="{% url 'compilacao:dispositivo_edit' node.ta_id node.pk %}" class="btn btn-default {%if active%}btn-primary{%endif%}"> <a href="{% url view.get_url_this_view node.ta_id node.pk %}" class="btn btn-default {%if active%}btn-primary{%endif%}">
{{node|nomenclatura}} {{node|nomenclatura}}
<span class="caret"></span> <span class="caret"></span>
</a> </a>
@ -16,7 +16,7 @@
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li> <li>
{%for parent in node.dispositivos_filhos_set.all %} {%for parent in node.dispositivos_filhos_set.all %}
<a href="{% url 'compilacao:dispositivo_edit' parent.ta_id parent.pk %}"> <a href="{% url view.get_url_this_view parent.ta_id parent.pk %}">
{{parent|nomenclatura}} {{parent|nomenclatura}}
</a> </a>
{%endfor %} {%endfor %}

Loading…
Cancel
Save