diff --git a/base/templatetags/common_tags.py b/base/templatetags/common_tags.py index 6bf2b7283..dc38f1014 100644 --- a/base/templatetags/common_tags.py +++ b/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 diff --git a/compilacao/forms.py b/compilacao/forms.py index c84bb224e..8fe2f5a4c 100644 --- a/compilacao/forms.py +++ b/compilacao/forms.py @@ -1,8 +1,7 @@ +from crispy_forms.bootstrap import FormActions, StrictButton, FieldWithButtons from crispy_forms.helper import FormHelper -from crispy_forms_foundation.layout import (HTML, Column, Div, Fieldset, - Layout, Row) -from crispy_forms_foundation.layout.buttons import Button -from crispy_forms_foundation.layout.fields import Field +from crispy_forms.layout import Button, Field, Column, HTML, Layout, Div, Row,\ + Fieldset from django import forms from django.core.exceptions import NON_FIELD_ERRORS 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, Publicacao, TextoArticulado, TipoNota, TipoPublicacao, TipoTextoArticulado, TipoVide, - VeiculoPublicacao, Vide) + VeiculoPublicacao, Vide, + NOTAS_PUBLICIDADE_CHOICES) 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 +140,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 +171,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 +209,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('' + '%s' % _('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'), - row1, - Field('texto', placeholder=_('Adicionar Nota')), - Field('url_externa', placeholder=_('URL Externa (opcional)')), - row3 + + Div( + Div(HTML(_('Notas')), css_class='panel-heading'), + Div( + 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) @@ -256,6 +259,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 +301,63 @@ class VideForm(ModelForm): def __init__(self, *args, **kwargs): - self.helper = FormHelper() - self.helper.layout = Layout( + buttons = FormActions( + HTML('' + '%s' % _('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( - to_column(( - Div( - Div(to_column((Field( - 'tipo', - placeholder=_('Selecione um Tipo de Vide')), 12))), - Div(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( - '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)) - - ), - to_column( - (Div(css_class='container-busca'), 12)) - ), 8) - ) + 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.')), + 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" + ), + 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) diff --git a/compilacao/models.py b/compilacao/models.py index 3155f1de5..0f197e071 100644 --- a/compilacao/models.py +++ b/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 %s') % ( 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,20 +1144,25 @@ class Vide(TimestampedMixin): 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): + 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 = models.CharField( verbose_name=_('Título'), max_length=100, @@ -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: diff --git a/compilacao/templatetags/compilacao_filters.py b/compilacao/templatetags/compilacao_filters.py index b620ed307..f52d75c19 100644 --- a/compilacao/templatetags/compilacao_filters.py +++ b/compilacao/templatetags/compilacao_filters.py @@ -36,15 +36,15 @@ 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 '' diff --git a/compilacao/views.py b/compilacao/views.py index 46d084842..cafe79402 100644 --- a/compilacao/views.py +++ b/compilacao/views.py @@ -1,6 +1,6 @@ -import sys from collections import OrderedDict from datetime import datetime, timedelta +import sys from braces.views import FormMessagesMixin from django import forms @@ -29,6 +29,7 @@ from compilacao.models import (Dispositivo, Nota, VeiculoPublicacao, Vide) from sapl.crud import NO_ENTRIES_MSG, build_crud, make_pagination + DISPOSITIVO_SELECT_RELATED = ( 'tipo_dispositivo', 'ta_publicado', @@ -38,7 +39,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', [ @@ -193,17 +196,18 @@ 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: - ct = ContentType.objects.filter( - model=item.model.__name__.lower(), - app_label=item.model._meta.app_label) - if ct.exists(): - result.append(( - ct[0].pk, - item.model._meta.verbose_name_plural)) + 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) + if ct.exists(): + result.append(( + ct[0].pk, + item.model._meta.verbose_name_plural)) return result @@ -242,7 +246,7 @@ 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)) @@ -268,7 +272,7 @@ 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)) @@ -321,7 +325,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' + '%s') % ( self.get_object().content_object._meta.verbose_name_plural, self.get_object().content_object) else: @@ -444,9 +449,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 +463,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 +473,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 +616,7 @@ class DispositivoView(TextView): return itens -class TextEditView(TextView): +class TextEditView(ListView, CompMixin): template_name = 'compilacao/text_edit.html' flag_alteradora = -1 @@ -611,14 +626,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 @@ -1487,30 +1515,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: - 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 + def get(self, request, *args, **kwargs): + self.object = None - 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 +1645,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) diff --git a/materia/views.py b/materia/views.py index 1f63def44..178016862 100644 --- a/materia/views.py +++ b/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 diff --git a/norma/urls.py b/norma/urls.py index 862e535ed..b770223fa 100644 --- a/norma/urls.py +++ b/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[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[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)), diff --git a/norma/views.py b/norma/views.py index e937446f7..548cdde18 100644 --- a/norma/views.py +++ b/norma/views.py @@ -15,6 +15,7 @@ from .forms import NormaJuridicaForm from .models import (AssuntoNorma, LegislacaoCitada, NormaJuridica, TipoNormaJuridica) + assunto_norma_crud = build_crud( AssuntoNorma, 'assunto_norma_juridica', [ @@ -125,3 +126,4 @@ class NormaIncluirView(FormMixin, GenericView): class NormaTaView(IntegracaoTaView): model = NormaJuridica + model_type_foreignkey = TipoNormaJuridica diff --git a/sapl/layout.py b/sapl/layout.py index a779b20e5..6d0c4c7f5 100644 --- a/sapl/layout.py +++ b/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): diff --git a/static/js/app.js b/static/js/app.js index 7f00d4398..87d7b099f 100644 --- a/static/js/app.js +++ b/static/js/app.js @@ -13,7 +13,7 @@ function refreshMask() { $('.rg').mask("0.000.000", {placeholder:"_.___.___"}); $('.titulo_eleitor').mask("0000.0000.0000.0000", {placeholder:"____.____.____.____"}); $('.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(){ diff --git a/static/js/compilacao_notas.js b/static/js/compilacao_notas.js index 8d1168acd..00f0930b2 100644 --- a/static/js/compilacao_notas.js +++ b/static/js/compilacao_notas.js @@ -1,46 +1,62 @@ -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(''); }); - $('#dne'+pk+" select[name='tipo']").change(function(event) { - var url = ''; - url = 'text/'+pk+'/nota/create?action=modelo_nota&id_tipo='+this.value; - $.get(url).done(function( data ) { - $('#dne'+pk+" textarea[name='texto']").val(data); + 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; + $.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']" - ).change(onChangeParamNorma); + var select = $('#dne'+pk+" select[name='tipo_model']"); + select.empty(); + $('').appendTo(select); + + $.get(url).done(function( data ) { + select.empty(); + for(var item in data) { + for (var i in data[item]) + $('').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 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,7 +115,7 @@ var onSubmitEditForm = function(event) { if (typeof data == "string") { if (data.indexOf('= 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) @@ -152,7 +169,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(); }); diff --git a/static/js/compilacao_view.js b/static/js/compilacao_view.js index f64c74e40..5a68573ad 100644 --- a/static/js/compilacao_view.js +++ b/static/js/compilacao_view.js @@ -30,7 +30,11 @@ function textoMultiVigente(item, diff) { if ($(ldpts[i]).hasClass('displaynone')) continue; if (isElementInViewport( ldpts[i])) { - elv = 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])) { - elv = ldpts[i]; + if (i+1 < ldpts.length) + elv = ldpts[i+1]; + else { + elv = ldpts[i]; + } break; } } diff --git a/static/styles/compilacao.scss b/static/styles/compilacao.scss index 5b3bebf16..fc2dadcd9 100644 --- a/static/styles/compilacao.scss +++ b/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 { - position: absolute; - margin: 0 0 0 0; - display: table; list-style: none; - clip: rect(0,0,0,0); - opacity: 0; - transition: opacity 1.5s linear, clip 1s linear; - border-collapse:separate; - border-spacing: 0; - top: 0px; - right: 0px; - z-index: 19; + padding: 0; + position: absolute; + right: 0; + background-color: $color_buttons; li { - display: table-cell; - background-color: $color_buttons; + float: left; + &:hover { + background-color: rgba(#000, 0.1); + } a { - font-size: 155%; - padding: 0.4em 0.8em; + color: white; + padding: 0.15em 1em 0; display: inline-block; - float: right; - color: #fff !important; &:hover { - background-color: rgba(0, 0, 0, 0.15); } } } } } + .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); @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; - } + transform: translate(-50%, 0); + margin: 0; + padding: 0; + background-color: $color_buttons; + z-index: 1000; - .fixed{ + opacity: 0.9; + transition: all 0.3s ease-in-out; - z-index:98; - opacity: 0.2; - transition: all 2s ease-in-out; - -webkit-transition-delay: 3s; /* Safari */ - transition-delay: 3s; - - &:hover { - -webkit-transition-delay: 0s; /* Safari */ - transition-delay: 0s; - transition: all 0.3s ease-in-out; - opacity: 0.9; - - &::-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; diff --git a/templates/base.html b/templates/base.html index 5d4a6d9d9..36df2ab06 100644 --- a/templates/base.html +++ b/templates/base.html @@ -155,7 +155,7 @@ {% block title %} {% if view.title %} -

{{ view.title|linebreaksbr }}

+

{{ view.title|safe|linebreaksbr }}

{% endif %} {% endblock %} @@ -217,7 +217,7 @@ {% block foot_js %} - + @@ -225,7 +225,14 @@ + {# Scripts #} + {# modernizr must be in head (see http://modernizr.com/docs/#installing) #} + + + + + {% block extra_js %}{% endblock %} diff --git a/templates/compilacao/ajax_form.html b/templates/compilacao/ajax_form.html index 52cbf0e30..8daf9e789 100644 --- a/templates/compilacao/ajax_form.html +++ b/templates/compilacao/ajax_form.html @@ -1,3 +1,2 @@ {% load crispy_forms_tags %} -
{% crispy form form.helper%} diff --git a/templates/compilacao/publicacao_detail.html b/templates/compilacao/publicacao_detail.html index c7e5a9ea1..4f3cccc22 100644 --- a/templates/compilacao/publicacao_detail.html +++ b/templates/compilacao/publicacao_detail.html @@ -1,19 +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 actions %} - + {% endblock actions %} +
+
{% block sections_nav %} {% endblock %}
-
{% block detail_content %} {# TODO replace fieldset for something semantically correct, but with similar visual grouping style #}
diff --git a/templates/compilacao/publicacao_list.html b/templates/compilacao/publicacao_list.html index abcb696d0..3e1dd22ff 100644 --- a/templates/compilacao/publicacao_list.html +++ b/templates/compilacao/publicacao_list.html @@ -10,8 +10,7 @@ {% trans 'Adicionar'%} {%model_verbose_name 'compilacao.models.Publicacao'%} {% block more_buttons %} - {% trans 'Voltar' %} - + {% trans 'Voltar' %} {% endblock more_buttons %} diff --git a/templates/compilacao/text_edit.html b/templates/compilacao/text_edit.html index 04a8f0b4d..1a4ffabb5 100644 --- a/templates/compilacao/text_edit.html +++ b/templates/compilacao/text_edit.html @@ -6,26 +6,38 @@ {% load crispy_forms_tags %} {% load common_tags %} - {% block head_content %}{{block.super}} - - {% endblock %} - {% block title%}

Edição: {{ view.title }} - {% trans 'Texto Multivigente' %}

{% endblock %} - -{% block base_content %}{{block.super}} - -
{% trans 'Aguarde... Atualizando informações!!!'%}
-
+{% block base_content %}{{block.super}} + +
{% include 'compilacao/text_edit_bloco.html'%}
{% endblock base_content %} +{% block actions %} +
+ +
+{% endblock actions %} + +{% block foot_js %} + {{block.super}} + + +{% endblock %} diff --git a/templates/compilacao/text_edit_bloco.html b/templates/compilacao/text_edit_bloco.html index 7f22d15f4..9ac0e6c70 100644 --- a/templates/compilacao/text_edit_bloco.html +++ b/templates/compilacao/text_edit_bloco.html @@ -14,7 +14,6 @@
{% endif%} - {% if view|render_actions_head:dpt %}
@@ -47,10 +46,10 @@
- {% elif dpt.nivel < view.flag_nivel_old %} - {% close_div view.flag_nivel_old dpt.nivel 0 %} + {% elif dpt.nivel < view.flag_nivel_old %} + {% close_div view.flag_nivel_old dpt.nivel 0 %} {% endif%} @@ -20,23 +20,27 @@ {% spaceless %}
- {{ 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%}{{ dpt.texto|safe }}{%else%} {%endif%} - {% if dpt.ta_publicado_id != None and not dpt.tipo_dispositivo.dispositivo_de_articulacao %} + + {{ 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 %}{{ dpt.texto|safe }}{%else%}{%if not dpt.tipo_dispositivo.dispositivo_de_articulacao %} {%endif%}{%endif%} + {% if dpt.ta_publicado_id and not dpt.tipo_dispositivo.dispositivo_de_articulacao %} {{ 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 }} {% 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%} -
{# TODO: User - dne - Dispostivo Nota Editor - tratar permissão de usuário#} +
    {% if perms.compilacao.change_dispositivo %}
  • Ed
  • {% endif %} {% if perms.compilacao.add_nota %}
  • N
  • {% endif %} {% if perms.compilacao.add_vide %}
  • V
  • {% endif %}
-
+
{% endif %} {% endif%} @@ -107,7 +111,7 @@ {% 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 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 %}
  • {%endif%}
    • @@ -153,7 +157,7 @@ {% endif%}
  • {% 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' %} {%include template_name%} {%endwith%} diff --git a/templates/compilacao/text_list_blocoalteracao.html b/templates/compilacao/text_list_blocoalteracao.html index e3bc1e76e..ff9aabb27 100644 --- a/templates/compilacao/text_list_blocoalteracao.html +++ b/templates/compilacao/text_list_blocoalteracao.html @@ -1,6 +1,5 @@ {% load compilacao_filters %} {% load common_tags %} - {% for ch in dpt.pk|get_bloco_atualizador %} {% spaceless %} {% if ch.visibilidade %} diff --git a/templates/compilacao/textoarticulado_detail.html b/templates/compilacao/textoarticulado_detail.html index 7c8e834ce..300a10fe7 100644 --- a/templates/compilacao/textoarticulado_detail.html +++ b/templates/compilacao/textoarticulado_detail.html @@ -3,46 +3,34 @@ {% load compilacao_filters %} {% load common_tags %} - {% block sections_nav %} - {%if object %} -
    - {% if object.content_object%} - Início - {%else%} - {% trans 'Início' %} - {%endif%} - - {% model_verbose_name_plural 'compilacao.models.Publicacao' %} +{% block sections_nav %} + +{% endblock %} - {% trans 'Texto' %} - {% trans 'Edição do Texto' %} -
    - {%endif %} - {% endblock %} +{% block base_content %} -{% block base_content %} {# FIXME is this the best markup to use? #} +{% block actions %} +{% endblock actions %} - {%if object %} -
  • {% trans 'Edição dos Metadados do Texto Articulado' %}
  • -
  • {% trans 'Excluir' %}
  • - {%endif%} -
  • -
  • - - {% endblock actions %} -
    {% block detail_content %} {# TODO replace fieldset for something semantically correct, but with similar visual grouping style #}
    diff --git a/templates/compilacao/textoarticulado_list.html b/templates/compilacao/textoarticulado_list.html index 7df007eb7..62fd0fd0e 100644 --- a/templates/compilacao/textoarticulado_list.html +++ b/templates/compilacao/textoarticulado_list.html @@ -4,21 +4,21 @@ {% load common_tags %} {% block base_content %} - {% block actions %}{{block.super}} + {% block detail_content %} + {% endblock detail_content %} - {% endblock actions %} -{% block detail_content %} -{% endblock detail_content %} -
    - - {% trans 'Adicionar'%} {%model_verbose_name 'compilacao.models.TextoArticulado'%} - +{% block actions %} +
    + + {% trans 'Adicionar'%} {%model_verbose_name 'compilacao.models.TextoArticulado'%} + + {% include 'compilacao/textoarticulado_menu_config.html' %} + - {% block more_buttons %} - {% endblock more_buttons %} -
    +
    +{% endblock actions %} diff --git a/templates/compilacao/textoarticulado_menu_config.html b/templates/compilacao/textoarticulado_menu_config.html new file mode 100644 index 000000000..bd28b883b --- /dev/null +++ b/templates/compilacao/textoarticulado_menu_config.html @@ -0,0 +1,17 @@ +{% load i18n %} +{% load common_tags %} + diff --git a/templates/norma/normajuridica_detail.html b/templates/norma/normajuridica_detail.html index 70e5131c1..6ec4edca0 100644 --- a/templates/norma/normajuridica_detail.html +++ b/templates/norma/normajuridica_detail.html @@ -10,7 +10,7 @@ e a view NormaTa(IntegracaoTaView) em views.py Em nada mais a integração interfere em Norma Jurídica {% endcomment %} - {% trans 'Texto' %} + {% trans 'Texto da Norma' %} {% endblock sections_nav %}