Browse Source

Merge pull request #213 from interlegis/compilacao

Compilacao - ajustes para bootstrap
pull/216/head
Leandro Roberto da Silva 9 years ago
parent
commit
a7fc49a5a5
  1. 3
      base/templatetags/common_tags.py
  2. 162
      compilacao/forms.py
  3. 28
      compilacao/models.py
  4. 13
      compilacao/templatetags/compilacao_filters.py
  5. 19
      compilacao/urls.py
  6. 250
      compilacao/views.py
  7. 2
      materia/views.py
  8. 8
      norma/urls.py
  9. 1
      norma/views.py
  10. 3
      sapl/layout.py
  11. 49
      static/js/compilacao_notas.js
  12. 12
      static/js/compilacao_view.js
  13. 356
      static/styles/compilacao.scss
  14. 17
      templates/base.html
  15. 1
      templates/compilacao/ajax_form.html
  16. 20
      templates/compilacao/confirm_delete.html
  17. 5
      templates/compilacao/dispositivo_search_fragment_form.html
  18. 21
      templates/compilacao/publicacao_detail.html
  19. 25
      templates/compilacao/publicacao_list.html
  20. 28
      templates/compilacao/text_edit.html
  21. 17
      templates/compilacao/text_edit_bloco.html
  22. 6
      templates/compilacao/text_edit_blocoalteracao.html
  23. 122
      templates/compilacao/text_list.html
  24. 71
      templates/compilacao/text_list_bloco.html
  25. 7
      templates/compilacao/text_list_blocoalteracao.html
  26. 61
      templates/compilacao/textoarticulado_detail.html
  27. 26
      templates/compilacao/textoarticulado_list.html
  28. 16
      templates/compilacao/textoarticulado_menu_config.html
  29. 19
      templates/compilacao/tipotextoarticulado_detail.html
  30. 18
      templates/compilacao/tipotextoarticulado_list.html
  31. 27
      templates/crud/confirm_delete.html
  32. 11
      templates/norma/normajuridica_detail.html

3
base/templatetags/common_tags.py

@ -29,8 +29,7 @@ def model_verbose_name_plural(class_name):
@register.filter
def lookup(d, key):
skey = str(key)
return d[str(key)] if skey in d else []
return d[key] if key in d else []
@register.filter

162
compilacao/forms.py

