Browse Source

Ajustar compilação para bootstrap em progresso

- Issue #188
  - Tarefa em progresso - 60% concluida.
    - Botões de navegação ok
    - Reenderização de usuário anônimo ok
    - Edição de notas e vides ok
pull/213/head
LeandroRoberto 9 years ago
parent
commit
6c0d305bf3
  1. 3
      base/templatetags/common_tags.py
  2. 179
      compilacao/forms.py
  3. 32
      compilacao/models.py
  4. 10
      compilacao/templatetags/compilacao_filters.py
  5. 202
      compilacao/views.py
  6. 2
      materia/views.py
  7. 8
      norma/urls.py
  8. 2
      norma/views.py
  9. 3
      sapl/layout.py
  10. 2
      static/js/app.js
  11. 67
      static/js/compilacao_notas.js
  12. 12
      static/js/compilacao_view.js
  13. 362
      static/styles/compilacao.scss
  14. 11
      templates/base.html
  15. 1
      templates/compilacao/ajax_form.html
  16. 19
      templates/compilacao/publicacao_detail.html
  17. 3
      templates/compilacao/publicacao_list.html
  18. 30
      templates/compilacao/text_edit.html
  19. 9
      templates/compilacao/text_edit_bloco.html
  20. 158
      templates/compilacao/text_list.html
  21. 22
      templates/compilacao/text_list_bloco.html
  22. 1
      templates/compilacao/text_list_blocoalteracao.html
  23. 58
      templates/compilacao/textoarticulado_detail.html
  24. 22
      templates/compilacao/textoarticulado_list.html
  25. 17
      templates/compilacao/textoarticulado_menu_config.html
  26. 2
      templates/norma/normajuridica_detail.html

3
base/templatetags/common_tags.py

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

179
compilacao/forms.py

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

32
compilacao/models.py

