Browse Source

refatora backend de compilação

pull/3029/head
Leandro Roberto 5 years ago
parent
commit
a68d7117f7
  1. 58
      sapl/compilacao/forms.py
  2. 27
      sapl/compilacao/migrations/0013_auto_20190924_0830.py
  3. 29
      sapl/compilacao/models.py
  4. 3
      sapl/compilacao/templatetags/compilacao_filters.py
  5. 422
      sapl/compilacao/views.py
  6. 123
      sapl/templates/compilacao/dispositivo_form_search_fragment.html
  7. 45
      sapl/templates/compilacao/dispositivo_form_search_fragment_child.html
  8. 4
      sapl/templates/compilacao/subnav.html
  9. 23
      sapl/templates/compilacao/text_edit.html
  10. 16
      sapl/templates/compilacao/text_edit_bloco.html
  11. 5
      sapl/templates/compilacao/text_list.html
  12. 12
      sapl/templates/compilacao/text_list__embedded.html
  13. 4
      sapl/templates/compilacao/text_list_blocoalteracao.html
  14. 15
      sapl/templates/compilacao/textoarticulado_detail.html
  15. 51
      sapl/templates/compilacao/textoarticulado_list.html

58
sapl/compilacao/forms.py

@ -13,6 +13,7 @@ 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
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from model_utils.choices import Choices
from sapl import utils from sapl import utils
from sapl.compilacao.models import (NOTAS_PUBLICIDADE_CHOICES, from sapl.compilacao.models import (NOTAS_PUBLICIDADE_CHOICES,
@ -115,7 +116,7 @@ class TaForm(ModelForm):
queryset=TipoTextoArticulado.objects.all(), queryset=TipoTextoArticulado.objects.all(),
required=True, required=True,
empty_label=None) empty_label=None)
numero = forms.IntegerField( numero = forms.CharField(
label=TextoArticulado._meta.get_field( label=TextoArticulado._meta.get_field(
'numero').verbose_name, 'numero').verbose_name,
required=True) required=True)
@ -744,6 +745,12 @@ class DispositivoEdicaoBasicaForm(ModelForm):
class DispositivoSearchModalForm(Form): class DispositivoSearchModalForm(Form):
TIPO_RESULTADO_CHOICES = Choices(
('C', 'coincidentes', _('Apenas Coincidentes')),
('I', 'internos', _('Incluir Internos')),
('S', 'coin_sequentes', _('Coincidentes e seus sequentes')),
)
tipo_ta = forms.ModelChoiceField( tipo_ta = forms.ModelChoiceField(
label=_('Tipo do Texto Articulado'), label=_('Tipo do Texto Articulado'),
queryset=TipoTextoArticulado.objects.all(), queryset=TipoTextoArticulado.objects.all(),
@ -758,9 +765,9 @@ class DispositivoSearchModalForm(Form):
ano_ta = forms.IntegerField( ano_ta = forms.IntegerField(
label=_('Ano do Documento'), required=False) label=_('Ano do Documento'), required=False)
dispositivos_internos = forms.ChoiceField( tipo_resultado = forms.ChoiceField(
label=_('Dispositivos Internos?'), label=_('Tipo do Resultado?'),
choices=utils.YES_NO_CHOICES, choices=TIPO_RESULTADO_CHOICES,
widget=forms.RadioSelect(), widget=forms.RadioSelect(),
required=False) required=False)
@ -769,7 +776,7 @@ class DispositivoSearchModalForm(Form):
choices=[(10, _('Dez Dispositivos')), choices=[(10, _('Dez Dispositivos')),
(30, _('Trinta Dispositivos')), (30, _('Trinta Dispositivos')),
(50, _('Cinquenta Dispositivos')), (50, _('Cinquenta Dispositivos')),
(0, _('Tudo que atender aos Critérios da Busca'))], (100, _('Cem Dispositivos'))],
widget=forms.Select(), widget=forms.Select(),
required=False) required=False)
@ -789,22 +796,33 @@ class DispositivoSearchModalForm(Form):
to_column(('num_ta', 4)), to_column(('num_ta', 4)),
to_column(('ano_ta', 4)), to_column(('ano_ta', 4)),
to_column(('max_results', 4))), to_column(('max_results', 4))),
Row( Row(
to_column(('tipo_ta', 6)), to_column(('tipo_resultado', 3)),
to_column(('tipo_model', 6))), to_column(
Row(to_column((InlineRadios('dispositivos_internos'), 3)), (
to_column(('rotulo_dispositivo', 2)), Div(
to_column((FieldWithButtons( Row(
Field( to_column(('tipo_ta', 6)),
'texto_dispositivo', to_column(('tipo_model', 6))),
placeholder=_('Digite palavras, letras, ' Row(
'números ou algo' to_column(('rotulo_dispositivo', 4)),
' que estejam no texto.')), to_column(
StrictButton( (
_('Buscar'), FieldWithButtons(
css_class='btn-busca btn-primary')), 7)) Field(
'texto_dispositivo',
placeholder=_('Digite palavras, letras, '
'números ou algo'
' que estejam no texto.')),
StrictButton(
_('Buscar'),
css_class='btn-busca btn-primary')), 8))
)
), 9
)
) )
) ))
self.helper = SaplFormHelper() self.helper = SaplFormHelper()
self.helper.layout = Layout( self.helper.layout = Layout(
@ -821,7 +839,7 @@ class DispositivoSearchModalForm(Form):
choice = ch(kwargs['instance'].ta.tipo_ta_id) choice = ch(kwargs['instance'].ta.tipo_ta_id)
self.base_fields['tipo_model'].choices = choice self.base_fields['tipo_model'].choices = choice
kwargs['initial'].update({'dispositivos_internos': False}) kwargs['initial'].update({'tipo_resultado': 'C'})
super(DispositivoSearchModalForm, self).__init__(*args, **kwargs) super(DispositivoSearchModalForm, self).__init__(*args, **kwargs)

27
sapl/compilacao/migrations/0013_auto_20190924_0830.py

@ -0,0 +1,27 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.24 on 2019-09-24 11:30
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('compilacao', '0012_bug_auto_inserido'),
]
operations = [
migrations.AlterField(
model_name='textoarticulado',
name='editable_only_by_owners',
field=models.BooleanField(choices=[(True, 'Sim'), (False, 'Não')], default=True,
verbose_name='Editável apenas pelos donos do Texto Articulado?'),
),
migrations.AlterField(
model_name='textoarticulado',
name='editing_locked',
field=models.BooleanField(choices=[(
True, 'Sim'), (False, 'Não')], default=True, verbose_name='Texto Articulado em Edição?'),
),
]

29
sapl/compilacao/models.py

@ -221,12 +221,12 @@ class TextoArticulado(TimestampedMixin):
editable_only_by_owners = models.BooleanField( editable_only_by_owners = models.BooleanField(
choices=YES_NO_CHOICES, choices=YES_NO_CHOICES,
default=True, default=True,
verbose_name=_('Editável apenas pelos donos do Texto Articulado')) verbose_name=_('Editável apenas pelos donos do Texto Articulado?'))
editing_locked = models.BooleanField( editing_locked = models.BooleanField(
choices=YES_NO_CHOICES, choices=YES_NO_CHOICES,
default=True, default=True,
verbose_name=_('Texto Articulado em Edição')) verbose_name=_('Texto Articulado em Edição?'))
privacidade = models.IntegerField( privacidade = models.IntegerField(
_('Privacidade'), _('Privacidade'),
@ -416,8 +416,8 @@ class TextoArticulado(TimestampedMixin):
def clone_for(self, obj): def clone_for(self, obj):
# O clone gera um texto válido original dada a base self, # O clone gera um texto válido original dada a base self,
# mesmo sendo esta base um texto compilado. # mesmo sendo esta base um Texto Articulado.
# Os dispositivos a clonar será com base no texto compilado # Os dispositivos a clonar será com base no Texto Articulado
assert self.tipo_ta and self.tipo_ta.content_type, _( assert self.tipo_ta and self.tipo_ta.content_type, _(
'Não é permitido chamar o método clone_for ' 'Não é permitido chamar o método clone_for '
@ -1072,6 +1072,10 @@ class Dispositivo(BaseModel, TimestampedMixin):
'Permissão alteração global do dispositivo de vigência')), 'Permissão alteração global do dispositivo de vigência')),
) )
def ws_sync(self):
return self.ta and self.ta.privacidade in (
STATUS_TA_IMMUTABLE_PUBLIC, STATUS_TA_PUBLIC)
def clean(self): def clean(self):
""" """
Check for instances with null values in unique_together fields. Check for instances with null values in unique_together fields.
@ -1113,14 +1117,15 @@ class Dispositivo(BaseModel, TimestampedMixin):
self.contagem_continua = self.tipo_dispositivo.contagem_continua self.contagem_continua = self.tipo_dispositivo.contagem_continua
try: """try:
if self.texto: if self.texto:
self.texto = self.texto.replace('\xa0', '')
self.texto = str(BeautifulSoup(self.texto, "html.parser")) self.texto = str(BeautifulSoup(self.texto, "html.parser"))
if self.texto_atualizador: if self.texto_atualizador:
self.texto_atualizador = str(BeautifulSoup( self.texto_atualizador = str(BeautifulSoup(
self.texto_atualizador, "html.parser")) self.texto_atualizador, "html.parser"))
except: except:
pass pass"""
return super().save( return super().save(
force_insert=force_insert, force_update=force_update, using=using, force_insert=force_insert, force_update=force_update, using=using,
@ -1624,7 +1629,7 @@ class Dispositivo(BaseModel, TimestampedMixin):
yield ultimo yield ultimo
@staticmethod @staticmethod
def new_instance_based_on(dispositivo_base, tipo_base): def new_instance_based_on(dispositivo_base, tipo_base, base_alteracao=None):
dp = Dispositivo() dp = Dispositivo()
dp.tipo_dispositivo = tipo_base dp.tipo_dispositivo = tipo_base
@ -1639,6 +1644,16 @@ class Dispositivo(BaseModel, TimestampedMixin):
dp.dispositivo_pai = dispositivo_base.dispositivo_pai dp.dispositivo_pai = dispositivo_base.dispositivo_pai
dp.publicacao = dispositivo_base.publicacao dp.publicacao = dispositivo_base.publicacao
b = base_alteracao if base_alteracao else dispositivo_base
# teste de criação inversa de itens alterados por mesmo bloco
dp.ta_publicado = b.ta_publicado
dp.dispositivo_atualizador = b.dispositivo_atualizador
if dp.ta_publicado:
dp.ordem_bloco_atualizador = b.ordem_bloco_atualizador + \
Dispositivo.INTERVALO_ORDEM
dp.dispositivo_vigencia = dispositivo_base.dispositivo_vigencia dp.dispositivo_vigencia = dispositivo_base.dispositivo_vigencia
if dp.dispositivo_vigencia: if dp.dispositivo_vigencia:
dp.inicio_eficacia = dp.dispositivo_vigencia.inicio_eficacia dp.inicio_eficacia = dp.dispositivo_vigencia.inicio_eficacia

3
sapl/compilacao/templatetags/compilacao_filters.py

@ -65,6 +65,8 @@ def get_bloco_atualizador(pk_atualizador):
@register.simple_tag @register.simple_tag
def dispositivo_desativado(dispositivo, inicio_vigencia, fim_vigencia): def dispositivo_desativado(dispositivo, inicio_vigencia, fim_vigencia):
if dispositivo.dispositivo_de_revogacao:
return 'revogado'
if inicio_vigencia and fim_vigencia: if inicio_vigencia and fim_vigencia:
if dispositivo.fim_vigencia is None: if dispositivo.fim_vigencia is None:
return '' return ''
@ -292,7 +294,6 @@ def nomenclatura_heranca(d, ignore_ultimo=0, ignore_primeiro=0):
return result return result
@register.filter @register.filter
def list(obj): def list(obj):
return [obj, ] return [obj, ]

422
sapl/compilacao/views.py

@ -10,7 +10,7 @@ from django.conf import settings
from django.contrib import messages from django.contrib import messages
from django.contrib.auth.mixins import PermissionRequiredMixin from django.contrib.auth.mixins import PermissionRequiredMixin
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError, PermissionDenied
from django.core.signing import Signer from django.core.signing import Signer
from django.core.urlresolvers import reverse, reverse_lazy from django.core.urlresolvers import reverse, reverse_lazy
from django.db import transaction from django.db import transaction
@ -494,6 +494,18 @@ class TaListView(CompMixin, ListView):
~Q(owners=self.request.user.id), ~Q(owners=self.request.user.id),
privacidade=STATUS_TA_PRIVATE) privacidade=STATUS_TA_PRIVATE)
if 'check' in self.request.GET:
qs = qs.filter(
temp_check_migrations=False,
privacidade=0,
).exclude(dispositivos_set__tipo_dispositivo_id=3)
if 'check_dvt' in self.request.GET:
qs = qs.filter(
).filter(
dispositivos_set__isnull=False,
dispositivos_set__dispositivo_vigencia__isnull=True).distinct()
return qs return qs
@ -565,13 +577,29 @@ class TaDeleteView(CompMixin, DeleteView):
template_name = "crud/confirm_delete.html" template_name = "crud/confirm_delete.html"
permission_required = 'compilacao.delete_textoarticulado' permission_required = 'compilacao.delete_textoarticulado'
def post(self, request, *args, **kwargs):
if not request.user.is_superuser:
raise PermissionDenied
return DeleteView.post(self, request, *args, **kwargs)
@property @property
def detail_url(self): def detail_url(self):
return reverse_lazy('sapl.compilacao:ta_detail', return reverse_lazy('sapl.compilacao:ta_detail',
kwargs={'pk': self.kwargs['pk']}) kwargs={'pk': self.kwargs['pk']})
def get_success_url(self): def get_success_url(self):
return reverse_lazy('sapl.compilacao:ta_list') messages.info(self.request, 'Texto Articulado excluido com sucesso!')
reverse_url = '%s:%s_detail' % (
self.object.content_object._meta.app_config.name,
self.object.content_object._meta.model_name)
return reverse_lazy(reverse_url,
kwargs={'pk': self.object.content_object.pk})
@property
def title(self):
return '<b>Texto Articulado:</b> %s' % self.object
class DispositivoSuccessUrlMixin(CompMixin): class DispositivoSuccessUrlMixin(CompMixin):
@ -849,6 +877,10 @@ class TextView(CompMixin, ListView):
fim_vigencia = None fim_vigencia = None
ta_vigencia = None ta_vigencia = None
@property
def title(self):
return '<b>Texto Articulado:</b> %s' % self.object
def has_permission(self): def has_permission(self):
self.object = self.ta self.object = self.ta
return self.object.has_view_permission(self.request) return self.object.has_view_permission(self.request)
@ -1078,7 +1110,7 @@ class TextEditView(CompMixin, TemplateView):
self.object.content_object.save() self.object.content_object.save()
else: else:
if 'lock' in request.GET: if 'lock' in request.GET or 'check' in request.GET:
# TODO - implementar logging de ação de usuário # TODO - implementar logging de ação de usuário
notificacoes = self.get_notificacoes( notificacoes = self.get_notificacoes(
@ -1097,11 +1129,17 @@ class TextEditView(CompMixin, TemplateView):
'sapl.compilacao:ta_text_notificacoes', kwargs={ 'sapl.compilacao:ta_text_notificacoes', kwargs={
'ta_id': self.object.id})) 'ta_id': self.object.id}))
self.object.editing_locked = True if 'lock' in request.GET:
self.object.privacidade = STATUS_TA_PUBLIC self.object.editing_locked = True
self.object.save() self.object.privacidade = STATUS_TA_PUBLIC
messages.success(request, _( self.object.save()
'Texto Articulado bloqueado com sucesso.')) messages.success(request, _(
'Texto Articulado publicado com sucesso.'))
else:
self.object.temp_check_migrations = True
self.object.save()
messages.success(request, _(
'Texto Articulado Checado...'))
if self.object.content_object: if self.object.content_object:
self.object.content_object.save() self.object.content_object.save()
@ -2083,6 +2121,10 @@ class ActionDispositivoCreateMixin(ActionsCommonsMixin):
if len(result) > 2: if len(result) > 2:
result.pop() result.pop()
result[0]['itens'] = result[1]['itens'] + result[0]['itens']
result[0]['tipo_insert'] = 'Inserção'
result[1]['itens'] = []
return result return result
except Exception as e: except Exception as e:
@ -2097,7 +2139,6 @@ class ActionDispositivoCreateMixin(ActionsCommonsMixin):
dvt = Dispositivo.objects.get(pk=self.kwargs['dispositivo_id']) dvt = Dispositivo.objects.get(pk=self.kwargs['dispositivo_id'])
if dvt.auto_inserido: if dvt.auto_inserido:
dvt = dvt.dispositivo_pai dvt = dvt.dispositivo_pai
try: try:
Dispositivo.objects.filter( Dispositivo.objects.filter(
ta=dvt.ta, ta_publicado__isnull=True ta=dvt.ta, ta_publicado__isnull=True
@ -2109,7 +2150,7 @@ class ActionDispositivoCreateMixin(ActionsCommonsMixin):
Dispositivo.objects.filter(ta_publicado=dvt.ta Dispositivo.objects.filter(ta_publicado=dvt.ta
).update( ).update(
dispositivo_vigencia=dvt, dispositivo_vigencia=dvt,
inicio_vigencia=dvt.inicio_eficacia, inicio_vigencia=dvt.inicio_vigencia,
inicio_eficacia=dvt.inicio_eficacia) inicio_eficacia=dvt.inicio_eficacia)
dps = Dispositivo.objects.filter(dispositivo_vigencia=dvt) dps = Dispositivo.objects.filter(dispositivo_vigencia=dvt)
@ -2162,6 +2203,10 @@ class ActionDispositivoCreateMixin(ActionsCommonsMixin):
dp_auto_insert = None dp_auto_insert = None
base = Dispositivo.objects.get(pk=self.kwargs['dispositivo_id']) base = Dispositivo.objects.get(pk=self.kwargs['dispositivo_id'])
if base.dispositivo_atualizador:
registro_inclusao = True
tipo = TipoDispositivo.objects.get(pk=context['tipo_pk']) tipo = TipoDispositivo.objects.get(pk=context['tipo_pk'])
pub_last = Publicacao.objects.order_by( pub_last = Publicacao.objects.order_by(
'data', 'hora').filter(ta=base.ta).last() 'data', 'hora').filter(ta=base.ta).last()
@ -2197,11 +2242,13 @@ class ActionDispositivoCreateMixin(ActionsCommonsMixin):
dp_pai = dp dp_pai = dp
if dp_irmao is not None: if dp_irmao is not None:
dp = Dispositivo.new_instance_based_on(dp_irmao, tipo) dp = Dispositivo.new_instance_based_on(
dp_irmao, tipo, base_alteracao=base)
dp.transform_in_next(variacao) dp.transform_in_next(variacao)
else: else:
# Inserção sem precedente # Inserção sem precedente
dp = Dispositivo.new_instance_based_on(dp_pai, tipo) dp = Dispositivo.new_instance_based_on(
dp_pai, tipo, base_alteracao=base)
dp.dispositivo_pai = dp_pai dp.dispositivo_pai = dp_pai
dp.nivel += 1 dp.nivel += 1
@ -2224,6 +2271,9 @@ class ActionDispositivoCreateMixin(ActionsCommonsMixin):
else: else:
dp.set_numero_completo([1, 0, 0, 0, 0, 0, ]) dp.set_numero_completo([1, 0, 0, 0, 0, 0, ])
if dp.dispositivo_atualizador:
registro_inclusao = True
# verificar se existe restrição de quantidade de itens # verificar se existe restrição de quantidade de itens
if dp.dispositivo_pai: if dp.dispositivo_pai:
for perfil in perfil_parents: for perfil in perfil_parents:
@ -2262,7 +2312,8 @@ class ActionDispositivoCreateMixin(ActionsCommonsMixin):
dp.incrementar_irmaos(variacao, [local_add, ], force=False) dp.incrementar_irmaos(variacao, [local_add, ], force=False)
dp.publicacao = pub_last dp.publicacao = pub_last
dp.save()
dp.save(clean=not registro_inclusao)
count_auto_insert = 0 count_auto_insert = 0
if create_auto_inserts: if create_auto_inserts:
@ -2314,6 +2365,10 @@ class ActionDispositivoCreateMixin(ActionsCommonsMixin):
ordem += Dispositivo.INTERVALO_ORDEM ordem += Dispositivo.INTERVALO_ORDEM
dp = Dispositivo.objects.get(pk=dp_pk) dp = Dispositivo.objects.get(pk=dp_pk)
dp.ta_publicado = None
dp.dispositivo_atualizador = None
dp.ordem_bloco_atualizador = 0
dp.save(clean=False)
''' Reenquadrar todos os dispositivos que possuem pai ''' Reenquadrar todos os dispositivos que possuem pai
antes da inserção atual e que são inferiores a dp, antes da inserção atual e que são inferiores a dp,
@ -2624,8 +2679,12 @@ class ActionsEditMixin(ActionDragAndMoveDispositivoAlteradoMixin,
ds = d ds = d
while ds.dispositivo_subsequente: while ds.dispositivo_subsequente:
ds = ds.dispositivo_subsequente ds = ds.dispositivo_subsequente
dsps_ids.add(ds.pk) dsps_ids.add(ds.pk)
if revogacao and ds.dispositivo_de_revogacao:
dsps_ids.remove(ds.pk)
if em_bloco: if em_bloco:
proximo_bloco = Dispositivo.objects.filter( proximo_bloco = Dispositivo.objects.filter(
ordem__gt=ds.ordem, ordem__gt=ds.ordem,
@ -2636,9 +2695,18 @@ class ActionsEditMixin(ActionDragAndMoveDispositivoAlteradoMixin,
'ta_id': ds.ta_id, 'ta_id': ds.ta_id,
'nivel__gte': ds.nivel, 'nivel__gte': ds.nivel,
'ordem__gte': ds.ordem, 'ordem__gte': ds.ordem,
'dispositivo_subsequente__isnull': True 'dispositivo_subsequente__isnull': True,
} }
if revogacao:
params.update(
{
'dispositivo_de_revogacao': False,
'tipo_dispositivo__dispositivo_de_articulacao': False
}
)
if proximo_bloco: if proximo_bloco:
params['ordem__lt'] = proximo_bloco.ordem params['ordem__lt'] = proximo_bloco.ordem
@ -2655,9 +2723,9 @@ class ActionsEditMixin(ActionDragAndMoveDispositivoAlteradoMixin,
dsps_ids = Dispositivo.objects.filter( dsps_ids = Dispositivo.objects.filter(
id__in=dsps_ids id__in=dsps_ids
).values_list('id', flat="True") ).values_list('id', flat="True").order_by('ordem')
for dsp in dsps_ids: with transaction.atomic():
with transaction.atomic(): for dsp in dsps_ids:
data.update( data.update(
self.registra_alteracao( self.registra_alteracao(
bloco_alteracao, bloco_alteracao,
@ -2713,10 +2781,10 @@ class ActionsEditMixin(ActionDragAndMoveDispositivoAlteradoMixin,
if ndp.dispositivo_vigencia: if ndp.dispositivo_vigencia:
ndp.inicio_eficacia = ndp.dispositivo_vigencia.inicio_eficacia ndp.inicio_eficacia = ndp.dispositivo_vigencia.inicio_eficacia
ndp.inicio_vigencia = ndp.dispositivo_vigencia.inicio_eficacia ndp.inicio_vigencia = ndp.dispositivo_vigencia.inicio_vigencia
else: else:
ndp.inicio_eficacia = bloco_alteracao.inicio_eficacia ndp.inicio_eficacia = bloco_alteracao.inicio_eficacia
ndp.inicio_vigencia = bloco_alteracao.inicio_eficacia ndp.inicio_vigencia = bloco_alteracao.inicio_vigencia
try: try:
ordem = dsp_a_alterar.criar_espaco( ordem = dsp_a_alterar.criar_espaco(
@ -2748,6 +2816,7 @@ class ActionsEditMixin(ActionDragAndMoveDispositivoAlteradoMixin,
).ordem_bloco_atualizador + Dispositivo.INTERVALO_ORDEM ).ordem_bloco_atualizador + Dispositivo.INTERVALO_ORDEM
else: else:
ndp.ordem_bloco_atualizador = Dispositivo.INTERVALO_ORDEM ndp.ordem_bloco_atualizador = Dispositivo.INTERVALO_ORDEM
ndp.save() ndp.save()
p.dispositivo_subsequente = ndp p.dispositivo_subsequente = ndp
@ -2765,10 +2834,10 @@ class ActionsEditMixin(ActionDragAndMoveDispositivoAlteradoMixin,
filhos_diretos = dsp_a_alterar.dispositivos_filhos_set filhos_diretos = dsp_a_alterar.dispositivos_filhos_set
for d in filhos_diretos.all(): for d in filhos_diretos.all():
d.dispositivo_pai = ndp d.dispositivo_pai = ndp
d.save() d.save(clean=False)
ndp.ta.reordenar_dispositivos() # ndp.ta.reordenar_dispositivos()
bloco_alteracao.ordenar_bloco_alteracao() # bloco_alteracao.ordenar_bloco_alteracao()
if not revogacao: if not revogacao:
if 'message' not in data: if 'message' not in data:
@ -2980,201 +3049,172 @@ class DispositivoSearchFragmentFormView(ListView):
itens.append(item) itens.append(item)
return JsonResponse(itens, safe=False) return JsonResponse(itens, safe=False)
response = ListView.get(self, request, *args, **kwargs) return ListView.get(self, request, *args, **kwargs)
if not self.object_list or \
not isinstance(self.object_list, list) and \
not self.object_list.exists():
messages.info(
request, _('Não foram encontrados resultados '
'com seus critérios de busca!'))
username = self.request.user.username
self.logger.error("user=" + username + ". Não foram encontrados "
"resultados com esses critérios de busca. "
"id_tipo_ta=".format(request.GET['tipo_ta']))
try:
r = response.render()
return response
except Exception as e:
messages.error(request, "Erro - %s" % str(e))
context = {}
self.template_name = 'compilacao/messages.html'
username = self.request.user.username
self.logger.error("user=" + username + ". " + str(e))
return self.render_to_response(context)
def get_queryset(self): def get_queryset(self):
try: result = []
n = 10
if 'max_results' in self.request.GET:
n = int(self.request.GET['max_results'])
q = Q()
if 'initial_ref' in self.request.GET:
initial_ref = self.request.GET['initial_ref']
if initial_ref:
q = q & Q(pk=initial_ref)
result = Dispositivo.objects.filter(q).select_related(
'ta').exclude(
tipo_dispositivo__dispositivo_de_alteracao=True)
return result[:n]
str_texto = ''
texto = ''
rotulo = ''
num_ta = ''
ano_ta = ''
if 'texto' in self.request.GET:
str_texto = self.request.GET['texto']
try:
tipo_model = self.request.GET.get('tipo_model', '')
limit = int(self.request.GET.get('max_results', 100))
tipo_ta = self.request.GET.get('tipo_ta', '')
num_ta = self.request.GET.get('num_ta', '')
ano_ta = self.request.GET.get('ano_ta', '')
rotulo = self.request.GET.get('rotulo', '')
str_texto = self.request.GET.get('texto', '')
texto = str_texto.split(' ') texto = str_texto.split(' ')
if 'rotulo' in self.request.GET: tipo_resultado = self.request.GET.get('tipo_resultado', '')
rotulo = self.request.GET['rotulo'] tipo_resultado = '' if tipo_resultado == 'False' else tipo_resultado
if rotulo:
q = q & Q(rotulo__icontains=rotulo)
for item in texto:
if not item:
continue
if q:
q = q & (Q(texto__icontains=item) |
Q(texto_atualizador__icontains=item))
else:
q = (Q(texto__icontains=item) |
Q(texto_atualizador__icontains=item))
if 'tipo_ta' in self.request.GET:
tipo_ta = self.request.GET['tipo_ta']
if tipo_ta:
q = q & Q(ta__tipo_ta_id=tipo_ta)
if 'num_ta' in self.request.GET:
num_ta = self.request.GET['num_ta']
if num_ta:
q = q & Q(ta__numero=num_ta)
if 'ano_ta' in self.request.GET:
ano_ta = self.request.GET['ano_ta']
if ano_ta:
q = q & Q(ta__ano=ano_ta)
if not q.children and not n:
n = 10
q = q & Q(nivel__gt=0)
result = Dispositivo.objects.order_by(
'-ta__data',
'-ta__ano',
'-ta__numero',
'ta',
'ordem').filter(q).select_related('ta')
if 'data_type_selection' in self.request.GET and\
self.request.GET['data_type_selection'] == 'checkbox':
result = result.exclude(
tipo_dispositivo__dispositivo_de_alteracao=True)
else:
if 'data_function' in self.request.GET and\
self.request.GET['data_function'] == 'alterador':
result = result.exclude(
tipo_dispositivo__dispositivo_de_alteracao=False,
)
result = result.exclude(
tipo_dispositivo__dispositivo_de_articulacao=False,
)
print(str(result.query))
def resultados(r):
if n:
return r[:n]
else:
return r
"""if num_ta and ano_ta and not rotulo and not str_texto and\ model_class = None
'data_type_selection' in self.request.GET and\
self.request.GET['data_type_selection'] == 'checkbox':
return r
else:
return r[:n]"""
if 'tipo_model' not in self.request.GET: if tipo_ta:
return resultados(result) tipo_ta = TipoTextoArticulado.objects.get(pk=tipo_ta)
if tipo_ta and tipo_model:
integrations_view_names = get_integrations_view_names()
for item in integrations_view_names:
if hasattr(item, 'model_type_foreignkey') and\
hasattr(item, 'model'):
if (tipo_ta.content_type.model ==
item.model.__name__.lower() and
tipo_ta.content_type.app_label ==
item.model._meta.app_label):
model_class = item.model
model_type_class = item.model_type_foreignkey
tipo_model = item.model_type_foreignkey.objects.get(
pk=tipo_model)
break
tipo_model = self.request.GET['tipo_model'] column_field = ''
if not tipo_model: if model_class:
return resultados(result) for field in model_class._meta.fields:
if field.related_model == model_type_class:
column_field = field.column
break
integrations_view_names = get_integrations_view_names() dts = self.request.GET.get('data_type_selection', '')
df = self.request.GET.get('data_function', '')
tipo_ta = TipoTextoArticulado.objects.get(pk=tipo_ta) AND_CONTROLS = ''
if dts == 'checkbox':
AND_CONTROLS = 'AND td.dispositivo_de_alteracao = false'
else:
if df == 'alterador':
AND_CONTROLS = '''AND td.dispositivo_de_alteracao = true
AND td.dispositivo_de_articulacao = true'''
texto = list(map("d.texto ~* '{}'".format, texto))
AND_TEXTO_ROTULO = ''
if str_texto and rotulo:
AND_TEXTO_ROTULO = '''AND ( ({BUSCA_TEXTO} AND d.rotulo ~* '{BUSCA_ROTULO}') OR
({BUSCA_TEXTO} AND d.rotulo = '' AND dp.rotulo ~* '{BUSCA_ROTULO}')
)'''.format(
BUSCA_TEXTO=' AND '.join(texto),
BUSCA_ROTULO=rotulo
)
elif str_texto:
AND_TEXTO_ROTULO = ' AND '.join(texto)
elif rotulo:
AND_TEXTO_ROTULO = "AND d.rotulo ~* '{BUSCA_ROTULO}'".format(
BUSCA_ROTULO=rotulo)
jtms = '' # JOIN_TYPE_MODEL_SELECTED
atms = '' # AND_TYPE_MODEL_SELECTED
if tipo_model:
jtms = 'JOIN {gfk_table} gfkt on (gfkt.id = ta.object_id)'.format(
gfk_table=model_class._meta.db_table)
atms = 'AND gfkt.{gfk_field_type} = {gfk_field_type_id}'.format(
gfk_field_type=column_field,
gfk_field_type_id=tipo_model.id,
)
model_class = None sql = '''
for item in integrations_view_names: SELECT d.* FROM compilacao_dispositivo d
if hasattr(item, 'model_type_foreignkey') and\ JOIN compilacao_dispositivo dp on (d.dispositivo_pai_id = dp.id)
hasattr(item, 'model'): JOIN compilacao_tipodispositivo td on (d.tipo_dispositivo_id = td.id)
if (tipo_ta.content_type.model == JOIN compilacao_textoarticulado ta on (d.ta_id = ta.id)
item.model.__name__.lower() and
tipo_ta.content_type.app_label == {JOIN_TYPE_MODEL_SELECTED}
item.model._meta.app_label):
where d.nivel > 0
model_class = item.model
model_type_class = item.model_type_foreignkey {AND_TYPE_MODEL_SELECTED}
tipo_model = item.model_type_foreignkey.objects.get(
pk=tipo_model) {AND_TEXTO_ROTULO}
break {AND1_NUMERO}
{AND2_ANO}
{AND3_TIPO_TA}
{AND_CONTROLS}
order by ta.data desc,
ta.numero desc,
ta.id desc,
d.ordem
{limit};
'''.format(
limit='limit {}'.format(limit) if limit else '',
JOIN_TYPE_MODEL_SELECTED=jtms,
AND_TYPE_MODEL_SELECTED=atms,
AND3_TIPO_TA="AND ta.tipo_ta_id = {}".format(
tipo_ta.id) if tipo_ta else '',
AND2_ANO="AND ta.ano = {}".format(
ano_ta) if ano_ta else '',
AND1_NUMERO="AND ta.numero ~* '{}'".format(
num_ta) if num_ta else '',
AND_TEXTO_ROTULO=AND_TEXTO_ROTULO if AND_TEXTO_ROTULO else '',
AND_CONTROLS=AND_CONTROLS if AND_CONTROLS else ''
)
if not model_class: result = Dispositivo.objects.raw(sql)
return resultados(result)
column_field = '' r = []
for field in model_class._meta.fields: ids = set()
if field.related_model == model_type_class:
column_field = field.column
break
if not column_field: def proc_dispositivos(ds):
return resultados(result)
r = [] for d in ds:
""" if d.id not in ids:
ao integrar um model ao app de compilação, se este model possuir r.append(d)
ids.add(d.id)
texto_articulado = GenericRelation( if tipo_resultado == 'I':
TextoArticulado, related_query_name='texto_articulado') if ds != result:
d.I = True
proc_dispositivos(d.dispositivos_filhos_set.filter(
tipo_dispositivo__dispositivo_de_alteracao=False
))
elif tipo_resultado == 'S' and ds == result:
será uma integração mais eficiente para as buscas de Dispositivos seq = Dispositivo.objects.filter(
""" ta=d.ta,
if hasattr(model_class, 'texto_articulado'): ordem__gt=d.ordem,
q = q & Q(**{ nivel__gt=0,
'ta__texto_articulado__' + column_field: tipo_model.pk tipo_dispositivo__dispositivo_de_alteracao=False
}) )
if n: proc_dispositivos(seq[:limit])
result = result.filter(q)[:n]
else:
result = result.filter(q)
for d in result: elif tipo_resultado == 'S':
if not d.ta.content_object or\ d.S = True
not hasattr(d.ta.content_object, column_field):
continue
if tipo_model.pk == getattr(d.ta.content_object, column_field): proc_dispositivos(result)
r.append(d)
if (len(r) == n and (not num_ta or
not ano_ta or rotulo or str_texto)):
break
return r return r
except Exception as e: except Exception as e:
username = self.request.user.username username = self.request.user.username
self.logger.error("user=" + username + ". " + str(e)) self.logger.error("user=" + username + ". " + str(e))
return []
pass
class DispositivoSearchModalView(FormView): class DispositivoSearchModalView(FormView):

123
sapl/templates/compilacao/dispositivo_form_search_fragment.html

@ -8,14 +8,19 @@
{{ message|safe }} {{ message|safe }}
</div> </div>
{% endfor %} {% endfor %}
{% if object_list|length > 1000 %}
{% if object_list.count >= 100 %} <div class="alert alert-warning">
<div class="alert-box success radius"> {% trans 'Mais de Mil itens no resultado... melhore os argumentos para simplificar listagem...' %}
{% trans 'Use argumentos para simplificar listagem...' %}
</div> </div>
{% endif %} {% endif %}
{% with object_list|length as length_results %}
{% for dpt in object_list %} {% if length_results %}
<span class="length_results">
{{ length_results }} ite{{ length_results|pluralize:"m,ns"}} corresponde{{length_results|pluralize:"m"}} a sua busca.
</span>
{% endif %}
{% endwith %}
{% for dpt in object_list %}
{% ifchanged dpt.ta%} {% ifchanged dpt.ta%}
{% if not forloop.first %}</ul>{% endif %} {% if not forloop.first %}</ul>{% endif %}
<ul class="cp" id="ta{{dpt.ta.pk}}"> <ul class="cp" id="ta{{dpt.ta.pk}}">
@ -24,111 +29,17 @@
<div class="iteminput"> <div class="iteminput">
<input type="{{request.GET.data_type_selection}}" name="ta_select_all" id="ta_title{{dpt.ta.pk}}" value="{{dpt.ta.pk}}"/> <input type="{{request.GET.data_type_selection}}" name="ta_select_all" id="ta_title{{dpt.ta.pk}}" value="{{dpt.ta.pk}}"/>
</div> </div>
<div class="itemlabel"> <label class="itemlabel" for="ta_title{{dpt.ta.pk}}">{{dpt.ta}}</label>
<label for="ta_title{{dpt.ta.pk}}">{{dpt.ta}}</label>
</div>
</li> </li>
{% else %} {% else %}
<li class="ta_title"><span>{{dpt.ta}}</span></li> <li class="ta_title"><span>{{dpt.ta}}</span></li>
{% endif %} {% endif %}
{% endifchanged %} {% endifchanged %}
{% if dpt.tipo_dispositivo.dispositivo_de_alteracao or dpt.dispositivo_pai.nivel > 0 and dpt.auto_inserido and dpt.dispositivo_pai not in object_list %} {% with dpt as df %}
<li> {% include "compilacao/dispositivo_form_search_fragment_child.html" %}
<div class="iteminput"> {% endwith %}
<input type="{{request.GET.data_type_selection}}" name="{{request.GET.data_field}}" id="dpt{{dpt.pk}}" value="{{dpt.pk}}"/>
</div>
<div class="itemlabel dpt">
{% if dpt.dispositivo_pai.nivel > 1 %}
<a class="clearfix" target="_blank" href="{% url 'sapl.compilacao:ta_text' dpt.dispositivo_pai.ta.pk%}#{{dpt.dispositivo_pai.pk}}" class="nomenclatura_heranca">{% trans "Herança:" %} {% heranca request dpt 1 0 %}</a>
{% endif %}
<div class="{{ dpt.dispositivo_pai.tipo_dispositivo.class_css }}">
<div class="dptt {% dispositivo_desativado dpt.dispositivo_pai None None %}" id="dptt{{dpt.dispositivo_pai.pk}}" >
{{ dpt.dispositivo_pai.tipo_dispositivo.rotulo_prefixo_html|safe }}
{{ dpt.dispositivo_pai.rotulo }}
{{ dpt.dispositivo_pai.tipo_dispositivo.rotulo_sufixo_html|safe }}
<span class="dtxt" id="d{% if not dpt.dispositivo_pai.dispositivo_subsequente_id and dpt.dispositivo_pai.dispositivo_substituido_id %}a{% endif %}{{dpt.dispositivo_pai.pk}}" pks="{{dpt.dispositivo_pai.dispositivo_substituido_id|default:''}}" pk="{{dpt.dispositivo_pai.pk}}">{{ dpt.dispositivo_pai.tipo_dispositivo.texto_prefixo_html|safe }}{%if dpt.dispositivo_pai.texto %}{{ dpt.dispositivo_pai.texto|safe }}{%else%}{%if not dpt.dispositivo_pai.tipo_dispositivo.dispositivo_de_articulacao %}&nbsp;{% endif %}{% endif %}</span>
{% if dpt.dispositivo_pai.ta_publicado_id %}
<a class="nota-alteracao" href="{% url 'sapl.compilacao:ta_text' dpt.dispositivo_pai.ta_publicado.pk %}#{{dpt.dispositivo_pai.dispositivo_atualizador_id}}">
{{ dpt.dispositivo_pai.tipo_dispositivo.nota_automatica_prefixo_html|safe }}
{% nota_automatica dpt.dispositivo_pai ta_pub_list %}
{{ dpt.dispositivo_pai.tipo_dispositivo.nota_automatica_sufixo_html|safe }}
</a>
{% endif %}
</div>
</div>
</div>
</li>
{% endif %}
<li>
<div class="iteminput">
<input type="{{request.GET.data_type_selection}}" name="{{request.GET.data_field}}" id="dpt{{dpt.pk}}" value="{{dpt.pk}}"/>
</div>
<div class="itemlabel dpt">
{% if dpt.nivel > 1 %}
<a class="clearfix" target="_blank" href="{% url 'sapl.compilacao:ta_text' dpt.ta.pk%}#{{dpt.pk}}" class="nomenclatura_heranca">{% trans "Herança:" %} {% heranca request dpt 1 0 %}</a>
{% endif %}
<div class="{{ dpt.tipo_dispositivo.class_css }}">
<div class="dptt {% dispositivo_desativado dpt None None %}" id="dptt{{dpt.pk}}" >
{{ dpt.tipo_dispositivo.rotulo_prefixo_html|safe }}
{% if dpt.rotulo or dpt.nivel == 1 %}{{ dpt.rotulo }}{%else%}[{{ dpt|nomenclatura}} {% trans "de" %} {{ dpt.dispositivo_pai.rotulo }}] - {% endif %}
{{ dpt.tipo_dispositivo.rotulo_sufixo_html|safe }}
<span class="dtxt"
id="d{% if not dpt.dispositivo_subsequente_id and dpt.dispositivo_substituido_id %}a{% endif %}{{dpt.pk}}"
pks="{{dpt.dispositivo_substituido_id|default:''}}"
pk="{{dpt.pk}}">{{ dpt.tipo_dispositivo.texto_prefixo_html|safe }}{%if dpt.texto %}{{ dpt.texto|safe }}{%else%}{%if not dpt.tipo_dispositivo.dispositivo_de_articulacao %}&nbsp;{% endif %}{% endif %}</span>
{% if dpt.ta_publicado_id %}
<a class="nota-alteracao" href="{% url 'sapl.compilacao:ta_text' dpt.ta_publicado.pk %}#{{dpt.dispositivo_atualizador_id}}">
{{ dpt.tipo_dispositivo.nota_automatica_prefixo_html|safe }}
{% nota_automatica dpt ta_pub_list %}
{{ dpt.tipo_dispositivo.nota_automatica_sufixo_html|safe }}
</a>
{% endif %}
</div>
{% if dpt.tipo_dispositivo.dispositivo_de_alteracao%}
{%with node=dpt template_name='compilacao/text_list_blocoalteracao.html' %}
{%include template_name%}
{%endwith%}
{% endif%}
</div>
</div>
</li>
{% if request.GET.dispositivos_internos == 'True' %}
{% for df in dpt.dispositivos_filhos_set.all %}
{% if df not in object_list %}
<li>
<div class="iteminput">
<input type="{{request.GET.data_type_selection}}" name="{{request.GET.data_field}}" id="dpt{{df.pk}}" value="{{df.pk}}"/>
</div>
<div class="itemlabel dpt">
{% if df.nivel > 1 %}
<a class="clearfix" target="_blank" href="{% url 'sapl.compilacao:ta_text' df.ta.pk%}#{{df.pk}}" class="nomenclatura_heranca">{% trans "Herança:" %} {% heranca request df 1 0 %}</a>
{% endif %}
<div class="{{ df.tipo_dispositivo.class_css }}">
<div class="dptt {% dispositivo_desativado dpt None None %}" id="dptt{{df.pk}}" >
{{ df.tipo_dispositivo.rotulo_prefixo_html|safe }}
<a name="{{df.pk}}" title="{{df.pk}}">{% if df.rotulo or df.nivel == 1%}{{ df.rotulo }}{%else%}[{{ df|nomenclatura}} {% trans "de" %} {{ df.dispositivo_pai.rotulo }}] - {% endif %}</a>
{{ df.tipo_dispositivo.rotulo_sufixo_html|safe }}
<span class="dtxt" id="d{% if not df.dispositivo_subsequente_id and df.dispositivo_substituido_id %}a{% endif %}{{df.pk}}" pks="{{df.dispositivo_substituido_id|default:''}}" pk="{{df.pk}}">{{ df.tipo_dispositivo.texto_prefixo_html|safe }}{%if df.texto %}{{ df.texto|safe }}{%else%}{%if not df.tipo_dispositivo.dispositivo_de_articulacao %}&nbsp;{% endif %}{% endif %}</span>
{% if df.ta_publicado_id %}
<a class="nota-alteracao" href="{% url 'sapl.compilacao:ta_text' df.ta_publicado.pk %}#{{df.dispositivo_atualizador_id}}">
{{ df.tipo_dispositivo.nota_automatica_prefixo_html|safe }}
{% nota_automatica df ta_pub_list %}
{{ df.tipo_dispositivo.nota_automatica_sufixo_html|safe }}
</a>
{% endif %}
</div>
</div>
</div>
</li>
{% endif %}
{% endfor %}
{% endif %}
{% if forloop.last %}</ul>{% endif %} {% if forloop.last %}</ul>{% endif %}
{% empty %}
<div class="alert alert-info">Não foram encontrados itens com seus critérios de busca!</div>
{% endfor %} {% endfor %}

45
sapl/templates/compilacao/dispositivo_form_search_fragment_child.html

@ -0,0 +1,45 @@
{% load i18n compilacao_filters %}
<li>
<div class="iteminput">
{% if df.I %}
<div class="flag flag_i" title="Incluído por ser Interno a {{dpt.dispositivo_pai}}">I</div>
{% endif %}
{% if df.S %}
<div class="flag flag_s" title="Incluído por ser uma sequência de um dispositivo selecionado. Mesmo um selecionado pode ser classificado como sequente de outro anteriormente também selecionado.">S</div>
{% endif %}
<input type="{{request.GET.data_type_selection}}" name="{{request.GET.data_field}}" id="dpt{{df.pk}}" value="{{df.pk}}"/>
</div>
<label class="itemlabel dpt" for="dpt{{df.pk}}">
{% if df.nivel > 1 %}
<a class="clearfix"
target="_blank"
href="{% url 'sapl.compilacao:ta_text' df.ta.pk%}#{{df.pk}}"
class="nomenclatura_heranca">
{% trans "Herança:" %}
{% for p in df.get_parents_asc %}
{{ p.rotulo }}
{% endfor %}
</a>
{% endif %}
<div class="{{ df.tipo_dispositivo.class_css }}">
<div class="dptt {% dispositivo_desativado df None None %}" id="dptt{{df.pk}}">
{{ df.tipo_dispositivo.rotulo_prefixo_html|safe }}
<a name="{{df.pk}}" title="{{df.pk}}">{% if df.rotulo or df.nivel == 1%}{{ df.rotulo }}{%else%}[{{ df|nomenclatura}} {% trans "de" %} {{ df.dispositivo_pai.rotulo }}] - {% endif %}</a>
{{ df.tipo_dispositivo.rotulo_sufixo_html|safe }}
<span class="dtxt" id="d{% if not df.dispositivo_subsequente_id and df.dispositivo_substituido_id %}a{% endif %}{{df.pk}}" pks="{{df.dispositivo_substituido_id|default:''}}" pk="{{df.pk}}">{{ df.tipo_dispositivo.texto_prefixo_html|safe }}{%if df.texto %}{{ df.texto|safe }}{%else%}{%if not df.tipo_dispositivo.dispositivo_de_articulacao %}&nbsp;{% endif %}{% endif %}</span>
{% if df.ta_publicado_id %}
<a class="nota-alteracao" href="{% url 'sapl.compilacao:ta_text' df.ta_publicado.pk %}#{{df.dispositivo_atualizador_id}}">
{{ df.tipo_dispositivo.nota_automatica_prefixo_html|safe }}
{% nota_automatica df ta_pub_list %}
{{ df.tipo_dispositivo.nota_automatica_sufixo_html|safe }}
</a>
{% endif %}
</div>
</div>
</label>
</li>

4
sapl/templates/compilacao/subnav.html

@ -1,7 +1,7 @@
{% load i18n %} {% load i18n %}
{% load compilacao_filters %} {% load compilacao_filters %}
{% load common_tags %} {% load common_tags %}
<ul class="nav nav-pills justify-content-end"> <ul class="nav nav-tabs justify-content-end">
{%if object %} {%if object %}
<li class="nav-item"> <li class="nav-item">
{% if request.GET.back_type == 'history' and object.content_object %} {% if request.GET.back_type == 'history' and object.content_object %}
@ -19,7 +19,7 @@
<li class="nav-item"><a class="nav-link" href="{% url 'sapl.compilacao:ta_text_notificacoes' object.pk %}">{% trans 'Notificações' %}</a></li> <li class="nav-item"><a class="nav-link" href="{% url 'sapl.compilacao:ta_text_notificacoes' object.pk %}">{% trans 'Notificações' %}</a></li>
{% endif %} {% endif %}
{% block extra_sections_nav %} {% block extra_sections_nav %}
<li class="nav-item"><a class="nav-link" href="{% url 'sapl.compilacao:ta_text' object.pk %}">{% trans 'Texto Compilado' %}</a></li> <li class="nav-item"><a class="nav-link" href="{% url 'sapl.compilacao:ta_text' object.pk %}">{% trans 'Texto Articulado' %}</a></li>
{% endblock %} {% endblock %}
{% endif %} {% endif %}
</ul> </ul>

23
sapl/templates/compilacao/text_edit.html

@ -9,17 +9,20 @@
{% block actions %} {% block actions %}
{% if perms.compilacao.change_textoarticulado %} {% if perms.compilacao.change_textoarticulado %}
<div class="clearfix"> <div class="container-actions mt-4 mb-4 justify-content-between d-flex">
<div class="actions btn-toolbar float-right" role="toolbar">
<div class="actions btn-group" role="group">
{% if perms.compilacao.lock_unlock_textoarticulado and not object.editable_only_by_owners%}
<a href="{% url 'sapl.compilacao:ta_text_edit' object.pk %}?{% if object.editing_locked %}unlock{%else%}lock{% endif %}" class="btn {% if object.editing_locked %}btn-outline-danger{%else%}btn-outline-primary{% endif %}">{% if object.editing_locked %}{% trans 'Desbloquear Edição' %}{%else%}{% trans 'Publicar Texto' %}{% endif %}</a>
{% endif %} <div class="actions btn-group" role="group">
{% if perms.compilacao.lock_unlock_textoarticulado and not object.editable_only_by_owners%}
<a href="{% url 'sapl.compilacao:ta_edit' object.pk %}" class="btn btn-outline-primary">{% trans 'Editar Metadados do Texto Articulado' %}</a> <a href="{% url 'sapl.compilacao:ta_text_edit' object.pk %}?{% if object.editing_locked %}unlock{%else%}lock{% endif %}" class="btn {% if object.editing_locked %}btn-outline-danger{%else%}btn-outline-primary{% endif %}">{% if object.editing_locked %}{% trans 'Desbloquear Edição' %}{%else%}{% trans 'Publicar Texto' %}{% endif %}</a>
{% include 'compilacao/textoarticulado_menu_config.html' %} {% endif %}
</div>
<a href="{% url 'sapl.compilacao:ta_edit' object.pk %}" class="btn btn-outline-primary">{% trans 'Editar Metadados do Texto Articulado' %}</a>
{% include 'compilacao/textoarticulado_menu_config.html' %}
</div> </div>
</div> </div>
{% endif %} {% endif %}
{% endblock actions %} {% endblock actions %}

16
sapl/templates/compilacao/text_edit_bloco.html

@ -56,8 +56,22 @@
<div class="dpt-form clearfix"></div> <div class="dpt-form clearfix"></div>
<div class="dpt-actions-bottom btn-group"></div> <div class="dpt-actions-bottom btn-group"></div>
{% if node.alts or node.td.dispositivo_de_alteracao and node.td.dispositivo_de_articulacao %} {% if node.alts or node.td.dispositivo_de_alteracao and node.td.dispositivo_de_articulacao %}
<div class="dpt-alts">{{ alts }}</div> <div class="dpt-alts">{{ alts }}
</div>
{% if node.td.dispositivo_de_alteracao %}
<div class="dpt-actions-fixed bottom">
<a class="btn-dpt-edit btn btn-outline-primary btn-sm bottom" pk="{{node.dpt.pk}}" title=""><span class="deactivate">{% trans 'Editar'%} </span><span class="activate">{% trans 'Em Edição'%}: </span>{% if not node.td.rotulo_prefixo_texto %}{{ node.td.nome }} {% endif %}{{ node.dpt.rotulo }}</a>
</div>
{% endif %}
{% endif %} {% endif %}
{% if node.filhos %} {% if node.filhos %}
<div class="dpt-block"> <div class="dpt-block">
{{ filhos }} {{ filhos }}

5
sapl/templates/compilacao/text_list.html

@ -3,10 +3,6 @@
{% load compilacao_filters %} {% load compilacao_filters %}
{% load common_tags %} {% load common_tags %}
{% 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 base_content %} {% block base_content %}
{% block actions %} {% block actions %}
@ -16,6 +12,7 @@
{% block detail_content %} {% block detail_content %}
{{block.super}} {{block.super}}
{% endblock %} {% endblock %}
{% include 'compilacao/text_list__embedded.html'%} {% include 'compilacao/text_list__embedded.html'%}
{{object.tipo_ta.rodape_global|dont_break_out}} {{object.tipo_ta.rodape_global|dont_break_out}}

12
sapl/templates/compilacao/text_list__embedded.html

@ -17,14 +17,14 @@
<ul class="cp-linha-vigencias"> <ul class="cp-linha-vigencias">
{% for dispositivo in values %} {% for dispositivo in values %}
<li class="{% if view.inicio_vigencia == dispositivo.inicio_vigencia %}active{%endif%}"> <li class="{% if view.inicio_vigencia == dispositivo.inicio_vigencia %}active{%endif%}">
<a class="" href="{% url 'sapl.compilacao:ta_vigencia' dispositivo.ta_id dispositivo|get_sign_vigencia %}" title="{% trans 'Vigência entre'%} {{dispositivo.inicio_vigencia}} {% trans 'e'%} {{dispositivo.fim_vigencia}}">{% trans 'Texto Original'%}</a> <a class="" href="{% url 'sapl.compilacao:ta_vigencia' dispositivo.ta_id dispositivo|get_sign_vigencia %}" title="{% trans 'Vigência entre'%} {{dispositivo.inicio_vigencia}} {% trans 'e'%} {{dispositivo.fim_vigencia}}">{% trans 'Texto<br>Original'%}</a>
<span class="circle"> </span> <span class="circle"> </span>
</li> </li>
{% endfor %} {% endfor %}
{% elif forloop.last %} {% elif forloop.last %}
{% for dispositivo in values %} {% for dispositivo in values %}
<li class="{% if not view.inicio_vigencia%}active{% endif %}"> <li class="{% if not view.inicio_vigencia%}active{% endif %}">
<a class="" href="{% url 'sapl.compilacao:ta_text' dispositivo.ta_id %}" title="{% trans 'Compilação atual'%}.&#013;{% trans 'Vigência a partir de'%} {{dispositivo.inicio_vigencia}}&#013;{% if dispositivo.ta_publicado_id in ta_pub_list %}{{ ta_pub_list|lookup:dispositivo.ta_publicado_id }}{%else%}{%if dispositivo.ta_publicado %}{{dispositivo.ta_publicado}}{%else%}{{dispositivo.ta}}{%endif%}{%endif%}">{% trans 'Texto Atual'%}</a> <a class="" href="{% url 'sapl.compilacao:ta_text' dispositivo.ta_id %}" title="{% trans 'Compilação atual'%}.&#013;{% trans 'Vigência a partir de'%} {{dispositivo.inicio_vigencia}}&#013;{% if dispositivo.ta_publicado_id in ta_pub_list %}{{ ta_pub_list|lookup:dispositivo.ta_publicado_id }}{%else%}{%if dispositivo.ta_publicado %}{{dispositivo.ta_publicado}}{%else%}{{dispositivo.ta}}{%endif%}{%endif%}">{% trans 'Texto<br>Atual'%}</a>
<span class="circle"> </span> <span class="circle"> </span>
</li> </li>
{% if forloop.parentloop.last %} {% if forloop.parentloop.last %}
@ -39,18 +39,21 @@
{% blocktrans with inicio_vigencia=dispositivo.inicio_vigencia%} {% blocktrans with inicio_vigencia=dispositivo.inicio_vigencia%}
Vigência a partir de <b>{{inicio_vigencia}}</b>. Vigência a partir de <b>{{inicio_vigencia}}</b>.
{% endblocktrans%} {% endblocktrans%}
{% if dispositivo.inicio_vigencia != dispositivo.inicio_eficacia %}
Efeitos a partir de <b>{{dispositivo.inicio_eficacia}}</b>.
{% endif %}
{% endif %} {% endif %}
<br> <br>
{% if view.ta_vigencia %} {% if view.ta_vigencia %}
<small>{% trans 'Dada por '%}<a href="{% url 'sapl.compilacao:ta_text' view.ta_vigencia %}">{{ta_pub_list|lookup:view.ta_vigencia}}</a></small> <small>{% trans 'Dada por '%}<a href="{% url 'sapl.compilacao:ta_text' view.ta_vigencia %}">{{ta_pub_list|lookup:view.ta_vigencia}}</a></small>
{% elif view.ta_vigencia and view.ta_vigencia != 0%} {% elif view.ta_vigencia and view.ta_vigencia != 0 or view.ta_vigencia is None %}
<small>{% trans 'Dada por '%}<a href="{% url 'sapl.compilacao:ta_text' dispositivo.ta_publicado.pk %}">{{dispositivo.ta_publicado}}</a></small> <small>{% trans 'Dada por '%}<a href="{% url 'sapl.compilacao:ta_text' dispositivo.ta_publicado.pk %}">{{dispositivo.ta_publicado}}</a></small>
{% endif %} {% endif %}
</span> </span>
{% endif%} {% endif%}
{% endfor %} {% endfor %}
{% else %} {% else %}
<li class="{% if key == view.inicio_vigencia.year %}active{% endif %}"> <li class="{% if key == view.inicio_vigencia.year and view.ta_vigencia %}active{% endif %}">
<a class="" href="#">{{ key }}</a> <a class="" href="#">{{ key }}</a>
<span class="circle"> </span> <span class="circle"> </span>
<ul class=""> <ul class="">
@ -75,6 +78,7 @@
<a class="btn btn-primary" onclick="textoMultiVigente(this, true);" title="{% trans 'Texto Multivigente Integrado com Realce de Alterações'%}">{% trans 'TMI'%}</a> <a class="btn btn-primary" onclick="textoMultiVigente(this, true);" title="{% trans 'Texto Multivigente Integrado com Realce de Alterações'%}">{% trans 'TMI'%}</a>
<a class="btn btn-primary" onclick="textoMultiVigente(this, false); textoVigente(this, true);" title="{% trans 'Texto Vigente COM Links para Textos Alteradores'%}">{% trans 'TVL'%}</a> <a class="btn btn-primary" onclick="textoMultiVigente(this, false); textoVigente(this, true);" title="{% trans 'Texto Vigente COM Links para Textos Alteradores'%}">{% trans 'TVL'%}</a>
<a class="btn btn-primary" onclick="textoVigente(this, false);" title="{% trans 'Texto Vigente'%}">{% trans 'TVT'%}</a> <a class="btn btn-primary" onclick="textoVigente(this, false);" title="{% trans 'Texto Vigente'%}">{% trans 'TVT'%}</a>
<a class="btn btn-primary" onclick="textoVigenteSemRevogados(this, false);" title="{% trans 'Texto Vigente Sem Dispositivos Revogados'%}">{% trans 'TVR'%}</a>
</div> </div>
</div> </div>

4
sapl/templates/compilacao/text_list_blocoalteracao.html

@ -3,7 +3,7 @@
{% for ch in dpt.pk|get_bloco_atualizador %} {% for ch in dpt.pk|get_bloco_atualizador %}
{% spaceless %} {% spaceless %}
{% if ch.visibilidade %} {% if ch.visibilidade %}
<div class="dpt" id="d{{ch.id}}" nivel="{{ch.nivel}}"> <div class="dpt {% if ch.dispositivo_subsequente %}desativado{% endif %}" id="d{{ch.id}}" nivel="{{ch.nivel}}">
<div class="{{ ch.tipo_dispositivo.class_css }}" id="id{{ch.id}}" nivel="{{ch.nivel}}"> <div class="{{ ch.tipo_dispositivo.class_css }}" id="id{{ch.id}}" nivel="{{ch.nivel}}">
{% if ch.auto_inserido %} {% if ch.auto_inserido %}
{{ ch.dispositivo_pai.tipo_dispositivo.rotulo_prefixo_html|safe }} {{ ch.dispositivo_pai.tipo_dispositivo.rotulo_prefixo_html|safe }}
@ -32,6 +32,6 @@
{% endif %} {% endif %}
</div> </div>
</div> </div>
{%endif%} {% endif %}
{% endspaceless %} {% endspaceless %}
{% endfor %} {% endfor %}

15
sapl/templates/compilacao/textoarticulado_detail.html

@ -8,10 +8,10 @@
{% endblock %} {% endblock %}
{% block base_content %} {% block base_content %}
{% block actions %} {% block actions %}
<div class="clearfix hidden-print"> <div class="context-actions justify-content-between mb-4">
<div class="actions btn-group float-right" role="group"> <div class="actions btn-group" role="group">
{% if perms.compilacao.change_textoarticulado and object|can_use_dynamic_editing:user %} {% if perms.compilacao.change_textoarticulado and object|can_use_dynamic_editing:user %}
<a href="{% url 'sapl.compilacao:ta_edit' object.pk %}" class="btn btn-outline-primary">{% trans 'Editar Metadados do Texto Articulado' %}</a> <a href="{% url 'sapl.compilacao:ta_edit' object.pk %}" class="btn btn-outline-primary">{% trans 'Editar Metadados do Texto Articulado' %}</a>
{% endif %} {% endif %}
@ -19,12 +19,9 @@
<a href="{% url 'sapl.compilacao:ta_text_edit' object.pk %}" class="btn btn-outline-primary">{% trans 'Editar Texto' %}</a> <a href="{% url 'sapl.compilacao:ta_text_edit' object.pk %}" class="btn btn-outline-primary">{% trans 'Editar Texto' %}</a>
{% endif %} {% endif %}
{% 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%}
<a href="{% url 'sapl.compilacao:ta_text_edit' object.pk %}?{% if object.editing_locked %}unlock{%else%}lock{% endif %}" class="btn {% if object.editing_locked %}btn-outline-danger{%else%}btn-outline-primary{% endif %}">{% if object.editing_locked %}{% trans 'Desbloquear Edição' %}{%else%}{% trans 'Publicar Texto' %}{% endif %}</a> <a href="{% url 'sapl.compilacao:ta_text_edit' object.pk %}?{% if object.editing_locked %}unlock{%else%}lock{% endif %}" class="btn {% if object.editing_locked %}btn-danger{%else%}btn-outline-primary{% endif %}">{% if object.editing_locked %}{% trans 'Desbloquear Edição' %}{%else%}{% trans 'Publicar Texto' %}{% endif %}</a>
{% endif %} {% endif %}
</div> </div>
<div class="actions btn-group float-right" role="group">
<a href="{{base_url}}?print" class="btn btn-outline-primary">{% trans 'Preparar para impressão' %}</a>
</div>
</div> </div>
{% endblock actions %} {% endblock actions %}
@ -39,14 +36,14 @@
</div> </div>
</div> </div>
{% if object.content_object and object.content_object.tipo%} {% if object.content_object and object.content_object.tipo %}
<div class="col-md-3"> <div class="col-md-3">
<div id="div_id_tipo" class="holder"> <div id="div_id_tipo" class="holder">
<label>{% field_verbose_name object.content_object 'tipo' %}</label> <label>{% field_verbose_name object.content_object 'tipo' %}</label>
<p>{{ object.content_object.tipo}}</p> <p>{{ object.content_object.tipo}}</p>
</div> </div>
</div> </div>
{%endif%} {% endif %}
<div class="col-md-2"> <div class="col-md-2">
<div id="div_id_numero" class="holder"> <div id="div_id_numero" class="holder">

51
sapl/templates/compilacao/textoarticulado_list.html

@ -8,37 +8,42 @@
{% endblock detail_content %} {% endblock detail_content %}
{% block actions %} {% block actions %}
{% if perms.compilacao.add_textoarticulado %} <div class="container-actions mt-4 mb-4 justify-content-between d-flex">
<div class="actions btn-group float-right clearfix" role="group">
<a href="{{ view.create_url }}" class="btn btn-outline-primary"> <div class="actions btn-group" role="group">
{% trans 'Adicionar'%} {%model_verbose_name 'sapl.compilacao.models.TextoArticulado'%} <a class="btn btn-primary" href="{% url 'sapl.compilacao:ta_list'%}?check">Lista para Checagem</a>
</a> </div>
{% include 'compilacao/textoarticulado_menu_config.html' %} <div class="actions btn-group" role="group">
<a class="btn btn-primary" href="{% url 'sapl.compilacao:ta_list'%}?check_dvt">Texto Sem Dispositivo de Vigência</a>
</div> </div>
{% endif %} {% if perms.compilacao.add_textoarticulado %}
<div class="actions btn-group" role="group">
<a href="{{ view.create_url }}" class="btn btn-outline-primary">
{% trans 'Adicionar'%} {%model_verbose_name 'sapl.compilacao.models.TextoArticulado'%}
</a>
{% include 'compilacao/textoarticulado_menu_config.html' %}
</div>
{% endif %}
</div>
{% endblock actions %} {% endblock actions %}
<table class="table table-striped table-hover"> <table class="table table-striped table-hover">
<thead>
<tr>
<th>{% fieldclass_verbose_name 'sapl.compilacao.models.TextoArticulado' 'tipo_ta' %}</th>
<th>{% fieldclass_verbose_name 'sapl.compilacao.models.TextoArticulado' 'numero' %}</th>
<th>{% fieldclass_verbose_name 'sapl.compilacao.models.TextoArticulado' 'ano' %}</th>
<th>{% fieldclass_verbose_name 'sapl.compilacao.models.TextoArticulado' 'data' %}</th>
<th>{% fieldclass_verbose_name 'sapl.compilacao.models.TextoArticulado' 'ementa' %}</th>
</tr>
</thead>
<tbody>
{% for ta in object_list %} {% for ta in object_list %}
{% with ta as n %}
<tr> <tr>
<td><a href="{% url 'sapl.compilacao:ta_detail' ta.pk %}">{{ ta.tipo_ta }}</a></td> <td class="item-listas">
<td>{{ ta.numero }}</td> <div class="item-raiz">
<td>{{ ta.ano }}</td> <strong>
<td>{{ ta.data|date:"D d M Y" }}</td> <a href="{% url 'sapl.compilacao:ta_text' n.pk %}">{{ n }}</a>
<td>{{ ta.ementa|safe }}</td> </strong>
<div class="text-ementa">
{{n.ementa}}
</div>
</div>
</td>
</tr> </tr>
{% endwith %}
{% endfor %} {% endfor %}
</tbody>
</table> </table>
{% include 'paginacao.html'%} {% include 'paginacao.html'%}
{% endblock %} {% endblock %}

Loading…
Cancel
Save