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 (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 (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 (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); 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, 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 (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', ''); 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 import forms
from django.core.exceptions import NON_FIELD_ERRORS, ValidationError from django.core.exceptions import NON_FIELD_ERRORS, ValidationError
from django.db.models import Q from django.db.models import Q
from django.forms import widgets
from django.forms.forms import Form from django.forms.forms import Form
from django.forms.models import ModelForm from django.forms.models import ModelForm
from django.template import defaultfilters 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.crispy_layout_mixin import SaplFormLayout, to_column, to_row
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.')
@ -62,9 +64,12 @@ class TipoTaForm(ModelForm):
'descricao', 'descricao',
'content_type', 'content_type',
'participacao_social', 'participacao_social',
'publicacao_func' 'publicacao_func',
'perfis'
] ]
widgets = {'perfis': widgets.CheckboxSelectMultiple()}
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
row1 = to_row([ row1 = to_row([
@ -75,6 +80,7 @@ class TipoTaForm(ModelForm):
row2 = to_row([ row2 = to_row([
(InlineRadios('participacao_social'), 3), (InlineRadios('participacao_social'), 3),
(InlineRadios('publicacao_func'), 3), (InlineRadios('publicacao_func'), 3),
('perfis', 12),
]) ])
self.helper = FormHelper() 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) 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): class TipoTextoArticulado(models.Model):
sigla = models.CharField(max_length=3, verbose_name=_('Sigla')) sigla = models.CharField(max_length=3, verbose_name=_('Sigla'))
descricao = models.CharField(max_length=50, verbose_name=_('Descrição')) descricao = models.CharField(max_length=50, verbose_name=_('Descrição'))
@ -94,6 +119,15 @@ class TipoTextoArticulado(models.Model):
choices=YES_NO_CHOICES, choices=YES_NO_CHOICES,
verbose_name=_('Histórico de Publicação')) 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: class Meta:
verbose_name = _('Tipo de Texto Articulado') verbose_name = _('Tipo de Texto Articulado')
verbose_name_plural = _('Tipos de Texto Articulados') verbose_name_plural = _('Tipos de Texto Articulados')
@ -539,13 +573,11 @@ class TipoDispositivo(BaseModel):
blank=True, blank=True,
max_length=20, max_length=20,
verbose_name=_('Classe CSS')) verbose_name=_('Classe CSS'))
rotulo_prefixo_html = models.CharField( rotulo_prefixo_html = models.TextField(
blank=True, blank=True,
max_length=100,
verbose_name=_('Prefixo html do rótulo')) verbose_name=_('Prefixo html do rótulo'))
rotulo_prefixo_texto = models.CharField( rotulo_prefixo_texto = models.TextField(
blank=True, blank=True,
max_length=30,
verbose_name=_('Prefixo de Edição do rótulo')) verbose_name=_('Prefixo de Edição do rótulo'))
rotulo_ordinal = models.IntegerField( rotulo_ordinal = models.IntegerField(
choices=TIPO_NUMERO_ROTULO, choices=TIPO_NUMERO_ROTULO,
@ -575,29 +607,23 @@ class TipoDispositivo(BaseModel):
max_length=1, max_length=1,
default="-", default="-",
verbose_name=_('Separador entre Variação 4 e Variação 5')) verbose_name=_('Separador entre Variação 4 e Variação 5'))
rotulo_sufixo_texto = models.CharField( rotulo_sufixo_texto = models.TextField(
blank=True, blank=True,
max_length=30,
verbose_name=_('Sufixo de Edição do rótulo')) verbose_name=_('Sufixo de Edição do rótulo'))
rotulo_sufixo_html = models.CharField( rotulo_sufixo_html = models.TextField(
blank=True, blank=True,
max_length=100,
verbose_name=_('Sufixo html do rótulo')) verbose_name=_('Sufixo html do rótulo'))
texto_prefixo_html = models.CharField( texto_prefixo_html = models.TextField(
blank=True, blank=True,
max_length=100,
verbose_name=_('Prefixo html do texto')) verbose_name=_('Prefixo html do texto'))
texto_sufixo_html = models.CharField( texto_sufixo_html = models.TextField(
blank=True, blank=True,
max_length=100,
verbose_name=_('Sufixo html do texto')) verbose_name=_('Sufixo html do texto'))
nota_automatica_prefixo_html = models.CharField( nota_automatica_prefixo_html = models.TextField(
blank=True, blank=True,
max_length=100,
verbose_name=_('Prefixo html da nota automática')) verbose_name=_('Prefixo html da nota automática'))
nota_automatica_sufixo_html = models.CharField( nota_automatica_sufixo_html = models.TextField(
blank=True, blank=True,
max_length=100,
verbose_name=_('Sufixo html da nota automática')) verbose_name=_('Sufixo html da nota automática'))
contagem_continua = models.BooleanField( contagem_continua = models.BooleanField(
choices=YES_NO_CHOICES, verbose_name=_('Contagem contínua')) choices=YES_NO_CHOICES, verbose_name=_('Contagem contínua'))
@ -680,8 +706,7 @@ class TipoDispositivo(BaseModel):
perfil = perfil.parent perfil = perfil.parent
return False return False
def permitido_variacao( def permitido_variacao(self, base, perfil_pk=None):
self, base, perfil_pk=None):
perfil = PerfilEstruturalTextoArticulado.objects.all() perfil = PerfilEstruturalTextoArticulado.objects.all()
if not perfil_pk: if not perfil_pk:
@ -704,31 +729,6 @@ class TipoDispositivo(BaseModel):
return False 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): class TipoDispositivoRelationship(BaseModel):
pai = models.ForeignKey(TipoDispositivo, related_name='filhos_permitidos') pai = models.ForeignKey(TipoDispositivo, related_name='filhos_permitidos')
filho_permitido = models.ForeignKey( filho_permitido = models.ForeignKey(

76
sapl/compilacao/views.py

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

68
sapl/materia/forms.py

@ -1,12 +1,13 @@
from datetime import date, datetime from datetime import date, datetime
from itertools import chain
import os import os
from crispy_forms.bootstrap import (Alert, FormActions, InlineCheckboxes, from crispy_forms.bootstrap import (Alert, FormActions, InlineCheckboxes,
InlineRadios) InlineRadios)
from crispy_forms.helper import FormHelper from crispy_forms.helper import FormHelper
from crispy_forms.layout import (HTML, Button, Column, Field, Fieldset, Layout, from crispy_forms.layout import (HTML, Button, Column, Field, Fieldset, Layout,
Submit) Submit, Div)
from django import forms from django import forms
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.core.exceptions import ObjectDoesNotExist, ValidationError 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.db.models import Max
from django.forms import ModelForm, widgets from django.forms import ModelForm, widgets
from django.forms.forms import Form 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 _ from django.utils.translation import ugettext_lazy as _
import django_filters import django_filters
@ -757,8 +762,8 @@ class TipoProposicaoForm(ModelForm):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
tipo_select = Fieldset(TipoProposicao._meta.verbose_name, tipo_select = Fieldset(TipoProposicao._meta.verbose_name,
to_column(('descricao', 5)), Div(to_column(('descricao', 5)),
to_column(('content_type', 7)), to_column(('content_type', 7)), css_class='clearfix'),
to_column(('tipo_conteudo_related_radio', 6)), to_column(('tipo_conteudo_related_radio', 6)),
to_column(('perfis', 6))) to_column(('perfis', 6)))
@ -811,6 +816,44 @@ class TipoProposicaoForm(ModelForm):
return super().save(True) 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): class ProposicaoForm(forms.ModelForm):
TIPO_TEXTO_CHOICE = [ TIPO_TEXTO_CHOICE = [
@ -830,7 +873,7 @@ class ProposicaoForm(forms.ModelForm):
ano_materia = forms.CharField( ano_materia = forms.CharField(
label='Ano', required=False) label='Ano', required=False)
tipo_texto = forms.MultipleChoiceField( tipo_texto = forms.ChoiceField(
label=_('Tipo do Texto da Proposição'), label=_('Tipo do Texto da Proposição'),
required=False, required=False,
choices=TIPO_TEXTO_CHOICE, choices=TIPO_TEXTO_CHOICE,
@ -854,7 +897,8 @@ class ProposicaoForm(forms.ModelForm):
'tipo_texto'] 'tipo_texto']
widgets = { widgets = {
'descricao': widgets.Textarea(attrs={'rows': 4})} 'descricao': widgets.Textarea(attrs={'rows': 4}),
'tipo': TipoProposicaoSelect()}
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
self.texto_articulado_proposicao = sapl.base.models.AppConfig.attr( self.texto_articulado_proposicao = sapl.base.models.AppConfig.attr(
@ -896,12 +940,12 @@ class ProposicaoForm(forms.ModelForm):
super(ProposicaoForm, self).__init__(*args, **kwargs) super(ProposicaoForm, self).__init__(*args, **kwargs)
if self.instance.pk: if self.instance.pk:
self.fields['tipo_texto'].initial = [] self.fields['tipo_texto'].initial = ''
if self.instance.texto_original: 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.texto_articulado_proposicao:
if self.instance.texto_articulado.exists(): 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: if self.instance.materia_de_vinculo:
self.fields[ self.fields[
@ -944,6 +988,14 @@ class ProposicaoForm(forms.ModelForm):
def save(self, commit=True): def save(self, commit=True):
if self.instance.pk: 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) return super().save(commit)
self.instance.ano = datetime.now().year 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.auth.models import Group
from django.contrib.contenttypes.fields import GenericRelation from django.contrib.contenttypes.fields import GenericRelation
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.db import models from django.db import models
from django.db.models.deletion import PROTECT from django.db.models.deletion import PROTECT
from django.utils import formats
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from model_utils import Choices 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, SaplGenericRelation, restringe_tipos_de_arquivo_txt,
texto_upload_path) texto_upload_path)
EM_TRAMITACAO = [(1, 'Sim'), EM_TRAMITACAO = [(1, 'Sim'),
(0, 'Não')] (0, 'Não')]
@ -565,6 +569,17 @@ class Proposicao(models.Model):
documento_gerado = models.ForeignKey( documento_gerado = models.ForeignKey(
DocumentoAcessorio, blank=True, null=True)""" 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: class Meta:
verbose_name = _('Proposição') verbose_name = _('Proposição')
verbose_name_plural = _('Proposições') verbose_name_plural = _('Proposições')

13
sapl/materia/views.py

@ -624,18 +624,19 @@ class ProposicaoCrud(Crud):
def get_rows(self, object_list): def get_rows(self, object_list):
for obj in 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: if obj.data_envio is None:
obj.data_envio = 'Em elaboração...' obj.data_envio = 'Em elaboração...'
else: else:
obj.data_envio = formats.date_format( obj.data_envio = formats.date_format(
obj.data_envio, "DATETIME_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] return [self._as_row(obj) for obj in object_list]

6
sapl/templates/base.html

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

2
sapl/templates/compilacao/ajax_actions_dinamic_edit.html

@ -59,7 +59,7 @@
<div class="btn-group " role="group"> <div class="btn-group " role="group">
{% if not object.dispositivo_subsequente %} {% if not object.dispositivo_subsequente %}
{% for perfil in perfil_estrutural_list%} {% 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}} {{perfil.sigla}}
</button> </button>
{% endfor %} {% endfor %}

2
sapl/templates/compilacao/text_edit.html

@ -11,7 +11,7 @@
{% endblock %} {% endblock %}
{% block title%} {% 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 %} {% endblock %}
{% block actions %} {% block actions %}

5
sapl/templates/compilacao/text_list.html

@ -9,6 +9,11 @@
{{block.super}} {{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 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 %} {% block extra_sections_nav %}
<li><a href="{% url 'sapl.compilacao:ta_text' object.pk %}?print">{% trans 'Versão para Impressão' %}</a></li> <li><a href="{% url 'sapl.compilacao:ta_text' object.pk %}?print">{% trans 'Versão para Impressão' %}</a></li>
{% endblock %} {% endblock %}

6
sapl/templates/compilacao/textoarticulado_detail.html

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

12
sapl/templates/compilacao/tipotextoarticulado_detail.html

@ -56,6 +56,18 @@
</div> </div>
</div> </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> </fieldset>
{% endblock detail_content %} {% endblock detail_content %}
{% endblock base_content %} {% endblock base_content %}

15
sapl/templates/materia/proposicao_form.html

@ -13,6 +13,21 @@
$("#div_id_texto_original").addClass('hidden'); $("#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) { $("select[name=tipo_materia], input[name=numero_materia], input[name=ano_materia]").change(function(event) {
var url = '{% url 'sapl.api:materialegislativa-list'%}' var url = '{% url 'sapl.api:materialegislativa-list'%}'

Loading…
Cancel
Save