Browse Source

Fix #784

pull/797/head
LeandroRoberto 8 years ago
parent
commit
4ba1ffff56
  1. 3
      sapl/compilacao/compilacao_data_tables.sql
  2. 8
      sapl/compilacao/forms.py
  3. 20
      sapl/compilacao/migrations/0071_tipotextoarticulado_perfis.py
  4. 55
      sapl/compilacao/migrations/0072_auto_20161112_1553.py
  5. 86
      sapl/compilacao/models.py
  6. 76
      sapl/compilacao/views.py
  7. 68
      sapl/materia/forms.py
  8. 15
      sapl/materia/models.py
  9. 13
      sapl/materia/views.py
  10. 6
      sapl/templates/base.html
  11. 2
      sapl/templates/compilacao/ajax_actions_dinamic_edit.html
  12. 2
      sapl/templates/compilacao/text_edit.html
  13. 5
      sapl/templates/compilacao/text_list.html
  14. 6
      sapl/templates/compilacao/textoarticulado_detail.html
  15. 12
      sapl/templates/compilacao/tipotextoarticulado_detail.html
  16. 15
      sapl/templates/materia/proposicao_form.html

3
sapl/compilacao/compilacao_data_tables.sql

@ -25,8 +25,8 @@ INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html
INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (123, 'Alinea', 'alinea', '', '', 0, ')', ' – ', '', '', '', '', false, 'a', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false, false);
INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (124, 'Item', 'item', '', '', 0, '', ' – ', '', '', '', '', false, '1', '1', '1', '1', '1', '1', '.', '.', '.', '.', '.', false, false);
INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (125, 'Texto Não Estruturado', 'texto_n_estruturado', '', '', 0, '', '', '', '', '', '', true, 'N', 'N', 'N', 'N', 'N', 'N', '-', '-', '-', '-', '-', false, false);
INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (126, 'Justificativa', 'justificativa', '', '', 0, '', '', '', '<div class="titulo">Justificativa</div>', '', '', true, 'N', 'N', 'N', 'N', 'N', 'N', '-', '-', '-', '-', '-', false, false);
INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (126, 'Justificativa', 'titulo', '', '', 0, '', '', '', '', '', '', true, 'N', 'N', 'N', 'N', 'N', 'N', '-', '-', '-', '-', '-', false, false);
SELECT pg_catalog.setval('compilacao_tipodispositivo_id_seq', 126, true);
@ -248,6 +248,7 @@ INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id,
INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (125, 104, false, 1, -1, false);
INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (125, 104, false, 2, -1, false);
INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (126, 1, false, 3, -1, false);
INSERT INTO compilacao_tiponota (id, sigla, nome, modelo) VALUES (1, 'NE', 'Nota Explicativa', '');

8
sapl/compilacao/forms.py