@ -473,7 +473,7 @@ class Publicacao(TimestampedMixin):
verbose_name_plural = _('Publicações') verbose_name_plural = _('Publicações')
def __str__(self): def __str__(self):
return _('%s realizada em %s \n %s') % ( return _('%s realizada em %s \n <small>%s</small>') % (
self.tipo_publicacao, self.tipo_publicacao,
defaultfilters.date(self.data, "d \d\e F \d\e Y"), defaultfilters.date(self.data, "d \d\e F \d\e Y"),
self.ta) self.ta)
@ -624,9 +624,8 @@ class Dispositivo(BaseModel, TimestampedMixin):
) )
def __str__(self): def __str__(self):
return '%(rotulo)s - %(ta)s' % { return '%(rotulo)s' % {
'rotulo': (self.rotulo if self.rotulo else self.tipo_dispositivo), 'rotulo': (self.rotulo if self.rotulo else self.tipo_dispositivo)}
'ta': self.ta}
def rotulo_padrao(self, local_insert=0, for_insert_in=0): def rotulo_padrao(self, local_insert=0, for_insert_in=0):
""" """
@ -1145,20 +1144,25 @@ class Vide(TimestampedMixin):
return _('Vide %s') % self.texto return _('Vide %s') % self.texto
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): class Nota(TimestampedMixin):
NPRIV = 1 NPRIV = 1
NINST = 2 NINST = 2
NPUBL = 3 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 = models.CharField( titulo = models.CharField(
verbose_name=_('Título'), verbose_name=_('Título'),
max_length=100, max_length=100,
@ -1181,7 +1185,7 @@ class Nota(TimestampedMixin):
owner = models.ForeignKey(User, verbose_name=_('Dono da Nota')) owner = models.ForeignKey(User, verbose_name=_('Dono da Nota'))
publicidade = models.PositiveSmallIntegerField( publicidade = models.PositiveSmallIntegerField(
choices=PUBLICIDADE_CHOICES, choices=NOTAS_PUBLICIDADE_CHOICES,
verbose_name=_('Nível de Publicidade')) verbose_name=_('Nível de Publicidade'))
class Meta: class Meta:

10
compilacao/templatetags/compilacao_filters.py

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

202
compilacao/views.py

@ -1,6 +1,6 @@
import sys
from collections import OrderedDict from collections import OrderedDict
from datetime import datetime, timedelta from datetime import datetime, timedelta
import sys
from braces.views import FormMessagesMixin from braces.views import FormMessagesMixin
from django import forms from django import forms
@ -29,6 +29,7 @@ from compilacao.models import (Dispositivo, Nota,
VeiculoPublicacao, Vide) VeiculoPublicacao, Vide)
from sapl.crud import NO_ENTRIES_MSG, build_crud, make_pagination from sapl.crud import NO_ENTRIES_MSG, build_crud, make_pagination
DISPOSITIVO_SELECT_RELATED = ( DISPOSITIVO_SELECT_RELATED = (
'tipo_dispositivo', 'tipo_dispositivo',
'ta_publicado', 'ta_publicado',
@ -38,7 +39,9 @@ DISPOSITIVO_SELECT_RELATED = (
'dispositivo_atualizador__dispositivo_pai__ta', 'dispositivo_atualizador__dispositivo_pai__ta',
'dispositivo_atualizador__dispositivo_pai__ta__tipo_ta', 'dispositivo_atualizador__dispositivo_pai__ta__tipo_ta',
'dispositivo_pai', 'dispositivo_pai',
'dispositivo_pai__tipo_dispositivo') 'dispositivo_pai__tipo_dispositivo',
'ta_publicado',
'ta',)
tipo_nota_crud = build_crud( tipo_nota_crud = build_crud(
TipoNota, 'tipo_nota', [ TipoNota, 'tipo_nota', [
@ -193,17 +196,18 @@ def get_integrations_view_names():
return result return result
def choice_extenal_views(): def choice_models_in_extenal_views():
integrations_view_names = get_integrations_view_names() integrations_view_names = get_integrations_view_names()
result = [(None, '-------------'), ] result = [(None, '-------------'), ]
for item in integrations_view_names: for item in integrations_view_names:
ct = ContentType.objects.filter( if hasattr(item, 'model') and hasattr(item, 'model_type_foreignkey'):
model=item.model.__name__.lower(), ct = ContentType.objects.filter(
app_label=item.model._meta.app_label) model=item.model.__name__.lower(),
if ct.exists(): app_label=item.model._meta.app_label)
result.append(( if ct.exists():
ct[0].pk, result.append((
item.model._meta.verbose_name_plural)) ct[0].pk,
item.model._meta.verbose_name_plural))
return result return result
@ -242,7 +246,7 @@ class TipoTaCreateView(FormMessagesMixin, CreateView):
self.object = None self.object = None
form = self.get_form() form = self.get_form()
form.fields['content_type'] = forms.ChoiceField( form.fields['content_type'] = forms.ChoiceField(
choices=choice_extenal_views(), choices=choice_models_in_extenal_views(),
label=_('Modelo Integrado'), required=False) label=_('Modelo Integrado'), required=False)
return self.render_to_response(self.get_context_data(form=form)) return self.render_to_response(self.get_context_data(form=form))
@ -268,7 +272,7 @@ class TipoTaUpdateView(CompMixin, UpdateView):
self.object = self.get_object() self.object = self.get_object()
form = self.get_form() form = self.get_form()
form.fields['content_type'] = forms.ChoiceField( form.fields['content_type'] = forms.ChoiceField(
choices=choice_extenal_views(), choices=choice_models_in_extenal_views(),
label=_('Modelo Integrado'), required=False) label=_('Modelo Integrado'), required=False)
return self.render_to_response(self.get_context_data(form=form)) return self.render_to_response(self.get_context_data(form=form))
@ -321,7 +325,8 @@ class TaDetailView(DetailView):
def title(self): def title(self):
if self.get_object().content_object: if self.get_object().content_object:
return _( 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._meta.verbose_name_plural,
self.get_object().content_object) self.get_object().content_object)
else: else:
@ -444,9 +449,9 @@ class TextView(ListView, CompMixin):
context['cita'] = {} context['cita'] = {}
for c in cita: for c in cita:
if str(c.dispositivo_base_id) not in context['cita']: if c.dispositivo_base_id not in context['cita']:
context['cita'][str(c.dispositivo_base_id)] = [] context['cita'][c.dispositivo_base_id] = []
context['cita'][str(c.dispositivo_base_id)].append(c) context['cita'][c.dispositivo_base_id].append(c)
citado = Vide.objects.filter( citado = Vide.objects.filter(
Q(dispositivo_ref__ta_id=self.kwargs['ta_id'])).\ Q(dispositivo_ref__ta_id=self.kwargs['ta_id'])).\
@ -458,9 +463,9 @@ class TextView(ListView, CompMixin):
context['citado'] = {} context['citado'] = {}
for c in citado: for c in citado:
if str(c.dispositivo_ref_id) not in context['citado']: if c.dispositivo_ref_id not in context['citado']:
context['citado'][str(c.dispositivo_ref_id)] = [] context['citado'][c.dispositivo_ref_id] = []
context['citado'][str(c.dispositivo_ref_id)].append(c) context['citado'][c.dispositivo_ref_id].append(c)
notas = Nota.objects.filter( notas = Nota.objects.filter(
dispositivo__ta_id=self.kwargs['ta_id']).select_related( dispositivo__ta_id=self.kwargs['ta_id']).select_related(
@ -468,9 +473,19 @@ class TextView(ListView, CompMixin):
context['notas'] = {} context['notas'] = {}
for n in notas: for n in notas:
if str(n.dispositivo_id) not in context['notas']: if n.dispositivo_id not in context['notas']:
context['notas'][str(n.dispositivo_id)] = [] context['notas'][n.dispositivo_id] = []
context['notas'][str(n.dispositivo_id)].append(n) 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 return context
def get_queryset(self): def get_queryset(self):
@ -601,7 +616,7 @@ class DispositivoView(TextView):
return itens return itens
class TextEditView(TextView): class TextEditView(ListView, CompMixin):
template_name = 'compilacao/text_edit.html' template_name = 'compilacao/text_edit.html'
flag_alteradora = -1 flag_alteradora = -1
@ -611,14 +626,27 @@ class TextEditView(TextView):
pk_edit = 0 pk_edit = 0
pk_view = 0 pk_view = 0
"""
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
self.object_list = self.get_queryset() return ListView.get(self, request, *args, **kwargs)
context = self.get_context_data(
object_list=self.object_list)
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): def get_queryset(self):
self.pk_edit = 0 self.pk_edit = 0
@ -1487,30 +1515,58 @@ class VideMixin(DispositivoSuccessUrlMixin):
return super(VideMixin, self).dispatch(*args, **kwargs) 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): class VideCreateView(VideMixin, CreateView):
model = Vide model = Vide
template_name = 'compilacao/ajax_form.html' template_name = 'compilacao/ajax_form.html'
form_class = VideForm form_class = VideForm
def post_old(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
try: self.object = None
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(): if 'action' in request.GET and request.GET['action'] == 'get_tipos':
vd = form.save(commit=False) result = choice_model_type_foreignkey_in_extenal_views(
vd.save() id_tipo_ta=request.GET['tipo_ta'])
self.kwargs['pk'] = vd.pk
return self.form_valid(form) itens = []
else: for i in result:
return self.form_invalid(form) item = {}
except Exception as e: item[i[0] if i[0] else ''] = str(i[1])
print(e) itens.append(item)
return HttpResponse("error post") 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): class VideEditView(VideMixin, UpdateView):
@ -1589,7 +1645,59 @@ class DispositivoSearchFragmentFormView(ListView):
q = q & Q(pk=initial_ref) q = q & Q(pk=initial_ref)
n = 50 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: except Exception as e:
print(e) print(e)

2
materia/views.py

@ -1486,7 +1486,9 @@ class ProposicaoView(FormMixin, GenericView):
class MateriaTaView(IntegracaoTaView): class MateriaTaView(IntegracaoTaView):
model = MateriaLegislativa model = MateriaLegislativa
model_type_foreignkey = TipoMateriaLegislativa
class ProposicaoTaView(IntegracaoTaView): class ProposicaoTaView(IntegracaoTaView):
model = Proposicao 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, from norma.views import (NormaIncluirView, NormaTaView, assunto_norma_crud,
norma_temporario_crud, tipo_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_crud.urlpatterns + []
norma_url_patterns = norma_temporario_crud.urlpatterns + [
url(r'^norma/(?P<pk>[0-9]+)/ta$',
NormaTaView.as_view(), name='ta')
]
urlpatterns = [ urlpatterns = [
url(r'^norma/', include(norma_url_patterns, url(r'^norma/', include(norma_url_patterns,
norma_temporario_crud.namespace, norma_temporario_crud.namespace,
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/tipo/', include(tipo_norma_crud.urls)),
url(r'^sistema/norma/assunto/', include(assunto_norma_crud.urls)), url(r'^sistema/norma/assunto/', include(assunto_norma_crud.urls)),

2
norma/views.py

@ -15,6 +15,7 @@ from .forms import NormaJuridicaForm
from .models import (AssuntoNorma, LegislacaoCitada, NormaJuridica, from .models import (AssuntoNorma, LegislacaoCitada, NormaJuridica,
TipoNormaJuridica) TipoNormaJuridica)
assunto_norma_crud = build_crud( assunto_norma_crud = build_crud(
AssuntoNorma, 'assunto_norma_juridica', [ AssuntoNorma, 'assunto_norma_juridica', [
@ -125,3 +126,4 @@ class NormaIncluirView(FormMixin, GenericView):
class NormaTaView(IntegracaoTaView): class NormaTaView(IntegracaoTaView):
model = NormaJuridica 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')): 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): class SaplFormLayout(Layout):

2
static/js/app.js

@ -13,7 +13,7 @@ function refreshMask() {
$('.rg').mask("0.000.000", {placeholder:"_.___.___"}); $('.rg').mask("0.000.000", {placeholder:"_.___.___"});
$('.titulo_eleitor').mask("0000.0000.0000.0000", {placeholder:"____.____.____.____"}); $('.titulo_eleitor').mask("0000.0000.0000.0000", {placeholder:"____.____.____.____"});
$('.hora').mask("00:00", {placeholder:"hh:mm"}); $('.hora').mask("00:00", {placeholder:"hh:mm"});
$('.hora_hms').mask("00:00:00", {placeholder:"hh:mm:ss"}); $('.hora_hms').mask("00:00:00", {placeholder:"hh:mm:ss"});
} }
$(document).ready(function(){ $(document).ready(function(){

67
static/js/compilacao_notas.js

@ -1,46 +1,62 @@
function onEventsDneExec(pk) { function onEventsDneExec(pk, model) {
$('html, body').animate({ $('html, body').animate({
scrollTop: $('#dne' + pk ).offset().top - window.innerHeight / 5 scrollTop: $('#dne' + pk ).offset().top - window.innerHeight / 5
}, 300); }, 300);
$('.dateinput').fdatepicker({ refreshDatePicker()
// TODO localize
format: 'dd/mm/yyyy',
language: 'pt',
endDate: '31/12/2100',
todayBtn: true
});
$('#dne'+pk+" .primary").click(onSubmitEditForm); $('#dne'+pk+" #button-id-submit-form").click(onSubmitEditForm);
$('#dne'+pk+" .btn-close-container").click(function(){ $('#dne'+pk+" .btn-close-container").click(function(){
$(this).closest('.dne-nota').removeClass('dne-nota'); $(this).closest('.dne-nota').removeClass('dne-nota');
$(this).closest('.dne-form').html(''); $(this).closest('.dne-form').html('');
}); });
$('#dne'+pk+" select[name='tipo']").change(function(event) { if (model == 'nota') {
var url = ''; $('#dne'+pk+" select[name='tipo']").change(function(event) {
url = 'text/'+pk+'/nota/create?action=modelo_nota&id_tipo='+this.value; var url = '';
$.get(url).done(function( data ) { url = 'text/'+pk+'/nota/create?action=modelo_nota&id_tipo='+this.value;
$('#dne'+pk+" textarea[name='texto']").val(data); $.get(url).done(function( data ) {
$('#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);
$('#dne'+pk+" select[name='tipo_norma']" var select = $('#dne'+pk+" select[name='tipo_model']");
).change(onChangeParamNorma); 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+" input[name='num_norma'], "
+ '#dne'+pk+" input[name='ano_norma'], "
+ '#dne'+pk+" input[name='busca_dispositivo']"
).change(onChangeParamNorma);
$('#dne'+pk+" .btn-busca").click(onChangeParamNorma); });
});
$('#dne'+pk+" input[name='num_norma'], "
+ '#dne'+pk+" input[name='ano_norma'], "
+ '#dne'+pk+" input[name='busca_dispositivo']"
).change(onChangeParamNorma);
onChangeParamNorma(); $('#dne'+pk+" .btn-busca").click(onChangeParamNorma);
onChangeParamNorma();
}
} }
var onChangeParamNorma = function(event) { var onChangeParamNorma = function(event) {
var tipo_ta = $("select[name='tipo_ta']").val(); 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 num_ta = $("input[name='num_ta']").val();
var ano_ta = $("input[name='ano_ta']").val(); var ano_ta = $("input[name='ano_ta']").val();
var busca_dispositivo = $("input[name='busca_dispositivo']").val(); var busca_dispositivo = $("input[name='busca_dispositivo']").val();
@ -55,6 +71,7 @@ var onChangeParamNorma = function(event) {
var formData = { var formData = {
'tipo_ta' : tipo_ta, 'tipo_ta' : tipo_ta,
'tipo_model' : tipo_model,
'num_ta' : num_ta, 'num_ta' : num_ta,
'ano_ta' : ano_ta, 'ano_ta' : ano_ta,
'busca' : busca_dispositivo, 'busca' : busca_dispositivo,
@ -98,7 +115,7 @@ var onSubmitEditForm = function(event) {
if (typeof data == "string") { if (typeof data == "string") {
if (data.indexOf('<form') >= 0) { if (data.indexOf('<form') >= 0) {
$('#dne'+id_dispositivo+' .dne-form').html(data); $('#dne'+id_dispositivo+' .dne-form').html(data);
onEventsDneExec(id_dispositivo); onEventsDneExec(id_dispositivo, model);
} }
else { else {
$('#dne'+id_dispositivo+' .dne-form').closest('.dpt').html(data) $('#dne'+id_dispositivo+' .dne-form').closest('.dpt').html(data)
@ -152,7 +169,7 @@ function getForm(_this) {
$.get(url).done(function( data ) { $.get(url).done(function( data ) {
$('#dne'+id_dispositivo+' .dne-form').html(data); $('#dne'+id_dispositivo+' .dne-form').html(data);
onEventsDneExec(id_dispositivo); onEventsDneExec(id_dispositivo, model);
}).fail(function() { }).fail(function() {
onReadyNotasVides(); onReadyNotasVides();
}); });

12
static/js/compilacao_view.js

@ -30,7 +30,11 @@ function textoMultiVigente(item, diff) {
if ($(ldpts[i]).hasClass('displaynone')) if ($(ldpts[i]).hasClass('displaynone'))
continue; continue;
if (isElementInViewport( ldpts[i])) { if (isElementInViewport( ldpts[i])) {
elv = ldpts[i]; if (i+1 < ldpts.length)
elv = ldpts[i+1];
else {
elv = ldpts[i];
}
break; break;
} }
} }
@ -112,7 +116,11 @@ function textoVigente(item, link) {
if ($(ldpts[i]).hasClass('displaynone')) if ($(ldpts[i]).hasClass('displaynone'))
continue; continue;
if (isElementInViewport( ldpts[i])) { if (isElementInViewport( ldpts[i])) {
elv = ldpts[i]; if (i+1 < ldpts.length)
elv = ldpts[i+1];
else {
elv = ldpts[i];
}
break; break;
} }
} }

362
static/styles/compilacao.scss

@ -151,13 +151,19 @@ a:link:after, a:visited:after {
border: 1px dotted #ccc; border: 1px dotted #ccc;
} }
} }
a {
text-decoration: none;
cursor: pointer;
}
.diff { .diff {
.desativado, .desativado * { .desativado, .desativado * {
text-decoration: line-through; text-decoration: line-through;
color: #dbb !important; color: #ddd !important;
font-size: 90%;
} }
.added { .added {
color: #018; color: #04DE2C;
} }
} }
@ -254,19 +260,7 @@ a:link:after, a:visited:after {
margin-top: 2px; margin-top: 2px;
} }
a {
color: #444444;
&.link_alterador {
color: #2980B9;
font-size: 0.75em;
&:hover {
text-decoration: underline;
}
}
&.desativado {
@extend .desativado;
}
}
.bloco_alteracao { .bloco_alteracao {
padding-left: 10%; padding-left: 10%;
@ -283,16 +277,14 @@ a:link:after, a:visited:after {
} }
.dn { /* Notas de Dispositivo*/ .dn { /* Notas de Dispositivo*/
font-size: 0.8rem;
font-weight: normal; font-weight: normal;
line-height: 1rem;
position: relative; position: relative;
font-size: 70%;
p, ul { p, ul {
font-size: 0.8rem;
font-weight: normal; font-weight: normal;
line-height: 1rem;
margin: 0 0 0 0; margin: 0 0 0 0;
list-style: none; list-style: none;
padding: 0;
} }
.dnl { /* Lista Notas de Dispositivo*/ .dnl { /* Lista Notas de Dispositivo*/
@ -305,7 +297,6 @@ a:link:after, a:visited:after {
.bullet { .bullet {
padding: 0 0.333em; padding: 0 0.333em;
padding-bottom: 0.2em;
display: inline-block; display: inline-block;
} }
.dnli { .dnli {
@ -326,9 +317,10 @@ a:link:after, a:visited:after {
position: absolute; position: absolute;
background: transparent; background: transparent;
right: 0; right: 0;
padding: 0.5em 0.5em 0em 0.5em; padding: 0.2em 0.5em 0em 0.5em;
border: 1px solid #c7e3d3; border: 1px solid #c7e3d3;
border-top: 0px; border-top: 0px;
font-size: 1.5rem;
li { li {
display: table-cell; display: table-cell;
color: #aaa; color: #aaa;
@ -347,17 +339,17 @@ a:link:after, a:visited:after {
.ntitulo { .ntitulo {
font-weight: bold; font-weight: bold;
color: #676; color: #03A203;
font-size: 90%;
text-decoration: none; text-decoration: none;
a{ a {
color: #294 !important; color: #294 !important;
} }
} }
.ntexto { .ntexto {
color: #787;
color: #06D806;
a{ a{
color: #294 !important; color: #03A203 !important;
} }
} }
} }
@ -381,61 +373,140 @@ a:link:after, a:visited:after {
} }
.dptt { .dptt {
& > a {
color: #444444;
&.link_alterador {
color: #2980B9;
font-size: 0.75em;
&:hover {
text-decoration: underline;
}
}
&.desativado {
@extend .desativado;
}
}
.dne { .dne {
text-decoration: none;
position: absolute; position: absolute;
display: block; display: block;
font-size: 0.8rem; right: 0;
font-weight: normal; left: 0;
line-height: 1rem; top: 0;
text-align: left;
height: 0; height: 0;
transform: scaleX(0); transform: scaleX(0);
transform-origin: right; transform-origin: right;
transition: all 0.3s ease; transition: all 0.3s ease;
top: 0; border-top: 1px solid $color_buttons;
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;
}
ul.btns-action { ul.btns-action {
position: absolute;
margin: 0 0 0 0;
display: table;
list-style: none; list-style: none;
clip: rect(0,0,0,0); padding: 0;
opacity: 0; position: absolute;
transition: opacity 1.5s linear, clip 1s linear; right: 0;
border-collapse:separate; background-color: $color_buttons;
border-spacing: 0;
top: 0px;
right: 0px;
z-index: 19;
li { li {
display: table-cell; float: left;
background-color: $color_buttons; &:hover {
background-color: rgba(#000, 0.1);
}
a { a {
font-size: 155%; color: white;
padding: 0.4em 0.8em; padding: 0.15em 1em 0;
display: inline-block; display: inline-block;
float: right;
color: #fff !important;
&:hover { &:hover {
background-color: rgba(0, 0, 0, 0.15);
} }
} }
} }
} }
} }
.dne-nota { .dne-nota {
position: relative;
transform: scaleX(1);
height: auto;
border-top: 0px;
ul.btns-action {
display: none;
}
.dne-form {
margin: 1em -2em 0em;
text-align: left;
font-size: 1.6rem;
.container-busca {
ul{
list-style: none;
display: table;
margin-left: 0;
border-collapse:separate;
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;
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); 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); @include background-top-down(#f5f5f5, #eee);
position: relative; position: relative;
@ -451,7 +522,7 @@ a:link:after, a:visited:after {
display: none; display: none;
} }
.dne-form { .dne-form111 {
.asterisk { .asterisk {
color: transparent; color: transparent;
&::before { &::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 */ } /* 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 { .tipo-vigencias {
border-top: 1px solid #62B5B5; list-style: none;
position: fixed; position: fixed;
bottom: 0; bottom: 0px;
transform: translate(-50%,0);
left: 50%; left: 50%;
} transform: translate(-50%, 0);
margin: 0;
.vigencias { padding: 0;
margin: 2.5em 0 0 0; background-color: $color_buttons;
transition: all .4s ease-in-out; z-index: 1000;
background: #2980B9;
clear:both;
}
.fixed{ opacity: 0.9;
transition: all 0.3s ease-in-out;
z-index:98; li {
opacity: 0.2; display: inline-block;
transition: all 2s ease-in-out; border-left: 1px solid #fff;
-webkit-transition-delay: 3s; /* Safari */ float: left;
transition-delay: 3s; a {
color: white;
&:hover { padding: 0.3em 1em 0;
-webkit-transition-delay: 0s; /* Safari */ display: inline-block;
transition-delay: 0s; font-size: 110%;
transition: all 0.3s ease-in-out; cursor: pointer;
opacity: 0.9; &.selected {
background-color: rgba(0, 0, 0, 0.5);
&::-webkit-scrollbar { }
width: 10px;
height: 10px;
} }
&:hover {
background-color: rgba(0, 0, 0, 0.2);
&::-webkit-scrollbar-thumb:vertical {
height: 30px;
background-color: rgba(0, 0, 0, 0.1);
} }
}
&:hover {
opacity: 1;
} }
} }
} /* end cp */ } /* end cp */
.cpe { .cp.cpe {
@extend .cp;
margin-bottom: 15em; margin-bottom: 15em;
margin-left: 0.8em; margin-left: 0.8em;
a { a {
text-decoration: none; text-decoration: none;
cursor: pointer;
} }
.dpt { .dpt {
@ -1141,6 +1154,7 @@ a:link:after, a:visited:after {
min-height: 12.6em; min-height: 12.6em;
border: 0px; border: 0px;
font-size: 120%; font-size: 120%;
width: 100%;
&:focus { &:focus {
background: #fff; 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 { .class_color_container {
background: #ddd !important; background: #ddd !important;

11
templates/base.html

@ -155,7 +155,7 @@
{% block title %} {% block title %}
{% if view.title %} {% if view.title %}
<h1 class="page-header">{{ view.title|linebreaksbr }}</h1> <h1 class="page-header">{{ view.title|safe|linebreaksbr }}</h1>
{% endif %} {% endif %}
{% endblock %} {% endblock %}
@ -217,7 +217,7 @@
{% block foot_js %} {% block foot_js %}
<!-- Bootstrap core JavaScript ================================================== --> <!-- Bootstrap core JavaScript ================================================== -->
<!-- Placed at the end of the document so the pages load faster --> <!-- 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 '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-runner/build/jquery.runner.js' %}"></script>
<script type="text/javascript" src="{% static 'jquery-mask-plugin/dist/jquery.mask.js' %}"></script> <script type="text/javascript" src="{% static 'jquery-mask-plugin/dist/jquery.mask.js' %}"></script>
@ -225,7 +225,14 @@
<script src="{% static 'jquery-ui/jquery-ui.min.js' %}"></script> <script 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-ui/ui/i18n/datepicker-pt-BR.js' %}"></script>
{# Scripts #}
{# modernizr must be in head (see http://modernizr.com/docs/#installing) #}
<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 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> <script type="text/javascript" src="{% static 'js/app.js' %}"></script>
{% block extra_js %}{% endblock %} {% block extra_js %}{% endblock %}

1
templates/compilacao/ajax_form.html

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

19
templates/compilacao/publicacao_detail.html

@ -1,19 +1,24 @@
{% extends "base.html" %} {% load i18n %} {% load compilacao_filters %} {% extends "base.html" %} {% load i18n %} {% load compilacao_filters %}
{% load common_tags %} {% 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 %} {% block actions %}
<ul class="button-group right"> <div class="actions btn-group pull-right" role="group">
<li><a href="{% url 'ta_pub_edit' object.ta.pk object.pk %}" class="button tiny">{% trans 'Editar' %}</a></li> <a href="{% url 'ta_pub_edit' object.ta.pk object.pk %}" class="btn btn-default">{% trans 'Editar' %}</a>
<li><a href="{% url 'ta_pub_delete' object.ta.pk object.pk %}" class="button alert tiny">{% trans 'Excluir' %}</a></li> <a href="{% url 'ta_pub_delete' object.ta.pk object.pk %}" class="btn btn-default">{% trans 'Excluir' %}</a>
</ul> </div>
{% endblock actions %} {% endblock actions %}
</div>
<div class="actions btn-group pull-right" role="group"> <div class="actions btn-group pull-right" role="group">
{% block sections_nav %} {% block sections_nav %}
{% endblock %} {% endblock %}
</div> </div>
</div>
{% block detail_content %} {# TODO replace fieldset for something semantically correct, but with similar visual grouping style #} {% block detail_content %} {# TODO replace fieldset for something semantically correct, but with similar visual grouping style #}
<fieldset> <fieldset>

3
templates/compilacao/publicacao_list.html

@ -10,8 +10,7 @@
{% trans 'Adicionar'%} {%model_verbose_name 'compilacao.models.Publicacao'%} {% trans 'Adicionar'%} {%model_verbose_name 'compilacao.models.Publicacao'%}
</a> </a>
{% block more_buttons %} {% block more_buttons %}
<a href="{% url 'ta_text' view.kwargs|lookup:'ta_id' %}" class="btn btn-default">{% trans 'Voltar' %}</a> <a href="{% url 'ta_text' view.kwargs.ta_id %}" class="btn btn-default">{% trans 'Voltar' %}</a>
{% endblock more_buttons %} {% endblock more_buttons %}
</div> </div>

30
templates/compilacao/text_edit.html

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

9
templates/compilacao/text_edit_bloco.html

@ -14,7 +14,6 @@
<div class="dpt" id="dpt{{dpt.pk}}" pk="{{dpt.pk}}"> <div class="dpt" id="dpt{{dpt.pk}}" pk="{{dpt.pk}}">
{% endif%} {% endif%}
{% if view|render_actions_head:dpt %} {% if view|render_actions_head:dpt %}
<div class="csform"> <div class="csform">
<form method="post" action="" action_ajax="{{dpt.pk}}/refresh"> <form method="post" action="" action_ajax="{{dpt.pk}}/refresh">
@ -47,10 +46,10 @@
<ul class="actions_inserts {% if not dpt.tipo_dispositivo.dispositivo_de_articulacao %}menu_flutuante{%endif%}"> <ul class="actions_inserts {% if not dpt.tipo_dispositivo.dispositivo_de_articulacao %}menu_flutuante{%endif%}">
{% if dpt.dispositivo_subsequente == None %} {% if dpt.dispositivo_subsequente == None %}
{% for inserts in view|select_provaveis_inserts:request %} {% 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}}" > <ul id="afe{{dpt.id}}" >
{% for item in inserts|lookup:'itens' %} {% for item in inserts.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> <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 %} {% endfor %}
</ul> </ul>
</li> </li>
@ -111,7 +110,7 @@
{% if dpt.ta_publicado_id != None and not dpt.tipo_dispositivo.dispositivo_de_articulacao %} {% 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="{%url 'ta_text_edit' dpt.ta_publicado.pk %}#{{dpt.dispositivo_atualizador_id}}">
{{ dpt.tipo_dispositivo.nota_automatica_prefixo_html|safe }} {{ 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 }} {{ dpt.tipo_dispositivo.nota_automatica_sufixo_html|safe }}
</a> </a>
{% endif %} {% endif %}

158
templates/compilacao/text_list.html

@ -5,94 +5,90 @@
{% load staticfiles %} {% load staticfiles %}
{% load sass_tags %} {% load sass_tags %}
{% block head_content %}{{block.super}} {% block head_content %}
<link rel="stylesheet" href="{% sass_src 'styles/compilacao.scss' %}" type="text/css"> {{block.super}}
<script type="text/javascript" src="{% static 'jsdiff/diff.min.js' %}"></script> <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_view.js' %}"></script>
{% if perms.compilacao.add_nota %}
<script type="text/javascript" src="{% static 'js/compilacao_notas.js' %}"></script>
{% endif %}
{% endblock %} {% endblock %}
{% block base_content %}
{% block actions %}
<div class="clearfix">
<div class="actions btn-group pull-right" role="group">
<a href="{% url 'ta_text_edit' object.pk %}" class="btn btn-default">{% trans 'Editar Texto' %}</a>
</div>
</div>
{% endblock actions %}
{% block base_content %}{{block.super}} {% block detail_content %}{{block.super}}
{% endblock %}
<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>
{% 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 %}
{% 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>
{% 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>
{% 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">
{% for dispositivo in values %}
<li class="nav__sub-item">
{% 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%}
</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 %}
<ul class="tipo-vigencias">
<li><a class="selected" onclick="textoMultiVigente(this, false);" title="{% trans 'Texto Multivigente Sequencial'%}">{% trans 'TMS'%}</a></li>
<li><a onclick="textoMultiVigente(this, true);" title="{% trans 'Texto Multivigente Integrado com Realce de Alterações'%}">{% trans 'TMI'%}</a></li>
<li><a onclick="textoVigente(this, true);" title="{% trans 'Texto Vigente COM Links para Textos Alteradores'%}">{% trans 'TVL'%}</a></li>
<li><a onclick="textoVigente(this, false);" title="{% trans 'Texto Vigente'%}">{% trans 'TVT'%}</a></li>
</ul>
{% if object_list %}
<div class="clearfix">
<div class="actions btn-group pull-right" role="group">
</section> <a class="btn btn-default" id="btn_font_menos" title="Diminuir tamanho da letra">a</a>
</nav> <a class="btn btn-default" id="btn_font_mais" title="Aumentar tamanho da Letra">A</a>
</section> </div>
{%endif%} </div>
{% endfor %} {% endif %}
<br>
{% if view.inicio_vigencia != None and view.fim_vigencia != None %} {% for key, values in view.get_vigencias.items %}
{% trans 'Vigência entre'%} <b>{{view.inicio_vigencia}}</b> {% trans 'e'%} <b>{{view.fim_vigencia}}</b>. {% if forloop.first %}
{%endif%} <ul class="nav nav-pills">
{% endif %}
{% if forloop.first %}
{% for dispositivo in values %}
<li class="{% if view.inicio_vigencia == dispositivo.inicio_vigencia %}active{%endif%}"><a href="{%url '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>
{% endfor %}
{% elif forloop.last %}
{% for dispositivo in values %}
<li class="{% if not view.inicio_vigencia%}active{% endif %}"><a href="{%url '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>
{% if forloop.last %}
</ul>
{% if view.inicio_vigencia and view.fim_vigencia %}
<span class="vigencia-active">{% trans 'Vigência entre'%} <b>{{view.inicio_vigencia}}</b> {% trans 'e'%} <b>{{view.fim_vigencia}}</b>.</span>
{% else%}
<span class="vigencia-active">{% trans 'Vigência a partir de '%} <b>{{dispositivo.inicio_vigencia}}.</b></span>
{%endif%}
{% endif%}
{% endfor %}
{% else %}
<li class="{% if view.inicio_vigencia.year == key %}active{% endif %}"><a data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false">{{ key }}</a>
{%endif%}
{% if not forloop.first and not forloop.last %}
<ul class="dropdown-menu">
{% for dispositivo in values %}
<li>
{% if not forloop.parentloop.first %}
<a href="{%url '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>
{% endfor %}
<ul class="tipo-vigencias">
<li><a class="selected" onclick="textoMultiVigente(this, false);" title="{% trans 'Texto Multivigente Sequencial'%}">{% trans 'TMS'%}</a></li>
<li><a onclick="textoMultiVigente(this, true);" title="{% trans 'Texto Multivigente Integrado com Realce de Alterações'%}">{% trans 'TMI'%}</a></li>
<li><a onclick="textoVigente(this, true);" title="{% trans 'Texto Vigente COM Links para Textos Alteradores'%}">{% trans 'TVL'%}</a></li>
<li><a onclick="textoVigente(this, false);" title="{% trans 'Texto Vigente'%}">{% trans 'TVT'%}</a></li>
</ul>
{% include 'compilacao/text_list_bloco.html'%} {% include 'compilacao/text_list_bloco.html'%}
</div> </div>
{% endblock base_content %} {% 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 %}

22
templates/compilacao/text_list_bloco.html

@ -7,8 +7,8 @@
{% for dpt in object_list %} {% for dpt in object_list %}
{% if dpt.nivel == view.flag_nivel_old %} {% if dpt.nivel == view.flag_nivel_old %}
</div> </div>
{% elif dpt.nivel < view.flag_nivel_old %} {% elif dpt.nivel < view.flag_nivel_old %}
{% close_div view.flag_nivel_old dpt.nivel 0 %} {% close_div view.flag_nivel_old dpt.nivel 0 %}
{% endif%} {% endif%}
@ -20,23 +20,27 @@
{% spaceless %} {% spaceless %}
<div class="{{ dpt.tipo_dispositivo.class_css }}"> <div class="{{ dpt.tipo_dispositivo.class_css }}">
<div class="dptt {% dispositivo_desativado dpt view.inicio_vigencia view.fim_vigencia %}" id="dptt{{dpt.pk}}" > <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 %} {{ 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 'ta_text' dpt.ta_publicado.pk %}#{{dpt.dispositivo_atualizador_id}}"> <a class="link_alterador" href="{%url 'ta_text' dpt.ta_publicado.pk %}#{{dpt.dispositivo_atualizador_id}}">
{{ dpt.tipo_dispositivo.nota_automatica_prefixo_html|safe }} {{ 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 }} {{ dpt.tipo_dispositivo.nota_automatica_sufixo_html|safe }}
</a> </a>
{% endif %} {% endif %}
{% if user.is_authenticated and not dpt.tipo_dispositivo.dispositivo_de_articulacao%} {% 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%} {% 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"> <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 '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_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 %} {% 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> </ul>
<div class="dne-form"></div> <div class="dne-form clearfix"></div>
</div> </div>
{% endif %} {% endif %}
{% endif%} {% endif%}
@ -107,7 +111,7 @@
{% if notas and notas|lookup:dpt.pk %} {% if notas and notas|lookup:dpt.pk %}
{% for nota in 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 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 not forloop.first %}<li class="bullet">&#8226;</li>{%endif%}
<li class="dnli" id="nt{{nota.pk}}"> <li class="dnli" id="nt{{nota.pk}}">
<ul> <ul>
@ -153,7 +157,7 @@
{% endif%} {% endif%}
</div> </div>
{% endspaceless %} {% endspaceless %}
{% if view.is_ta_alterador and dpt.tipo_dispositivo.class_css == 'bloco_alteracao'%} {% if ta_pub_list and dpt.tipo_dispositivo.class_css == 'bloco_alteracao'%}
{%with node=dpt template_name='compilacao/text_list_blocoalteracao.html' %} {%with node=dpt template_name='compilacao/text_list_blocoalteracao.html' %}
{%include template_name%} {%include template_name%}
{%endwith%} {%endwith%}

1
templates/compilacao/text_list_blocoalteracao.html

@ -1,6 +1,5 @@
{% load compilacao_filters %} {% load compilacao_filters %}
{% load common_tags %} {% 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 %} {% for ch in dpt.pk|get_bloco_atualizador %}
{% spaceless %} {% spaceless %}
{% if ch.visibilidade %} {% if ch.visibilidade %}

58
templates/compilacao/textoarticulado_detail.html

@ -3,46 +3,34 @@
{% load compilacao_filters %} {% load compilacao_filters %}
{% load common_tags %} {% load common_tags %}
{% block sections_nav %} {% block sections_nav %}
{%if object %} <ul class="nav nav-pills navbar-right">
<div class="actions btn-group pull-right" role="group"> {%if object %}
{% if object.content_object%} <li>
<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> {% if object.content_object%}
{%else%} <a href="{% url object|urldetail_content_type object.content_object.pk %}" title="{% trans 'Ir para '%}{{object.content_object}}">Início</a>
<a href="{% url 'ta_detail' object.pk %}" class="btn btn-default">{% trans 'Início' %}</a> {%else%}
{%endif%} <a href="{% url '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> </li>
<li><a href="{% url 'ta_pub_list' object.pk %}">{% model_verbose_name_plural 'compilacao.models.Publicacao' %}</a></li>
<li><a href="{% url 'ta_text' object.pk %}">{% trans 'Texto da Norma' %}</a></li>
{%endif %}
</ul>
{% endblock %}
<a href="{% url 'ta_text' object.pk %}" class="btn btn-default">{% trans 'Texto' %}</a> {% block base_content %}
<a href="{% url 'ta_text_edit' object.pk %}" class="btn btn-default">{% trans 'Edição do Texto' %}</a>
</div>
{%endif %}
{% endblock %}
{% block base_content %} {# FIXME is this the best markup to use? #} {% block actions %}
<div class="clearfix"> <div class="clearfix">
{% block actions %} <div class="actions btn-group pull-right" role="group">
<ul class="button-group right"> <a href="{% url 'ta_edit' object.pk %}" class="btn btn-default">{% trans 'Editar Metadados do Texto Articulado' %}</a>
<a href="{% url 'ta_text_edit' object.pk %}" class="btn btn-default">{% trans 'Editar Texto' %}</a>
</div>
</div>
{% endblock actions %}
{%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>
{% endblock actions %}
</div>
{% block detail_content %} {# TODO replace fieldset for something semantically correct, but with similar visual grouping style #} {% block detail_content %} {# TODO replace fieldset for something semantically correct, but with similar visual grouping style #}
<fieldset> <fieldset>

22
templates/compilacao/textoarticulado_list.html

@ -4,21 +4,21 @@
{% load common_tags %} {% load common_tags %}
{% block base_content %} {% block base_content %}
{% block actions %}{{block.super}} {% block detail_content %}
{% endblock detail_content %}
{% endblock actions %} {% block actions %}
{% block detail_content %} <div class="actions btn-group pull-right clearfix" role="group">
{% endblock detail_content %} <a href="{{ view.create_url }}" class="btn btn-default">
<div class="actions btn-group pull-right" role="group"> {% trans 'Adicionar'%} {%model_verbose_name 'compilacao.models.TextoArticulado'%}
<a href="{{ view.create_url }}" class="btn btn-default"> </a>
{% trans 'Adicionar'%} {%model_verbose_name 'compilacao.models.TextoArticulado'%}
</a>
{% include 'compilacao/textoarticulado_menu_config.html' %}
{% block more_buttons %}
{% endblock more_buttons %} </div>
</div> {% endblock actions %}
<table class="table table-striped table-hover"> <table class="table table-striped table-hover">
<thead> <thead>

17
templates/compilacao/textoarticulado_menu_config.html

@ -0,0 +1,17 @@
{% 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 '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>

2
templates/norma/normajuridica_detail.html

@ -10,7 +10,7 @@
e a view NormaTa(IntegracaoTaView) em views.py e a view NormaTa(IntegracaoTaView) em views.py
Em nada mais a integração interfere em Norma Jurídica Em nada mais a integração interfere em Norma Jurídica
{% endcomment %} {% endcomment %}
<a href="{% url 'norma_ta' object.pk %}" class="btn btn-default">{% trans 'Texto' %}</a> <a href="{% url 'normajuridica:ta' object.pk %}" class="btn btn-default">{% trans 'Texto da Norma' %}</a>
</div> </div>
{% endblock sections_nav %} {% endblock sections_nav %}

Loading…
Cancel
Save