@ -1,26 +1,20 @@
from crispy_forms.bootstrap import FieldWithButtons, FormActions, StrictButton
from crispy_forms.helper import FormHelper
from crispy_forms_foundation.layout import (HTML, Column, Div, Fieldset,
from crispy_forms.layout import (HTML, Button, Column, Div, Field, Fieldset,
Layout, Row)
from crispy_forms_foundation.layout.buttons import Button
from crispy_forms_foundation.layout.fields import Field
from django import forms
from django.core.exceptions import NON_FIELD_ERRORS
from django.forms.models import ModelForm
from django.utils.translation import ugettext_lazy as _
from compilacao.models import (PARTICIPACAO_SOCIAL_CHOICES, Dispositivo, Nota,
from compilacao.models import (NOTAS_PUBLICIDADE_CHOICES,
PARTICIPACAO_SOCIAL_CHOICES, Dispositivo, Nota,
Publicacao, TextoArticulado, TipoNota,
TipoPublicacao, TipoTextoArticulado, TipoVide,
VeiculoPublicacao, Vide)
from sapl.layout import SaplFormLayout, to_column, to_row
from sapl.utils import YES_NO_CHOICES
class UpLoadImportFileForm(forms.Form):
import_file = forms.FileField(
required=True,
label=_('Arquivo formato ODF para Importanção'))
error_messages = {
'required': _('Este campo é obrigatório'),
'invalid': _('URL inválida.')
@ -145,41 +139,30 @@ class TaForm(ModelForm):
class NotaForm(ModelForm):
NPRIV = 1
NINST = 2
NPUBL = 3
PUBLICIDADE_CHOICES = (
# Only the owner of the note has visibility.
(NPRIV, _('Nota Privada')),
# All authenticated users have visibility.
(NINST, _('Nota Institucional')),
# All users have visibility.
(NPUBL, _('Nota Pública')),
)
titulo = forms.CharField(label=' ', required=False)
titulo = forms.CharField(
label=Nota._meta.get_field('titulo').verbose_name, required=False)
texto = forms.CharField(
label='',
label=Nota._meta.get_field('texto').verbose_name,
widget=forms.Textarea,
error_messages=error_messages)
url_externa = forms.URLField(
label='',
label=Nota._meta.get_field('url_externa').verbose_name,
required=False,
error_messages=error_messages)
publicidade = forms.ChoiceField(
required=True,
label=_('Publicidade'),
choices=PUBLICIDADE_CHOICES,
label=Nota._meta.get_field('publicidade').verbose_name,
choices=NOTAS_PUBLICIDADE_CHOICES,
widget=forms.Select(attrs={'class': 'selector'}))
tipo = forms.ModelChoiceField(
required=False,
label=_('Tipo da Nota'),
label=Nota._meta.get_field('tipo').verbose_name,
queryset=TipoNota.objects.all(),
empty_label=None)
publicacao = forms.DateField(
label=_('Publicação'),
label=Nota._meta.get_field('publicacao').verbose_name,
input_formats=['%d/%m/%Y'],
required=True,
widget=forms.DateInput(
@ -187,7 +170,7 @@ class NotaForm(ModelForm):
error_messages=error_messages
)
efetividade = forms.DateField(
label=_('Efetividade'),
label=Nota._meta.get_field('efetividade').verbose_name,
input_formats=['%d/%m/%Y'],
required=True,
widget=forms.DateInput(
@ -225,20 +208,39 @@ class NotaForm(ModelForm):
css_class='col-md-8'))
row3 = to_row([
('publicidade', 3),
('publicidade', 6),
('publicacao', 3),
('efetividade', 3),
(Button('submit', _('Salvar'),
css_class='btn btn-primary'), 3)
])
buttons = FormActions(
HTML('<a class="btn btn-inverse btn-close-container">'
'%s</a>' % _('Cancelar')),
Button(
'submit-form',
'Salvar',
css_class='btn btn-primary pull-right')
)
self.helper = FormHelper()
self.helper.layout = Layout(
Div(HTML(_('Notas')), css_class='title_form'),
Div(
Div(HTML(_('Notas')), css_class='panel-heading'),
Div(
row1,
Field('texto', placeholder=_('Adicionar Nota')),
Field('url_externa', placeholder=_('URL Externa (opcional)')),
row3
to_row([(Field(
'texto',
placeholder=_('Adicionar Nota')), 12)]),
to_row([(Field(
'url_externa',
placeholder=_('URL Externa (opcional)')), 12)]),
row3,
to_row([(buttons, 12)]),
css_class="panel-body"
),
css_class="panel panel-primary"
)
)
super(NotaForm, self).__init__(*args, **kwargs)
@ -256,6 +258,11 @@ class VideForm(ModelForm):
label=_('Tipo do Texto Articulado'),
queryset=TipoTextoArticulado.objects.all(),
required=False)
tipo_model = forms.ChoiceField(
choices=[],
label=_('Tipos de...'), required=False)
num_ta = forms.IntegerField(
label=_('Núm Texto Articulado'), required=False)
ano_ta = forms.IntegerField(
@ -293,54 +300,63 @@ class VideForm(ModelForm):
def __init__(self, *args, **kwargs):
self.helper = FormHelper()
self.helper.layout = Layout(
Div(HTML(_('Vides')), css_class='title_form'),
buttons = FormActions(
HTML('<a class="btn btn-inverse btn-close-container">'
'%s</a>' % _('Cancelar')),
Button(
'submit-form',
'Salvar',
css_class='btn-primary pull-right')
)
Row(
to_column((
Div(
Div(to_column((Field(
fields_form = Div(
Row(to_column((Field(
'tipo',
placeholder=_('Selecione um Tipo de Vide')), 12))),
Div(to_column((
Field(
Row(to_column((Field(
'texto',
placeholder=_(
'Texto Adicional ao Vide')), 12))),
Div(to_column((
Button(
'submit',
'Salvar',
css_class='btn btn-primary'), 12)))
), 4)),
to_column((
Div(
Div(to_column(('tipo_ta', 6))),
Div(to_column(('num_ta', 3)),
to_column(('ano_ta', 3))),
Div(to_column(
(Field(
placeholder=_('Texto Adicional ao Vide')), 12))),
Row(to_column((buttons, 12))))
fields_search = Div(
Row(
to_column(('tipo_ta', 6)),
to_column(('tipo_model', 6))),
Row(
to_column(('num_ta', 6)),
to_column(('ano_ta', 6))),
Row(to_column((FieldWithButtons(
Field(
'busca_dispositivo',
placeholder=_('Digite palavras, letras, '
'números ou algo'
' que estejam '
'no rótulo ou no texto.')), 10)),
to_column((
Button(
'buscar',
'Buscar',
css_class='btn btn-primary btn-busca'), 2))
'no rótulo ou no texto.')),
StrictButton("Buscar", css_class='btn-busca')), 12))),
Row(to_column(
(Div(css_class='container-busca'), 12)))
)
self.helper = FormHelper()
self.helper.layout = Layout(
Div(
Div(HTML(_('Vides')), css_class='panel-heading'),
Div(
to_column((
fields_form, 4)),
to_column((
fields_search, 8)), css_class="panel-body"
),
to_column(
(Div(css_class='container-busca'), 12))
), 8)
)
css_class="panel panel-primary"
)
)
if 'choice_model_type_foreignkey_in_extenal_views' in kwargs:
ch = kwargs.pop('choice_model_type_foreignkey_in_extenal_views')
if 'data' in kwargs:
choice = ch(kwargs['data']['tipo_ta'])
self.base_fields['tipo_model'].choices = choice
super(VideForm, self).__init__(*args, **kwargs)

28
compilacao/models.py

@ -473,7 +473,7 @@ class Publicacao(TimestampedMixin):
verbose_name_plural = _('Publicações')
def __str__(self):
return _('%s realizada em %s \n %s') % (
return _('%s realizada em %s \n <small>%s</small>') % (
self.tipo_publicacao,
defaultfilters.date(self.data, "d \d\e F \d\e Y"),
self.ta)
@ -624,9 +624,8 @@ class Dispositivo(BaseModel, TimestampedMixin):
)
def __str__(self):
return '%(rotulo)s - %(ta)s' % {
'rotulo': (self.rotulo if self.rotulo else self.tipo_dispositivo),
'ta': self.ta}
return '%(rotulo)s' % {
'rotulo': (self.rotulo if self.rotulo else self.tipo_dispositivo)}
def rotulo_padrao(self, local_insert=0, for_insert_in=0):
"""
@ -1145,19 +1144,24 @@ class Vide(TimestampedMixin):
return _('Vide %s') % self.texto
class Nota(TimestampedMixin):
NPRIV = 1
NINST = 2
NPUBL = 3
PUBLICIDADE_CHOICES = (
NPRIV = 1
NINST = 2
NPUBL = 3
NOTAS_PUBLICIDADE_CHOICES = (
# Only the owner of the note has visibility.
(NPRIV, _('Nota Privada')),
# All authenticated users have visibility.
(NINST, _('Nota Institucional')),
# All users have visibility.
(NPUBL, _('Nota Pública')),
)
)
class Nota(TimestampedMixin):
NPRIV = 1
NINST = 2
NPUBL = 3
titulo = models.CharField(
verbose_name=_('Título'),
@ -1181,7 +1185,7 @@ class Nota(TimestampedMixin):
owner = models.ForeignKey(User, verbose_name=_('Dono da Nota'))
publicidade = models.PositiveSmallIntegerField(
choices=PUBLICIDADE_CHOICES,
choices=NOTAS_PUBLICIDADE_CHOICES,
verbose_name=_('Nível de Publicidade'))
class Meta:

13
compilacao/templatetags/compilacao_filters.py

@ -36,15 +36,18 @@ def dispositivo_desativado(dispositivo, inicio_vigencia, fim_vigencia):
@register.simple_tag
def nota_automatica(dispositivo):
def nota_automatica(dispositivo, ta_pub_list):
if dispositivo.ta_publicado is not None:
d = dispositivo.dispositivo_atualizador.dispositivo_pai
if dispositivo.texto == Dispositivo.TEXTO_PADRAO_DISPOSITIVO_REVOGADO:
return 'Revogado pelo %s.' % d
elif not dispositivo.dispositivo_substituido:
return 'Inclusão feita pelo %s.' % d
return 'Revogado pelo %s - %s.' % (
d, ta_pub_list[dispositivo.ta_publicado_id])
elif not dispositivo.dispositivo_substituido_id:
return 'Inclusão feita pelo %s - %s.' % (
d, ta_pub_list[dispositivo.ta_publicado_id])
else:
return 'Alteração feita pelo %s.' % d
return 'Alteração feita pelo %s - %s.' % (
d, ta_pub_list[dispositivo.ta_publicado_id])
return ''

19
compilacao/urls.py

@ -16,6 +16,7 @@ urlpatterns_compilacao = [
url(r'^(?P<ta_id>[0-9]+)/text$',
views.TextView.as_view(), name='ta_text'),
url(r'^(?P<ta_id>[0-9]+)/text/vigencia/(?P<sign>.+)/$',
views.TextView.as_view(), name='ta_vigencia'),
@ -85,17 +86,19 @@ urlpatterns_compilacao = [
url(r'^config/tipo-textoarticulado/(?P<pk>[0-9]+)/delete$',
views.TipoTaDeleteView.as_view(), name='tipo_ta_delete'),
url(r'^config/tipo-nota/',
]
urlpatterns = [
url(r'^ta/', include(urlpatterns_compilacao, 'compilacao', 'compilacao')),
url(r'^ta/config/tipo-nota/',
include(tipo_nota_crud.urls)),
url(r'^config/tipo-vide/',
url(r'^ta/config/tipo-vide/',
include(tipo_vide_crud.urls)),
url(r'^config/tipo-publicacao/',
url(r'^ta/config/tipo-publicacao/',
include(tipo_publicacao_crud.urls)),
url(r'^config/veiculo-publicacao/',
url(r'^ta/config/veiculo-publicacao/',
include(veiculo_publicacao_crud.urls)),
]
urlpatterns = [
url(r'^ta/', include(urlpatterns_compilacao)),
]

250
compilacao/views.py

@ -7,7 +7,7 @@ from django import forms
from django.contrib.auth.decorators import login_required
from django.contrib.contenttypes.models import ContentType
from django.core.signing import Signer
from django.core.urlresolvers import reverse, reverse_lazy
from django.core.urlresolvers import reverse_lazy
from django.db.models import Q
from django.http.response import (HttpResponse, HttpResponseRedirect,
JsonResponse)
@ -38,7 +38,9 @@ DISPOSITIVO_SELECT_RELATED = (
'dispositivo_atualizador__dispositivo_pai__ta',
'dispositivo_atualizador__dispositivo_pai__ta__tipo_ta',
'dispositivo_pai',
'dispositivo_pai__tipo_dispositivo')
'dispositivo_pai__tipo_dispositivo',
'ta_publicado',
'ta',)
tipo_nota_crud = build_crud(
TipoNota, 'tipo_nota', [
@ -174,7 +176,8 @@ class IntegracaoTaView(TemplateView):
ta.save()
return redirect(to=reverse_lazy('ta_text', kwargs={'ta_id': ta.pk}))
return redirect(to=reverse_lazy('compilacao:ta_text',
kwargs={'ta_id': ta.pk}))
class Meta:
abstract = True
@ -193,10 +196,11 @@ def get_integrations_view_names():
return result
def choice_extenal_views():
def choice_models_in_extenal_views():
integrations_view_names = get_integrations_view_names()
result = [(None, '-------------'), ]
for item in integrations_view_names:
if hasattr(item, 'model') and hasattr(item, 'model_type_foreignkey'):
ct = ContentType.objects.filter(
model=item.model.__name__.lower(),
app_label=item.model._meta.app_label)
@ -228,7 +232,7 @@ class TipoTaListView(ListView):
@property
def create_url(self):
return reverse_lazy('tipo_ta_create')
return reverse_lazy('compilacao:tipo_ta_create')
class TipoTaCreateView(FormMessagesMixin, CreateView):
@ -242,17 +246,18 @@ class TipoTaCreateView(FormMessagesMixin, CreateView):
self.object = None
form = self.get_form()
form.fields['content_type'] = forms.ChoiceField(
choices=choice_extenal_views(),
choices=choice_models_in_extenal_views(),
label=_('Modelo Integrado'), required=False)
return self.render_to_response(self.get_context_data(form=form))
def get_success_url(self):
return reverse_lazy('tipo_ta_detail', kwargs={'pk': self.object.id})
return reverse_lazy('compilacao:tipo_ta_detail',
kwargs={'pk': self.object.id})
@property
def cancel_url(self):
return reverse_lazy('tipo_ta_list')
return reverse_lazy('compilacao:tipo_ta_list')
class TipoTaDetailView(CompMixin, DetailView):
@ -268,28 +273,31 @@ class TipoTaUpdateView(CompMixin, UpdateView):
self.object = self.get_object()
form = self.get_form()
form.fields['content_type'] = forms.ChoiceField(
choices=choice_extenal_views(),
choices=choice_models_in_extenal_views(),
label=_('Modelo Integrado'), required=False)
return self.render_to_response(self.get_context_data(form=form))
def get_success_url(self):
return reverse_lazy('tipo_ta_detail', kwargs={'pk': self.kwargs['pk']})
return reverse_lazy('compilacao:tipo_ta_detail',
kwargs={'pk': self.kwargs['pk']})
@property
def cancel_url(self):
return reverse_lazy('tipo_ta_detail', kwargs={'pk': self.kwargs['pk']})
return reverse_lazy('compilacao:tipo_ta_detail',
kwargs={'pk': self.kwargs['pk']})
class TipoTaDeleteView(CompMixin, DeleteView):
model = TipoTextoArticulado
template_name = "compilacao/confirm_delete.html"
template_name = "crud/confirm_delete.html"
@property
def detail_url(self):
return reverse_lazy('tipo_ta_detail', kwargs={'pk': self.kwargs['pk']})
return reverse_lazy('compilacao:tipo_ta_detail',
kwargs={'pk': self.kwargs['pk']})
def get_success_url(self):
return reverse_lazy('tipo_ta_list')
return reverse_lazy('compilacao:tipo_ta_list')
class TaListView(ListView):
@ -303,7 +311,7 @@ class TaListView(ListView):
@property
def create_url(self):
return reverse_lazy('ta_create')
return reverse_lazy('compilacao:ta_create')
def get_context_data(self, **kwargs):
context = super(TaListView, self).get_context_data(**kwargs)
@ -321,7 +329,8 @@ class TaDetailView(DetailView):
def title(self):
if self.get_object().content_object:
return _(
'Metadados para o Texto Articulado da %s - %s') % (
'Metadados para o Texto Articulado de %s\n'
'<small>%s</small>') % (
self.get_object().content_object._meta.verbose_name_plural,
self.get_object().content_object)
else:
@ -336,11 +345,12 @@ class TaCreateView(FormMessagesMixin, CreateView):
form_invalid_message = _('O registro não foi criado.')
def get_success_url(self):
return reverse_lazy('ta_detail', kwargs={'pk': self.object.id})
return reverse_lazy('compilacao:ta_detail',
kwargs={'pk': self.object.id})
@property
def cancel_url(self):
return reverse_lazy('ta_list')
return reverse_lazy('compilacao:ta_list')
class TaUpdateView(CompMixin, UpdateView):
@ -357,23 +367,26 @@ class TaUpdateView(CompMixin, UpdateView):
return self.render_to_response(self.get_context_data(form=form))
def get_success_url(self):
return reverse_lazy('ta_detail', kwargs={'pk': self.kwargs['pk']})
return reverse_lazy('compilacao:ta_detail',
kwargs={'pk': self.kwargs['pk']})
@property
def cancel_url(self):
return reverse_lazy('ta_detail', kwargs={'pk': self.kwargs['pk']})
return reverse_lazy('compilacao:ta_detail',
kwargs={'pk': self.kwargs['pk']})
class TaDeleteView(CompMixin, DeleteView):
model = TextoArticulado
template_name = "compilacao/confirm_delete.html"
template_name = "crud/confirm_delete.html"
@property
def detail_url(self):
return reverse_lazy('ta_detail', kwargs={'pk': self.kwargs['pk']})
return reverse_lazy('compilacao:ta_detail',
kwargs={'pk': self.kwargs['pk']})
def get_success_url(self):
return reverse_lazy('ta_list')
return reverse_lazy('compilacao:ta_list')
class TextView(ListView, CompMixin):
@ -444,9 +457,9 @@ class TextView(ListView, CompMixin):
context['cita'] = {}
for c in cita:
if str(c.dispositivo_base_id) not in context['cita']:
context['cita'][str(c.dispositivo_base_id)] = []
context['cita'][str(c.dispositivo_base_id)].append(c)
if c.dispositivo_base_id not in context['cita']:
context['cita'][c.dispositivo_base_id] = []
context['cita'][c.dispositivo_base_id].append(c)
citado = Vide.objects.filter(
Q(dispositivo_ref__ta_id=self.kwargs['ta_id'])).\
@ -458,9 +471,9 @@ class TextView(ListView, CompMixin):
context['citado'] = {}
for c in citado:
if str(c.dispositivo_ref_id) not in context['citado']:
context['citado'][str(c.dispositivo_ref_id)] = []
context['citado'][str(c.dispositivo_ref_id)].append(c)
if c.dispositivo_ref_id not in context['citado']:
context['citado'][c.dispositivo_ref_id] = []
context['citado'][c.dispositivo_ref_id].append(c)
notas = Nota.objects.filter(
dispositivo__ta_id=self.kwargs['ta_id']).select_related(
@ -468,9 +481,19 @@ class TextView(ListView, CompMixin):
context['notas'] = {}
for n in notas:
if str(n.dispositivo_id) not in context['notas']:
context['notas'][str(n.dispositivo_id)] = []
context['notas'][str(n.dispositivo_id)].append(n)
if n.dispositivo_id not in context['notas']:
context['notas'][n.dispositivo_id] = []
context['notas'][n.dispositivo_id].append(n)
tas_pub = [d.ta_publicado for d in self.object_list if d.ta_publicado]
tas_pub = set(tas_pub)
ta_pub_list = {}
for ta in tas_pub:
ta_pub_list[ta.pk] = str(ta)
context['ta_pub_list'] = ta_pub_list
# context['vigencias'] = self.get_vigencias()
return context
def get_queryset(self):
@ -601,7 +624,7 @@ class DispositivoView(TextView):
return itens
class TextEditView(TextView):
class TextEditView(ListView, CompMixin):
template_name = 'compilacao/text_edit.html'
flag_alteradora = -1
@ -611,14 +634,27 @@ class TextEditView(TextView):
pk_edit = 0
pk_view = 0
"""
def get(self, request, *args, **kwargs):
self.object_list = self.get_queryset()
context = self.get_context_data(
object_list=self.object_list)
return ListView.get(self, request, *args, **kwargs)
return self.render_to_response(context)"""
def get_context_data(self, **kwargs):
context = super(TextEditView, self).get_context_data(**kwargs)
ta = TextoArticulado.objects.get(pk=self.kwargs['ta_id'])
self.object = ta
context['object'] = self.object
tas_pub = [d.ta_publicado for d in self.object_list if d.ta_publicado]
tas_pub = set(tas_pub)
ta_pub_list = {}
for ta in tas_pub:
ta_pub_list[ta.pk] = str(ta)
context['ta_pub_list'] = ta_pub_list
return context
def get_queryset(self):
self.pk_edit = 0
@ -722,7 +758,8 @@ class DispositivoEditView(TextEditView):
if not dnext.exists():
dnext = []
dnext[0] = d
dnext.append(d)
pais = [d.dispositivo_pai_id, ]
else:
if dnext[0].nivel > d.nivel:
@ -1385,8 +1422,8 @@ class ActionsEditView(ActionsEditMixin, TemplateView):
class DispositivoSuccessUrlMixin(object):
def get_success_url(self):
return reverse(
'dispositivo', kwargs={
return reverse_lazy(
'compilacao:dispositivo', kwargs={
'ta_id': self.kwargs[
'ta_id'],
'dispositivo_id': self.kwargs[
@ -1428,6 +1465,7 @@ class NotasCreateView(NotaMixin, CreateView):
return super(NotasCreateView, self).get(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
self.object = None
try:
ta_id = kwargs.pop('ta_id')
dispositivo_id = kwargs.pop('dispositivo_id')
@ -1487,30 +1525,58 @@ class VideMixin(DispositivoSuccessUrlMixin):
return super(VideMixin, self).dispatch(*args, **kwargs)
def choice_model_type_foreignkey_in_extenal_views(id_tipo_ta=None):
result = [(None, '-------------'), ]
if not id_tipo_ta:
return result
tipo_ta = TipoTextoArticulado.objects.get(pk=id_tipo_ta)
integrations_view_names = get_integrations_view_names()
for item in integrations_view_names:
if hasattr(item, 'model_type_foreignkey'):
if (tipo_ta.content_type.model == item.model.__name__.lower() and
tipo_ta.content_type.app_label ==
item.model._meta.app_label):
for i in item.model_type_foreignkey.objects.all():
result.append((i.pk, i))
return result
class VideCreateView(VideMixin, CreateView):
model = Vide
template_name = 'compilacao/ajax_form.html'
form_class = VideForm
def post_old(self, request, *args, **kwargs):
try:
def get(self, request, *args, **kwargs):
self.object = None
ta_id = kwargs.pop('ta_id')
dispositivo_id = kwargs.pop('dispositivo_id')
form = VideForm(request.POST, request.FILES, **kwargs)
kwargs['ta_id'] = ta_id
kwargs['dispositivo_id'] = dispositivo_id
if form.is_valid():
vd = form.save(commit=False)
vd.save()
self.kwargs['pk'] = vd.pk
return self.form_valid(form)
else:
return self.form_invalid(form)
except Exception as e:
print(e)
return HttpResponse("error post")
if 'action' in request.GET and request.GET['action'] == 'get_tipos':
result = choice_model_type_foreignkey_in_extenal_views(
id_tipo_ta=request.GET['tipo_ta'])
itens = []
for i in result:
item = {}
item[i[0] if i[0] else ''] = str(i[1])
itens.append(item)
return JsonResponse(itens, safe=False)
form = self.get_form()
return self.render_to_response(self.get_context_data(form=form))
def get_form_kwargs(self):
kwargs = super(VideCreateView, self).get_form_kwargs()
if 'choice_model_type_foreignkey_in_extenal_views' not in kwargs:
kwargs.update({
'choice_model_type_foreignkey_in_extenal_views':
choice_model_type_foreignkey_in_extenal_views
})
return kwargs
class VideEditView(VideMixin, UpdateView):
@ -1589,7 +1655,59 @@ class DispositivoSearchFragmentFormView(ListView):
q = q & Q(pk=initial_ref)
n = 50
return Dispositivo.objects.filter(q)[:n]
result = Dispositivo.objects.filter(q).select_related('ta')
if 'tipo_model' not in self.request.GET:
return result[:n]
tipo_model = self.request.GET['tipo_model']
if not tipo_model:
return result[:n]
integrations_view_names = get_integrations_view_names()
tipo_ta = TipoTextoArticulado.objects.get(pk=tipo_ta)
model_class = None
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
if not model_class:
return result[:n]
column_field = ''
for field in model_class._meta.fields:
if field.related_model == model_type_class:
column_field = field.column
break
if not column_field:
return result[:n]
r = []
for d in result:
if not d.ta.content_object or\
not hasattr(d.ta.content_object, column_field):
continue
if tipo_model.pk == getattr(d.ta.content_object, column_field):
r.append(d)
if len(r) == n:
break
return r
except Exception as e:
print(e)
@ -1613,7 +1731,7 @@ class PublicacaoListView(ListView):
@property
def create_url(self):
return reverse_lazy(
'ta_pub_create',
'compilacao:ta_pub_create',
kwargs={'ta_id': self.kwargs['ta_id']})
def get_queryset(self):
@ -1635,7 +1753,7 @@ class PublicacaoCreateView(FormMessagesMixin, CreateView):
def get_success_url(self):
return reverse_lazy(
'ta_pub_detail',
'compilacao:ta_pub_detail',
kwargs={
'pk': self.object.id,
'ta_id': self.kwargs['ta_id']})
@ -1643,7 +1761,7 @@ class PublicacaoCreateView(FormMessagesMixin, CreateView):
@property
def cancel_url(self):
return reverse_lazy(
'ta_pub_list',
'compilacao:ta_pub_list',
kwargs={'ta_id': self.kwargs['ta_id']})
def get_initial(self):
@ -1668,7 +1786,7 @@ class PublicacaoUpdateView(CompMixin, UpdateView):
return self.render_to_response(self.get_context_data(form=form))
def get_success_url(self):
return reverse_lazy('ta_pub_detail',
return reverse_lazy('compilacao:ta_pub_detail',
kwargs={
'pk': self.object.id,
'ta_id': self.kwargs['ta_id']})
@ -1680,15 +1798,15 @@ class PublicacaoUpdateView(CompMixin, UpdateView):
class PublicacaoDeleteView(CompMixin, DeleteView):
model = Publicacao
template_name = "compilacao/confirm_delete.html"
template_name = "crud/confirm_delete.html"
@property
def detail_url(self):
return reverse_lazy('ta_pub_detail',
return reverse_lazy('compilacao:ta_pub_detail',
kwargs={
'pk': self.object.id,
'ta_id': self.kwargs['ta_id']})
def get_success_url(self):
return reverse_lazy('ta_pub_list',
return reverse_lazy('compilacao:ta_pub_list',
kwargs={'ta_id': self.kwargs['ta_id']})

2
materia/views.py

@ -1486,7 +1486,9 @@ class ProposicaoView(FormMixin, GenericView):
class MateriaTaView(IntegracaoTaView):
model = MateriaLegislativa
model_type_foreignkey = TipoMateriaLegislativa
class ProposicaoTaView(IntegracaoTaView):
model = Proposicao
model_type_foreignkey = TipoProposicao

8
norma/urls.py

@ -3,17 +3,17 @@ from django.conf.urls import include, url
from norma.views import (NormaIncluirView, NormaTaView, assunto_norma_crud,
norma_temporario_crud, tipo_norma_crud)
norma_url_patterns = norma_temporario_crud.urlpatterns
# norma_url_patterns = norma_crud.urlpatterns + []
norma_url_patterns = norma_temporario_crud.urlpatterns + [
url(r'^norma/(?P<pk>[0-9]+)/ta$',
NormaTaView.as_view(), name='ta')
]
urlpatterns = [
url(r'^norma/', include(norma_url_patterns,
norma_temporario_crud.namespace,
norma_temporario_crud.namespace)),
url(r'^norma/(?P<pk>[0-9]+)/ta$',
NormaTaView.as_view(), name='norma_ta'),
url(r'^sistema/norma/tipo/', include(tipo_norma_crud.urls)),
url(r'^sistema/norma/assunto/', include(assunto_norma_crud.urls)),

1
norma/views.py

@ -125,3 +125,4 @@ class NormaIncluirView(FormMixin, GenericView):
class NormaTaView(IntegracaoTaView):
model = NormaJuridica
model_type_foreignkey = TipoNormaJuridica

3
sapl/layout.py

@ -23,7 +23,8 @@ def to_fieldsets(fields):
def form_actions(more=[], save_label=_('Salvar')):
return FormActions(Submit('salvar', save_label), *more)
return FormActions(
Submit('salvar', save_label, css_class='pull-right'), *more)
class SaplFormLayout(Layout):

49
static/js/compilacao_notas.js

@ -1,24 +1,19 @@
function onEventsDneExec(pk) {
function onEventsDneExec(pk, model) {
$('html, body').animate({
scrollTop: $('#dne' + pk ).offset().top - window.innerHeight / 5
}, 300);
$('.dateinput').fdatepicker({
// TODO localize
format: 'dd/mm/yyyy',
language: 'pt',
endDate: '31/12/2100',
todayBtn: true
});
refreshDatePicker()
$('#dne'+pk+" .primary").click(onSubmitEditForm);
$('#dne'+pk+" #button-id-submit-form").click(onSubmitEditForm);
$('#dne'+pk+" .btn-close-container").click(function(){
$(this).closest('.dne-nota').removeClass('dne-nota');
$(this).closest('.dne-form').html('');
});
if (model == 'nota') {
$('#dne'+pk+" select[name='tipo']").change(function(event) {
var url = '';
url = 'text/'+pk+'/nota/create?action=modelo_nota&id_tipo='+this.value;
@ -26,10 +21,29 @@ function onEventsDneExec(pk) {
$('#dne'+pk+" textarea[name='texto']").val(data);
});
});
}
else if (model == 'vide') {
$('#dne'+pk+" select[name='tipo_ta']").change(function(event) {
var url = '';
url = 'text/'+pk+'/vide/create?action=get_tipos&tipo_ta='+this.value;
$('#dne'+pk+" label[for='id_tipo_model']").html('Tipos de ' + this.children[this.selectedIndex].innerHTML);
var select = $('#dne'+pk+" select[name='tipo_model']");
select.empty();
$('<option value="">Carregando...</option>').appendTo(select);
$.get(url).done(function( data ) {
select.empty();
for(var item in data) {
for (var i in data[item])
$('<option value="'+i+'">'+data[item][i]+'</option>').appendTo(select);
}
$('#dne'+pk+" select[name='tipo_norma']"
).change(onChangeParamNorma);
});
});
$('#dne'+pk+" input[name='num_norma'], "
+ '#dne'+pk+" input[name='ano_norma'], "
+ '#dne'+pk+" input[name='busca_dispositivo']"
@ -38,9 +52,11 @@ function onEventsDneExec(pk) {
$('#dne'+pk+" .btn-busca").click(onChangeParamNorma);
onChangeParamNorma();
}
}
var onChangeParamNorma = function(event) {
var tipo_ta = $("select[name='tipo_ta']").val();
var tipo_model = $("select[name='tipo_model']").val();
var num_ta = $("input[name='num_ta']").val();
var ano_ta = $("input[name='ano_ta']").val();
var busca_dispositivo = $("input[name='busca_dispositivo']").val();
@ -55,6 +71,7 @@ var onChangeParamNorma = function(event) {
var formData = {
'tipo_ta' : tipo_ta,
'tipo_model' : tipo_model,
'num_ta' : num_ta,
'ano_ta' : ano_ta,
'busca' : busca_dispositivo,
@ -98,15 +115,19 @@ var onSubmitEditForm = function(event) {
if (typeof data == "string") {
if (data.indexOf('<form') >= 0) {
$('#dne'+id_dispositivo+' .dne-form').html(data);
onEventsDneExec(id_dispositivo);
onEventsDneExec(id_dispositivo, model);
}
else {
$('#dne'+id_dispositivo+' .dne-form').closest('.dpt').html(data)
onReadyNotasVides();
try {
$('html, body').animate({
scrollTop: $('#dne' + id_dispositivo ).offset().top - window.innerHeight / 3
}, 300);
}
catch(err) {
console.log(err.message);
}
}
}
@ -152,7 +173,7 @@ function getForm(_this) {
$.get(url).done(function( data ) {
$('#dne'+id_dispositivo+' .dne-form').html(data);
onEventsDneExec(id_dispositivo);
onEventsDneExec(id_dispositivo, model);
}).fail(function() {
onReadyNotasVides();
});

12
static/js/compilacao_view.js

@ -30,7 +30,11 @@ function textoMultiVigente(item, diff) {
if ($(ldpts[i]).hasClass('displaynone'))
continue;
if (isElementInViewport( ldpts[i])) {
if (i+1 < ldpts.length)
elv = ldpts[i+1];
else {
elv = ldpts[i];
}
break;
}
}
@ -112,7 +116,11 @@ function textoVigente(item, link) {
if ($(ldpts[i]).hasClass('displaynone'))
continue;
if (isElementInViewport( ldpts[i])) {
if (i+1 < ldpts.length)
elv = ldpts[i+1];
else {
elv = ldpts[i];
}
break;
}
}
@ -150,10 +158,10 @@ $(document).ready(function() {
$(".dpt").css("font-size", "+=1");
});
$(".dpt").each(function() {
$(".dpt.bloco_alteracao .dpt").each(function() {
var nivel = parseInt($(this).attr('nivel'));
$(this).css('z-index', 20-nivel)
$(this).css('z-index', 15-nivel)
});
});

356
static/styles/compilacao.scss

@ -151,13 +151,19 @@ a:link:after, a:visited:after {
border: 1px dotted #ccc;
}
}
a {
text-decoration: none;
cursor: pointer;
}
.diff {
.desativado, .desativado * {
text-decoration: line-through;
color: #dbb !important;
color: #ddd !important;
font-size: 90%;
}
.added {
color: #018;
color: #04DE2C;
}
}
@ -254,19 +260,7 @@ a:link:after, a:visited:after {
margin-top: 2px;
}
a {
color: #444444;
&.link_alterador {
color: #2980B9;
font-size: 0.75em;
&:hover {
text-decoration: underline;
}
}
&.desativado {
@extend .desativado;
}
}
.bloco_alteracao {
padding-left: 10%;
@ -283,16 +277,14 @@ a:link:after, a:visited:after {
}
.dn { /* Notas de Dispositivo*/
font-size: 0.8rem;
font-weight: normal;
line-height: 1rem;
position: relative;
font-size: 70%;
p, ul {
font-size: 0.8rem;
font-weight: normal;
line-height: 1rem;
margin: 0 0 0 0;
list-style: none;
padding: 0;
}
.dnl { /* Lista Notas de Dispositivo*/
@ -305,7 +297,6 @@ a:link:after, a:visited:after {
.bullet {
padding: 0 0.333em;
padding-bottom: 0.2em;
display: inline-block;
}
.dnli {
@ -326,9 +317,10 @@ a:link:after, a:visited:after {
position: absolute;
background: transparent;
right: 0;
padding: 0.5em 0.5em 0em 0.5em;
padding: 0.2em 0.5em 0em 0.5em;
border: 1px solid #c7e3d3;
border-top: 0px;
font-size: 1.5rem;
li {
display: table-cell;
color: #aaa;
@ -347,17 +339,17 @@ a:link:after, a:visited:after {
.ntitulo {
font-weight: bold;
color: #676;
font-size: 90%;
color: #03A203;
text-decoration: none;
a{
a {
color: #294 !important;
}
}
.ntexto {
color: #787;
color: #06D806;
a{
color: #294 !important;
color: #03A203 !important;
}
}
}
@ -381,61 +373,140 @@ a:link:after, a:visited:after {
}
.dptt {
& > a {
color: #444444;
&.link_alterador {
color: #2980B9;
font-size: 0.75em;
&:hover {
text-decoration: underline;
}
}
&.desativado {
@extend .desativado;
}
}
.dne {
text-decoration: none;
position: absolute;
display: block;
font-size: 0.8rem;
font-weight: normal;
line-height: 1rem;
text-align: left;
right: 0;
left: 0;
top: 0;
height: 0;
transform: scaleX(0);
transform-origin: right;
transition: all 0.3s ease;
top: 0;
left: -1.6em;
right: -1.6em;
background-color: #2980b9;
z-index: 18;
* {
font-size: 0.8rem;
font-weight: normal;
line-height: 1rem;
text-decoration: none !important;
border-top: 1px solid $color_buttons;
ul.btns-action {
list-style: none;
padding: 0;
position: absolute;
right: 0;
background-color: $color_buttons;
li {
float: left;
&:hover {
background-color: rgba(#000, 0.1);
}
a {
color: white;
padding: 0.15em 1em 0;
display: inline-block;
&:hover {
}
}
}
}
}
.dne-nota {
position: relative;
transform: scaleX(1);
height: auto;
border-top: 0px;
ul.btns-action {
position: absolute;
margin: 0 0 0 0;
display: table;
display: none;
}
.dne-form {
margin: 1em -2em 0em;
text-align: left;
font-size: 1.6rem;
.container-busca {
ul{
list-style: none;
clip: rect(0,0,0,0);
opacity: 0;
transition: opacity 1.5s linear, clip 1s linear;
display: table;
margin-left: 0;
border-collapse:separate;
border-spacing: 0;
top: 0px;
right: 0px;
z-index: 19;
border-spacing:1px;
padding: 0px;
li {
display: table-row;
&:nth-child(even) {
background-color: rgba(0, 0, 0, 0.05);
}
&:nth-child(odd) {
background-color: rgba(0, 0, 0, 0.08);
}
.iteminput {
display: table-cell;
background-color: $color_buttons;
a {
font-size: 155%;
padding: 0.4em 0.8em;
display: inline-block;
float: right;
color: #fff !important;
&:hover {
padding: 0.5em;
vertical-align: middle;
text-align: center;
input {
margin: 0;
}
}
.itemlabel {
display: table-cell;
padding: 0.5em;
vertical-align: middle;
width: 100%;
label {
line-height: 1;
font-family: "SourceSansPro", Helvetica, Arial, sans-serif;
}
}
}
}
.ta_title {
padding: 0.15em 0.7em;
background-color: rgba(0, 0, 0, 0.15);
margin: 0.1em 0.08em 0 0.1em;
}
.nomenclatura_heranca {
font-size: 90%;
color: #057dba;
}
}
}
}
&:hover {
.dne {
height: 0.1667rem;
transform: scaleX(1);
transition-delay: 1s;
}
.dne-nota {
height: auto;
transition-delay: 0s;
}
}
.dne-nota111 {
box-shadow: -4px 15px 15px rgba(0, 0, 0, 0.1), 0px 6px 6px rgba(0, 0, 0, 0.23);
@include background-top-down(#f5f5f5, #eee);
position: relative;
@ -451,7 +522,7 @@ a:link:after, a:visited:after {
display: none;
}
.dne-form {
.dne-form111 {
.asterisk {
color: transparent;
&::before {
@ -592,114 +663,56 @@ a:link:after, a:visited:after {
}
}
}
&:hover {
.dne {
height: 0.1667rem;
transform: scaleX(1);
transition-delay: 1s;
ul.btns-action {
clip: rect(-100px, 2000px, 2000px, -100px);
opacity: 1;
transition: opacity 0.5s linear, clip 0s 0.3s;
li {
a {
}
}
}
}
.dne-nota {
height: auto;
transition-delay: 0s;
}
}
}
} /* and dpt */
.top-bar {
line-height: 1.6rem;
height: auto;
background: #2980B9;
z-index:1;
margin: 0 auto;
max-width: 62.5rem;
}
.top-bar-section {
li:not(.has-form) {
a:not(.button) {
@extend .top-bar;
padding: 0 0.43333rem;
&.selected, &:hover {
background: #1056A0;
}
}
}
}
ul.nav {
background: #2980B9;
display:block;
width: 100%;
z-index:1;
}
.tipo-vigencias {
border-top: 1px solid #62B5B5;
list-style: none;
position: fixed;
bottom: 0;
transform: translate(-50%,0);
bottom: 0px;
left: 50%;
}
.vigencias {
margin: 2.5em 0 0 0;
transition: all .4s ease-in-out;
background: #2980B9;
clear:both;
}
.fixed{
z-index:98;
opacity: 0.2;
transition: all 2s ease-in-out;
-webkit-transition-delay: 3s; /* Safari */
transition-delay: 3s;
transform: translate(-50%, 0);
margin: 0;
padding: 0;
background-color: $color_buttons;
z-index: 1000;
&:hover {
-webkit-transition-delay: 0s; /* Safari */
transition-delay: 0s;
transition: all 0.3s ease-in-out;
opacity: 0.9;
transition: all 0.3s ease-in-out;
&::-webkit-scrollbar {
width: 10px;
height: 10px;
li {
display: inline-block;
border-left: 1px solid #fff;
float: left;
a {
color: white;
padding: 0.3em 1em 0;
display: inline-block;
font-size: 110%;
cursor: pointer;
&.selected {
background-color: rgba(0, 0, 0, 0.5);
}
&::-webkit-scrollbar-thumb:vertical {
height: 30px;
background-color: rgba(0, 0, 0, 0.1);
}
&:hover {
background-color: rgba(0, 0, 0, 0.2);
}
}
&:hover {
opacity: 1;
}
}
} /* end cp */
.cpe {
.cp.cpe {
@extend .cp;
margin-bottom: 15em;
margin-left: 0.8em;
a {
text-decoration: none;
cursor: pointer;
}
.dpt {
@ -1141,6 +1154,7 @@ a:link:after, a:visited:after {
min-height: 12.6em;
border: 0px;
font-size: 120%;
width: 100%;
&:focus {
background: #fff;
}
@ -1173,53 +1187,7 @@ a:link:after, a:visited:after {
}
}
}
.btn-busca {
background-color: #0093dd;
&:hover {
background-color: #007ebe;
}
&:focus {
background-color: #036190;
}
}
.btn-close-container{
position: absolute;
background-color: #AAA;
width: 2em;
height: 2em;
border: 0.3em solid #FFF;
top: -0.9em;
right: -0.9em;
border-radius: 50%;
cursor: pointer;
opacity: 0.7;
transform: rotate(45deg);
z-index: 98;
.icon-close{
background: #FFF;
height: 1.2em;
position: absolute;
width: 0.2em;
top: 0.15em;
left: 0.66em;
&::after {
background: #FFF;
content: "";
height: 0.2em;
left: -0.5em;
position: absolute;
top: 0.48em;
width: 1.2em;
}
}
&:hover{
opacity: 1;
}
}
.class_color_container {
background: #ddd !important;

17
templates/base.html

@ -154,9 +154,13 @@
{% endblock %}
{% block title %}
<h1 class="page-header">
{% if view.title %}
<h1 class="page-header">{{ view.title|linebreaksbr }}</h1>
{{ view.title|safe|linebreaksbr }}
{% else %}
{{ title|safe|linebreaksbr }}
{% endif %}
</h1>
{% endblock %}
</div>
@ -217,15 +221,18 @@
{% block foot_js %}
<!-- Bootstrap core JavaScript ================================================== -->
<!-- Placed at the end of the document so the pages load faster -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script type="text/javascript" src="{% static 'jquery/dist/jquery.min.js' %}"></script>
<script type="text/javascript" src="{% static 'bootstrap-sass/assets/javascripts/bootstrap.min.js' %}"></script>
<script type="text/javascript" src="{% static 'jQuery-runner/build/jquery.runner.js' %}"></script>
<script type="text/javascript" src="{% static 'jquery-mask-plugin/dist/jquery.mask.js' %}"></script>
<script src="{% static 'jquery-ui/jquery-ui.min.js' %}"></script>
<script type="text/javascript" src="{% static 'jquery-ui/jquery-ui.min.js' %}"></script>
<script type="text/javascript" src="{% static 'jquery-ui/ui/i18n/datepicker-pt-BR.js' %}"></script>
<script type="text/javascript" src="{% static 'jQuery-runner/build/jquery.runner.js' %}"></script>
<script type="text/javascript" src="{% static 'jquery-mask-plugin/dist/jquery.mask.js' %}"></script>
<script src="{% static 'tinymce/tinymce.min.js' %}"></script>
<script type="text/javascript" src="{% static 'jsdiff/diff.min.js' %}"></script>
<script type="text/javascript" src="{% static 'js/app.js' %}"></script>
{% block extra_js %}{% endblock %}

1
templates/compilacao/ajax_form.html

@ -1,3 +1,2 @@
{% load crispy_forms_tags %}
<div class="btn-close-container"><div class="icon-close"></div></div>
{% crispy form form.helper%}

20
templates/compilacao/confirm_delete.html

@ -1,20 +0,0 @@
{% extends "base.html" %}
{% load i18n %}
{% block base_content %}
<form action="" method="post">{% csrf_token %}
<div class="callout panel text-center radius clearfix">
<p>
{% blocktrans %}
Confirma exclusão de <br/> "{{ object }}"?
{% endblocktrans %}
</p>
<div class="button-group">
<a href="{{ view.detail_url }}" class="button button radius alert">{% trans 'Cancelar' %}</a>
<input name="submit" value="{% trans 'Confirmar' %}" class="submit button button radius success" type="submit"></li>
</div>
</div>
</form>
{% endblock %}

5
templates/compilacao/dispositivo_search_fragment_form.html

@ -21,7 +21,7 @@
</div>
<div class="itemlabel">
<label for="r{{dpt.dispositivo_pai.pk}}">{{dpt.dispositivo_pai.rotulo|safe}} - {{dpt.texto|safe}}</label>
<a target="_blank" href="{% url 'ta_text' dpt.ta.pk%}#{{dpt.pk}}" class="nomenclatura_heranca">{% nomenclatura_heranca dpt 1 1 %}</a>
<a target="_blank" href="{% url 'compilacao:ta_text' dpt.ta.pk%}#{{dpt.pk}}" class="nomenclatura_heranca">{% nomenclatura_heranca dpt 1 1 %}</a>
</div>
</li>
{% elif not dpt.tipo_dispositivo.dispositivo_de_articulacao %}
@ -31,10 +31,9 @@
</div>
<div class="itemlabel">
<label for="r{{dpt.pk}}">{{dpt.rotulo|safe}} - {{dpt.texto|safe}}</label>
<a target="_blank" href="{% url 'ta_text' dpt.ta.pk%}#{{dpt.pk}}" class="nomenclatura_heranca">{% nomenclatura_heranca dpt 1 1 %}</a>
<a target="_blank" href="{% url 'compilacao:ta_text' dpt.ta.pk%}#{{dpt.pk}}" class="nomenclatura_heranca">{% nomenclatura_heranca dpt 1 1 %}</a>
</div>
</li>
{% endif%}
{% if forloop.last %}</ul>{% endif %}
{% endfor %}

21
templates/compilacao/publicacao_detail.html

@ -1,24 +1,25 @@
{% extends "base.html" %} {% load i18n %} {% load compilacao_filters %}
{% extends "base.html" %}
{% load i18n %}
{% load compilacao_filters %}
{% load common_tags %}
{% block base_content %} {# FIXME is this the best markup to use? #}
<div class="clearfix">
{% block base_content %}
<div class="clearfix">
{% block actions %}
<ul class="button-group right">
<li><a href="{% url 'ta_pub_edit' object.ta.pk object.pk %}" class="button tiny">{% trans 'Editar' %}</a></li>
<li><a href="{% url 'ta_pub_delete' object.ta.pk object.pk %}" class="button alert tiny">{% trans 'Excluir' %}</a></li>
</ul>
<div class="actions btn-group pull-right" role="group">
<a href="{% url 'compilacao:ta_pub_edit' object.ta.pk object.pk %}" class="btn btn-default">{% trans 'Editar' %}</a>
<a href="{% url 'compilacao:ta_pub_delete' object.ta.pk object.pk %}" class="btn btn-default">{% trans 'Excluir' %}</a>
</div>
{% endblock actions %}
</div>
<div class="actions btn-group pull-right" role="group">
{% block sections_nav %}
{% endblock %}
</div>
</div>
{% block detail_content %} {# TODO replace fieldset for something semantically correct, but with similar visual grouping style #}
<fieldset>
<legend>{%trans 'Identificação Básica'%}</legend>
<div class="row">
<div class="col-md-4">
<div id="div_id_tipo" class="holder">
@ -84,9 +85,7 @@
<p>{{ object.url_externa|default:''}}</p>
</div>
</div>
</div>
</fieldset>
{% endblock detail_content %}
{% endblock base_content %}

25
templates/compilacao/publicacao_list.html

@ -5,20 +5,19 @@
{% block base_content %}
<div class="actions btn-group pull-right" role="group">
<div class="actions btn-group pull-right" role="group">
<a href="{{ view.create_url }}" class="btn btn-default">
{% trans 'Adicionar'%} {%model_verbose_name 'compilacao.models.Publicacao'%}
</a>
{% block more_buttons %}
<a href="{% url 'ta_text' view.kwargs|lookup:'ta_id' %}" class="btn btn-default">{% trans 'Voltar' %}</a>
{% endblock more_buttons %}
</div>
<a href="{% url 'compilacao:ta_text' view.kwargs.ta_id %}" class="btn btn-default">
{% trans 'Voltar' %}
</a>
</div>
{% if not object_list %}
{% if not object_list %}
<p>{{ NO_ENTRIES_MSG }}</p>
{% else %}
<table class="table">
{% else %}
<table class="table">
<thead>
<tr>
<th>{% fieldclass_verbose_name 'compilacao.models.Publicacao' 'data' %}</th>
@ -33,7 +32,7 @@
<tbody>
{% for pub in object_list %}
<tr>
<td><a href="{% url 'ta_pub_detail' view.kwargs.ta_id pub.pk%}">{{ pub.data }}</a></td>
<td><a href="{% url 'compilacao:ta_pub_detail' view.kwargs.ta_id pub.pk%}">{{ pub.data }}</a></td>
<td>{{ pub.hora|time:'H:i:s' }}</td>
<td>{{ pub.numero|default:'' }}</td>
<td>{{ pub.ano|default:'' }}</td>
@ -43,7 +42,7 @@
</tr>
{% endfor %}
</tbody>
</table>
{%endif%}
{% include 'paginacao.html'%}
</table>
{%endif%}
{% include 'paginacao.html'%}
{% endblock %}

28
templates/compilacao/text_edit.html

@ -6,26 +6,36 @@
{% load crispy_forms_tags %}
{% load common_tags %}
{% block head_content %}{{block.super}}
<link rel="stylesheet" href="{% sass_src 'styles/compilacao.scss' %}" type="text/css">
<script type="text/javascript" src="{% static 'js/compilacao.js' %}"></script>
<script type="text/javascript" src="{% static 'js/compilacao_edit.js' %}"></script>
{% endblock %}
{% block title%}
<h1><b>Edição:</b> {{ view.title }} - <i>{% trans 'Texto Multivigente' %}</i></h1>
{% endblock %}
<div id="message_block"><div id="msg">{% trans 'Aguarde... Atualizando informações!!!'%}</div></div>
{% block actions %}
<div class="clearfix">
<div class="actions btn-toolbar pull-right" role="toolbar">
<div class="actions btn-group" role="group">
<a href="{% url 'compilacao:ta_edit' object.pk %}" class="btn btn-default">{% trans 'Editar Metadados do Texto Articulado' %}</a>
</div>
{% include 'compilacao/textoarticulado_menu_config.html' %}
</div>
</div>
{% endblock actions %}
{% block base_content %}{{block.super}}
<div id="message_block"><div id="msg">{% trans 'Aguarde... Atualizando informações!!!'%}</div></div>
<div class="cpe">
<div class="cp cpe">
{% include 'compilacao/text_edit_bloco.html'%}
</div>
</div>
{% endblock base_content %}
{% block foot_js %}
{{block.super}}
<script type="text/javascript" src="{% static 'js/compilacao.js' %}"></script>
<script type="text/javascript" src="{% static 'js/compilacao_edit.js' %}"></script>
{% endblock %}

17
templates/compilacao/text_edit_bloco.html

@ -14,7 +14,6 @@
<div class="dpt" id="dpt{{dpt.pk}}" pk="{{dpt.pk}}">
{% endif%}
{% if view|render_actions_head:dpt %}
<div class="csform">
<form method="post" action="" action_ajax="{{dpt.pk}}/refresh">
@ -36,7 +35,7 @@
</ul>
<ul class="btns-action actions_left">
<li><a href ="{% url 'ta_text' dpt.ta.pk%}#{{dpt.pk}}" class="btn-left btn-action" pk="{{dpt.pk}}" title="{% trans 'Ir para Texto'%}">T</a></li>
<li><a href ="{% url 'compilacao:ta_text' dpt.ta.pk%}#{{dpt.pk}}" class="btn-left btn-action" pk="{{dpt.pk}}" title="{% trans 'Ir para Texto'%}">T</a></li>
</ul>
<ul class="btns-action actions_bottom">
{% for perfil in perfil_estrutural_list%}
@ -47,17 +46,16 @@
<ul class="actions_inserts {% if not dpt.tipo_dispositivo.dispositivo_de_articulacao %}menu_flutuante{%endif%}">
{% if dpt.dispositivo_subsequente == None %}
{% for inserts in view|select_provaveis_inserts:request %}
<li class="{{inserts|lookup:'action'}}"><a class="btn-inserts" action="" pk="{{dpt.pk}}">{{inserts|lookup:'icone'|safe}}<span>{{inserts|lookup:'tipo_insert'}}</span></a>
<li class="{{inserts.action}}"><a class="btn-inserts" action="" pk="{{dpt.pk}}">{{inserts.icone|safe}}<span>{{inserts.tipo_insert}}</span></a>
<ul id="afe{{dpt.id}}" >
{% for item in inserts|lookup:'itens' %}
<li><a class="btn-inserts btn-action" action="{{inserts|lookup:'action'}}" pk="{{item|lookup:'dispositivo_base'}}" variacao="{{item|lookup:'variacao'}}" tipo_pk="{{item|lookup:'tipo_pk'}}">{{item|lookup:'provavel'}}</a></li>
{% for item in inserts.itens %}
<li><a class="btn-inserts btn-action" action="{{inserts|lookup:'action'}}" pk="{{item.dispositivo_base}}" variacao="{{item.variacao}}" tipo_pk="{{item.tipo_pk}}">{{item.provavel}}</a></li>
{% endfor %}
</ul>
</li>
{% endfor %}
{%endif%}
{% if not dpt|is_relative_auto_insert:request %}
<li class="menu_excluir"><a {% if not dpt.dispositivos_filhos_set.exists %}class="btn-excluir btn-action" action="delete_item_dispositivo" pk={{dpt.pk}}{%else%}class="btn-excluir"{%endif%}>&nbsp;<span>Excluir</span></a>
{% if dpt.dispositivos_filhos_set.exists %}
@ -75,11 +73,9 @@
<div class="fields">
{% csrf_token %}
{% if not dpt.tipo_dispositivo.dispositivo_de_articulacao %}
<textarea id="editdi_texto" placeholder="{% trans "Insirir o texto do dispositivo aqui... Use, nos menus das bordas de edição, 'E+' ou 'E*' para outras opções de editores."%}" name="texto" rows="7">{{ dpt.texto|safe }}</textarea>
{%endif%}
</div>
<ul class="label_status" >
@ -99,7 +95,6 @@
{% endif%}
{% if view.pk_view == 0 and view.pk_edit == 0 or view.pk_edit != view.pk_view %}
{% if not dpt.rotulo and not dpt.texto %}
<div class="btns-action actions_left">
<a class="btn-edit" pk="{{dpt.pk}}" title="Edição do dispositivo: {{ dpt.tipo_dispositivo.nome }} {{ dpt.rotulo }}">E</a>
@ -109,9 +104,9 @@
{% spaceless %}
<div class="de" id="id{{dpt.id}}" pk="{{dpt.pk}}" ordem="{{dpt.ordem}}" name="{{dpt.pk}}" title="{{dpt.pk}}">{{ dpt.tipo_dispositivo.rotulo_prefixo_html|safe }}{{ dpt.rotulo }}{{ dpt.tipo_dispositivo.rotulo_sufixo_html|safe }}{{ dpt.tipo_dispositivo.texto_prefixo_html|safe }}{% if dpt.texto == '' and not dpt.tipo_dispositivo.dispositivo_de_articulacao %}<span class="semtexto">({{dpt.tipo_dispositivo}} sem texto)</span>{%else%}{{ dpt.texto|safe }}{%endif%}</div>
{% if dpt.ta_publicado_id != None and not dpt.tipo_dispositivo.dispositivo_de_articulacao %}
<a class="link_alterador" href="{%url 'ta_text_edit' dpt.ta_publicado.pk %}#{{dpt.dispositivo_atualizador_id}}">
<a class="link_alterador" href="compilacao:ta_text_edit' dpt.ta_publicado.pk %}#{{dpt.dispositivo_atualizador_id}}">
{{ dpt.tipo_dispositivo.nota_automatica_prefixo_html|safe }}
{% nota_automatica dpt %}
{% nota_automatica dpt ta_pub_list %}
{{ dpt.tipo_dispositivo.nota_automatica_sufixo_html|safe }}
</a>
{% endif %}

6
templates/compilacao/text_edit_blocoalteracao.html

@ -1,11 +1,11 @@
{% load compilacao_filters %}
{% load common_tags %}
{% for ch in dpt.pk|get_bloco_atualizador %}
{% spaceless %}
{% spaceless %}
<div class="dpt" id="d{{ch.id}}">
<div class="{{ ch.tipo_dispositivo.class_css }}" id="id{{ch.id}}" nivel="{{ch.nivel}}">
{{ ch.tipo_dispositivo.rotulo_prefixo_html|safe }}<a name="{{ch.pk}}" href="{%url 'ta_text_edit' ch.ta.pk %}#{{ch.pk}}">{{ ch.rotulo }}</a>{{ ch.tipo_dispositivo.rotulo_sufixo_html|safe }}{{ ch.tipo_dispositivo.texto_prefixo_html|safe }}{{ ch.texto|safe }}
{{ ch.tipo_dispositivo.rotulo_prefixo_html|safe }}<a name="{{ch.pk}}" href="compilacao:ta_text_edit' ch.ta.pk %}#{{ch.pk}}">{{ ch.rotulo }}</a>{{ ch.tipo_dispositivo.rotulo_sufixo_html|safe }}{{ ch.tipo_dispositivo.texto_prefixo_html|safe }}{{ ch.texto|safe }}
</div>
</div>
{% endspaceless %}
{% endspaceless %}
{% endfor %}

122
templates/compilacao/text_list.html

@ -5,73 +5,83 @@
{% load staticfiles %}
{% load sass_tags %}
{% block head_content %}{{block.super}}
{% block head_content %}
{{block.super}}
<link rel="stylesheet" href="{% sass_src 'styles/compilacao.scss' %}" type="text/css">
<script type="text/javascript" src="{% static 'jsdiff/diff.min.js' %}"></script>
<script type="text/javascript" src="{% static 'js/compilacao.js' %}"></script>
<script type="text/javascript" src="{% static 'js/compilacao_view.js' %}"></script>
{% if perms.compilacao.add_nota %}
<script type="text/javascript" src="{% static 'js/compilacao_notas.js' %}"></script>
{% endif %}
{% endblock %}
{% block base_content %}
{% block actions %}
<div class="clearfix">
<div class="actions btn-group pull-right" role="group">
<a href="{% url 'compilacao:ta_text_edit' object.pk %}" class="btn btn-default">{% trans 'Editar Texto' %}</a>
</div>
</div>
{% endblock actions %}
{% block detail_content %}
{{block.super}}
{% endblock %}
{% block base_content %}{{block.super}}
<div class="cp">
<div class="cp">
{% if object_list %}
<ul class="button-group right">
<li><a class="button tiny" id="btn_font_menos" title="Diminuir tamanho da letra">a</a></li>
<li><a class="button tiny" id="btn_font_mais" title="Aumentar tamanho da Letra">A</a></li>
</ul>
<div class="clearfix">
<div class="actions btn-group pull-right" role="group">
<a class="btn btn-default" id="btn_font_menos" title="Diminuir tamanho da letra">a</a>
<a class="btn btn-default" id="btn_font_mais" title="Aumentar tamanho da Letra">A</a>
</div>
</div>
{% endif %}
{% for key, values in view.get_vigencias.items %}
{% if forloop.first %}
<section class="vigencias">
<nav class="top-bar" data-topbar="" role="navigation">
<section class="top-bar-section">
<ul class="nav left">
{%endif%}
<li class="nav__item has-dropdown">
{% if forloop.first %}
<ul class="nav nav-pills cp-vigencias">
{% for dispositivo in values %}
<a class="nav__link {% if view.inicio_vigencia == dispositivo.inicio_vigencia %}selected{%endif%}" href="{%url 'ta_vigencia' dispositivo.ta.pk dispositivo|get_sign_vigencia %}" title="{% trans 'Vigência entre'%} {{dispositivo.inicio_vigencia}} {% trans 'e'%} {{dispositivo.fim_vigencia}}">{% trans 'Texto Original'%}</a>
<li class="{% if view.inicio_vigencia == dispositivo.inicio_vigencia %}active{%endif%}">
<a href="{%url '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>
</li>
{% endfor %}
{% elif forloop.last %}
{% for dispositivo in values %}
<a class="nav__link {% if view.inicio_vigencia == None %}selected{%endif%}" href="{%url 'ta_text' dispositivo.ta.pk %}" title="{% trans 'Compilação atual'%}.&#013;{% trans 'Vigência a partir de'%} {{dispositivo.inicio_vigencia}}&#013;{{dispositivo.ta_publicado}}">{% trans 'Texto Atual'%}</a>
<li class="{% if not view.inicio_vigencia%}active{% endif %}">
<a href="{%url '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%}{{dispositivo.ta_publicado}}{%endif%}">{% trans 'Texto Atual'%}</a>
</li>
{% if forloop.parentloop.last %}
</ul>
{% if view.inicio_vigencia and view.fim_vigencia %}
<span class="vigencia-active">
{% blocktrans with inicio_vigencia=view.inicio_vigencia fim_vigencia=view.fim_vigencia ta_publicado=dispositivo.ta_publicado%}
Vigência entre <b>{{inicio_vigencia}}</b> e <b>{{fim_vigencia}}</b>.
<br>
<small>Dada pela {{ta_publicado}}</small>
</span>
{% endblocktrans%}
{% else%}
<span class="vigencia-active">
{% blocktrans with inicio_vigencia=dispositivo.inicio_vigencia ta_publicado=dispositivo.ta_publicado%}
Vigência a partir de <b>{{inicio_vigencia}}</b>.
<br>
<small>Dada pela {{ta_publicado}}</small>
{% endblocktrans %}
</span>
{%endif%}
{% endif%}
{% endfor %}
{% else %}
<a class="nav__link {% if view.inicio_vigencia.year == key %}selected{%endif%}">{{ key }}</a>
{%endif%}
{% if not forloop.first and not forloop.last %}
<ul class="nav__sub-nav dropdown">
<li class="{% if values.inicio_vigencia.year == key %}active{% endif %}"><a data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false">{{ key }}</a>
<ul class="dropdown-menu">
{% for dispositivo in values %}
<li class="nav__sub-item">
<li>
{% if not forloop.parentloop.first %}
<a class="nav__sub-link" href="{%url 'ta_vigencia' dispositivo.ta.pk dispositivo|get_sign_vigencia %}" title="{{ dispositivo.ta_publicado }}">{% trans 'Vigência entre'%} {{dispositivo.inicio_vigencia}} {% trans 'e'%} {{dispositivo.fim_vigencia}}</a>
{%endif%}
<a href="{%url 'compilacao:ta_vigencia' dispositivo.ta_id dispositivo|get_sign_vigencia %}" title="{% if dispositivo.ta_publicado_id in ta_pub_list%}{{ ta_pub_list|lookup:dispositivo.ta_publicado_id }}{%else%}{{dispositivo.ta_publicado}}{%endif%}">{% trans 'Vigência entre'%} {{dispositivo.inicio_vigencia}} {% trans 'e'%} {{dispositivo.fim_vigencia}}</a>
{% endif %}
</li>
{% endfor %}
</ul>
{%endif%}
</li>
{% if forloop.last %}
</ul>
{% comment %}
<ul class="nav left tipo-vigencias">
<li><a class="selected" onclick="textoMultiVigente(this);" title="">{% trans 'Texto Multivigente'%}</a></li>
<li><a onclick="textoVigente(this, true);">{% trans 'Texto Vigente COM Links para Textos Alteradores'%}</a></li>
<li><a onclick="textoVigente(this, false);">{% trans 'Texto Vigente SEM Links para Textos Alteradores'%}</a></li>
</ul>
{% endcomment %}
{% endif %}
{% endfor %}
<ul class="tipo-vigencias">
<li><a class="selected" onclick="textoMultiVigente(this, false);" title="{% trans 'Texto Multivigente Sequencial'%}">{% trans 'TMS'%}</a></li>
@ -80,19 +90,17 @@
<li><a onclick="textoVigente(this, false);" title="{% trans 'Texto Vigente'%}">{% trans 'TVT'%}</a></li>
</ul>
{% include 'compilacao/text_list_bloco.html'%}
</div>
{% endblock base_content %}
</section>
</nav>
</section>
{%endif%}
{% endfor %}
<br>
{% if view.inicio_vigencia != None and view.fim_vigencia != None %}
{% trans 'Vigência entre'%} <b>{{view.inicio_vigencia}}</b> {% trans 'e'%} <b>{{view.fim_vigencia}}</b>.
{%endif%}
{% include 'compilacao/text_list_bloco.html'%}
</div>
{% endblock base_content %}
{% block foot_js %}
{{block.super}}
<script type="text/javascript" src="{% static 'js/compilacao.js' %}"></script>
<script type="text/javascript" src="{% static 'js/compilacao_view.js' %}"></script>
{% if perms.compilacao.add_nota %}
<script type="text/javascript" src="{% static 'js/compilacao_notas.js' %}"></script>
{% endif %}
{% endblock %}

71
templates/compilacao/text_list_bloco.html

@ -2,8 +2,6 @@
{% load compilacao_filters %}
{% load common_tags %}
<div class="display"></div>
{% for dpt in object_list %}
{% if dpt.nivel == view.flag_nivel_old %}
</div>
@ -11,46 +9,49 @@
{% close_div view.flag_nivel_old dpt.nivel 0 %}
{% endif%}
{% if forloop.first and view|isinst:'DispositivoView' %}
{% else %}
<div class="dpt {%if dpt.tipo_dispositivo.class_css == 'bloco_alteracao'%}bloco_alteracao{%endif%}" nivel="{{dpt.nivel}}">
<div class="dpt {%if dpt.tipo_dispositivo.class_css == 'bloco_alteracao'%}bloco_alteracao{% endif %}" nivel="{{dpt.nivel}}">
{% endif%}
{% spaceless %}
<div class="{{ dpt.tipo_dispositivo.class_css }}">
<div class="dptt {% dispositivo_desativado dpt view.inicio_vigencia view.fim_vigencia %}" id="dptt{{dpt.pk}}" >
{{ dpt.tipo_dispositivo.rotulo_prefixo_html|safe }}<a name="{{dpt.pk}}" title="{{dpt.pk}}">{{ dpt.rotulo }}</a>{{ dpt.tipo_dispositivo.rotulo_sufixo_html|safe }}<span class="dtxt" id="d{% if not dpt.dispositivo_subsequente and dpt.dispositivo_substituido %}a{%endif%}{{dpt.pk}}" pks="{{dpt.dispositivo_substituido.pk}}" pk="{{dpt.pk}}">{{ dpt.tipo_dispositivo.texto_prefixo_html|safe }}{%if dpt.texto%}{{ dpt.texto|safe }}{%else%}&nbsp;{%endif%}</span>
{% if dpt.ta_publicado_id != None and not dpt.tipo_dispositivo.dispositivo_de_articulacao %}
<a class="link_alterador" href="{%url 'ta_text' dpt.ta_publicado.pk %}#{{dpt.dispositivo_atualizador_id}}">
{{ dpt.tipo_dispositivo.rotulo_prefixo_html|safe }}
<a name="{{dpt.pk}}" title="{{dpt.pk}}">{{ dpt.rotulo }}</a>
{{ 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 and not dpt.tipo_dispositivo.dispositivo_de_articulacao %}
<a class="link_alterador" href="{%url 'compilacao:ta_text' dpt.ta_publicado.pk %}#{{dpt.dispositivo_atualizador_id}}">
{{ dpt.tipo_dispositivo.nota_automatica_prefixo_html|safe }}
{% nota_automatica dpt %}
{% nota_automatica dpt ta_pub_list %}
{{ dpt.tipo_dispositivo.nota_automatica_sufixo_html|safe }}
</a>
{% endif %}
{% if user.is_authenticated and not dpt.tipo_dispositivo.dispositivo_de_articulacao%}
{% if perms.compilacao.add_nota or perms.compilacao.add_vide or perms.compilacao.change_dispositivo%}
<div class="dne" id="dne{{dpt.pk}}" pk="{{dpt.pk}}">{# TODO: User - dne - Dispostivo Nota Editor - tratar permissão de usuário#}
<div class="dne" id="dne{{dpt.pk}}" pk="{{dpt.pk}}">
<ul class="btns-action">
{% if perms.compilacao.change_dispositivo %}<li><a href = "{% url 'ta_text_edit' dpt.ta.pk%}#{{dpt.pk}}" class="btn-action" title="{% trans 'Editar Dispositivo'%}">Ed</a></li>{% endif %}
{% if perms.compilacao.change_dispositivo %}<li><a href = "{% url 'compilacao:ta_text_edit' dpt.ta.pk%}#{{dpt.pk}}" class="btn-action" title="{% trans 'Editar Dispositivo'%}">Ed</a></li>{% endif %}
{% if perms.compilacao.add_nota %}<li><a class="btn-action btn-nota-create" model="nota" pk="{{dpt.pk}}" title="{% trans 'Adicionar Nota'%}">N</a></li>{% endif %}
{% if perms.compilacao.add_vide %}<li><a class="btn-action btn-vide-create" model="vide" pk="{{dpt.pk}}" title="{% trans 'Adicionar Vide'%}">V</a></li>{% endif %}
</ul>
<div class="dne-form"></div>
<div class="dne-form clearfix"></div>
</div>
{% endif %}
{% endif%}
{% endif %}
</div>
{% if not dpt.tipo_dispositivo.dispositivo_de_articulacao%}
<div class="dn" id="dn{{dpt.pk}}" pk="{{dpt.pk}}">{# Dispostivo Nota e Vides #}
<ul class="dnl">{# Dispostivo Nota Lista#}
{% if cita and cita|lookup:dpt.pk %}
{% for vide in cita|lookup:dpt.pk %}
{%if not forloop.first %}<li class="bullet">&#8226;</li>{%endif%}
{%if not forloop.first %}
<li class="bullet">&#8226;</li>
{% endif %}
<li class="dnli" id="nt{{vide.pk}}">
<ul>
@ -58,11 +59,11 @@
{% if perms.compilacao.change_vide %}
<li><a class="btn-action btn-vide-edit" model="vide" pk="{{vide.pk}}">Editar</a></li>
<li class="bullet">&#8226;</li>
{%endif%}
{% endif %}
{% if perms.compilacao.delete_vide %}
<li><a class="btn-action btn-vide-delete" model="vide" pk="{{vide.pk}}">Excluir</a></li>
<li class="bullet">&#8226;</li>
{%endif%}
{% endif %}
{% endif %}
<li class="ntipo">{{vide.tipo.nome}}</li>
<li class="bullet">&#8226;</li>
@ -71,9 +72,9 @@
<div class="ntitulo">Vide: </div>
<div class="ntexto">
{% if vide.dispositivo_ref.dispositivo_pai.nivel != 0 and vide.dispositivo_ref.dispositivo_pai.tipo_dispositivo.dispositivo_de_articulacao %}
<a href="{%url 'ta_text' vide.dispositivo_ref.dispositivo_pai.ta.pk%}#{{vide.dispositivo_ref.dispositivo_pai.pk }}">{{ vide.dispositivo_ref.dispositivo_pai}}</a>
<a href="{%url 'compilacao:ta_text' vide.dispositivo_ref.dispositivo_pai.ta.pk%}#{{vide.dispositivo_ref.dispositivo_pai.pk }}">{{ vide.dispositivo_ref.dispositivo_pai}}</a>
{% else %}
<a href="{%url 'ta_text' vide.dispositivo_ref.ta.pk%}#{{vide.dispositivo_ref.pk }}">{{ vide.dispositivo_ref}}</a>
<a href="{%url 'compilacao:ta_text' vide.dispositivo_ref.ta.pk%}#{{vide.dispositivo_ref.pk }}">{{ vide.dispositivo_ref}}</a>
{% endif %}
{% if vide.texto %} - {{vide.texto}}{% endif %}
</div>
@ -82,9 +83,14 @@
{% endif %}
{% if citado and citado|lookup:dpt.pk %}
{% if cita and cita|lookup:dpt.pk %}<li class="bullet">&#8226;</li>{%endif%}
{% if cita and cita|lookup:dpt.pk %}
<li class="bullet">&#8226;</li>
{% endif %}
{% for vide in citado|lookup:dpt.pk %}
{%if not forloop.first %}<li class="bullet">&#8226;</li>{%endif%}
{%if not forloop.first %}
<li class="bullet">&#8226;</li>
{% endif %}
<li class="dnli" id="nt{{vide.pk}}">
<ul>
<li class="ntipo">{{vide.tipo.nome}}</li>
@ -94,21 +100,25 @@
<div class="ntitulo">Citado em: </div>
<div class="ntexto">
{% if vide.dispositivo_base.dispositivo_pai.nivel != 0 and vide.dispositivo_base.dispositivo_pai.tipo_dispositivo.dispositivo_de_articulacao%}
<a href="{%url 'ta_text' vide.dispositivo_base.dispositivo_pai.ta.pk%}#{{vide.dispositivo_base.dispositivo_pai.pk }}">{{ vide.dispositivo_base.dispositivo_pai}}</a>
<a href="{%url 'compilacao:ta_text' vide.dispositivo_base.dispositivo_pai.ta.pk%}#{{vide.dispositivo_base.dispositivo_pai.pk }}">{{ vide.dispositivo_base.dispositivo_pai}}</a>
{% else %}
<a href="{%url 'ta_text' vide.dispositivo_base.ta.pk%}#{{vide.dispositivo_base.pk }}">{{ vide.dispositivo_base}}</a>
<a href="{%url 'compilacao:ta_text' vide.dispositivo_base.ta.pk%}#{{vide.dispositivo_base.pk }}">{{ vide.dispositivo_base}}</a>
{% endif %}
{% if vide.texto %} - {{vide.texto}}{% endif %}
</div>
</li>
{% endfor %}
{% endif %}
{%if notas and notas|lookup:dpt.pk and cita and cita|lookup:dpt.pk or notas and notas|lookup:dpt.pk and citado and citado|lookup:dpt.pk %}<li class="bullet">&#8226;</li>{%endif%}
{%if notas and notas|lookup:dpt.pk and cita and cita|lookup:dpt.pk or notas and notas|lookup:dpt.pk and citado and citado|lookup:dpt.pk %}
<li class="bullet">&#8226;</li>
{% endif %}
{% if notas and notas|lookup:dpt.pk %}
{% for nota in notas|lookup:dpt.pk %}
{% if user.is_superuser or nota.publicidade == nota.NPUBL or nota.publicidade == nota.NINST and user.is_authenticated or nota.publicidade = nota.NPRIV and nota.owner == user %}
{%if not forloop.first %}<li class="bullet">&#8226;</li>{%endif%}
{% if user.is_superuser or nota.publicidade == nota.NPUBL or nota.publicidade == nota.NINST and user.is_authenticated or nota.publicidade == nota.NPRIV and nota.owner == user %}
{%if not forloop.first %}
<li class="bullet">&#8226;</li>
{% endif %}
<li class="dnli" id="nt{{nota.pk}}">
<ul>
{% if user.is_authenticated %}
@ -123,18 +133,18 @@
{% endif %}
<li class="ntipo">{{nota.tipo.nome}}</li>
<li class="bullet">&#8226;</li>
<li class="nowner" title="{% trans 'Criado Por' %}">{%if nota.owner.first_name%}{{nota.owner.first_name}}{%else%}{{nota.owner}}{%endif%}</li>
<li class="nowner" title="{% trans 'Criado Por' %}">{%if nota.owner.first_name%}{{nota.owner.first_name}}{%else%}{{nota.owner}}{% endif %}</li>
<li class="bullet">&#8226;</li>
<li class="npublicacao" title="{% trans 'Data de Publicação'%}">{{nota.publicacao|date:"d M Y"}}</li>
</ul>
{%if nota.titulo %}
<div class="ntitulo">
{%if nota.url_externa %}<a target="_blank" href="{{nota.url_externa}}">{%endif%}{{nota.titulo}} - {%if nota.url_externa %}</a>{%endif%}
{%if nota.url_externa %}<a target="_blank" href="{{nota.url_externa}}">{% endif %}{{nota.titulo}} - {%if nota.url_externa %}</a>{% endif %}
</div>
{%endif%}
{% endif %}
<div class="ntexto">
{%if nota.url_externa %}<a target="_blank" href="{{nota.url_externa}}">{%endif%}{{ nota.texto}}{%if nota.url_externa %}</a>{%endif%}
{%if nota.url_externa %}<a target="_blank" href="{{nota.url_externa}}">{% endif %}{{ nota.texto}}{%if nota.url_externa %}</a>{% endif %}
</div>
{%comment%}
@ -153,13 +163,14 @@
{% endif%}
</div>
{% endspaceless %}
{% if view.is_ta_alterador and dpt.tipo_dispositivo.class_css == 'bloco_alteracao'%}
{% if dpt.tipo_dispositivo.class_css == 'bloco_alteracao'%}
{%with node=dpt template_name='compilacao/text_list_blocoalteracao.html' %}
{%include template_name%}
{%endwith%}
{% endif%}
{% set_nivel_old view dpt.nivel %}
{% endfor %}
{% if view|isinst:'DispositivoView' %}
{% close_div view.flag_nivel_old view.flag_nivel_ini -1 %}
{% else %}

7
templates/compilacao/text_list_blocoalteracao.html

@ -1,14 +1,13 @@
{% load compilacao_filters %}
{% load common_tags %}
<i class="fa fa-quote-left fa-2x fa-pull-left fa-border"></i>
{% for ch in dpt.pk|get_bloco_atualizador %}
{% spaceless %}
{% spaceless %}
{% if ch.visibilidade %}
<div class="dpt" id="d{{ch.id}}" nivel="{{ch.nivel}}">
<div class="{{ ch.tipo_dispositivo.class_css }}" id="id{{ch.id}}" nivel="{{ch.nivel}}">
{{ ch.tipo_dispositivo.rotulo_prefixo_html|safe }}<a name="{{ch.pk}}" href="{%url 'ta_text' ch.ta.pk %}#{{ch.pk}}">{{ ch.rotulo }}</a>{{ ch.tipo_dispositivo.rotulo_sufixo_html|safe }}{{ ch.tipo_dispositivo.texto_prefixo_html|safe }}{{ ch.texto|safe }}
{{ ch.tipo_dispositivo.rotulo_prefixo_html|safe }}<a name="{{ch.pk}}" href="{%url 'compilacao:ta_text' ch.ta.pk %}#{{ch.pk}}">{{ ch.rotulo }}</a>{{ ch.tipo_dispositivo.rotulo_sufixo_html|safe }}{{ ch.tipo_dispositivo.texto_prefixo_html|safe }}{{ ch.texto|safe }}
</div>
</div>
{%endif%}
{% endspaceless %}
{% endspaceless %}
{% endfor %}

61
templates/compilacao/textoarticulado_detail.html

@ -3,53 +3,37 @@
{% load compilacao_filters %}
{% load common_tags %}
{% block sections_nav %}
{% block sections_nav %}
<ul class="nav nav-pills navbar-right">
{%if object %}
<div class="actions btn-group pull-right" role="group">
<li>
{% if object.content_object%}
<a href="{% url object|urldetail_content_type object.content_object.pk %}"title="{% trans 'Ir para '%}{{object.content_object}}" class="btn btn-default">Início</a>
<a href="{% url object|urldetail_content_type object.content_object.pk %}" title="{% trans 'Ir para '%}{{object.content_object}}">Início</a>
{%else%}
<a href="{% url 'ta_detail' object.pk %}" class="btn btn-default">{% trans 'Início' %}</a>
<a href="{% url 'compilacao:ta_detail' object.pk %}">{% trans 'Início' %}</a>
{%endif%}
<a href="{% url 'ta_pub_list' object.pk %}" class="btn btn-default">{% model_verbose_name_plural 'compilacao.models.Publicacao' %}</a>
<a href="{% url 'ta_text' object.pk %}" class="btn btn-default">{% trans 'Texto' %}</a>
<a href="{% url 'ta_text_edit' object.pk %}" class="btn btn-default">{% trans 'Edição do Texto' %}</a>
</div>
</li>
<li><a href="{% url 'compilacao:ta_pub_list' object.pk %}">{% model_verbose_name_plural 'compilacao.models.Publicacao' %}</a></li>
<li><a href="{% url 'compilacao:ta_text' object.pk %}">{% trans 'Texto da Norma' %}</a></li>
{%endif %}
{% endblock %}
</ul>
{% endblock %}
{% block base_content %} {# FIXME is this the best markup to use? #}
<div class="clearfix">
{% block actions %}
<ul class="button-group right">
{% block base_content %}
{%if object %}
<li><a href="{% url 'ta_edit' object.pk %}" class="button tiny">{% trans 'Edição dos Metadados do Texto Articulado' %}</a></li>
<li><a href="{% url 'ta_delete' object.pk %}" class="button alert tiny">{% trans 'Excluir' %}</a></li>
{%endif%}
<li><a href="#" class="button tiny" data-dropdown="drop"><i class="fi-widget"></i></a>
<ul id="drop" class="tiny f-dropdown" data-dropdown-content>
<li><a href="{% url 'tipo_ta_list' %}">{%model_verbose_name_plural 'compilacao.models.TipoTextoArticulado'%}</a></li>
<li><a href="{% url 'tipopublicacao:list' %}">{%model_verbose_name_plural 'compilacao.models.TipoPublicacao'%}</a></li>
<li><a href="{% url 'veiculopublicacao:list' %}">{%model_verbose_name_plural 'compilacao.models.VeiculoPublicacao'%}</a></li>
<li><a href="{% url 'tiponota:list' %}">{%model_verbose_name_plural 'compilacao.models.TipoNota'%}</a></li>
<li><a href="{% url 'tipovide:list' %}">{%model_verbose_name_plural 'compilacao.models.TipoVide'%}</a></li>
<li><a href="#">TODO: Tipo de Dispositivo</a></li>
<li><a href="#">TODO: Perfil Estrutural de Textos Articulados</a></li>
</ul></li>
</ul>
{% block actions %}
<div class="clearfix">
<div class="actions btn-group pull-right" role="group">
<a href="{% url 'compilacao:ta_edit' object.pk %}" class="btn btn-default">{% trans 'Editar Metadados do Texto Articulado' %}</a>
<a href="{% url 'compilacao:ta_text_edit' object.pk %}" class="btn btn-default">{% trans 'Editar Texto' %}</a>
</div>
</div>
{% endblock actions %}
</div>
{% block detail_content %} {# TODO replace fieldset for something semantically correct, but with similar visual grouping style #}
<fieldset>
{% block detail_content %} {# TODO replace fieldset for something semantically correct, but with similar visual grouping style #}
<fieldset>
<legend>{%trans 'Identificação Básica'%}</legend>
<div class="row">
<div class="col-md-3">
<div id="div_id_tipo" class="holder">
<label>{% field_verbose_name object 'tipo_ta' %}</label>
@ -96,5 +80,6 @@
</div>
</div>
</div>
</fieldset>
{% endblock detail_content %} {% endblock base_content %}
</fieldset>
{% endblock detail_content %}
{% endblock base_content %}

26
templates/compilacao/textoarticulado_list.html

@ -4,23 +4,19 @@
{% load common_tags %}
{% block base_content %}
{% block actions %}{{block.super}}
{% block detail_content %}
{% endblock detail_content %}
{% endblock actions %}
{% block detail_content %}
{% endblock detail_content %}
<div class="actions btn-group pull-right" role="group">
{% block actions %}
<div class="actions btn-group pull-right clearfix" role="group">
<a href="{{ view.create_url }}" class="btn btn-default">
{% trans 'Adicionar'%} {%model_verbose_name 'compilacao.models.TextoArticulado'%}
</a>
{% include 'compilacao/textoarticulado_menu_config.html' %}
</div>
{% endblock actions %}
{% block more_buttons %}
{% endblock more_buttons %}
</div>
<table class="table table-striped table-hover">
<table class="table table-striped table-hover">
<thead>
<tr>
<th>{% fieldclass_verbose_name 'compilacao.models.TextoArticulado' 'tipo_ta' %}</th>
@ -33,7 +29,7 @@
<tbody>
{% for ta in object_list %}
<tr>
<td><a href="{% url 'ta_detail' ta.pk %}">{{ ta.tipo_ta }}</a></td>
<td><a href="{% url 'compilacao:ta_detail' ta.pk %}">{{ ta.tipo_ta }}</a></td>
<td>{{ ta.numero }}</td>
<td>{{ ta.ano }}</td>
<td>{{ ta.data }}</td>
@ -41,6 +37,6 @@
</tr>
{% endfor %}
</tbody>
</table>
{% include 'paginacao.html'%}
</table>
{% include 'paginacao.html'%}
{% endblock %}

16
templates/compilacao/textoarticulado_menu_config.html

@ -0,0 +1,16 @@
{% load i18n %}
{% load common_tags %}
<div class="btn-group" role="group">
<button type="button" class="btn btn-danger dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<i class="fa fa-cog fa-1x fa-fw"></i>
</button>
<ul class="dropdown-menu" role="menu">
<li><a href="{% url 'compilacao:tipo_ta_list' %}">{%model_verbose_name_plural 'compilacao.models.TipoTextoArticulado'%}</a></li>
<li><a href="{% url 'tipopublicacao:list' %}">{%model_verbose_name_plural 'compilacao.models.TipoPublicacao'%}</a></li>
<li><a href="{% url 'veiculopublicacao:list' %}">{%model_verbose_name_plural 'compilacao.models.VeiculoPublicacao'%}</a></li>
<li><a href="{% url 'tiponota:list' %}">{%model_verbose_name_plural 'compilacao.models.TipoNota'%}</a></li>
<li><a href="{% url 'tipovide:list' %}">{%model_verbose_name_plural 'compilacao.models.TipoVide'%}</a></li>
<li><a href="#">TODO: Tipo de Dispositivo</a></li>
<li><a href="#">TODO: Perfil Estrutural de Textos Articulados</a></li>
</ul>
</div>

19
templates/compilacao/tipotextoarticulado_detail.html

@ -1,26 +1,24 @@
{% extends "base.html" %} {% load i18n %} {% load compilacao_filters %}
{% load common_tags %}
{% block base_content %} {# FIXME is this the best markup to use? #}
{% block base_content %}
{% block sections_nav %}
{% endblock %}
<div class="clearfix">
<div class="clearfix">
{% block actions %}
<ul class="button-group right">
<li><a href="{% url 'tipo_ta_edit' object.pk %}" class="button tiny">{% trans 'Editar' %}</a></li>
<li><a href="{% url 'tipo_ta_delete' object.pk %}" class="button alert tiny">{% trans 'Excluir' %}</a></li>
</ul>
<div class="actions btn-group pull-right" role="group">
<a class="btn btn-default" href="{% url 'compilacao:tipo_ta_edit' object.pk %}">{% trans 'Editar' %}</a>
<a class="btn btn-default" href="{% url 'compilacao:tipo_ta_delete' object.pk %}">{% trans 'Excluir' %}</a>
</div>
{% endblock actions %}
</div>
</div>
{% block detail_content %} {# TODO replace fieldset for something semantically correct, but with similar visual grouping style #}
<fieldset>
<legend>{%trans 'Identificação Básica'%}</legend>
<div class="row">
<div class="col-md-2">
<div id="div_id_tipo" class="holder">
<label>{% field_verbose_name object 'sigla' %}</label>
@ -50,5 +48,4 @@
</div>
</fieldset>
{% endblock detail_content %}
{% endblock base_content %}

18
templates/compilacao/tipotextoarticulado_list.html

@ -4,19 +4,17 @@
{% load common_tags %}
{% block base_content %}
<div class="actions btn-group pull-right" role="group">
{% block actions %}
<div class="actions btn-group pull-right" role="group">
<a href="{{ view.create_url }}" class="btn btn-default">
{% trans 'Adicionar'%} {%model_verbose_name 'compilacao.models.TipoTextoArticulado'%}
</a>
{% block more_buttons %}
{% endblock more_buttons %}
</div>
</div>
{% endblock actions %}
{% if not object_list %}
{% if not object_list %}
<p>{{ NO_ENTRIES_MSG }}</p>
{% else %}
{% else %}
<table class="table table-striped table-hover" width=100%>
<thead>
<tr>
@ -28,7 +26,7 @@
<tbody>
{% for tipo_ta in object_list %}
<tr>
<td><a href="{% url 'tipo_ta_detail' tipo_ta.pk %}">{{ tipo_ta.sigla }}</a></td>
<td><a href="{% url 'compilacao:tipo_ta_detail' tipo_ta.pk %}">{{ tipo_ta.sigla }}</a></td>
<td>{{ tipo_ta.descricao }}</td>
<td>{{ tipo_ta.content_type }}</td>
</tr>
@ -36,5 +34,5 @@
</tbody>
</table>
{%endif%}
{% include 'paginacao.html'%}
{% include 'paginacao.html'%}
{% endblock %}

27
templates/crud/confirm_delete.html

@ -1,21 +1,24 @@
{% extends "base.html" %}
{% load i18n %}
{% block base_content %}
<form action="" method="post">{% csrf_token %}
<div class="callout panel text-center radius clearfix">
{% block title %}
{% with object as title %}
{{ block.super }}
{% endwith %}
{% endblock %}
<p>
{% block base_content %}
<form action="" method="post">{% csrf_token %}
<div class="panel panel-danger">
<div class="panel-heading text-center">
{% blocktrans %}
Tem certeza que deseja apagar <br/> "{{ object }}"?
Confirma exclusão de "{{ object }}"?
{% endblocktrans %}
</p>
<div class="button-group">
<a href="{{ view.detail_url }}" class="button button radius alert">{% trans 'Cancelar' %}</a>
<input name="submit" value="{% trans 'Confirmar' %}" class="submit button button radius success" type="submit"></li>
</div>
<div class="panel-body text-center">
<a href="{{ view.detail_url }}" class="btn btn-inverse">{% trans 'Cancelar' %}</a>
<input name="submit" value="{% trans 'Confirmar' %}" class="btn btn-danger" type="submit"></li>
</div>
</div>
</form>
</form>
{% endblock %}

11
templates/norma/normajuridica_detail.html

@ -1,8 +1,11 @@
{% extends "crud/detail.html" %}
{% load i18n %}
{% block sections_nav %}
<div class="actions btn-group pull-right" role="group">
<a href="{% url 'normajuridica:detail' object.pk %}" class="btn btn-default">{% trans 'Início' %}</a>
<ul class="nav nav-pills navbar-right">
<li>
<a href="{% url 'normajuridica:detail' object.pk %}">{% trans 'Início' %}</a>
</li>
{% comment %}
Opção adicionada para chamar o TextoArticulado da norma.
@ -10,7 +13,7 @@
e a view NormaTa(IntegracaoTaView) em views.py
Em nada mais a integração interfere em Norma Jurídica
{% endcomment %}
<a href="{% url 'norma_ta' object.pk %}" class="btn btn-default">{% trans 'Texto' %}</a>
</div>
<li><a href="{% url 'normajuridica:ta' object.pk %}">{% trans 'Texto da Norma' %}</a></li>
</ul>
{% endblock sections_nav %}

Loading…
Cancel
Save