@ -8,6 +8,7 @@ from crispy_forms.layout import (HTML, Button, Column, Div, Field, Fieldset,
from django import forms
from django.core.exceptions import NON_FIELD_ERRORS, ValidationError
from django.db.models import Q
from django.forms import widgets
from django.forms.forms import Form
from django.forms.models import ModelForm
from django.template import defaultfilters
@ -24,6 +25,7 @@ from sapl.compilacao.utils import DISPOSITIVO_SELECT_RELATED
from sapl.crispy_layout_mixin import SaplFormLayout, to_column, to_row
from sapl.utils import YES_NO_CHOICES
error_messages = {
'required': _('Este campo é obrigatório'),
'invalid': _('URL inválida.')
@ -62,9 +64,12 @@ class TipoTaForm(ModelForm):
'descricao',
'content_type',
'participacao_social',
'publicacao_func'
'publicacao_func',
'perfis'
]
widgets = {'perfis': widgets.CheckboxSelectMultiple()}
def __init__(self, *args, **kwargs):
row1 = to_row([
@ -75,6 +80,7 @@ class TipoTaForm(ModelForm):
row2 = to_row([
(InlineRadios('participacao_social'), 3),
(InlineRadios('publicacao_func'), 3),
('perfis', 12),
])
self.helper = FormHelper()

20
sapl/compilacao/migrations/0071_tipotextoarticulado_perfis.py

@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-11-12 14:25
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('compilacao', '0070_perfilestruturaltextoarticulado_parent'),
]
operations = [
migrations.AddField(
model_name='tipotextoarticulado',
name='perfis',
field=models.ManyToManyField(blank=True, help_text='\n Apenas os perfis selecionados aqui estarão disponíveis\n para o editor de Textos Articulados cujo Tipo seja este\n em edição.\n ', to='compilacao.PerfilEstruturalTextoArticulado', verbose_name='Perfis Estruturais de Textos Articulados'),
),
]

55
sapl/compilacao/migrations/0072_auto_20161112_1553.py

@ -0,0 +1,55 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-11-12 15:53
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('compilacao', '0071_tipotextoarticulado_perfis'),
]
operations = [
migrations.AlterField(
model_name='tipodispositivo',
name='nota_automatica_prefixo_html',
field=models.TextField(blank=True, verbose_name='Prefixo html da nota automática'),
),
migrations.AlterField(
model_name='tipodispositivo',
name='nota_automatica_sufixo_html',
field=models.TextField(blank=True, verbose_name='Sufixo html da nota automática'),
),
migrations.AlterField(
model_name='tipodispositivo',
name='rotulo_prefixo_html',
field=models.TextField(blank=True, verbose_name='Prefixo html do rótulo'),
),
migrations.AlterField(
model_name='tipodispositivo',
name='rotulo_prefixo_texto',
field=models.TextField(blank=True, verbose_name='Prefixo de Edição do rótulo'),
),
migrations.AlterField(
model_name='tipodispositivo',
name='rotulo_sufixo_html',
field=models.TextField(blank=True, verbose_name='Sufixo html do rótulo'),
),
migrations.AlterField(
model_name='tipodispositivo',
name='rotulo_sufixo_texto',
field=models.TextField(blank=True, verbose_name='Sufixo de Edição do rótulo'),
),
migrations.AlterField(
model_name='tipodispositivo',
name='texto_prefixo_html',
field=models.TextField(blank=True, verbose_name='Prefixo html do texto'),
),
migrations.AlterField(
model_name='tipodispositivo',
name='texto_sufixo_html',
field=models.TextField(blank=True, verbose_name='Sufixo html do texto'),
),
]

86
sapl/compilacao/models.py

@ -75,6 +75,31 @@ class BaseModel(models.Model):
update_fields=update_fields)
class PerfilEstruturalTextoArticulado(BaseModel):
sigla = models.CharField(
max_length=10, unique=True, verbose_name=_('Sigla'))
nome = models.CharField(max_length=50, verbose_name=_('Nome'))
padrao = models.BooleanField(
default=False,
choices=YES_NO_CHOICES, verbose_name=_('Padrão'))
parent = models.ForeignKey(
'self',
blank=True, null=True, default=None,
related_name='perfil_parent_set',
on_delete=PROTECT,
verbose_name=_('Perfil Herdado'))
class Meta:
verbose_name = _('Perfil Estrutural de Texto Articulado')
verbose_name_plural = _('Perfis Estruturais de Textos Articulados')
ordering = ['-padrao', 'sigla']
def __str__(self):
return self.nome
class TipoTextoArticulado(models.Model):
sigla = models.CharField(max_length=3, verbose_name=_('Sigla'))
descricao = models.CharField(max_length=50, verbose_name=_('Descrição'))
@ -94,6 +119,15 @@ class TipoTextoArticulado(models.Model):
choices=YES_NO_CHOICES,
verbose_name=_('Histórico de Publicação'))
perfis = models.ManyToManyField(
PerfilEstruturalTextoArticulado,
blank=True, verbose_name=_('Perfis Estruturais de Textos Articulados'),
help_text=_("""
Apenas os perfis selecionados aqui estarão disponíveis
para o editor de Textos Articulados cujo Tipo seja este
em edição.
"""))
class Meta:
verbose_name = _('Tipo de Texto Articulado')
verbose_name_plural = _('Tipos de Texto Articulados')
@ -539,13 +573,11 @@ class TipoDispositivo(BaseModel):
blank=True,
max_length=20,
verbose_name=_('Classe CSS'))
rotulo_prefixo_html = models.CharField(
rotulo_prefixo_html = models.TextField(
blank=True,
max_length=100,
verbose_name=_('Prefixo html do rótulo'))
rotulo_prefixo_texto = models.CharField(
rotulo_prefixo_texto = models.TextField(
blank=True,
max_length=30,
verbose_name=_('Prefixo de Edição do rótulo'))
rotulo_ordinal = models.IntegerField(
choices=TIPO_NUMERO_ROTULO,
@ -575,29 +607,23 @@ class TipoDispositivo(BaseModel):
max_length=1,
default="-",
verbose_name=_('Separador entre Variação 4 e Variação 5'))
rotulo_sufixo_texto = models.CharField(
rotulo_sufixo_texto = models.TextField(
blank=True,
max_length=30,
verbose_name=_('Sufixo de Edição do rótulo'))
rotulo_sufixo_html = models.CharField(
rotulo_sufixo_html = models.TextField(
blank=True,
max_length=100,
verbose_name=_('Sufixo html do rótulo'))
texto_prefixo_html = models.CharField(
texto_prefixo_html = models.TextField(
blank=True,
max_length=100,
verbose_name=_('Prefixo html do texto'))
texto_sufixo_html = models.CharField(
texto_sufixo_html = models.TextField(
blank=True,
max_length=100,
verbose_name=_('Sufixo html do texto'))
nota_automatica_prefixo_html = models.CharField(
nota_automatica_prefixo_html = models.TextField(
blank=True,
max_length=100,
verbose_name=_('Prefixo html da nota automática'))
nota_automatica_sufixo_html = models.CharField(
nota_automatica_sufixo_html = models.TextField(
blank=True,
max_length=100,
verbose_name=_('Sufixo html da nota automática'))
contagem_continua = models.BooleanField(
choices=YES_NO_CHOICES, verbose_name=_('Contagem contínua'))
@ -680,8 +706,7 @@ class TipoDispositivo(BaseModel):
perfil = perfil.parent
return False
def permitido_variacao(
self, base, perfil_pk=None):
def permitido_variacao(self, base, perfil_pk=None):
perfil = PerfilEstruturalTextoArticulado.objects.all()
if not perfil_pk:
@ -704,31 +729,6 @@ class TipoDispositivo(BaseModel):
return False
class PerfilEstruturalTextoArticulado(BaseModel):
sigla = models.CharField(
max_length=10, unique=True, verbose_name=_('Sigla'))
nome = models.CharField(max_length=50, verbose_name=_('Nome'))
padrao = models.BooleanField(
default=False,
choices=YES_NO_CHOICES, verbose_name=_('Padrão'))
parent = models.ForeignKey(
'self',
blank=True, null=True, default=None,
related_name='perfil_parent_set',
on_delete=PROTECT,
verbose_name=_('Perfil Herdado'))
class Meta:
verbose_name = _('Perfil Estrutural de Texto Articulado')
verbose_name_plural = _('Perfis Estruturais de Textos Articulados')
ordering = ['-padrao', 'sigla']
def __str__(self):
return self.nome
class TipoDispositivoRelationship(BaseModel):
pai = models.ForeignKey(TipoDispositivo, related_name='filhos_permitidos')
filho_permitido = models.ForeignKey(

76
sapl/compilacao/views.py

@ -1638,9 +1638,6 @@ class ActionDispositivoCreateMixin(ActionsCommonsMixin):
'action': 'json_add_prior',
'itens': []}]
if request and 'perfil_estrutural' not in request.session:
self.set_perfil_in_session(request)
perfil_pk = request.session['perfil_estrutural']
prox_possivel = Dispositivo.objects.filter(
@ -2222,42 +2219,47 @@ class ActionsEditMixin(ActionDragAndMoveDispositivoAlteradoMixin,
return JsonResponse(data, safe=False)
def get_queryset_perfil_estrutural(self):
perfis = PerfilEstruturalTextoArticulado.objects.all()
return perfis
def json_get_perfis(self, context):
if 'perfil_pk' in self.request.GET:
self.set_perfil_in_session(
self.request, self.request.GET['perfil_pk'])
elif 'perfil_estrutural' not in self.request.session:
self.set_perfil_in_session(request=self.request)
data = {'pk': self.kwargs['dispositivo_id'],
'pai': [self.kwargs['dispositivo_id'], ]}
return data
def set_perfil_in_session(self, request=None, perfil_id=0):
if not request:
return None
def update_perfis(self):
qs = PerfilEstruturalTextoArticulado.objects.all()
request = self.request
if perfil_id:
perfil = PerfilEstruturalTextoArticulado.objects.get(
pk=perfil_id)
request.session['perfil_estrutural'] = perfil.pk
return perfil.pk
ta = None
if hasattr(self, 'object') and isinstance(self.object, Dispositivo):
ta = self.object.ta
elif hasattr(self, 'object') and isinstance(
self.object, TextoArticulado):
ta = self.object
else:
perfis = PerfilEstruturalTextoArticulado.objects.filter(
padrao=True)[:1]
ta_id = self.kwargs.get('ta_id', 0)
if ta_id:
ta = TextoArticulado.objects.get(pk=ta_id)
if not perfis.exists():
request.session.pop('perfil_estrutural')
if ta:
if ta.content_object and hasattr(ta.content_object, 'perfis'):
qs = ta.content_object.perfis
else:
request.session['perfil_estrutural'] = perfis[0].pk
return perfis[0].pk
return None
qs = ta.tipo_ta.perfis.all()
perfil_get = request.GET.get('perfil_pk', 0)
if perfil_get and qs.filter(id=perfil_get).exists():
request.session['perfil_estrutural'] = int(perfil_get)
return qs
perfil_session = request.session.get('perfil_estrutural', perfil_get)
if perfil_session and qs.filter(id=perfil_session).exists():
request.session['perfil_estrutural'] = int(perfil_session)
return qs
if qs.exists():
request.session['perfil_estrutural'] = qs.first().id
return qs
def json_add_next_registra_inclusao(
self, context, local_add='json_add_next'):
@ -2500,6 +2502,9 @@ class DispositivoDinamicEditView(
self.template_name = 'compilacao/text_edit_bloco.html'
return TextEditView.get(self, request, *args, **kwargs)
self.object = Dispositivo.objects.get(pk=self.kwargs['dispositivo_id'])
perfil_estrutural_list = self.update_perfis()
self.template_name = 'compilacao/ajax_form.html'
self.action = request.GET['action']
@ -2519,9 +2524,6 @@ class DispositivoDinamicEditView(
elif self.action.startswith('get_actions'):
self.form_class = None
self.object = Dispositivo.objects.get(
pk=self.kwargs['dispositivo_id'])
ta_id = self.kwargs['ta_id']
context = {}
@ -2537,17 +2539,9 @@ class DispositivoDinamicEditView(
'ajax_actions_dinamic_edit.html')
if ta_id == str(self.object.ta_id):
context['perfil_estrutural_list'] = perfil_estrutural_list
context['allowed_inserts'] = self.allowed_inserts()
if 'perfil_pk' in request.GET:
self.set_perfil_in_session(
request, request.GET['perfil_pk'])
elif 'perfil_estrutural' not in request.session:
self.set_perfil_in_session(request=request)
context['perfil_estrutural_list'
] = PerfilEstruturalTextoArticulado.objects.all()
return self.render_to_response(context)
elif self.action.startswith('json_'):

68
sapl/materia/forms.py

@ -1,12 +1,13 @@
from datetime import date, datetime
from itertools import chain
import os
from crispy_forms.bootstrap import (Alert, FormActions, InlineCheckboxes,
InlineRadios)
from crispy_forms.helper import FormHelper
from crispy_forms.layout import (HTML, Button, Column, Field, Fieldset, Layout,
Submit)
Submit, Div)
from django import forms
from django.contrib.contenttypes.models import ContentType
from django.core.exceptions import ObjectDoesNotExist, ValidationError
@ -16,6 +17,10 @@ from django.db import models, transaction
from django.db.models import Max
from django.forms import ModelForm, widgets
from django.forms.forms import Form
from django.forms.widgets import Select
from django.utils.encoding import force_text
from django.utils.html import format_html
from django.utils.safestring import mark_safe
from django.utils.translation import ugettext_lazy as _
import django_filters
@ -757,8 +762,8 @@ class TipoProposicaoForm(ModelForm):
def __init__(self, *args, **kwargs):
tipo_select = Fieldset(TipoProposicao._meta.verbose_name,
to_column(('descricao', 5)),
to_column(('content_type', 7)),
Div(to_column(('descricao', 5)),
to_column(('content_type', 7)), css_class='clearfix'),
to_column(('tipo_conteudo_related_radio', 6)),
to_column(('perfis', 6)))
@ -811,6 +816,44 @@ class TipoProposicaoForm(ModelForm):
return super().save(True)
class TipoProposicaoSelect(Select):
def render_tipo_option(self, selected_choices, option_value, option_label,
data_has_perfil=False):
if option_value is None:
option_value = ''
option_value = force_text(option_value)
if option_value in selected_choices:
selected_html = mark_safe(' selected="selected"')
if not self.allow_multiple_selected:
# Only allow for a single selection.
selected_choices.remove(option_value)
else:
selected_html = ''
return format_html('<option value="{}"{} data-has-perfil={}>{}</option>',
option_value,
selected_html,
str(data_has_perfil),
force_text(option_label))
def render_options(self, choices, selected_choices):
# Normalize to strings.
selected_choices = set(force_text(v) for v in selected_choices)
output = []
output.append(
self.render_tipo_option(
selected_choices, '', self.choices.field.empty_label))
for tipo in self.choices.queryset.all():
output.append(
self.render_tipo_option(
selected_choices,
str(tipo.pk),
str(tipo),
data_has_perfil=tipo.perfis.exists()))
return '\n'.join(output)
class ProposicaoForm(forms.ModelForm):
TIPO_TEXTO_CHOICE = [
@ -830,7 +873,7 @@ class ProposicaoForm(forms.ModelForm):
ano_materia = forms.CharField(
label='Ano', required=False)
tipo_texto = forms.MultipleChoiceField(
tipo_texto = forms.ChoiceField(
label=_('Tipo do Texto da Proposição'),
required=False,
choices=TIPO_TEXTO_CHOICE,
@ -854,7 +897,8 @@ class ProposicaoForm(forms.ModelForm):
'tipo_texto']
widgets = {
'descricao': widgets.Textarea(attrs={'rows': 4})}
'descricao': widgets.Textarea(attrs={'rows': 4}),
'tipo': TipoProposicaoSelect()}
def __init__(self, *args, **kwargs):
self.texto_articulado_proposicao = sapl.base.models.AppConfig.attr(
@ -896,12 +940,12 @@ class ProposicaoForm(forms.ModelForm):
super(ProposicaoForm, self).__init__(*args, **kwargs)
if self.instance.pk:
self.fields['tipo_texto'].initial = []
self.fields['tipo_texto'].initial = ''
if self.instance.texto_original:
self.fields['tipo_texto'].initial.append('D')
self.fields['tipo_texto'].initial = 'D'
if self.texto_articulado_proposicao:
if self.instance.texto_articulado.exists():
self.fields['tipo_texto'].initial.append('T')
self.fields['tipo_texto'].initial = 'T'
if self.instance.materia_de_vinculo:
self.fields[
@ -944,6 +988,14 @@ class ProposicaoForm(forms.ModelForm):
def save(self, commit=True):
if self.instance.pk:
if 'tipo_texto' in self.cleaned_data:
if self.cleaned_data['tipo_texto'] in ['T', ''] and\
self.instance.texto_original:
self.instance.texto_original.delete()
if self.cleaned_data['tipo_texto'] in ['D', '']:
self.instance.texto_articulado.all().delete()
return super().save(commit)
self.instance.ano = datetime.now().year

15
sapl/materia/models.py

@ -1,8 +1,11 @@
from datetime import datetime
from django.contrib.auth.models import Group
from django.contrib.contenttypes.fields import GenericRelation
from django.contrib.contenttypes.models import ContentType
from django.db import models
from django.db.models.deletion import PROTECT
from django.utils import formats
from django.utils.translation import ugettext_lazy as _
from model_utils import Choices
@ -15,6 +18,7 @@ from sapl.utils import (RANGE_ANOS, YES_NO_CHOICES, SaplGenericForeignKey,
SaplGenericRelation, restringe_tipos_de_arquivo_txt,
texto_upload_path)
EM_TRAMITACAO = [(1, 'Sim'),
(0, 'Não')]
@ -565,6 +569,17 @@ class Proposicao(models.Model):
documento_gerado = models.ForeignKey(
DocumentoAcessorio, blank=True, null=True)"""
@property
def perfis(self):
return self.tipo.perfis.all()
@property
def title_type(self):
return '%s nº _____ %s' % (
self.tipo, formats.date_format(
self.data_envio if self.data_envio else datetime.now(),
"\d\e d \d\e F \d\e Y"))
class Meta:
verbose_name = _('Proposição')
verbose_name_plural = _('Proposições')

13
sapl/materia/views.py

@ -624,18 +624,19 @@ class ProposicaoCrud(Crud):
def get_rows(self, object_list):
for obj in object_list:
if obj.data_recebimento is None:
obj.data_recebimento = 'Não recebida'\
if obj.data_envio else 'Não enviada'
else:
obj.data_recebimento = formats.date_format(
obj.data_recebimento, "DATETIME_FORMAT")
if obj.data_envio is None:
obj.data_envio = 'Em elaboração...'
else:
obj.data_envio = formats.date_format(
obj.data_envio, "DATETIME_FORMAT")
if obj.data_recebimento is None:
obj.data_recebimento = 'Não recebida'
else:
obj.data_envio = formats.date_format(
obj.data_recebimento, "DATETIME_FORMAT")
return [self._as_row(obj) for obj in object_list]

6
sapl/templates/base.html

@ -94,7 +94,9 @@
</span>
</a>
</div>
{% block sections_nav %} {% subnav %} {% endblock sections_nav %}
<div class="hidden-print">
{% block sections_nav %} {% subnav %} {% endblock sections_nav %}
</div>
</div>
</header>
{% endblock main_header %}
@ -148,7 +150,7 @@
{% block footer_container %}
<footer id="footer" class="footer page__row">
<footer id="footer" class="footer page__row hidden-print">
<div class="container">
<div class="row">

2
sapl/templates/compilacao/ajax_actions_dinamic_edit.html

@ -59,7 +59,7 @@
<div class="btn-group " role="group">
{% if not object.dispositivo_subsequente %}
{% for perfil in perfil_estrutural_list%}
<button type="button" class="btn-action btn-perfis btn btn-xs {%if request.session.perfil_estrutural == perfil.pk%}btn-primary{%else%}btn-default{%endif%}" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true" pk="{{object.pk}}" perfil_pk="{{perfil.pk}}" action="json_get_perfis" title="{{perfil.nome}}">
<button type="button" class="btn-action btn-perfis btn btn-xs {%if request.session.perfil_estrutural == perfil.pk %}btn-primary{%else%}btn-default{%endif%}" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true" pk="{{object.pk}}" perfil_pk="{{perfil.pk}}" action="json_get_perfis" title="{{perfil.nome}}">
{{perfil.sigla}}
</button>
{% endfor %}

2
sapl/templates/compilacao/text_edit.html

@ -11,7 +11,7 @@
{% endblock %}
{% block title%}
<h1 class="page-header">{{object }}. <small><i>{% trans 'Texto Multivigente em Edição' %}</i></small></h1>
<h2 class="page-header">{% if object.content_object.title_type %}{{object.content_object.title_type}}{%else%}{{object}}{% endif %}{% comment %}<small><i>{% trans 'Texto Multivigente em Edição' %}</i></small>{% endcomment %}</h2>
{% endblock %}
{% block actions %}

5
sapl/templates/compilacao/text_list.html

@ -9,6 +9,11 @@
{{block.super}}
<link rel="stylesheet" href="{% sass_src 'styles/compilacao.scss' %}" type="text/css">
{% endblock %}
{% block title %}
<h2 class="page-header">{% if object.content_object.title_type %}{{object.content_object.title_type}}{%else%}{{object}}{% endif %}{% comment %}<small><i>{% trans 'Texto Multivigente em Edição' %}</i></small>{% endcomment %}</h2>
{% endblock %}
{% block extra_sections_nav %}
<li><a href="{% url 'sapl.compilacao:ta_text' object.pk %}?print">{% trans 'Versão para Impressão' %}</a></li>
{% endblock %}

6
sapl/templates/compilacao/textoarticulado_detail.html

@ -31,7 +31,7 @@
{% block base_content %}
{% block actions %}
<div class="clearfix">
<div class="clearfix hidden-print">
<div class="actions btn-group pull-right" role="group">
{% if perms.compilacao.lock_unlock_textoarticulado and not object.editable_only_by_owners%}
@ -44,12 +44,12 @@
<a href="{% url 'sapl.compilacao:ta_text_edit' object.pk %}" class="btn btn-default">{% trans 'Editar Texto' %}</a>
{% endif %}
</div>
</div>
</div>
{% endblock actions %}
{% block detail_content %} {# TODO replace fieldset for something semantically correct, but with similar visual grouping style #}
<fieldset>
<fieldset class="hidden-print">
<legend>{%trans 'Identificação Básica'%}</legend>
<div class="row">
<div class="col-md-3">

12
sapl/templates/compilacao/tipotextoarticulado_detail.html

@ -56,6 +56,18 @@
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div id="div_id_ano" class="holder">
<label>{% field_verbose_name object 'perfis' %}</label>
<ul>
{% for perfil in object.perfis.all %}
<li>{{perfil}}</li>
{% endfor %}
</ul>
</div>
</div>
</div>
</fieldset>
{% endblock detail_content %}
{% endblock base_content %}

15
sapl/templates/materia/proposicao_form.html

@ -13,6 +13,21 @@
$("#div_id_texto_original").addClass('hidden');
});
$("select[name=tipo]").change(function(event) {
if (this.selectedOptions[0].getAttribute('data-has-perfil') === "True") {
$("input[name=tipo_texto]").closest('label').removeClass('disabled');
$("input[name=tipo_texto]").prop('disabled', false);
}
else {
$("input[name=tipo_texto]").closest('label').addClass('disabled');
$("input[name=tipo_texto]").prop('disabled', true);
}
$("input[name=tipo_texto]").first().prop('checked', true);
$("input[name=tipo_texto]").first().closest('label').addClass('checked');
});
$("select[name=tipo_materia], input[name=numero_materia], input[name=ano_materia]").change(function(event) {
var url = '{% url 'sapl.api:materialegislativa-list'%}'

Loading…
Cancel
Save