From ae19c6a170871cc4bb253fc753cc3392967e26ff Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Tue, 1 Dec 2015 16:53:33 -0200 Subject: [PATCH] Impl. of features for editing notes and quotes. --- compilacao/forms.py | 142 ++++++--- compilacao/models.py | 21 +- compilacao/templatetags/compilacao_filters.py | 11 +- compilacao/urls.py | 16 + compilacao/views.py | 284 +++++++++++++----- norma/urls.py | 4 +- sapl/settings.py | 3 +- static/js/compilacao.js | 4 + static/js/compilacao_notas.js | 149 ++++++--- static/styles/compilacao.scss | 248 ++++++++++++--- templates/compilacao/ajax_form.html | 3 + .../dispositivo_search_fragment_form.html | 43 +++ templates/compilacao/edit_bloco.html | 2 +- templates/compilacao/index_bloco.html | 177 ++++++++--- .../compilacao/index_bloco_alteracao.html | 4 +- templates/compilacao/nota_ajaxform.html | 3 - 16 files changed, 857 insertions(+), 257 deletions(-) create mode 100644 templates/compilacao/ajax_form.html create mode 100644 templates/compilacao/dispositivo_search_fragment_form.html delete mode 100644 templates/compilacao/nota_ajaxform.html diff --git a/compilacao/forms.py b/compilacao/forms.py index f47cebf0b..ff5d31c9f 100644 --- a/compilacao/forms.py +++ b/compilacao/forms.py @@ -1,13 +1,12 @@ from crispy_forms.helper import FormHelper -from crispy_forms.layout import Layout, Fieldset, ButtonHolder, Submit, Field,\ - Div, Column, Row, Hidden, Button +from crispy_forms.layout import HTML, Button, Column, Div, Field, Layout, Row from django import forms -from django.core.urlresolvers import reverse from django.forms.models import ModelForm from django.utils.translation import ugettext_lazy as _ -from compilacao.models import Nota, TipoNota, Dispositivo -import sapl +from compilacao.models import Dispositivo, Nota, TipoNota, TipoVide, Vide +from norma.models import TipoNormaJuridica +from sapl.layout import to_column, to_row class UpLoadImportFileForm(forms.Form): @@ -15,31 +14,25 @@ class UpLoadImportFileForm(forms.Form): required=True, label=_('Arquivo formato ODF para Importanção')) - -def get_tipos_nota(): - return [(t.id, t.sigla + ' - ' + t.nome) for t in TipoNota.objects.all()] +error_messages = { + 'required': _('Este campo é obrigatório'), + 'invalid': _('URL inválida.') +} class NotaForm(ModelForm): NPRIV = 1 - NSTRL = 2 - NINST = 3 - NPUBL = 4 + NINST = 2 + NPUBL = 3 PUBLICIDADE_CHOICES = ( # Only the owner of the note has visibility. (NPRIV, _('Nota Privada')), - # All of the same group have visibility. - (NSTRL, _('Nota Setorial')), # All authenticated users have visibility. (NINST, _('Nota Institucional')), # All users have visibility. (NPUBL, _('Nota Pública')), ) - error_messages = { - 'required': _('Este campo é obrigatório'), - 'invalid': _('URL inválida.') - } titulo = forms.CharField(label=' ', required=False) texto = forms.CharField( label='', @@ -51,18 +44,18 @@ class NotaForm(ModelForm): error_messages=error_messages) publicidade = forms.ChoiceField( required=True, - label='Publicidade', + label=_('Publicidade'), choices=PUBLICIDADE_CHOICES, widget=forms.Select(attrs={'class': 'selector'})) tipo = forms.ModelChoiceField( required=False, - label='Tipo da Nota', + label=_('Tipo da Nota'), queryset=TipoNota.objects.all(), empty_label=None) publicacao = forms.DateField( - label=u'Publicação', + label=_('Publicação'), input_formats=['%d/%m/%Y'], required=True, widget=forms.DateInput( @@ -70,7 +63,7 @@ class NotaForm(ModelForm): error_messages=error_messages ) efetividade = forms.DateField( - label=u'Efetividade', + label=_('Efetividade'), input_formats=['%d/%m/%Y'], required=True, widget=forms.DateInput( @@ -96,7 +89,7 @@ class NotaForm(ModelForm): def __init__(self, *args, **kwargs): - row1 = sapl.layout.to_row([ + row1 = to_row([ ('tipo', 4), ]) row1.append( @@ -107,31 +100,112 @@ class NotaForm(ModelForm): ), css_class='columns large-8')) - row3 = sapl.layout.to_row([ + row3 = to_row([ ('publicidade', 3), ('publicacao', 3), ('efetividade', 3), (Button('submit', 'Salvar', - css_class='button primary'), 3) + css_class='button primary radius'), 3) ]) 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 ) - kwargs.pop('norma_id') - dispositivo_id = kwargs.pop('dispositivo_id') - if 'pk' in kwargs: - pk = kwargs.pop('pk') - else: - pk = '' - super(NotaForm, self).__init__(*args, **kwargs) - self.fields['dispositivo'].initial = dispositivo_id - if pk: - self.fields['pk'].initial = pk + +class VideForm(ModelForm): + dispositivo_base = forms.ModelChoiceField( + queryset=Dispositivo.objects.all(), + widget=forms.HiddenInput()) + dispositivo_ref = forms.ModelChoiceField( + queryset=Dispositivo.objects.all(), + widget=forms.HiddenInput()) + + tipo_norma = forms.ModelChoiceField( + queryset=TipoNormaJuridica.objects.all(), + required=False) + num_norma = forms.IntegerField(label=_('Núm. da Norma'), required=False) + ano_norma = forms.IntegerField(label=_('Ano da Norma'), required=False) + + texto = forms.CharField( + label='', + widget=forms.Textarea, + error_messages=error_messages, + required=False) + tipo = forms.ModelChoiceField( + label=_('Tipo do Vide'), + queryset=TipoVide.objects.all(), + required=True) + + busca_dispositivo = forms.CharField( + label=_('Buscar Dispositivo a Referenciar'), + required=False) + pk = forms.IntegerField(widget=forms.HiddenInput(), + required=False) + + class Meta: + model = Vide + fields = ['dispositivo_base', + 'dispositivo_ref', + 'texto', + 'tipo', + 'pk'] + + def __init__(self, *args, **kwargs): + + self.helper = FormHelper() + self.helper.layout = Layout( + + Div(HTML(_('Vides')), css_class='title_form'), + + 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='button primary radius'), 12))) + ), 4)), + to_column(( + Div( + Div(to_column(('tipo_norma', 6))), + Div(to_column(('num_norma', 3)), + to_column(('ano_norma', 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='button btn-busca radius'), 2)) + + ), + to_column( + (Div(css_class='container-busca'), 12)) + ), 8) + ) + ) + ) + + super(VideForm, self).__init__(*args, **kwargs) diff --git a/compilacao/models.py b/compilacao/models.py index 076df95e0..e6df58898 100644 --- a/compilacao/models.py +++ b/compilacao/models.py @@ -950,9 +950,16 @@ class Dispositivo(BaseModel, TimestampedMixin): return proxima_articulacao[0] - def is_relative_auto_insert(self, perfil_pk): + def is_relative_auto_insert(self, perfil_pk=None): if self.dispositivo_pai is not None: # pp possiveis_pais + + if not perfil_pk: + perfis = PerfilEstruturalTextosNormativos.objects.filter( + padrao=True)[:1] + if perfis.exists(): + perfil_pk = perfis[0].pk + pp = self.tipo_dispositivo.possiveis_pais.filter( pai=self.dispositivo_pai.tipo_dispositivo, perfil_id=perfil_pk) @@ -1032,15 +1039,16 @@ class Vide(TimestampedMixin): dispositivo_base = models.ForeignKey( Dispositivo, verbose_name=_('Dispositivo Base'), - related_name='%(class)s_dispositivo_base') + related_name='cita') dispositivo_ref = models.ForeignKey( Dispositivo, - related_name='%(class)s_dispositivo_ref', + related_name='citado', verbose_name=_('Dispositivo Referido')) class Meta: verbose_name = _('Vide') verbose_name_plural = _('Vides') + unique_together = ['dispositivo_base', 'dispositivo_ref'] def __str__(self): return _('Vide %s') % self.texto @@ -1048,15 +1056,12 @@ class Vide(TimestampedMixin): class Nota(TimestampedMixin): NPRIV = 1 - NSTRL = 2 - NINST = 3 - NPUBL = 4 + NINST = 2 + NPUBL = 3 PUBLICIDADE_CHOICES = ( # Only the owner of the note has visibility. (NPRIV, _('Nota Privada')), - # All of the same group have visibility. - (NSTRL, _('Nota Setorial')), # All authenticated users have visibility. (NINST, _('Nota Institucional')), # All users have visibility. diff --git a/compilacao/templatetags/compilacao_filters.py b/compilacao/templatetags/compilacao_filters.py index 4bf6223b6..74d3b06ee 100644 --- a/compilacao/templatetags/compilacao_filters.py +++ b/compilacao/templatetags/compilacao_filters.py @@ -128,9 +128,17 @@ def nomenclatura(d): @register.simple_tag -def nomenclatura_heranca(d): +def nomenclatura_heranca(d, ignore_ultimo=0, ignore_primeiro=0): result = '' while d is not None: + + if ignore_ultimo and d.dispositivo_pai is None: + break + if ignore_primeiro: + ignore_primeiro = 0 + d = d.dispositivo_pai + continue + if d.rotulo != '': if d.tipo_dispositivo.rotulo_prefixo_texto != '': result = d.rotulo + ' ' + result @@ -141,4 +149,5 @@ def nomenclatura_heranca(d): result = '(' + d.tipo_dispositivo.nome + \ d.rotulo_padrao() + ')' + ' ' + result d = d.dispositivo_pai + return result diff --git a/compilacao/urls.py b/compilacao/urls.py index 75089ab82..571794788 100644 --- a/compilacao/urls.py +++ b/compilacao/urls.py @@ -34,6 +34,22 @@ urlpatterns_compilacao = [ '(?P[0-9]+)/nota/(?P[0-9]+)/delete$', views.NotasDeleteView.as_view(), name='nota_delete'), + url(r'^(?P[0-9]+)/compilacao/' + '(?P[0-9]+)/vide/create$', + views.VideCreateView.as_view(), name='vide_create'), + + url(r'^(?P[0-9]+)/compilacao/' + '(?P[0-9]+)/vide/(?P[0-9]+)/edit$', + views.VideEditView.as_view(), name='vide_edit'), + + url(r'^(?P[0-9]+)/compilacao/' + '(?P[0-9]+)/vide/(?P[0-9]+)/delete$', + views.VideDeleteView.as_view(), name='vide_delete'), + + url(r'^(?P[0-9]+)/compilacao/search$', + views.DispositivoSearchFragmentFormView.as_view(), + name='search_dispositivo'), + ] urlpatterns = [ diff --git a/compilacao/views.py b/compilacao/views.py index 3e8b09898..ed14100b0 100644 --- a/compilacao/views.py +++ b/compilacao/views.py @@ -2,31 +2,30 @@ from collections import OrderedDict from datetime import datetime, timedelta from os.path import sys -from django.contrib.auth.models import User +from django.contrib.auth.decorators import login_required from django.core.signing import Signer from django.core.urlresolvers import reverse from django.db.models import Q -from django.http.response import JsonResponse, HttpResponse,\ - HttpResponseRedirect -from django.shortcuts import render +from django.http.response import (HttpResponse, HttpResponseRedirect, + JsonResponse) +from django.shortcuts import get_object_or_404, render from django.utils.dateparse import parse_date +from django.utils.decorators import method_decorator from django.utils.translation import ugettext_lazy as _ from django.views.generic.base import TemplateView -from django.views.generic.detail import SingleObjectMixin -from django.views.generic.edit import FormMixin, UpdateView, DeleteView +from django.views.generic.edit import FormMixin, UpdateView from django.views.generic.list import ListView from vanilla.model_views import CreateView from compilacao import forms from compilacao.file2dispositivo import Parser -from compilacao.forms import NotaForm -from compilacao.models import (Dispositivo, PerfilEstruturalTextosNormativos, +from compilacao.models import (Dispositivo, Nota, + PerfilEstruturalTextosNormativos, TipoDispositivo, TipoNota, TipoPublicacao, - TipoVide, VeiculoPublicacao, Nota) + TipoVide, VeiculoPublicacao, Vide) from norma.models import NormaJuridica from sapl.crud import build_crud - DISPOSITIVO_SELECT_RELATED = ( 'tipo_dispositivo', 'norma_publicada', @@ -131,6 +130,22 @@ class CompilacaoView(ListView): inicio_vigencia = None fim_vigencia = None + def get_context_data(self, **kwargs): + context = super(CompilacaoView, self).get_context_data(**kwargs) + + vides = Vide.objects.filter( + Q(dispositivo_base__norma_id=self.kwargs['norma_id']) | + Q(dispositivo_ref__norma_id=self.kwargs['norma_id'])) + + context['cita'] = [v.dispositivo_base_id for v in vides] + context['citado'] = [v.dispositivo_ref_id for v in vides] + + notas = Nota.objects.filter( + dispositivo__norma_id=self.kwargs['norma_id']) + + context['notas'] = [n.dispositivo_id for n in notas] + return context + def get_queryset(self): self.flag_alteradora = -1 self.flag_nivel_ini = 0 @@ -153,11 +168,22 @@ class CompilacaoView(ListView): norma_id=self.kwargs['norma_id'], ).select_related(*DISPOSITIVO_SELECT_RELATED) else: - return Dispositivo.objects.filter( + + r = Dispositivo.objects.filter( ordem__gt=0, - norma_id=self.kwargs['norma_id'] - ).select_related(*DISPOSITIVO_SELECT_RELATED).prefetch_related( - 'notas',) + norma_id=self.kwargs['norma_id'], + ).select_related( + 'tipo_dispositivo', + 'norma_publicada', + 'norma', + 'dispositivo_atualizador', + 'dispositivo_atualizador__dispositivo_pai', + 'dispositivo_atualizador__dispositivo_pai__norma', + 'dispositivo_atualizador__dispositivo_pai__norma__tipo', + 'dispositivo_pai', + 'dispositivo_pai__tipo_dispositivo') + + return r def get_vigencias(self): itens = Dispositivo.objects.filter( @@ -1087,31 +1113,65 @@ class ActionsEditView(ActionsEditMixin, TemplateView): return self.render_to_json_response(context, **response_kwargs) -class NotasCreateView(FormMixin, CreateView): - template_name = 'compilacao/nota_ajaxform.html' - form_class = forms.NotaForm +class DispositivoSuccessUrlMixin(object): - def get(self, request, *args, **kwargs): + def get_success_url(self): + return reverse( + 'dispositivo', kwargs={ + 'norma_id': self.kwargs[ + 'norma_id'], + 'dispositivo_id': self.kwargs[ + 'dispositivo_id']}) + + +class NotaMixin(DispositivoSuccessUrlMixin): + def get_modelo_nota(self, request): + # TODO: permitir edição apenas das notas do usuário conectado + # TODO: tratar revalidação no método post + # TODO: não mostrar botão de edição na interface if 'action' in request.GET and request.GET['action'] == 'modelo_nota': tn = TipoNota.objects.get(pk=request.GET['id_tipo']) - return HttpResponse(tn.modelo) + return True, tn.modelo + return False, '' - return super(NotasCreateView, self).get(request, *args, **kwargs) + def get_initial(self): + dispositivo = get_object_or_404( + Dispositivo, pk=self.kwargs.get('dispositivo_id')) + initial = {'dispositivo': dispositivo} + + if 'pk' in self.kwargs: + initial['pk'] = self.kwargs.get('pk') + + return initial - def get_form_kwargs(self): - kwargs = super(NotasCreateView, self).get_form_kwargs() - kwargs.update(self.kwargs) - return kwargs + @method_decorator(login_required) + def dispatch(self, *args, **kwargs): + return super(NotaMixin, self).dispatch(*args, **kwargs) + + +class NotasCreateView(NotaMixin, FormMixin, CreateView): + template_name = 'compilacao/ajax_form.html' + form_class = forms.NotaForm + + def get(self, request, *args, **kwargs): + flag_action, modelo_nota = self.get_modelo_nota(request) + if flag_action: + return HttpResponse(modelo_nota) + + return super(NotasCreateView, self).get(request, *args, **kwargs) def post(self, request, *args, **kwargs): try: - form = NotaForm(request.POST, request.FILES, **kwargs) + norma_id = kwargs.pop('norma_id') + dispositivo_id = kwargs.pop('dispositivo_id') + form = forms.NotaForm(request.POST, request.FILES, **kwargs) + kwargs['norma_id'] = norma_id + kwargs['dispositivo_id'] = dispositivo_id if form.is_valid(): nt = form.save(commit=False) - # TODO: Implementar tratamento do usuário. - nt.owner_id = User.objects.order_by('id')[:1][0].pk + nt.owner_id = request.user.pk nt.save() self.kwargs['pk'] = nt.pk return self.form_valid(form) @@ -1121,59 +1181,147 @@ class NotasCreateView(FormMixin, CreateView): print(e) return HttpResponse("post") - def get_success_url(self): - return reverse( - 'dispositivo', kwargs={ - 'norma_id': self.kwargs[ - 'norma_id'], - 'dispositivo_id': self.kwargs[ - 'dispositivo_id']}) - -class NotasEditView(UpdateView): +class NotasEditView(NotaMixin, UpdateView): model = Nota - template_name = 'compilacao/nota_ajaxform.html' + template_name = 'compilacao/ajax_form.html' form_class = forms.NotaForm def get(self, request, *args, **kwargs): + flag_action, modelo_nota = self.get_modelo_nota(request) + if flag_action: + return HttpResponse(modelo_nota) + + return super(NotasEditView, self).get(request, *args, **kwargs) + + +class NotasDeleteView(NotaMixin, TemplateView): + + def get(self, request, *args, **kwargs): + nt = Nota.objects.get(pk=self.kwargs['pk']) + nt.delete() + return HttpResponseRedirect(self.get_success_url()) + + +class VideMixin(DispositivoSuccessUrlMixin): + + def get_initial(self): + dispositivo_base = get_object_or_404( + Dispositivo, pk=self.kwargs.get('dispositivo_id')) + + initial = {'dispositivo_base': dispositivo_base} + + if 'pk' in self.kwargs: + initial['pk'] = self.kwargs.get('pk') + + return initial + + @method_decorator(login_required) + def dispatch(self, *args, **kwargs): + return super(VideMixin, self).dispatch(*args, **kwargs) + + +class VideCreateView(VideMixin, FormMixin, CreateView): + template_name = 'compilacao/ajax_form.html' + form_class = forms.VideForm + + def post(self, request, *args, **kwargs): try: - # TODO: permitir edição apenas das notas do usuário conectado - # TODO: tratar revalidação no método post - # TODO: não mostrar botão de edição na interface - if 'action' in request.GET and request.GET['action'] == 'modelo_nota': - tn = TipoNota.objects.get(pk=request.GET['id_tipo']) - return HttpResponse(tn.modelo) - - return super(NotasEditView, self).get(request, *args, **kwargs) + norma_id = kwargs.pop('norma_id') + dispositivo_id = kwargs.pop('dispositivo_id') + form = forms.VideForm(request.POST, request.FILES, **kwargs) + kwargs['norma_id'] = norma_id + kwargs['dispositivo_id'] = dispositivo_id + + if form.is_valid(): + vd = form.save(commit=False) + vd.save() + self.kwargs['pk'] = vd.pk + return self.form_valid(form) + else: + return self.form_invalid(form) except Exception as e: print(e) + return HttpResponse("post") - def get_form_kwargs(self): - kwargs = super(NotasEditView, self).get_form_kwargs() - kwargs.update(self.kwargs) - return kwargs - def get_success_url(self): - return reverse( - 'dispositivo', kwargs={ - 'norma_id': self.kwargs[ - 'norma_id'], - 'dispositivo_id': self.kwargs[ - 'dispositivo_id']}) +class VideEditView(VideMixin, UpdateView): + model = Vide + template_name = 'compilacao/ajax_form.html' + form_class = forms.VideForm -class NotasDeleteView(TemplateView): +class VideDeleteView(VideMixin, TemplateView): def get(self, request, *args, **kwargs): - nt = Nota.objects.get(pk=self.kwargs['pk']) - success_url = self.get_success_url() - nt.delete() - return HttpResponseRedirect(success_url) + vd = Vide.objects.get(pk=self.kwargs['pk']) + vd.delete() + return HttpResponseRedirect(self.get_success_url()) - def get_success_url(self): - return reverse( - 'dispositivo', kwargs={ - 'norma_id': self.kwargs[ - 'norma_id'], - 'dispositivo_id': self.kwargs[ - 'dispositivo_id']}) + +class DispositivoSearchFragmentFormView(ListView): + template_name = 'compilacao/dispositivo_search_fragment_form.html' + + @method_decorator(login_required) + def dispatch(self, *args, **kwargs): + return super( + DispositivoSearchFragmentFormView, + self).dispatch(*args, **kwargs) + + def get_queryset(self): + try: + busca = '' + + if 'busca' in self.request.GET: + busca = self.request.GET['busca'] + + q = Q(nivel__gt=0) + busca = busca.split(' ') + n = 10 + + for item in busca: + + if not item: + continue + + if q: + q = q & (Q(dispositivo_pai__rotulo__icontains=item) | + Q(rotulo__icontains=item) | + Q(texto__icontains=item) | + Q(texto_atualizador__icontains=item)) + n = 50 + else: + q = (Q(dispositivo_pai__rotulo__icontains=item) | + Q(rotulo__icontains=item) | + Q(texto__icontains=item) | + Q(texto_atualizador__icontains=item)) + n = 50 + + if 'tipo_norma' in self.request.GET: + tipo_norma = self.request.GET['tipo_norma'] + if tipo_norma: + q = q & Q(norma__tipo_id=tipo_norma) + n = 50 + + if 'num_norma' in self.request.GET: + num_norma = self.request.GET['num_norma'] + if num_norma: + q = q & Q(norma__numero=num_norma) + n = 50 + + if 'ano_norma' in self.request.GET: + ano_norma = self.request.GET['ano_norma'] + if ano_norma: + q = q & Q(norma__ano=ano_norma) + n = 50 + + if 'initial_ref' in self.request.GET: + initial_ref = self.request.GET['initial_ref'] + if initial_ref: + q = q & Q(pk=initial_ref) + n = 50 + + return Dispositivo.objects.filter(q)[:n] + + except Exception as e: + print(e) diff --git a/norma/urls.py b/norma/urls.py index 5e55c8713..66ed716cf 100644 --- a/norma/urls.py +++ b/norma/urls.py @@ -1,7 +1,7 @@ from django.conf.urls import include, url -from norma.views import NormaIncluirView, assunto_norma_crud, tipo_norma_crud,\ - norma_temporario_crud +from norma.views import (NormaIncluirView, assunto_norma_crud, + norma_temporario_crud, tipo_norma_crud) norma_url_patterns = norma_temporario_crud.urlpatterns + [] # norma_url_patterns = norma_crud.urlpatterns + [] diff --git a/sapl/settings.py b/sapl/settings.py index 998d10b7d..52d0b2b53 100644 --- a/sapl/settings.py +++ b/sapl/settings.py @@ -60,8 +60,7 @@ INSTALLED_APPS = ( 'sass_processor', ) if DEBUG: - # INSTALLED_APPS += ('debug_toolbar',) - pass + INSTALLED_APPS += ('debug_toolbar',) MIDDLEWARE_CLASSES = ( 'django.contrib.sessions.middleware.SessionMiddleware', diff --git a/static/js/compilacao.js b/static/js/compilacao.js index 2adf251fa..6cd8fc345 100644 --- a/static/js/compilacao.js +++ b/static/js/compilacao.js @@ -33,3 +33,7 @@ function ReadCookie(cookieName) { if (ind1==-1) ind1=theCookie.length; return unescape(theCookie.substring(ind+cookieName.length+2,ind1)); } + +function insertWaitAjax(element) { + jQuery(element).append('
'); +} diff --git a/static/js/compilacao_notas.js b/static/js/compilacao_notas.js index c31b2873b..4c6a09bda 100644 --- a/static/js/compilacao_notas.js +++ b/static/js/compilacao_notas.js @@ -6,12 +6,18 @@ function onEventsDneExec(pk) { }, 300); $('.dateinput').fdatepicker({ - // TODO localize - format: 'dd/mm/yyyy', - language: 'pt', - endDate: '31/12/2100', - todayBtn: true - }); + // TODO localize + format: 'dd/mm/yyyy', + language: 'pt', + endDate: '31/12/2100', + todayBtn: true + }); + + $('#dne'+pk+" .primary").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 = ''; @@ -21,19 +27,71 @@ function onEventsDneExec(pk) { }); }); - $('#dne'+pk+" .button").click(onSubmitEditForm); + $('#dne'+pk+" select[name='tipo_norma']" + ).change(onChangeParamNorma); + + $('#dne'+pk+" input[name='num_norma'], " + + '#dne'+pk+" input[name='ano_norma'], " + + '#dne'+pk+" input[name='busca_dispositivo']" + ).change(onChangeParamNorma); + + $('#dne'+pk+" .btn-busca").click(onChangeParamNorma); + + onChangeParamNorma(); +} +var onChangeParamNorma = function(event) { + var tipo_norma = $("select[name='tipo_norma']").val(); + var num_norma = $("input[name='num_norma']").val(); + var ano_norma = $("input[name='ano_norma']").val(); + var busca_dispositivo = $("input[name='busca_dispositivo']").val(); + var dispositivo_ref = $("#id_dispositivo_ref").val(); + $('#id_dispositivo_ref').remove(); + + if (dispositivo_ref == null) + dispositivo_ref = '' + + var url = ''; + var pk = $("select[name='tipo_norma']").closest('.dne').attr('pk') + + var formData = { + 'tipo_norma' : tipo_norma, + 'num_norma' : num_norma, + 'ano_norma' : ano_norma, + 'busca' : busca_dispositivo, + 'tipo_form' : 'radio', + 'initial_ref' : dispositivo_ref + }; + + url = 'compilacao/search'; + $('.container-busca').html(''); + insertWaitAjax('.container-busca') + $.get(url, formData).done(function( data ) { + $('.container-busca').html(data); + $("input[name='dispositivo_ref']").first().prop('checked', true); + }); } var onSubmitEditForm = function(event) { + var url = ''; + var model = 'nota'; + var id_edit = null; var id_dispositivo = $('#id_dispositivo').val(); - var id_nota = $('#id_pk').val(); - var url = 'compilacao/'+id_dispositivo+'/nota/' - if (id_nota == '') + if (id_dispositivo == null) { // trata-se de um vide + $('#id_dispositivo_ref').remove(); + id_dispositivo = $('#id_dispositivo_base').val(); + model='vide'; + } + + id_edit = $('#id_pk').val(); + url = 'compilacao/'+id_dispositivo+'/'+model+'/' + if (id_edit == null || id_edit == '') url += 'create'; else - url += id_nota+'/edit'; + url += id_edit+'/edit'; + + console.log($('#dne'+id_dispositivo+" form").serialize()); $.post( url, $('#dne'+id_dispositivo+" form").serialize(), function(data) { @@ -44,7 +102,12 @@ var onSubmitEditForm = function(event) { } else { $('#dne'+id_dispositivo+' .dne-form').closest('.dpt').html(data) - onReadyNotas(); + onReadyNotasVides(); + + $('html, body').animate({ + scrollTop: $('#dne' + id_dispositivo ).offset().top - window.innerHeight / 3 + }, 300); + } } } @@ -52,55 +115,65 @@ var onSubmitEditForm = function(event) { } var onDelete = function(event) { + var model = $(event).attr('model'); + var id_dispositivo = $(event).closest('.dn').attr('pk'); - var id_nota = $(event).attr('pk'); - var url = 'compilacao/'+id_dispositivo+'/nota/'+id_nota+'/delete' + var id_delete = $(event).attr('pk'); + var url = 'compilacao/'+id_dispositivo+'/'+model+'/'+id_delete+'/delete'; $.get( url, function(data) { $('#dne'+id_dispositivo+' .dne-form').closest('.dpt').html(data) - onReadyNotas(); + onReadyNotasVides(); } ); } -function getFormNota(_this, _btn) { - var id_dispositivo = $('.dne-exec .dne-form').closest('.dne').attr('pk'); +function getForm(_this) { + + var url = ''; + var model = $(_this).attr('model'); + var id_dispositivo = $('.dne-nota .dne-form').closest('.dne').attr('pk'); if (id_dispositivo != null) { - $('#dne'+id_dispositivo).removeClass('dne-exec'); + $('#dne'+id_dispositivo).removeClass('dne-nota'); $('#dne'+id_dispositivo+' .dne-form').html(''); } - var url = ''; - if (_btn == 'btn-create') { + if (_this.className.indexOf('create') >= 0 ) { id_dispositivo = $(_this).attr('pk'); - url = 'compilacao/'+id_dispositivo+'/nota/create'; - } - else if (_btn == 'btn-edit') { - var id_nota = $(_this).attr('pk'); + url = 'compilacao/'+id_dispositivo+'/'+model+'/create'; + } + else if (_this.className.indexOf('edit') >= 0 ) { + var id_edit = $(_this).attr('pk'); id_dispositivo = $(_this).closest('.dn').attr('pk'); - url = 'compilacao/'+id_dispositivo+'/nota/'+id_nota+'/edit' + url = 'compilacao/'+id_dispositivo+'/'+model+'/'+id_edit+'/edit' } - $('#dne'+id_dispositivo).addClass('dne-exec'); + + $('#dne'+id_dispositivo).addClass('dne-nota'); $.get(url).done(function( data ) { $('#dne'+id_dispositivo+' .dne-form').html(data); onEventsDneExec(id_dispositivo); + }).fail(function() { + onReadyNotasVides(); }); } -function onReadyNotas() { - $('.dne .btn-create').off(); - $('.dne .btn-edit').off(); - $('.dne .btn-delete').off(); - $('.dne .btn-create').click(function(){ - getFormNota(this, 'btn-create') - }); - $('.dn .btn-edit').click(function(){ - getFormNota(this, 'btn-edit') + +function onReadyNotasVides() { + + $('.dne-nota').removeClass('dne-nota'); + $('.dne-form').html(''); + + $('.dne .btn-action').off(); + $('.dn .btn-action').off(); + + $('.dne .btn-action, .dn .btn-action').not('.btn-nota-delete').not('.btn-vide-delete').click(function(){ + getForm(this); }); - $('.dn .btn-delete').click(function(){ - onDelete(this, 'btn-delete') + + $('.dn .btn-nota-delete, .dn .btn-vide-delete').click(function(){ + onDelete(this); }); } $(document).ready(function() { - onReadyNotas() + onReadyNotasVides() }); diff --git a/static/styles/compilacao.scss b/static/styles/compilacao.scss index 923c01d95..f51ab838a 100644 --- a/static/styles/compilacao.scss +++ b/static/styles/compilacao.scss @@ -19,32 +19,34 @@ $color_actions_border: #CCC; @mixin placeholder($color, $opacity, $fontsize, $fontweight) { &::-webkit-input-placeholder { - color: $color; + color: $color !important; opacity: $opacity; font-size:$fontsize; font-weight: $fontweight; } &::-moz-placeholder { - color: $color; + color: $color !important; opacity: $opacity; font-size:$fontsize; font-weight: $fontweight; } &::-moz-placeholder { - color: $color; + color: $color !important; opacity: $opacity; font-size:$fontsize; font-weight: $fontweight; } &:-ms-input-placeholder { - color: $color; + color: $color !important; opacity: $opacity; font-size:$fontsize; font-weight: $fontweight; } } - +a:link:after, a:visited:after { + content: ""; +} @mixin li_flutuante() { @@ -142,7 +144,7 @@ $color_actions_border: #CCC; .cp { .desativado, .desativado * { text-decoration: line-through; - color: #777 !important; + color: #999 !important; table, table td { border: 1px dotted #ccc; @@ -273,7 +275,6 @@ $color_actions_border: #CCC; font-weight: normal; line-height: 1rem; position: relative; - text-decoration: none; p, ul { font-size: 0.8rem; font-weight: normal; @@ -281,14 +282,30 @@ $color_actions_border: #CCC; margin: 0 0 0 0; list-style: none; } + .dnl { /* Lista Notas de Dispositivo*/ display: block; - margin-left: 15%; + text-align: left !important; + + * { + display: inline; + } + .bullet { + padding: 0 0.333em; + padding-bottom: 0.2em; + display: inline-block; + } .dnli { - margin-top: 0.5em; - border-top: 1px solid #c7e3d3; - display: block; + min-height: 2.5em; + &:hover { + ul { + transition: opacity 0.5s linear, clip 0s 0.3s; + clip: auto; + opacity: 1; + background: rgba(230,230,230, 0.9); + } + } ul { transition: opacity 0.5s linear, clip 0s 0.3s; @@ -300,38 +317,27 @@ $color_actions_border: #CCC; padding: 0.5em 0.5em 0em 0.5em; border: 1px solid #c7e3d3; border-top: 0px; - } - - &:hover { - min-height: 2.5em; - ul { - transition: opacity 0.5s linear, clip 0s 0.3s; - clip: auto; - opacity: 1; - background: rgba(230,230,230, 0.9); - } - } - - li { - display: table-cell; - color: #aaa; - &.bullet { - padding: 0 0.333em; - padding-bottom: 0.2em; - } + li { + display: table-cell; + color: #aaa; - &:hover { - color: #787; - a{ + &:hover { + color: #787; + a{ + color: #27AE60 !important; + } + } + .nowner { color: #27AE60 !important; } } - } + .ntitulo { font-weight: bold; color: #676; font-size: 90%; + text-decoration: none; a{ color: #294 !important; } @@ -342,11 +348,24 @@ $color_actions_border: #CCC; color: #294 !important; } } - .nowner { - color: #27AE60; + } + &:hover { + display: block; + + + * { + display: block; + } + & > .bullet { + display: none; + } + .dnli { + margin-top: 0.5em; + border-top: 1px solid #c7e3d3; } } } + } .dptt { @@ -366,7 +385,7 @@ $color_actions_border: #CCC; font-size: 0.8rem; font-weight: normal; line-height: 1rem; - text-decoration: none; + text-decoration: none !important; } ul.btns-action { @@ -378,23 +397,32 @@ $color_actions_border: #CCC; opacity: 0; transition: opacity 1.5s linear, clip 1s linear; transition-delay: 0s; + border-collapse:separate; + border-spacing:0.5em; li { display: table-cell; - background-color: #ddd; - border-radius: 50%; a { + background-color: #DDD; border-radius: 50%; + width: 3rem; + height: 3rem; display: inline-block; - background: url(/static/img/hand-note.png) no-repeat 50% 50%; - padding: 1.2em 1.7em; + font-size: 203%; + line-height: 3rem; + text-align: center; + &.btn-nota-create { + background: #ddd url(/static/img/hand-note.png) no-repeat 50% 50%; + } + &.btn-vide-create { + } &:hover { - background-color: rgba(0, 150, 0, 0.1); + background-color: #Cdc ; } } } } } - .dne-exec { + .dne-nota { 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); @@ -413,10 +441,18 @@ $color_actions_border: #CCC; &::before { color: red; content: "\2b25"; - padding: 0.333em; + padding: 0 0.333em; vertical-align: super; } } + .title_form { + font-size: 2.5em; + padding: 0.5em 0.3em 0.2em; + background: #e5e5e5; + color: #777; + margin-bottom: 0.4em; + border-bottom: 1px solid #aaa; + } fieldset { border: 0px; } @@ -429,6 +465,9 @@ $color_actions_border: #CCC; margin-top: 1em; display: inline-block; } + .columns { + padding: 0 0.5rem; + } .input { border: 0px; border-bottom: 1px solid #ccc; @@ -440,6 +479,14 @@ $color_actions_border: #CCC; @include placeholder(#777, 1, 100%, normal); &:focus { background: #fafafa; + @include placeholder(#456, 1, 100%, normal); + } + } + .textinput{ + @include placeholder(#777, 1, 90%, normal); + &:focus { + background: #fafafa; + @include placeholder(#456, 1, 90%, normal); } } .textinput[name='titulo']{ @@ -448,6 +495,10 @@ $color_actions_border: #CCC; font-weight: bold; border-bottom: 0; @include placeholder(#777, 1, 100%, bold); + &:focus { + background: #fafafa; + @include placeholder(#777, 1, 100%, bold); + } } .textarea { @@ -464,14 +515,67 @@ $color_actions_border: #CCC; .button { width: 100%; margin-top: 1.6em; - height: 2.3125rem; padding: 0; + height: 2.835em; + } + .btn-busca { + margin-top: 1.25em; + } + .container-busca { + ul{ + list-style: none; + display: table; + margin-left: 0; + border-collapse:separate; + border-spacing:1px; + + 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%; + } + } + } + .norma_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: 3.2em; + height: 4.3em; transform: scaleY(1); transition-delay: 1s; @@ -486,7 +590,7 @@ $color_actions_border: #CCC; } } } - .dne-exec { + .dne-nota { transition-delay: 0s; height: auto; @@ -639,6 +743,9 @@ $color_actions_border: #CCC; *:hover { color: #27AE60; } + .de { + cursor: pointer; + } } .articulacao{ margin-left: -0.8em; @@ -1043,8 +1150,54 @@ $color_actions_border: #CCC; } } } +} +.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); + + .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; } @@ -1149,7 +1302,6 @@ $color_actions_border: #CCC; } } - @media print { .cp .vigencias { display:none; diff --git a/templates/compilacao/ajax_form.html b/templates/compilacao/ajax_form.html new file mode 100644 index 000000000..52cbf0e30 --- /dev/null +++ b/templates/compilacao/ajax_form.html @@ -0,0 +1,3 @@ +{% load crispy_forms_tags %} +
+{% crispy form form.helper%} diff --git a/templates/compilacao/dispositivo_search_fragment_form.html b/templates/compilacao/dispositivo_search_fragment_form.html new file mode 100644 index 000000000..636818388 --- /dev/null +++ b/templates/compilacao/dispositivo_search_fragment_form.html @@ -0,0 +1,43 @@ +{% load i18n %} +{% load compilacao_filters %} + +{% if object_list.count >= 100 %} +
+ {% trans 'Use argumentos para simplificar listagem...' %} +
+{% endif %} + +{% for dpt in object_list %} + {% ifchanged dpt.norma%} + {% if not forloop.first %}{% endif %} +
{{dpt.norma}}
+
    + {% endifchanged %} + + {% if dpt.is_relative_auto_insert and dpt.dispositivo_pai and dpt.dispositivo_pai.nivel != 0 %} + +
  • +
    + +
    +
    + + {% nomenclatura_heranca dpt 1 1 %} +
    +
  • + {% endif%} + + {% if not dpt.tipo_dispositivo.dispositivo_de_articulacao and not dpt.is_relative_auto_insert %} +
  • +
    + +
    +
    + + {% nomenclatura_heranca dpt 1 1 %} +
    +
  • + {% endif%} + + {% if forloop.last %}
{% endif %} +{% endfor %} diff --git a/templates/compilacao/edit_bloco.html b/templates/compilacao/edit_bloco.html index 27348e7c9..2a188f636 100644 --- a/templates/compilacao/edit_bloco.html +++ b/templates/compilacao/edit_bloco.html @@ -106,7 +106,7 @@ {% endif %}
{% 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 == '' and not dpt.tipo_dispositivo.dispositivo_de_articulacao %}({{dpt.tipo_dispositivo}} sem texto){%else%}{{ dpt.texto|safe }}{%endif%} +
{{ dpt.tipo_dispositivo.rotulo_prefixo_html|safe }}{{ dpt.rotulo }}{{ dpt.tipo_dispositivo.rotulo_sufixo_html|safe }}{{ dpt.tipo_dispositivo.texto_prefixo_html|safe }}{% if dpt.texto == '' and not dpt.tipo_dispositivo.dispositivo_de_articulacao %}({{dpt.tipo_dispositivo}} sem texto){%else%}{{ dpt.texto|safe }}{%endif%}
{% if dpt.norma_publicada_id != None and not dpt.tipo_dispositivo.dispositivo_de_articulacao %} {{ dpt.tipo_dispositivo.nota_automatica_prefixo_html|safe }} diff --git a/templates/compilacao/index_bloco.html b/templates/compilacao/index_bloco.html index a1ee1adb3..3cb398859 100644 --- a/templates/compilacao/index_bloco.html +++ b/templates/compilacao/index_bloco.html @@ -11,12 +11,12 @@ {% if forloop.first and view|isinst:'DispositivoView' %} {% else %} -
+
{% endif%} {% 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.norma_publicada_id != None and not dpt.tipo_dispositivo.dispositivo_de_articulacao %} @@ -25,57 +25,134 @@ {{ dpt.tipo_dispositivo.nota_automatica_sufixo_html|safe }} {% endif %} - {% if not dpt.tipo_dispositivo.dispositivo_de_articulacao%} -
{# TODO: User - dne - Dispostivo Nota Editor - tratar permissão de usuário#} - -
-
- {% endif%} + {% if user.is_authenticated and not dpt.tipo_dispositivo.dispositivo_de_articulacao%} + {% if perms.compilacao.add_nota or perms.compilacao.add_vide %} +
{# TODO: User - dne - Dispostivo Nota Editor - tratar permissão de usuário#} +
    + {% if perms.compilacao.add_nota %}
  •  
  • {% endif %} + {% if perms.compilacao.add_vide %}
  • V
  • {% endif %} +
+
+
+ {% endif %} + {% endif%}
+ {% if not dpt.tipo_dispositivo.dispositivo_de_articulacao%} -
{# Dispostivo Nota#} - -
    {# Dispostivo Nota Lista#} - {% for nota in dpt.notas.all %}{# TODO: User - dnl - Dispostivo Nota Editor - tratar permissão de usuário quanto a publicidade#} -
  • -
      -
    • Editar
    • {# TODO: User - tratar permissão usuário #} -
    • -
    • Excluir
    • {# TODO: User - tratar permissão usuário #} -
    • - -
    • {{nota.tipo.nome}}
    • -
    • -
    • {%if nota.owner.first_name%}{{nota.owner.first_name}}{%else%}{{nota.owner}}{%endif%}
    • -
    • -
    • {{nota.publicacao|date:"d M Y"}}
    • -
    - - {%if nota.titulo %} -
    +
    {# Dispostivo Nota e Vides #} +
      {# Dispostivo Nota Lista#} + {% if cita and dpt.pk in cita %} + {% for vide in dpt.cita.all %} + {%if not forloop.first %}
    • {%endif%} +
    • + +
        + {% if user.is_authenticated %} + {% if perms.compilacao.change_vide %} +
      • Editar
      • +
      • + {%endif%} + {% if perms.compilacao.delete_vide %} +
      • Excluir
      • +
      • + {%endif%} + {% endif %} +
      • {{vide.tipo.nome}}
      • +
      • +
      • {{vide.created|date:"d M Y"}}
      • +
      +
      Vide:
      +
      + {% if dpt.is_relative_auto_insert %} + {{ vide.dispositivo_ref.dispositivo_pai}} + {% else %} + {{ vide.dispositivo_ref}} + {% endif %} + {% if vide.texto %} - {{vide.texto}}{% endif %} +
      +
    • + {% endfor %} + {% endif %} + + {% if citado and dpt.pk in citado %} + {% for vide in dpt.citado.all %} + {%if not forloop.first %}
    • {%endif%} +
    • +
        +
      • {{vide.tipo.nome}}
      • +
      • +
      • {{vide.created|date:"d M Y"}}
      • +
      +
      Citado em:
      +
      + {% if dpt.is_relative_auto_insert %} + {{ vide.dispositivo_base.dispositivo_pai}} + {% else %} + {{ vide.dispositivo_base}} + {% endif %} + {% if vide.texto %} - {{vide.texto}}{% endif %} +
      +
    • + + {% endfor %} + {% endif %} + + + {%if notas and dpt.pk in notas and dpt.pk in cita or dpt.pk in citado and notas%}
    • {%endif%} + + {% if notas and dpt.pk in notas %} + + {% for nota in dpt.notas.all %} + + {% 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%} +
    • +
        + {% if user.is_authenticated %} + {% if user == nota.owner and perms.compilacao.change_nota or user.is_superuser%} +
      • Editar
      • +
      • + {% endif %} + {% if user == nota.owner and perms.compilacao.delete_nota or user.is_superuser %} +
      • Excluir
      • +
      • + {% endif %} + {% endif %} +
      • {{nota.tipo.nome}}
      • +
      • +
      • {%if nota.owner.first_name%}{{nota.owner.first_name}}{%else%}{{nota.owner}}{%endif%}
      • +
      • +
      • {{nota.publicacao|date:"d M Y"}}
      • +
      + + {%if nota.titulo %} +
      + {%if nota.url_externa %}{%endif%} + {{nota.titulo}} - + {%if nota.url_externa %}{%endif%} +
      + {%endif%} + +
      {%if nota.url_externa %}{%endif%} - {{nota.titulo}} - {%if nota.url_externa %}{%endif%} -
      - {%endif%} - -
      - {%if nota.url_externa %}{%endif%} - {{ nota.texto}} - {%if nota.url_externa %}{%endif%} -
      - -{%comment%} -
        -
      • {{nota.efetividade|date:"d M Y"}}
      • -
      • -
      • {{nota.get_publicidade_display}}
      • -
      -{%endcomment%} -
    • {# Dispostivo Nota Lista Item#} - {% endfor %} + {{ nota.texto}} + {%if nota.url_externa %}{%endif%} +
    + + {%comment%} +
      +
    • {{nota.efetividade|date:"d M Y"}}
    • +
    • +
    • {{nota.get_publicidade_display}}
    • +
    + {%endcomment%} +
  • + {% endif %} + + + + {% endfor %} + {% endif %}
{% endif%} diff --git a/templates/compilacao/index_bloco_alteracao.html b/templates/compilacao/index_bloco_alteracao.html index e5925a8ac..ef12970ed 100644 --- a/templates/compilacao/index_bloco_alteracao.html +++ b/templates/compilacao/index_bloco_alteracao.html @@ -3,9 +3,9 @@ {% spaceless %}
-
+ {{ ch.tipo_dispositivo.rotulo_prefixo_html|safe }}{{ ch.rotulo }}{{ ch.tipo_dispositivo.rotulo_sufixo_html|safe }}{{ ch.tipo_dispositivo.texto_prefixo_html|safe }}{{ ch.texto|safe }} -
+
{% endspaceless %} diff --git a/templates/compilacao/nota_ajaxform.html b/templates/compilacao/nota_ajaxform.html deleted file mode 100644 index 8b032736f..000000000 --- a/templates/compilacao/nota_ajaxform.html +++ /dev/null @@ -1,3 +0,0 @@ -{% load crispy_forms_tags %} -{% crispy form form.helper%} -