From 350475a1dbd27071a0f4c4b7407d85ab0fab432a Mon Sep 17 00:00:00 2001 From: Leandro Roberto Date: Wed, 6 Feb 2019 16:58:26 -0200 Subject: [PATCH 01/33] =?UTF-8?q?corrige=20l=C3=B3gica=20de=20tratamento?= =?UTF-8?q?=20de=20despachos=20iniciais?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/materia/forms.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py index c8ba3e4cf..cdb21021d 100644 --- a/sapl/materia/forms.py +++ b/sapl/materia/forms.py @@ -196,7 +196,7 @@ class MateriaLegislativaForm(ModelForm): def __init__(self, *args, **kwargs): super(MateriaLegislativaForm, self).__init__(*args, **kwargs) - + self.fields['ementa'].widget.attrs['maxlength'] = 1000 if self.instance and self.instance.pk: @@ -989,8 +989,9 @@ class DespachoInicialForm(ModelForm): if DespachoInicial.objects.filter( materia=self.instance.materia, comissao=self.cleaned_data['comissao'], - ).exists(): - msg = _('Esse Despacho já foi cadastrado.') + ).exclude(pk=self.instance.pk).exists(): + msg = _('Já existe um Despacho cadastrado para %s' % + self.cleaned_data['comissao']) raise ValidationError(msg) return self.cleaned_data From efe2a39d5c6cac2eecd87564ffa892a8492937cb Mon Sep 17 00:00:00 2001 From: Leandro Roberto Date: Wed, 6 Feb 2019 17:10:26 -0200 Subject: [PATCH 02/33] Fix #2474 --- sapl/base/forms.py | 15 ++++++++++----- sapl/materia/forms.py | 9 +++++---- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/sapl/base/forms.py b/sapl/base/forms.py index d603ffc45..f24868ff6 100644 --- a/sapl/base/forms.py +++ b/sapl/base/forms.py @@ -18,14 +18,15 @@ from django.utils.translation import string_concat from django.utils.translation import ugettext_lazy as _ import django_filters +from sapl.audiencia.models import AudienciaPublica, TipoAudienciaPublica from sapl.audiencia.models import AudienciaPublica, TipoAudienciaPublica from sapl.base.models import Autor, TipoAutor from sapl.comissoes.models import Reuniao, Comissao +from sapl.comissoes.models import Reuniao, Comissao from sapl.crispy_layout_mixin import (SaplFormLayout, form_actions, to_column, to_row) -from sapl.audiencia.models import AudienciaPublica,TipoAudienciaPublica -from sapl.comissoes.models import Reuniao, Comissao -from sapl.materia.models import (MateriaLegislativa, UnidadeTramitacao, StatusTramitacao) +from sapl.materia.models import ( + MateriaLegislativa, UnidadeTramitacao, StatusTramitacao) from sapl.norma.models import (NormaJuridica, NormaEstatisticas) from sapl.parlamentares.models import SessaoLegislativa from sapl.sessao.models import SessaoPlenaria @@ -706,7 +707,7 @@ class RelatorioAtasFilterSet(django_filters.FilterSet): def ultimo_ano_com_norma(): anos_normas = choice_anos_com_normas() - + if anos_normas: return anos_normas[0] return '' @@ -754,7 +755,7 @@ class EstatisticasAcessoNormasForm(Form): class Meta: fields = ['ano'] - + def __init__(self, *args, **kwargs): super(EstatisticasAcessoNormasForm, self).__init__( *args, **kwargs) @@ -857,7 +858,11 @@ class RelatorioHistoricoTramitacaoFilterSet(django_filters.FilterSet): self.filters['tipo'].label = 'Tipo de Matéria' + self.filters['tramitacao__unidade_tramitacao_local' + ].label = _('Unidade Local (Último Local)') + self.filters['tramitacao__status'].label = _('Status') row1 = to_row([('tramitacao__data_tramitacao', 12)]) + row2 = to_row( [('tipo', 4), ('tramitacao__unidade_tramitacao_local', 4), diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py index cdb21021d..85659ff78 100644 --- a/sapl/materia/forms.py +++ b/sapl/materia/forms.py @@ -1160,10 +1160,11 @@ class TramitacaoEmLoteFilterSet(django_filters.FilterSet): super(TramitacaoEmLoteFilterSet, self).__init__( *args, **kwargs) - self.filters['tipo'].label = 'Tipo de Matéria' - self.filters['data_apresentacao'].label = 'Data (Inicial - Final)' + self.filters['tipo'].label = _('Tipo de Matéria') + self.filters['data_apresentacao'].label = _('Data (Inicial - Final)') self.filters['tramitacao__unidade_tramitacao_destino' - ].label = 'Unidade Destino (Último Destino)' + ].label = _('Unidade Destino (Último Destino)') + self.filters['tramitacao__status'].label = _('Status') self.form.fields['tipo'].required = True self.form.fields['data_apresentacao'].required = False self.form.fields['tramitacao__status'].required = True @@ -1180,7 +1181,7 @@ class TramitacaoEmLoteFilterSet(django_filters.FilterSet): self.form.helper.form_method = 'GET' self.form.helper.layout = Layout( Fieldset(_('Tramitação em Lote'), - row1, row2, form_actions(label='Pesquisar'))) + row1, row2, form_actions(label=_('Pesquisar')))) class TipoProposicaoForm(ModelForm): From 6d01901ef240e7e5194ca84a2c7e3ab689d01d9c Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Wed, 6 Feb 2019 17:51:54 -0200 Subject: [PATCH 03/33] Release: 3.1.143 --- docker-compose.yml | 2 +- sapl/templates/base.html | 2 +- setup.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 5b0ee2315..ab841b87b 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -11,7 +11,7 @@ sapldb: ports: - "5432:5432" sapl: - image: interlegis/sapl:3.1.142 + image: interlegis/sapl:3.1.143 restart: always environment: ADMIN_PASSWORD: interlegis diff --git a/sapl/templates/base.html b/sapl/templates/base.html index 84deb4b60..b13a9e3b4 100644 --- a/sapl/templates/base.html +++ b/sapl/templates/base.html @@ -184,7 +184,7 @@ Desenvolvido pelo Interlegis em software livre e aberto. - Release: 3.1.142 + Release: 3.1.143

diff --git a/setup.py b/setup.py index 31cf08684..fb680f72c 100644 --- a/setup.py +++ b/setup.py @@ -51,7 +51,7 @@ install_requires = [ ] setup( name='interlegis-sapl', - version='3.1.142', + version='3.1.143', packages=find_packages(), include_package_data=True, license='GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007', From 719d4c928a9bd8cfd3746f447f0bc5451de03ad7 Mon Sep 17 00:00:00 2001 From: Cesar Carvalho Date: Fri, 8 Feb 2019 15:58:23 -0200 Subject: [PATCH 04/33] HOTFIX - Erro de data do timestamp de protocoloadm --- sapl/materia/models.py | 2 ++ sapl/materia/views.py | 8 +++++++- sapl/protocoloadm/views.py | 5 ++--- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/sapl/materia/models.py b/sapl/materia/models.py index 221078811..1adb21ea5 100644 --- a/sapl/materia/models.py +++ b/sapl/materia/models.py @@ -269,6 +269,8 @@ class MateriaLegislativa(models.Model): if protocolo: if protocolo.timestamp: return protocolo.timestamp.date() + elif protocolo.timestamp_data_hora_manual: + return protocolo.timestamp_data_hora_manual.date() elif protocolo.data: return protocolo.data diff --git a/sapl/materia/views.py b/sapl/materia/views.py index c3036d52e..47cb857af 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -211,7 +211,13 @@ class CriarProtocoloMateriaView(CreateView): context['form'].fields['tipo'].initial = protocolo.tipo_materia context['form'].fields['numero'].initial = numero context['form'].fields['ano'].initial = protocolo.ano - context['form'].fields['data_apresentacao'].initial = protocolo.timestamp.date() + if protocolo: + if protocolo.timestamp: + context['form'].fields['data_apresentacao'].initial = protocolo.timestamp.date() + elif protocolo.timestamp_data_hora_manual: + context['form'].fields['data_apresentacao'].initial = protocolo.timestamp_data_hora_manual.date() + elif protocolo.data: + context['form'].fields['data_apresentacao'].initial = protocolo.data context['form'].fields['numero_protocolo'].initial = protocolo.numero context['form'].fields['ementa'].initial = protocolo.assunto_ementa diff --git a/sapl/protocoloadm/views.py b/sapl/protocoloadm/views.py index f91ee5227..a750d1881 100755 --- a/sapl/protocoloadm/views.py +++ b/sapl/protocoloadm/views.py @@ -730,8 +730,8 @@ class ProtocoloMateriaView(PermissionRequiredMixin, CreateView): if protocolo.numero < (numero['numero__max'] + 1): self.logger.error("user=" + username + ". Número de protocolo ({}) é menor que {}" .format(protocolo.numero, numero['numero__max'])) - msg = _('Número de protocolo deve ser maior que {}').format( - numero['numero__max']) + msg = _('Número de protocolo deve ser maior que {}'.format( + numero['numero__max'])) messages.add_message(self.request, messages.ERROR, msg) return self.render_to_response(self.get_context_data()) protocolo.ano = timezone.now().year @@ -757,7 +757,6 @@ class ProtocoloMateriaView(PermissionRequiredMixin, CreateView): protocolo.hora = None protocolo.user_data_hora_manual = '' protocolo.ip_data_hora_manual = '' - protocolo.save() data = form.cleaned_data if data['vincular_materia'] == 'True': From 9e62f0626346700345eec0310dda9f926adb0260 Mon Sep 17 00:00:00 2001 From: Edward Date: Fri, 8 Feb 2019 18:40:39 -0200 Subject: [PATCH 05/33] Fixes #2482 (#2483) --- sapl/templates/search/search.html | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/sapl/templates/search/search.html b/sapl/templates/search/search.html index a5103d47d..12b7e07fb 100644 --- a/sapl/templates/search/search.html +++ b/sapl/templates/search/search.html @@ -42,7 +42,11 @@ {% if query %} - + {% for result in page.object_list %} From 4cdc78788f8985d37da34ede4bcebb2fa5954615 Mon Sep 17 00:00:00 2001 From: Leandro Roberto Date: Sat, 9 Feb 2019 22:01:08 -0200 Subject: [PATCH 06/33] =?UTF-8?q?ajustas=20heran=C3=A7as=20de=20sele=C3=A7?= =?UTF-8?q?=C3=A3o=20baseada=20em=20content=5Ftypes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - muda BancadaCrud(Crud) para BancadaCrud(CrudAux) e BlocoCrud(Crud) para BlocoCrud(CrudAux) e adequa forma de buscar TipoAutor em metodos save de formulários que criam Autores automaticamente. --- sapl/comissoes/forms.py | 118 +++++++++++++++++++----------------- sapl/materia/forms.py | 2 +- sapl/parlamentares/forms.py | 61 ++++++++++--------- sapl/sessao/forms.py | 4 +- sapl/sessao/views.py | 17 ++---- 5 files changed, 102 insertions(+), 100 deletions(-) diff --git a/sapl/comissoes/forms.py b/sapl/comissoes/forms.py index 14d42f53e..cef967102 100644 --- a/sapl/comissoes/forms.py +++ b/sapl/comissoes/forms.py @@ -13,10 +13,13 @@ from sapl.comissoes.models import (Comissao, Composicao, DocumentoAcessorio, Participacao, Reuniao, Periodo) from sapl.parlamentares.models import Legislatura, Mandato, Parlamentar + class ComposicaoForm(forms.ModelForm): - comissao = forms.CharField(required=False, label='Comissao', widget=forms.HiddenInput()) + comissao = forms.CharField( + required=False, label='Comissao', widget=forms.HiddenInput()) logger = logging.getLogger(__name__) + class Meta: model = Composicao exclude = [] @@ -43,8 +46,8 @@ class ComposicaoForm(forms.ModelForm): if intersecao_periodo: self.logger.error('O período informado ({} a {})' - 'choca com períodos já ' - 'cadastrados para esta comissão'.format(periodo.data_inicio, periodo.data_fim)) + 'choca com períodos já ' + 'cadastrados para esta comissão'.format(periodo.data_inicio, periodo.data_fim)) raise ValidationError('O período informado ' 'choca com períodos já ' 'cadastrados para esta comissão') @@ -55,6 +58,7 @@ class ComposicaoForm(forms.ModelForm): class PeriodoForm(forms.ModelForm): logger = logging.getLogger(__name__) + class Meta: model = Periodo exclude = [] @@ -70,31 +74,29 @@ class PeriodoForm(forms.ModelForm): if data_fim and data_fim < data_inicio: self.logger.error('A Data Final ({}) é menor que ' - 'a Data Inicial({}).'.format(data_fim, data_inicio)) + 'a Data Inicial({}).'.format(data_fim, data_inicio)) raise ValidationError('A Data Final não pode ser menor que ' - 'a Data Inicial') + 'a Data Inicial') # Evita NoneType exception se não preenchida a data_fim if not data_fim: data_fim = data_inicio legislatura = Legislatura.objects.filter(data_inicio__lte=data_inicio, - data_fim__gte=data_fim, - ) + data_fim__gte=data_fim, + ) if not legislatura: self.logger.error('O período informado ({} a {})' - 'não está contido em uma única ' - 'legislatura existente'.format(data_inicio, data_fim)) + 'não está contido em uma única ' + 'legislatura existente'.format(data_inicio, data_fim)) raise ValidationError('O período informado ' 'deve estar contido em uma única ' 'legislatura existente') - return cleaned_data - class ParticipacaoCreateForm(forms.ModelForm): logger = logging.getLogger(__name__) @@ -122,9 +124,9 @@ class ParticipacaoCreateForm(forms.ModelForm): parlamentares = Mandato.objects.filter(qs, parlamentar__ativo=True ).prefetch_related('parlamentar').\ - values_list('parlamentar', - flat=True - ).distinct() + values_list('parlamentar', + flat=True + ).distinct() qs = Parlamentar.objects.filter(id__in=parlamentares).distinct().\ exclude(id__in=id_part) @@ -137,7 +139,6 @@ class ParticipacaoCreateForm(forms.ModelForm): qs = Parlamentar.objects.filter(id__in=ids) self.fields['parlamentar'].queryset = qs - def clean(self): cleaned_data = super(ParticipacaoCreateForm, self).clean() @@ -148,22 +149,23 @@ class ParticipacaoCreateForm(forms.ModelForm): data_desligamento = cleaned_data['data_desligamento'] if data_desligamento and \ - data_designacao > data_desligamento: + data_designacao > data_desligamento: self.logger.error('Data de designação ({}) superior ' - 'à data de desligamento ({})'.format(data_designacao, data_desligamento)) + 'à data de desligamento ({})'.format(data_designacao, data_desligamento)) raise ValidationError(_('Data de designação não pode ser superior ' - 'à data de desligamento')) + 'à data de desligamento')) composicao = Composicao.objects.get(id=self.initial['parent_pk']) - cargos_unicos = [c.cargo.nome for c in composicao.participacao_set.filter(cargo__unico=True)] + cargos_unicos = [ + c.cargo.nome for c in composicao.participacao_set.filter(cargo__unico=True)] if cleaned_data['cargo'].nome in cargos_unicos: msg = _('Este cargo é único para esta Comissão.') - self.logger.error('Este cargo ({}) é único para esta Comissão.'.format(cleaned_data['cargo'].nome)) + self.logger.error('Este cargo ({}) é único para esta Comissão.'.format( + cleaned_data['cargo'].nome)) raise ValidationError(msg) return cleaned_data - def create_participacao(self): composicao = Composicao.objects.get(id=self.initial['parent_pk']) data_inicio_comissao = composicao.periodo.data_inicio @@ -237,9 +239,9 @@ class ParticipacaoEditForm(forms.ModelForm): if data_desligamento and \ data_designacao > data_desligamento: self.logger.error('Data de designação ({}) superior ' - 'à data de desligamento ({})'.format(data_designacao, data_desligamento)) + 'à data de desligamento ({})'.format(data_designacao, data_desligamento)) raise ValidationError(_('Data de designação não pode ser superior ' - 'à data de desligamento')) + 'à data de desligamento')) composicao_id = self.instance.composicao_id @@ -250,7 +252,7 @@ class ParticipacaoEditForm(forms.ModelForm): if cleaned_data['cargo'].nome in cargos_unicos: msg = _('Este cargo é único para esta Comissão.') self.logger.error('Este cargo ({}) é único para esta Comissão (id={}).' - .format(cleaned_data['cargo'].nome, composicao_id)) + .format(cleaned_data['cargo'].nome, composicao_id)) raise ValidationError(msg) return cleaned_data @@ -259,6 +261,7 @@ class ParticipacaoEditForm(forms.ModelForm): class ComissaoForm(forms.ModelForm): logger = logging.getLogger(__name__) + class Meta: model = Comissao fields = '__all__' @@ -274,8 +277,6 @@ class ComissaoForm(forms.ModelForm): self.fields['data_prorrogada_temp'].widget.attrs['disabled'] = 'disabled' self.fields['data_fim_comissao'].widget.attrs['disabled'] = 'disabled' - - def clean(self): super(ComissaoForm, self).clean() @@ -283,51 +284,54 @@ class ComissaoForm(forms.ModelForm): return self.cleaned_data if len(self.cleaned_data['nome']) > 100: - msg = _('Nome da Comissão informado ({}) tem mais de 50 caracteres.'.format(self.cleaned_data['nome'])) - self.logger.error('Nome da Comissão deve ter no máximo 50 caracteres.') + msg = _('Nome da Comissão informado ({}) tem mais de 50 caracteres.'.format( + self.cleaned_data['nome'])) + self.logger.error( + 'Nome da Comissão deve ter no máximo 50 caracteres.') raise ValidationError(msg) if (self.cleaned_data['data_extincao'] and self.cleaned_data['data_extincao'] < self.cleaned_data['data_criacao']): - msg = _('Data de extinção não pode ser menor que a de criação') - self.logger.error('Data de extinção ({}) não pode ser menor que a de criação ({}).' - .format(self.cleaned_data['data_extincao'],self.cleaned_data['data_criacao'])) - raise ValidationError(msg) + msg = _('Data de extinção não pode ser menor que a de criação') + self.logger.error('Data de extinção ({}) não pode ser menor que a de criação ({}).' + .format(self.cleaned_data['data_extincao'], self.cleaned_data['data_criacao'])) + raise ValidationError(msg) if (self.cleaned_data['data_final_prevista_temp'] and self.cleaned_data['data_final_prevista_temp'] < self.cleaned_data['data_criacao']): - msg = _('Data Prevista para Término não pode ser menor que a de criação') - self.logger.error('Data Prevista para Término ({}) não pode ser menor que a de criação ({}).' - .format(self.cleaned_data['data_final_prevista_temp'], self.cleaned_data['data_criacao'])) - raise ValidationError(msg) + msg = _('Data Prevista para Término não pode ser menor que a de criação') + self.logger.error('Data Prevista para Término ({}) não pode ser menor que a de criação ({}).' + .format(self.cleaned_data['data_final_prevista_temp'], self.cleaned_data['data_criacao'])) + raise ValidationError(msg) if (self.cleaned_data['data_prorrogada_temp'] and self.cleaned_data['data_prorrogada_temp'] < self.cleaned_data['data_criacao']): - msg = _('Data Novo Prazo não pode ser menor que a de criação') - self.logger.error('Data Novo Prazo ({}) não pode ser menor que a de criação ({}).' - .format(self.cleaned_data['data_prorrogada_temp'], self.cleaned_data['data_criacao'])) - raise ValidationError(msg) + msg = _('Data Novo Prazo não pode ser menor que a de criação') + self.logger.error('Data Novo Prazo ({}) não pode ser menor que a de criação ({}).' + .format(self.cleaned_data['data_prorrogada_temp'], self.cleaned_data['data_criacao'])) + raise ValidationError(msg) if (self.cleaned_data['data_instalacao_temp'] and self.cleaned_data['data_instalacao_temp'] < self.cleaned_data['data_criacao']): - msg = _('Data de Instalação não pode ser menor que a de criação') - self.logger.error('Data de Instalação ({}) não pode ser menor que a de criação ({}).' - .format(self.cleaned_data['data_instalacao_temp'], self.cleaned_data['data_criacao'])) - raise ValidationError(msg) + msg = _('Data de Instalação não pode ser menor que a de criação') + self.logger.error('Data de Instalação ({}) não pode ser menor que a de criação ({}).' + .format(self.cleaned_data['data_instalacao_temp'], self.cleaned_data['data_criacao'])) + raise ValidationError(msg) if (self.cleaned_data['data_final_prevista_temp'] and self.cleaned_data['data_instalacao_temp'] and self.cleaned_data['data_final_prevista_temp'] < self.cleaned_data['data_instalacao_temp']): - msg = _('Data Prevista para Término não pode ser menor que a de Instalação.') - self.logger.error('Data Prevista para Término ({}) não pode ser menor que a de Instalação ({}).' - .format(self.cleaned_data['data_final_prevista_temp'], self.cleaned_data['data_instalacao_temp'])) - raise ValidationError(msg) + msg = _( + 'Data Prevista para Término não pode ser menor que a de Instalação.') + self.logger.error('Data Prevista para Término ({}) não pode ser menor que a de Instalação ({}).' + .format(self.cleaned_data['data_final_prevista_temp'], self.cleaned_data['data_instalacao_temp'])) + raise ValidationError(msg) if (self.cleaned_data['data_prorrogada_temp'] and self.cleaned_data['data_instalacao_temp'] and self.cleaned_data['data_prorrogada_temp'] < self.cleaned_data['data_instalacao_temp']): - msg = _('Data Novo Prazo não pode ser menor que a de Instalação.') - self.logger.error('Data Novo Prazo ({}) não pode ser menor que a de Instalação ({}).' - .format(self.cleaned_data['data_prorrogada_temp'], self.cleaned_data['data_instalacao_temp'])) - raise ValidationError(msg) + msg = _('Data Novo Prazo não pode ser menor que a de Instalação.') + self.logger.error('Data Novo Prazo ({}) não pode ser menor que a de Instalação ({}).' + .format(self.cleaned_data['data_prorrogada_temp'], self.cleaned_data['data_instalacao_temp'])) + raise ValidationError(msg) return self.cleaned_data @transaction.atomic @@ -337,7 +341,7 @@ class ComissaoForm(forms.ModelForm): comissao = super(ComissaoForm, self).save(commit) content_type = ContentType.objects.get_for_model(Comissao) object_id = comissao.pk - tipo = TipoAutor.objects.get(descricao__icontains='Comiss') + tipo = TipoAutor.objects.get(content_type=content_type) nome = comissao.sigla + ' - ' + comissao.nome Autor.objects.create( content_type=content_type, @@ -363,7 +367,6 @@ class ReuniaoForm(ModelForm): def clean(self): super(ReuniaoForm, self).clean() - if not self.is_valid(): return self.cleaned_data @@ -371,12 +374,14 @@ class ReuniaoForm(ModelForm): if self.cleaned_data['hora_fim']: if (self.cleaned_data['hora_fim'] < self.cleaned_data['hora_inicio']): - msg = _('A hora de término da reunião não pode ser menor que a de início') + msg = _( + 'A hora de término da reunião não pode ser menor que a de início') self.logger.error("A hora de término da reunião ({}) não pode ser menor que a de início ({})." - .format(self.cleaned_data['hora_fim'], self.cleaned_data['hora_inicio'])) + .format(self.cleaned_data['hora_fim'], self.cleaned_data['hora_inicio'])) raise ValidationError(msg) return self.cleaned_data + class DocumentoAcessorioCreateForm(forms.ModelForm): parent_pk = forms.CharField(required=False) # widget=forms.HiddenInput()) @@ -395,7 +400,6 @@ class DocumentoAcessorioCreateForm(forms.ModelForm): documentos = reuniao.documentoacessorio_set.all() return self.create_documentoacessorio() - def create_documentoacessorio(self): reuniao = Reuniao.objects.get(id=self.initial['parent_pk']) diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py index 85659ff78..7e6b5afe0 100644 --- a/sapl/materia/forms.py +++ b/sapl/materia/forms.py @@ -96,7 +96,7 @@ class OrgaoForm(ModelForm): orgao = super(OrgaoForm, self).save(commit) content_type = ContentType.objects.get_for_model(Orgao) object_id = orgao.pk - tipo = TipoAutor.objects.get(descricao='Órgão') + tipo = TipoAutor.objects.get(content_type=content_type) nome = orgao.nome + ' - ' + orgao.sigla Autor.objects.create( content_type=content_type, diff --git a/sapl/parlamentares/forms.py b/sapl/parlamentares/forms.py index a15a4e305..a0ef549a4 100755 --- a/sapl/parlamentares/forms.py +++ b/sapl/parlamentares/forms.py @@ -1,6 +1,5 @@ -import logging - from datetime import timedelta +import logging from crispy_forms.helper import FormHelper from crispy_forms.layout import Fieldset, Layout @@ -46,8 +45,8 @@ def validar_datas_legislatura(eleicao, inicio, fim, pk=None): # Verifica se data de eleição < inicio < fim if inicio >= fim or eleicao >= inicio: logger.error('A data início ({}) deve ser menor que a ' + - 'data fim ({}) e a data eleição ({}) deve ser ' + - 'menor que a data início ({})'.format(inicio, fim, eleicao, inicio)) + 'data fim ({}) e a data eleição ({}) deve ser ' + + 'menor que a data início ({})'.format(inicio, fim, eleicao, inicio)) msg_error = _('A data início deve ser menor que a ' + 'data fim e a data eleição deve ser ' + 'menor que a data início') @@ -66,7 +65,8 @@ def validar_datas_legislatura(eleicao, inicio, fim, pk=None): # Verifica se há alguma outra data de eleição cadastrada if Legislatura.objects.filter( data_eleicao=eleicao).exclude(pk=pk).exists(): - logger.error("Esta data de eleição ({}) já foi cadastrada.".format(eleicao)) + logger.error( + "Esta data de eleição ({}) já foi cadastrada.".format(eleicao)) msg_error = _('Esta data de eleição já foi cadastrada') return (False, msg_error) @@ -75,6 +75,7 @@ def validar_datas_legislatura(eleicao, inicio, fim, pk=None): class MandatoForm(ModelForm): logger = logging.getLogger(__name__) + class Meta: model = Mandato fields = ['legislatura', 'coligacao', 'votos_recebidos', @@ -108,30 +109,30 @@ class MandatoForm(ModelForm): if (data_fim_mandato < legislatura.data_inicio or data_fim_mandato > legislatura.data_fim): self.logger.error("Data fim mandato ({}) fora do intervalo" - " de legislatura informada ({} a {})." - .format(data_fim_mandato, legislatura.data_inicio, legislatura.data_fim)) + " de legislatura informada ({} a {})." + .format(data_fim_mandato, legislatura.data_inicio, legislatura.data_fim)) raise ValidationError(_("Data fim mandato fora do intervalo de" " legislatura informada")) data_expedicao_diploma = data['data_expedicao_diploma'] if (data_expedicao_diploma and data_expedicao_diploma > data_inicio_mandato): - self.logger.error("A data da expedição do diploma ({}) deve ser anterior " - "a data de início do mandato ({}).".format(data_expedicao_diploma, data_inicio_mandato)) - raise ValidationError(_("A data da expedição do diploma deve ser anterior " - "a data de início do mandato")) + self.logger.error("A data da expedição do diploma ({}) deve ser anterior " + "a data de início do mandato ({}).".format(data_expedicao_diploma, data_inicio_mandato)) + raise ValidationError(_("A data da expedição do diploma deve ser anterior " + "a data de início do mandato")) coligacao = data['coligacao'] if coligacao and not coligacao.legislatura == legislatura: - self.logger.error("A coligação selecionada ({}) não está cadastrada " - "na mesma legislatura ({}) que o presente mandato ({}), " - "favor verificar a coligação ou fazer o cadastro " - "de uma nova coligação na legislatura correspondente" - .format(coligacao, coligacao.legislatura, legislatura)) - raise ValidationError(_("A coligação selecionada não está cadastrada " - "na mesma legislatura que o presente mandato, " - "favor verificar a coligação ou fazer o cadastro " - "de uma nova coligação na legislatura correspondente")) + self.logger.error("A coligação selecionada ({}) não está cadastrada " + "na mesma legislatura ({}) que o presente mandato ({}), " + "favor verificar a coligação ou fazer o cadastro " + "de uma nova coligação na legislatura correspondente" + .format(coligacao, coligacao.legislatura, legislatura)) + raise ValidationError(_("A coligação selecionada não está cadastrada " + "na mesma legislatura que o presente mandato, " + "favor verificar a coligação ou fazer o cadastro " + "de uma nova coligação na legislatura correspondente")) existe_mandato = Mandato.objects.filter( parlamentar=data['parlamentar'], @@ -158,7 +159,6 @@ class LegislaturaForm(ModelForm): if not self.is_valid(): return self.cleaned_data - numero = data['numero'] data_inicio = data['data_inicio'] data_fim = data['data_fim'] @@ -166,7 +166,6 @@ class LegislaturaForm(ModelForm): pk = self.instance.pk - ultima_legislatura = Legislatura.objects.filter(data_inicio__lt=data_inicio ).order_by('-data_inicio').first() proxima_legislatura = Legislatura.objects.filter(data_fim__gt=data_fim @@ -175,13 +174,14 @@ class LegislaturaForm(ModelForm): if ultima_legislatura and ultima_legislatura.numero >= numero: self.logger.error("Número ({}) deve ser maior que o da legislatura anterior ({})." .format(numero, ultima_legislatura.numero)) - raise ValidationError(_("Número deve ser maior que o da legislatura anterior")) + raise ValidationError( + _("Número deve ser maior que o da legislatura anterior")) elif proxima_legislatura and proxima_legislatura.numero <= numero: self.logger.error("O Número ({}) deve ser menor que {}, pois existe uma " "legislatura afrente cronologicamente desta que está sendo criada!" .format(numero, proxima_legislatura.numero)) msg_erro = "O Número deve ser menor que {}, pois existe uma " \ - "legislatura afrente cronologicamente desta que está sendo criada!" + "legislatura afrente cronologicamente desta que está sendo criada!" msg_erro = msg_erro.format(proxima_legislatura.numero) raise ValidationError(_(msg_erro)) @@ -241,7 +241,7 @@ class ParlamentarCreateForm(ParlamentarForm): data_expedicao_diploma=self.cleaned_data['data_expedicao_diploma']) content_type = ContentType.objects.get_for_model(Parlamentar) object_id = parlamentar.pk - tipo = TipoAutor.objects.get(descricao='Parlamentar') + tipo = TipoAutor.objects.get(content_type=content_type) Autor.objects.create( content_type=content_type, object_id=object_id, @@ -385,6 +385,7 @@ class ComposicaoColigacaoForm(ModelForm): class FrenteForm(ModelForm): logger = logging.getLogger(__name__) + def __init__(self, *args, **kwargs): super(FrenteForm, self).__init__(*args, **kwargs) self.fields['parlamentares'].queryset = Parlamentar.objects.filter( @@ -404,15 +405,16 @@ class FrenteForm(ModelForm): if cd['data_extincao'] and cd['data_criacao'] >= cd['data_extincao']: self.logger.error("Data Dissolução ({}) não pode ser anterior a Data Criação ({})." - .format(cd['data_extincao'],cd['data_criacao'])) - raise ValidationError(_("Data Dissolução não pode ser anterior a Data Criação")) + .format(cd['data_extincao'], cd['data_criacao'])) + raise ValidationError( + _("Data Dissolução não pode ser anterior a Data Criação")) return cd @transaction.atomic def save(self, commit=True): frente = super(FrenteForm, self).save(commit) - + if not self.instance.pk: frente = super(FrenteForm, self).save(commit) content_type = ContentType.objects.get_for_model(Frente) @@ -466,7 +468,8 @@ class VotanteForm(ModelForm): username = cd['username'] user = get_user_model().objects.filter(username=username) if not user.exists(): - self.logger.error("Não foi possível vincular usuário. Usuário {} não existe.".format(username)) + self.logger.error( + "Não foi possível vincular usuário. Usuário {} não existe.".format(username)) raise ValidationError(_( "{} [{}] {}".format( 'Não foi possível vincular usuário. Usuário', diff --git a/sapl/sessao/forms.py b/sapl/sessao/forms.py index 68f6d3222..2b8ec4742 100644 --- a/sapl/sessao/forms.py +++ b/sapl/sessao/forms.py @@ -317,7 +317,7 @@ class BancadaForm(ModelForm): bancada = super(BancadaForm, self).save(commit) content_type = ContentType.objects.get_for_model(Bancada) object_id = bancada.pk - tipo = TipoAutor.objects.get(descricao__icontains='Bancada') + tipo = TipoAutor.objects.get(content_type=content_type) Autor.objects.create( content_type=content_type, object_id=object_id, @@ -352,7 +352,7 @@ class BlocoForm(ModelForm): bloco = super(BlocoForm, self).save(commit) content_type = ContentType.objects.get_for_model(Bloco) object_id = bloco.pk - tipo = TipoAutor.objects.get(descricao__icontains='Bloco') + tipo = TipoAutor.objects.get(content_type=content_type) Autor.objects.create( content_type=content_type, object_id=object_id, diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index b4665429b..096130162 100755 --- a/sapl/sessao/views.py +++ b/sapl/sessao/views.py @@ -614,26 +614,20 @@ class OradorCrud(OradorCrud): return initial -class BancadaCrud(Crud): +class BancadaCrud(CrudAux): model = Bancada - class ListView(Crud.ListView): - template_name = 'crud/list_tabaux.html' - - class CreateView(Crud.CreateView): + class CreateView(CrudAux.CreateView): form_class = BancadaForm def get_success_url(self): return reverse('sapl.sessao:bancada_list') -class BlocoCrud(Crud): +class BlocoCrud(CrudAux): model = Bloco - class ListView(Crud.ListView): - template_name = 'crud/list_tabaux.html' - - class CreateView(Crud.CreateView): + class CreateView(CrudAux.CreateView): form_class = BlocoForm def get_success_url(self): @@ -1902,7 +1896,8 @@ class VotacaoView(SessaoPermissionMixin): qtde_presentes -= 1 if (qtde_votos > qtde_presentes or qtde_votos < qtde_presentes): - msg = _('O total de votos não corresponde com a quantidade de presentes!') + msg = _( + 'O total de votos não corresponde com a quantidade de presentes!') messages.add_message(request, messages.ERROR, msg) return self.render_to_response(context) elif (qtde_presentes == qtde_votos): From 9b422f14c79e2dd1e5ed305b47a8de44c459cdb2 Mon Sep 17 00:00:00 2001 From: Leandro Roberto Date: Sun, 10 Feb 2019 15:37:54 -0200 Subject: [PATCH 07/33] =?UTF-8?q?Refatora=20Manuten=C3=A7=C3=A3o=20de=20Ti?= =?UTF-8?q?pos=20de=20Textos=20Articulados?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/compilacao/urls.py | 16 +-- sapl/compilacao/views.py | 109 +++++------------- sapl/templates/compilacao/layouts.yaml | 8 ++ .../tipotextoarticulado_detail.html | 73 ------------ .../compilacao/tipotextoarticulado_list.html | 50 -------- sapl/templates/menu_tabelas_auxiliares.yaml | 2 +- 6 files changed, 41 insertions(+), 217 deletions(-) delete mode 100644 sapl/templates/compilacao/tipotextoarticulado_detail.html delete mode 100644 sapl/templates/compilacao/tipotextoarticulado_list.html diff --git a/sapl/compilacao/urls.py b/sapl/compilacao/urls.py index 781a6d80e..9364985aa 100644 --- a/sapl/compilacao/urls.py +++ b/sapl/compilacao/urls.py @@ -3,7 +3,8 @@ from django.conf.urls import include, url from sapl.compilacao import views from sapl.compilacao.views import (TipoDispositivoCrud, TipoNotaCrud, TipoPublicacaoCrud, TipoVideCrud, - VeiculoPublicacaoCrud) + VeiculoPublicacaoCrud, + TipoTextoArticuladoCrud) from .apps import AppConfig @@ -113,14 +114,7 @@ urlpatterns = [ include(TipoPublicacaoCrud.get_urls())), url(r'^sistema/ta/config/veiculo-publicacao/', include(VeiculoPublicacaoCrud.get_urls())), - url(r'^sistema/ta/config/tipo-textoarticulado$', - views.TipoTaListView.as_view(), name='tipo_ta_list'), - url(r'^sistema/ta/config/tipo-textoarticulado/create$', - views.TipoTaCreateView.as_view(), name='tipo_ta_create'), - url(r'^sistema/ta/config/tipo-textoarticulado/(?P[0-9]+)$', - views.TipoTaDetailView.as_view(), name='tipo_ta_detail'), - url(r'^sistema/ta/config/tipo-textoarticulado/(?P[0-9]+)/edit$', - views.TipoTaUpdateView.as_view(), name='tipo_ta_edit'), - url(r'^sistema/ta/config/tipo-textoarticulado/(?P[0-9]+)/delete$', - views.TipoTaDeleteView.as_view(), name='tipo_ta_delete'), + url(r'^sistema/ta/config/tipo/', + include(TipoTextoArticuladoCrud.get_urls())), + ] diff --git a/sapl/compilacao/views.py b/sapl/compilacao/views.py index 897e18cd6..f09ed8a4f 100644 --- a/sapl/compilacao/views.py +++ b/sapl/compilacao/views.py @@ -50,7 +50,8 @@ from sapl.compilacao.models import (STATUS_TA_EDITION, STATUS_TA_PRIVATE, from sapl.compilacao.utils import (DISPOSITIVO_SELECT_RELATED, DISPOSITIVO_SELECT_RELATED_EDIT, get_integrations_view_names) -from sapl.crud.base import Crud, CrudAux, CrudListView, make_pagination +from sapl.crud.base import RP_DETAIL, RP_LIST, Crud, CrudAux, CrudListView,\ + make_pagination from sapl.settings import BASE_DIR @@ -431,88 +432,32 @@ class CompMixin(PermissionRequiredMixin): return rr -class TipoTaListView(CompMixin, ListView): +class TipoTextoArticuladoCrud(CrudAux): model = TipoTextoArticulado - paginate_by = 10 - verbose_name = model._meta.verbose_name - permission_required = 'compilacao.list_tipotextoarticulado' - - @property - def title(self): - return self.model._meta.verbose_name_plural - - @property - def create_url(self): - return reverse_lazy('sapl.compilacao:tipo_ta_create') - - -class TipoTaCreateView(CompMixin, FormMessagesMixin, CreateView): - model = TipoTextoArticulado - form_class = TipoTaForm - template_name = "crud/form.html" - form_valid_message = _('Registro criado com sucesso!') - form_invalid_message = _('O registro não foi criado.') - permission_required = 'compilacao.add_tipotextoarticulado' - - def get(self, request, *args, **kwargs): - self.object = None - form = self.get_form() - form.fields['content_type'] = forms.ChoiceField( - choices=choice_models_in_extenal_views(), - label=_('Modelo Integrado'), required=False) - - return self.render_to_response(self.get_context_data(form=form)) - - def get_success_url(self): - return reverse_lazy('sapl.compilacao:tipo_ta_detail', - kwargs={'pk': self.object.id}) - - @property - def cancel_url(self): - return reverse_lazy('sapl.compilacao:tipo_ta_list') - - -class TipoTaDetailView(CompMixin, DetailView): - model = TipoTextoArticulado - permission_required = 'compilacao.detail_tipotextoarticulado' - - -class TipoTaUpdateView(CompMixin, UpdateView): - model = TipoTextoArticulado - form_class = TipoTaForm - template_name = "crud/form.html" - permission_required = 'compilacao.change_tipotextoarticulado' - - def get(self, request, *args, **kwargs): - self.object = self.get_object() - form = self.get_form() - form.fields['content_type'] = forms.ChoiceField( - choices=choice_models_in_extenal_views(), - label=_('Modelo Integrado'), required=False) - return self.render_to_response(self.get_context_data(form=form)) - - def get_success_url(self): - return reverse_lazy('sapl.compilacao:tipo_ta_detail', - kwargs={'pk': self.kwargs['pk']}) - - @property - def cancel_url(self): - return reverse_lazy('sapl.compilacao:tipo_ta_detail', - kwargs={'pk': self.kwargs['pk']}) - - -class TipoTaDeleteView(CompMixin, DeleteView): - model = TipoTextoArticulado - template_name = "crud/confirm_delete.html" - permission_required = 'compilacao.delete_tipotextoarticulado' - - @property - def detail_url(self): - return reverse_lazy('sapl.compilacao:tipo_ta_detail', - kwargs={'pk': self.kwargs['pk']}) - - def get_success_url(self): - return reverse_lazy('sapl.compilacao:tipo_ta_list') + public = [RP_LIST, RP_DETAIL, ] + + class CreateView(CrudAux.CreateView): + form_class = TipoTaForm + + def get(self, request, *args, **kwargs): + self.object = None + form = self.get_form() + form.fields['content_type'] = forms.ChoiceField( + choices=choice_models_in_extenal_views(), + label=_('Modelo Integrado'), required=False) + + return self.render_to_response(self.get_context_data(form=form)) + + class UpdateView(CrudAux.UpdateView): + form_class = TipoTaForm + + def get(self, request, *args, **kwargs): + self.object = self.get_object() + form = self.get_form() + form.fields['content_type'] = forms.ChoiceField( + choices=choice_models_in_extenal_views(), + label=_('Modelo Integrado'), required=False) + return self.render_to_response(self.get_context_data(form=form)) class TaListView(CompMixin, ListView): diff --git a/sapl/templates/compilacao/layouts.yaml b/sapl/templates/compilacao/layouts.yaml index 60895b185..20446ba19 100644 --- a/sapl/templates/compilacao/layouts.yaml +++ b/sapl/templates/compilacao/layouts.yaml @@ -37,3 +37,11 @@ TipoDispositivo: - rotulo_separador_variacao23:5 formato_variacao3 - rotulo_separador_variacao34:5 formato_variacao4 - rotulo_separador_variacao45:5 formato_variacao5 + + +TipoTextoArticulado: + {% trans 'Identificação Básica' %}: + - sigla:3 descricao:5 content_type:4 + {% trans 'Funcionalidaes' %}: + - participacao_social publicacao_func + - perfis diff --git a/sapl/templates/compilacao/tipotextoarticulado_detail.html b/sapl/templates/compilacao/tipotextoarticulado_detail.html deleted file mode 100644 index 5deffd227..000000000 --- a/sapl/templates/compilacao/tipotextoarticulado_detail.html +++ /dev/null @@ -1,73 +0,0 @@ -{% extends "base.html" %} {% load i18n %} {% load compilacao_filters %} -{% load common_tags %} - -{% block base_content %} - - {% block sections_nav %} - {% endblock %} - -
- {% block actions %} -
- {% if perms.compilacao.change_tipotextoarticulado %}{% trans 'Editar' %}{% endif %} - {% if perms.compilacao.delete_tipotextoarticulado %}{% trans 'Excluir' %}{% endif %} -
- {% endblock actions %} -
- - {% block detail_content %} {# TODO replace fieldset for something semantically correct, but with similar visual grouping style #} -
- {%trans 'Identificação Básica'%} -
-
-
- -

{{ object.sigla}}

-
-
- -
-
- -

{{ object.descricao}}

-
-
- -
-
- -

{{ object.content_type|default:""}}

-
-
-
-
- {%trans 'Funcionalidades'%} -
-
-
- -

{{ object.get_participacao_social_display}}

-
-
-
-
- -

{{ object.get_publicacao_func_display}}

-
-
-
-
-
-
- -
    - {% for perfil in object.perfis.all %} -
  • {{perfil}}
  • - {% endfor %} -
-
-
-
-
- {% endblock detail_content %} -{% endblock base_content %} diff --git a/sapl/templates/compilacao/tipotextoarticulado_list.html b/sapl/templates/compilacao/tipotextoarticulado_list.html deleted file mode 100644 index 3445306f5..000000000 --- a/sapl/templates/compilacao/tipotextoarticulado_list.html +++ /dev/null @@ -1,50 +0,0 @@ -{% extends "base.html" %} -{% load i18n compilacao_filters common_tags menus%} - -{% block base_content %} - - - {% block actions %} - {% if perms.compilacao.add_tipotextoarticulado %} - - {% endif %} - {% endblock actions %} - -
-
- {% if not object_list %} -

{{ NO_ENTRIES_MSG }}

- {% else %} -

Resultados

Resultados - Foram encontrados {{ page.paginator.count }} registros
+ {% if page.paginator.count %} + Registros {{ page.start_index }} a {{ page.end_index }} de {{ page.paginator.count }} + {% endif %} +

- - - - - - - - - {% for tipo_ta in object_list %} - - - - - - {% endfor %} - -
{% fieldclass_verbose_name 'sapl.compilacao.models.TipoTextoArticulado' 'sigla' %}{% fieldclass_verbose_name 'sapl.compilacao.models.TipoTextoArticulado' 'descricao' %}{% fieldclass_verbose_name 'sapl.compilacao.models.TipoTextoArticulado' 'content_type' %}
{{ tipo_ta.sigla }}{{ tipo_ta.descricao }}{{ tipo_ta.content_type }}
- {%endif%} - {% include 'paginacao.html'%} -
- {% if perms.base.view_tabelas_auxiliares %} - - {% endif %} - -{% endblock %} diff --git a/sapl/templates/menu_tabelas_auxiliares.yaml b/sapl/templates/menu_tabelas_auxiliares.yaml index 6c8734805..2e8eb6045 100644 --- a/sapl/templates/menu_tabelas_auxiliares.yaml +++ b/sapl/templates/menu_tabelas_auxiliares.yaml @@ -126,7 +126,7 @@ css_class: head_title children: - title: {% trans 'Tipos de Textos Articulados' %} - url: sapl.compilacao:tipo_ta_list + url: sapl.compilacao:tipotextoarticulado_list css_class: btn btn-link - title: {% trans 'Tipos de Publicação' %} url: sapl.compilacao:tipopublicacao_list From 2ba8a37873b2bbaa61baa074ff6f78b60a058d05 Mon Sep 17 00:00:00 2001 From: Leandro Roberto da Silva Date: Sun, 10 Feb 2019 16:41:56 -0200 Subject: [PATCH 08/33] Fix #1540 migra frontend (#2485) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * retira django-bootstrap3 do projeto sapl * retira bower sass-processor e libsass do projeto sapl * altera origem do django-admin-bootstrapped * commenta todas as entradas css e js em base.html * vue create sapl-frontend * add e configura django-webpack-loader * add vue.config.js e configura comunicação com webpack-loader * adequa staticfiles_dirs e ignora webpack-stats * cria bloco de expansão para vue_content * remove rotas do app hellow e impl multiplas entradas * add nova entrada para gereciamento de temas * cria plugin para carregar THEME_CUSTOM em .env * add bootstrap ao projeto e a configuração fixa de temas * add imports básicos para bootstrap * move assets para sapl-frontend * move assets para projetosexterno de tema e configura sapl project para leitura de temas através do .env * remove theme do sapl frontend project * retira link simbólico de entre projeto frontend e projeto de tema * retira scss do projeto django * altera btn-default/bootstrap3 para btn-outline-dark/bootstrap4 * altera btns de outline-dark para outlink-primary * migra pull-right para float-right * migra pull-left para float-left * migra btn-excluir para btn-outline-danger * add global entry and configure jquery * add jquery na entrada global e migra getCookie * remove row-fluid * muda active para link a * ajustes do botão salvar * ajuste botão add participação em comissão * ajuste do layout das mensagens de alerta e botao add detail detail * ajusta script de votação individual * ajuste eslint * altera origem da imagem para etiqueta.png * corrige eslint * migra tela de busca de autores para sapl-frontend * corrige fragmento de html para paginação * ajuste de js e html em protocolo * ajuste de layout no menu protocolo * ajuste no formulário de proposições para sapl_frontend * migra jquery-mask-plugin * remove código antigo do jquery-mask-plugin * migra jquery e algumas funções dependentes * migra tinymce * ajustes eslint * ajuste de sub menus * add campo de hora em mask * move jquery.runner.js para sapl-frontend * primeira versão com jquery runner funcionando * ajusta painel ao sapl-frontend * ajuste de tela de login * cria entr compilação p sapl-frontend e migra jsdiff * migra js das notas * add import bootstrap em module global * altera nome de função para iniciar editor de texto rico * move scss de compilação do tema para o frontend * adequa crud de notas de compilação ao form do django 1.11 * retira render padrão scripts css e js de image_cropping * integra jquery runner e image cropping com jquery e lodash global * ajustes de eslint em compilação * ajuste de layout para notas e de código eslint * ajuste de layout para Vides da app compilação * altera configurações para pasta público de tema ser importada no build * ajustes de eslint * ajusta TAs embedded de normas para sapl-frontend * migra botões de compilação para bootstrap4 * migra componente alert para bootstrap 4 * altera chamada a jQuery e resolve conflito com bootstrap * altera travis.yaml * corrige entrada doo sapl-oficial-theme para instalação trivial * testa modo de definir versão do node no travis * teste de configuração do travis * ajuste de teste e das telas de erro 404 e 500 * Configura sapl-frontend e webpackloader Configura sapl-frontend e webpack-loader com código de produção já esportado para a sapl/static. Desta forma, tanto no travis como no docker não existe a necessidade de instalação de node, npm e/ou yarn * configura docker e localização do webpack-stats.json * inicia migração da edição de dispositivos * ajuste de chunks * resume forma de lidar com com chunks css e js * cria template tag para tratar chunk-vendors * corrige menu de configuração dos TAs * migra barra inferior da vigencia * migra linha do tempo de vigências * ajuste nos menus do topo da edição dinamica da compilação * frontend produção * ajuste de blocos * migra layout da edição dinamica de dispositivos originais * ajuste da seleção de tipos de vigências * migra frontend de edição dinâmica de dispositivos * ajst dropdown de seleção de editor de dispositivos * migra subnav da edição avançada de dispositivos * separa frontend em outro projeto * Altera how-to de instalação do ambiente dev Altera how-to de instalação do ambiente de desenvolvimento com novas instruções para colaboração com o sapl-frontend * migra barra de navegação de parents de dispositivos * Alterações no how-to para colab com sapl-frontend Alterações no how-to para colab com sapl-frontend * ajuste de docs * sapl-frontend reinseriu language pt-br datepicker * ajuste no form autoria multicreate para sapl-frontend * add webpack blocks no index de painel * refatora layout do painel para bootstrap4 * migra cadastro de autor * migra frontend da manutenção de tipos de proposição * migra tela de incorporação * remove templates de compilação * ajusta layout do form de pesquisa textual * ajustes de layout no painel * primeira versão checada do frontend --- .gitignore | 1 + .travis.yml | 2 - Dockerfile | 13 +- docs/instalacao31.rst | 106 +- requirements/requirements.txt | 13 +- sapl/base/forms.py | 8 +- sapl/base/templatetags/common_tags.py | 12 + sapl/base/tests/test_login.py | 8 +- sapl/compilacao/forms.py | 65 +- sapl/crispy_layout_mixin.py | 13 +- sapl/crud/base.py | 2 +- sapl/crud/tests/stub_app/templates/base.html | 4 +- sapl/materia/forms.py | 113 +- .../migrations/0039_auto_20190209_2346.py | 21 + sapl/materia/models.py | 16 +- sapl/materia/views.py | 2 +- sapl/parlamentares/views.py | 4 + sapl/protocoloadm/forms.py | 6 +- sapl/settings.py | 54 +- sapl/static/css/chunk-vendors.f109b7f2.css | 101 + sapl/static/css/compilacao.1e862898.css | 1 + sapl/static/css/global.d2e0a784.css | 1 + sapl/static/css/painel.61177241.css | 1 + sapl/static/fonts/fa-brands-400.3186ebd2.eot | Bin 0 -> 125320 bytes .../static/fonts/fa-brands-400.662c24d0.woff2 | Bin 0 -> 72148 bytes sapl/static/fonts/fa-brands-400.a995bae1.ttf | Bin 0 -> 125016 bytes sapl/static/fonts/fa-brands-400.c7d7a2a1.woff | Bin 0 -> 84568 bytes .../fonts/fa-regular-400.6a9d786e.woff2 | Bin 0 -> 13608 bytes .../static/fonts/fa-regular-400.72f15fa7.woff | Bin 0 -> 16812 bytes sapl/static/fonts/fa-regular-400.80efa56b.eot | Bin 0 -> 34388 bytes sapl/static/fonts/fa-regular-400.fcb220ee.ttf | Bin 0 -> 34092 bytes sapl/static/fonts/fa-solid-900.20c189aa.ttf | Bin 0 -> 186228 bytes sapl/static/fonts/fa-solid-900.3638e62e.woff2 | Bin 0 -> 74320 bytes sapl/static/fonts/fa-solid-900.9a52a4e9.eot | Bin 0 -> 186512 bytes sapl/static/fonts/fa-solid-900.9c73abbd.woff | Bin 0 -> 96248 bytes sapl/static/img/fa-brands-400.e4fed0a5.svg | 3300 ++++++++++++ sapl/static/img/fa-regular-400.304f31f4.svg | 803 +++ sapl/static/img/fa-solid-900.c8ea4c79.svg | 4520 +++++++++++++++++ .../img/ui-icons_2694e8_256x240.274157b3.png | Bin 0 -> 4676 bytes .../img/ui-icons_2e83ff_256x240.602e5d4d.png | Bin 0 -> 4676 bytes .../img/ui-icons_3d80b3_256x240.24fcd129.png | Bin 0 -> 4676 bytes .../img/ui-icons_72a7cf_256x240.55a4c5ce.png | Bin 0 -> 4676 bytes .../img/ui-icons_ffffff_256x240.bb2a88be.png | Bin 0 -> 6487 bytes sapl/static/js/app.js | 252 - sapl/static/js/chunk-vendors.406f40ec.js | 2572 ++++++++++ sapl/static/js/compilacao.9bf86742.js | 240 + sapl/static/js/compilacao.js | 276 - sapl/static/js/compilacao_edit.js | 610 --- sapl/static/js/compilacao_notas.js | 143 - sapl/static/js/compilacao_view.js | 178 - sapl/static/js/global.594a728f.js | 274 + sapl/static/js/jquery.runner.js | 296 -- sapl/static/js/painel.518bdc14.js | 192 + sapl/static/styles/_header.scss | 5 - sapl/static/styles/_home_index.scss | 188 - sapl/static/styles/app.scss | 468 -- sapl/static/styles/compilacao.scss | 1542 ------ sapl/templates/404.html | 46 +- sapl/templates/500.html | 44 +- sapl/templates/auth/user_list.html | 2 +- sapl/templates/base.html | 144 +- .../base/EstatisticasAcessoNormas_filter.html | 4 +- sapl/templates/base/RelatorioAtas_filter.html | 4 +- .../base/RelatorioAudiencia_filter.html | 4 +- ...elatorioDataFimPrazoTramitacao_filter.html | 4 +- .../RelatorioHistoricoTramitacao_filter.html | 4 +- ...latorioMateriasPorAnoAutorTipo_filter.html | 4 +- .../RelatorioMateriasPorAutor_filter.html | 4 +- ...RelatorioMateriasPorTramitacao_filter.html | 4 +- .../base/RelatorioNormaMes_filter.html | 4 +- .../base/RelatorioNormasVigencia_filter.html | 4 +- .../base/RelatorioPresencaSessao_filter.html | 4 +- .../base/RelatorioReuniao_filter.html | 4 +- sapl/templates/base/autor_form.html | 6 +- sapl/templates/base/casalegislativa_list.html | 4 +- sapl/templates/base/login.html | 12 +- .../bootstrap4/layout/formactions.html | 13 + sapl/templates/comissoes/composicao_list.html | 8 +- .../compilacao/ajax_actions_dinamic_edit.html | 133 +- .../ajax_actions_registro_inclusao.html | 2 +- .../templates/compilacao/base_compilacao.html | 12 + .../compilacao/dispositivo_form.html | 62 +- .../dispositivo_form_alteracao.html | 4 +- .../dispositivo_form_definidor_vigencia.html | 2 +- .../dispositivo_form_edicao_basica.html | 2 +- .../compilacao/dispositivo_form_parents.html | 24 +- .../compilacao/dispositivo_form_search.html | 6 +- .../dispositivo_form_search_fragment.html | 2 +- .../compilacao/dispositivo_form_vigencia.html | 2 +- .../layout/bootstrap_btn_checkbox.html | 2 +- sapl/templates/compilacao/messages.html | 4 +- .../compilacao/publicacao_detail.html | 6 +- .../templates/compilacao/publicacao_list.html | 4 +- sapl/templates/compilacao/subnav.html | 25 + sapl/templates/compilacao/text_edit.html | 24 +- .../templates/compilacao/text_edit_bloco.html | 4 +- sapl/templates/compilacao/text_list.html | 96 +- .../compilacao/text_list__embedded.html | 113 +- .../compilacao/text_list__print_version.html | 8 - .../compilacao/text_notificacoes.html | 8 +- .../compilacao/textoarticulado_detail.html | 34 +- .../compilacao/textoarticulado_list.html | 4 +- .../textoarticulado_menu_config.html | 16 +- sapl/templates/crud/confirm_delete.html | 2 +- sapl/templates/crud/detail.html | 20 +- sapl/templates/crud/detail_detail.html | 20 +- sapl/templates/crud/list.html | 8 +- .../floppyforms/image_thumbnail.html | 2 +- sapl/templates/index.html | 361 +- .../materia/adicionar_varias_autorias.html | 4 +- sapl/templates/materia/autoria_list.html | 2 +- .../materia/autoria_multicreate_form.html | 6 +- .../materia/confirmar_proposicao.html | 6 +- .../materia/materialegislativa_detail.html | 2 +- .../materia/materialegislativa_filter.html | 8 +- .../materia/materialegislativa_list.html | 2 +- .../materia/proposicao_confirm_return.html | 4 +- sapl/templates/materia/proposicao_detail.html | 20 +- sapl/templates/materia/proposicao_form.html | 2 +- sapl/templates/materia/relatoria_form.html | 2 +- .../materia/tipoproposicao_form.html | 5 +- sapl/templates/menu_tabelas_auxiliares.yaml | 2 +- sapl/templates/menus/nav.html | 10 +- sapl/templates/menus/subnav.html | 12 +- .../templates/norma/normajuridica_detail.html | 30 +- .../templates/norma/normajuridica_filter.html | 8 +- sapl/templates/paginacao.html | 66 +- sapl/templates/painel/index.html | 180 +- sapl/templates/painel/mensagem.html | 162 +- sapl/templates/painel/parlamentares.html | 60 +- sapl/templates/painel/votacao.html | 199 +- sapl/templates/painel/voto_nominal.html | 24 +- .../parlamentares/composicaomesa_form.html | 10 +- sapl/templates/parlamentares/frente_form.html | 10 +- .../parlamentar_perfil_publico.html | 2 +- .../templates/parlamentares/votante_list.html | 4 +- .../protocoloadm/MateriaTemplate.html | 2 +- .../protocoloadm/anular_protocoloadm.html | 13 +- .../protocoloadm/detail_doc_detail.html | 8 +- .../documentoadministrativo_filter.html | 8 +- .../pesquisa_documento_detail.html | 4 +- .../protocoloadm/proposicoes_detail.html | 10 +- .../protocoloadm/protocolar_documento.html | 19 +- .../protocoloadm/protocolar_materia.html | 14 +- .../protocoloadm/protocolo_filter.html | 17 +- .../protocoloadm/protocolo_list.html | 6 +- .../protocoloadm/protocolo_mostrar.html | 12 +- .../protocoloadm/protocoloadm_detail.html | 33 +- .../tramitacaoadministrativo_detail.html | 8 +- sapl/templates/search/search.html | 208 +- .../adicionar_varias_materias_expediente.html | 8 +- .../adicionar_varias_materias_ordem.html | 8 +- sapl/templates/sessao/expediente.html | 6 +- .../sessao/expedientemateria_form.html | 4 +- .../sessao/expedientemateria_list.html | 4 +- sapl/templates/sessao/mesa.html | 8 +- sapl/templates/sessao/ocorrencia_sessao.html | 2 +- sapl/templates/sessao/ordemdia_list.html | 4 +- sapl/templates/sessao/painel.html | 3 +- .../sessao/sessaoplenaria_filter.html | 12 +- .../templates/sessao/sessaoplenaria_list.html | 2 +- sapl/templates/sessao/votacao/nominal.html | 2 +- .../sessao/votacao/votacao_nominal_bloco.html | 2 +- .../votacao/votacao_simbolica_bloco.html | 2 +- sapl/utils.py | 2 +- setup.py | 13 +- start.sh | 5 - webpack-stats.json | 1 + 168 files changed, 13551 insertions(+), 5506 deletions(-) create mode 100644 sapl/materia/migrations/0039_auto_20190209_2346.py create mode 100644 sapl/static/css/chunk-vendors.f109b7f2.css create mode 100644 sapl/static/css/compilacao.1e862898.css create mode 100644 sapl/static/css/global.d2e0a784.css create mode 100644 sapl/static/css/painel.61177241.css create mode 100644 sapl/static/fonts/fa-brands-400.3186ebd2.eot create mode 100644 sapl/static/fonts/fa-brands-400.662c24d0.woff2 create mode 100644 sapl/static/fonts/fa-brands-400.a995bae1.ttf create mode 100644 sapl/static/fonts/fa-brands-400.c7d7a2a1.woff create mode 100644 sapl/static/fonts/fa-regular-400.6a9d786e.woff2 create mode 100644 sapl/static/fonts/fa-regular-400.72f15fa7.woff create mode 100644 sapl/static/fonts/fa-regular-400.80efa56b.eot create mode 100644 sapl/static/fonts/fa-regular-400.fcb220ee.ttf create mode 100644 sapl/static/fonts/fa-solid-900.20c189aa.ttf create mode 100644 sapl/static/fonts/fa-solid-900.3638e62e.woff2 create mode 100644 sapl/static/fonts/fa-solid-900.9a52a4e9.eot create mode 100644 sapl/static/fonts/fa-solid-900.9c73abbd.woff create mode 100644 sapl/static/img/fa-brands-400.e4fed0a5.svg create mode 100644 sapl/static/img/fa-regular-400.304f31f4.svg create mode 100644 sapl/static/img/fa-solid-900.c8ea4c79.svg create mode 100644 sapl/static/img/ui-icons_2694e8_256x240.274157b3.png create mode 100644 sapl/static/img/ui-icons_2e83ff_256x240.602e5d4d.png create mode 100644 sapl/static/img/ui-icons_3d80b3_256x240.24fcd129.png create mode 100644 sapl/static/img/ui-icons_72a7cf_256x240.55a4c5ce.png create mode 100644 sapl/static/img/ui-icons_ffffff_256x240.bb2a88be.png delete mode 100644 sapl/static/js/app.js create mode 100644 sapl/static/js/chunk-vendors.406f40ec.js create mode 100644 sapl/static/js/compilacao.9bf86742.js delete mode 100644 sapl/static/js/compilacao.js delete mode 100644 sapl/static/js/compilacao_edit.js delete mode 100644 sapl/static/js/compilacao_notas.js delete mode 100644 sapl/static/js/compilacao_view.js create mode 100644 sapl/static/js/global.594a728f.js delete mode 100644 sapl/static/js/jquery.runner.js create mode 100644 sapl/static/js/painel.518bdc14.js delete mode 100644 sapl/static/styles/_header.scss delete mode 100644 sapl/static/styles/_home_index.scss delete mode 100644 sapl/static/styles/app.scss delete mode 100644 sapl/static/styles/compilacao.scss create mode 100644 sapl/templates/bootstrap4/layout/formactions.html create mode 100644 sapl/templates/compilacao/base_compilacao.html create mode 100644 sapl/templates/compilacao/subnav.html create mode 100644 webpack-stats.json diff --git a/.gitignore b/.gitignore index dfdeb2b5c..c656b3b8f 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,7 @@ __pycache__/ # Nodejs node_modules/ +yarn.lock # Distribution / packaging .Python diff --git a/.travis.yml b/.travis.yml index f54ee6d20..80532c789 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,7 +10,6 @@ install: - pip install -r requirements/test-requirements.txt before_script: - - npm install -g bower - cp sapl/.env_test sapl/.env - psql -c "CREATE USER sapl WITH PASSWORD 'sapl'" -U postgres; - psql -c "CREATE DATABASE sapl OWNER sapl;" -U postgres @@ -18,7 +17,6 @@ before_script: script: - ./manage.py migrate - - ./manage.py bower install - py.test --create-db # - ./scripts/django/test_and_check_qa.sh diff --git a/Dockerfile b/Dockerfile index f4953de84..8c2dc0fb5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,7 +2,7 @@ FROM alpine:3.8 ENV BUILD_PACKAGES postgresql-dev graphviz-dev graphviz build-base git pkgconfig \ python3-dev libxml2-dev jpeg-dev libressl-dev libffi-dev libxslt-dev \ - nodejs npm py3-lxml py3-magic postgresql-client poppler-utils antiword \ + nodejs py3-lxml py3-magic postgresql-client poppler-utils antiword \ curl jq openssh-client vim openssh-client bash RUN apk update --update-cache && apk upgrade @@ -17,9 +17,7 @@ RUN apk add --no-cache python3 nginx tzdata && \ rm -f /etc/nginx/conf.d/* RUN mkdir -p /var/interlegis/sapl && \ - apk add --update --no-cache $BUILD_PACKAGES && \ - npm install -g bower && \ - npm cache verify + apk add --update --no-cache $BUILD_PACKAGES WORKDIR /var/interlegis/sapl/ @@ -37,13 +35,6 @@ COPY config/env_dockerfile /var/interlegis/sapl/sapl/.env # Configura timezone para BRT # RUN cp /usr/share/zoneinfo/America/Sao_Paulo /etc/localtime && echo "America/Sao_Paulo" > /etc/timezone -# manage.py bower install bug: https://github.com/nvbn/django-bower/issues/51 - -# compilescss - Precompile all occurrences of your SASS/SCSS files for the whole project into css files - -RUN python3 manage.py bower_install --allow-root && \ - python3 manage.py compilescss - RUN python3 manage.py collectstatic --noinput --clear # Remove .env(fake) e sapl.db da imagem diff --git a/docs/instalacao31.rst b/docs/instalacao31.rst index 6e9146ee4..a9752990f 100644 --- a/docs/instalacao31.rst +++ b/docs/instalacao31.rst @@ -28,15 +28,7 @@ Instalar as seguintes dependências do sistema:: pkg-config postgresql postgresql-contrib pgadmin3 python-psycopg2 \ software-properties-common build-essential libxml2-dev libjpeg-dev \ libmysqlclient-dev libssl-dev libffi-dev libxslt1-dev python3-setuptools \ - python3-pip curl poppler-utils antiword default-jre python3-venv - - sudo -i - curl -sL https://deb.nodesource.com/setup_8.x | bash - - exit - sudo apt-get install nodejs - - sudo npm install npm -g - sudo npm install -g bower + python3-pip poppler-utils antiword default-jre python3-venv Instalar o virtualenv usando python 3 para o projeto. ----------------------------------------------------- @@ -153,6 +145,8 @@ Criação da `SECRET_KEY =1.11,<2.0 -django-bootstrap3==11.0.0 django-haystack==2.8.1 django-filter==2.0.0 djangorestframework==3.9.0 dj-database-url==0.5.0 -django-bower==5.2.0 django-braces==1.9.0 django-crispy-forms==1.7.2 django-floppyforms==1.7.0 django-extra-views==0.12.0 django-model-utils==3.1.2 -django-sass-processor==0.7.2 django-reversion==3.0.2 django-reversion-compare==0.8.6 django-speedinfo==1.4.0 django-extensions==2.1.4 django-image-cropping==1.2 +django-webpack-loader==0.6.0 easy-thumbnails==2.5 -libsass==0.17.0 python-decouple==3.1 psycopg2-binary==2.7.6.1 pyyaml==4.2b1 @@ -34,6 +31,10 @@ whoosh==2.7.4 git+git://github.com/interlegis/trml2pdf.git git+git://github.com/jasperlittle/django-rest-framework-docs -git+git://github.com/rubgombar1/django-admin-bootstrapped.git +git+git://github.com/interlegis/django-admin-bootstrapped@custom-for-sapl31 -django-compressor==2.2 \ No newline at end of file +#django-compressor==2.2 +#django-bootstrap3==11.0.0 +#django-bower==5.2.0 +#django-sass-processor==0.7.2 +#libsass==0.17.0 diff --git a/sapl/base/forms.py b/sapl/base/forms.py index f24868ff6..d97ed1804 100644 --- a/sapl/base/forms.py +++ b/sapl/base/forms.py @@ -394,7 +394,7 @@ class AutorForm(ModelForm): placeholder=_('Pesquisar por possíveis autores para ' 'o Tipo de Autor selecionado.')), StrictButton( - _('Filtrar'), css_class='btn-default btn-filtrar-autor', + _('Filtrar'), css_class='btn-outline-primary btn-filtrar-autor', type='button')), css_class='hidden', data_action='create', @@ -402,9 +402,9 @@ class AutorForm(ModelForm): data_field='autor_related') autor_select = Row(to_column(('tipo', 3)), - Div(to_column(('nome', 5)), - to_column(('cargo', 4)), - css_class="div_nome_cargo"), + Div(to_column(('nome', 7)), + to_column(('cargo', 5)), + css_class="div_nome_cargo row col"), to_column((autor_related, 9)), to_column((Div( Field('autor_related'), diff --git a/sapl/base/templatetags/common_tags.py b/sapl/base/templatetags/common_tags.py index 884a6968f..3c72b1654 100644 --- a/sapl/base/templatetags/common_tags.py +++ b/sapl/base/templatetags/common_tags.py @@ -1,5 +1,7 @@ from django import template from django.template.defaultfilters import stringfilter +from django.utils.safestring import mark_safe +from webpack_loader import utils from sapl.base.models import AppConfig from sapl.materia.models import DocumentoAcessorio, MateriaLegislativa, Proposicao @@ -274,3 +276,13 @@ def filiacao_data_filter(parlamentar, data_inicio): @register.filter def filiacao_intervalo_filter(parlamentar, date_range): return filiacao_data(parlamentar, date_range[0], date_range[1]) + + +@register.simple_tag +def render_chunk_vendors(extension=None): + try: + tags = utils.get_as_tags( + 'chunk-vendors', extension=extension, config='DEFAULT', attrs='') + return mark_safe('\n'.join(tags)) + except: + return '' diff --git a/sapl/base/tests/test_login.py b/sapl/base/tests/test_login.py index 91665ea8d..7fe7672e5 100755 --- a/sapl/base/tests/test_login.py +++ b/sapl/base/tests/test_login.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- -import pytest from django.contrib.auth import get_user_model +import pytest + pytestmark = pytest.mark.django_db @@ -12,14 +13,15 @@ def user(): def test_login_aparece_na_barra_para_usuario_nao_logado(client): response = client.get('/') - assert '' in str( + assert '' in str( response.content) def test_username_do_usuario_logado_aparece_na_barra(client, user): assert client.login(username='jfirmino', password='123') response = client.get('/') - assert 'Login' not in str(response.content) + assert 'Login' not in str( + response.content) assert 'jfirmino' in str(response.content) assert 'Sair' in str(response.content) diff --git a/sapl/compilacao/forms.py b/sapl/compilacao/forms.py index 3c4275bee..0e4f933d7 100644 --- a/sapl/compilacao/forms.py +++ b/sapl/compilacao/forms.py @@ -23,7 +23,8 @@ from sapl.compilacao.models import (NOTAS_PUBLICIDADE_CHOICES, TipoTextoArticulado, TipoVide, VeiculoPublicacao, Vide) from sapl.compilacao.utils import DISPOSITIVO_SELECT_RELATED -from sapl.crispy_layout_mixin import SaplFormLayout, to_column, to_row +from sapl.crispy_layout_mixin import SaplFormLayout, to_column, to_row,\ + form_actions from sapl.utils import YES_NO_CHOICES error_messages = { @@ -256,19 +257,22 @@ class NotaForm(ModelForm): ]) buttons = FormActions( - HTML('' - '%s' % _('Cancelar')), + *[ + HTML('%s' % _('Cancelar')) + ], Button( 'submit-form', 'Salvar', - css_class='btn btn-primary pull-right') + css_class='btn btn-primary float-right'), + css_class='form-group row justify-content-between mr-1 ml-1' ) self.helper = FormHelper() self.helper.layout = Layout( Div( - Div(HTML(_('Notas')), css_class='panel-heading'), + Div(HTML(_('Notas')), css_class='card-header bg-light'), Div( row1, to_row([(Field( @@ -279,9 +283,9 @@ class NotaForm(ModelForm): placeholder=_('URL Externa (opcional)')), 12)]), row3, to_row([(buttons, 12)]), - css_class="panel-body" + css_class="card-body" ), - css_class="panel panel-primary" + css_class="card" ) ) @@ -328,12 +332,15 @@ class VideForm(ModelForm): def __init__(self, *args, **kwargs): buttons = FormActions( - HTML('' - '%s' % _('Cancelar')), + *[ + HTML('%s' % _('Cancelar')) + ], Button( 'submit-form', 'Salvar', - css_class='btn-primary pull-right') + css_class='btn btn-primary float-right'), + css_class='form-group row justify-content-between mr-1 ml-1' ) dispositivo_ref = Field( @@ -359,15 +366,15 @@ class VideForm(ModelForm): self.helper = FormHelper() self.helper.layout = Layout( Div( - Div(HTML(_('Vides')), css_class='car-header'), + Div(HTML(_('Vides')), css_class='card-header bg-light'), Div( to_column((fields_form[0], 6)), to_column((fields_form[1], 6)), to_column(('dispositivo_base', 0)), to_column(('pk', 0)), - css_class="card-body" + css_class="card-body row" ), - css_class="card bg-light" + css_class="card" ) ) @@ -671,7 +678,7 @@ class DispositivoEdicaoBasicaForm(ModelForm): cancel_label = _('Fechar') more = [ - HTML('%s' % + HTML('%s' % cancel_label), ] @@ -680,7 +687,7 @@ class DispositivoEdicaoBasicaForm(ModelForm): if not (inst.tipo_dispositivo.dispositivo_de_alteracao and inst.tipo_dispositivo.dispositivo_de_articulacao): btns_excluir = [ - HTML('%s' % + HTML('%s' % _('Cancelar')), ] - more.append(Submit('salvar', _('Salvar'), css_class='pull-right')) + more.append(Submit('salvar', _('Salvar'), css_class='float-right')) buttons = FormActions(*more, css_class='form-group') - _fields = [Div(*layout, css_class="row-fluid")] + \ + _fields = [Div(*layout, css_class="row")] + \ [to_row([(buttons, 12)])] self.helper = FormHelper() @@ -1414,14 +1421,14 @@ class DispositivoRegistroRevogacaoForm(Form): layout.append(Field('dispositivo_search_form')) more = [ - HTML('%s' % + HTML('%s' % _('Cancelar')), ] - more.append(Submit('salvar', _('Salvar'), css_class='pull-right')) + more.append(Submit('salvar', _('Salvar'), css_class='float-right')) buttons = FormActions(*more, css_class='form-group') - _fields = [Div(*layout, css_class="row-fluid")] + \ + _fields = [Div(*layout, css_class="row")] + \ [to_row([(buttons, 12)])] self.helper = FormHelper() @@ -1464,14 +1471,14 @@ class DispositivoRegistroInclusaoForm(Form): layout.append(Div(css_class="allowed_inserts col-md-12")) more = [ - HTML('%s' % + HTML('%s' % _('Cancelar')), ] - # more.append(Submit('salvar', _('Salvar'), css_class='pull-right')) + # more.append(Submit('salvar', _('Salvar'), css_class='float-right')) buttons = FormActions(*more, css_class='form-group') - _fields = [Div(*layout, css_class="row-fluid")] + \ + _fields = [Div(*layout, css_class="row")] + \ [to_row([(buttons, 12)])] self.helper = FormHelper() diff --git a/sapl/crispy_layout_mixin.py b/sapl/crispy_layout_mixin.py index 9b2f0867b..245be6b82 100644 --- a/sapl/crispy_layout_mixin.py +++ b/sapl/crispy_layout_mixin.py @@ -1,6 +1,5 @@ from math import ceil -import rtyaml from crispy_forms.bootstrap import FormActions from crispy_forms.helper import FormHelper from crispy_forms.layout import HTML, Div, Fieldset, Layout, Submit @@ -8,6 +7,7 @@ from django import template from django.core.urlresolvers import reverse, reverse_lazy from django.utils import formats from django.utils.translation import ugettext as _ +import rtyaml def heads_and_tails(list_of_lists): @@ -21,7 +21,7 @@ def to_column(name_span): def to_row(names_spans): - return Div(*map(to_column, names_spans), css_class='row-fluid') + return Div(*map(to_column, names_spans), css_class='row') def to_fieldsets(fields): @@ -35,7 +35,8 @@ def to_fieldsets(fields): def form_actions(more=[Div(css_class='clearfix')], - label=_('Salvar'), name='salvar', css_class='pull-right', disabled=True): + label=_('Salvar'), name='salvar', + css_class='float-right', disabled=True): if disabled: doubleclick = 'this.form.submit();this.disabled=true;' @@ -43,10 +44,12 @@ def form_actions(more=[Div(css_class='clearfix')], doubleclick = 'return true;' return FormActions( + *more, Submit(name, label, css_class=css_class, # para impedir resubmissão do form onclick=doubleclick), - *more) + css_class='form-group row justify-content-between' + ) class SaplFormLayout(Layout): @@ -58,7 +61,7 @@ class SaplFormLayout(Layout): if not buttons: buttons = form_actions(label=save_label, more=[ HTML('%s' % cancel_label) + ' class="btn btn-dark">%s' % cancel_label) if cancel_label else None]) _fields = list(to_fieldsets(fields)) diff --git a/sapl/crud/base.py b/sapl/crud/base.py index faa0e1287..ca5469bf0 100644 --- a/sapl/crud/base.py +++ b/sapl/crud/base.py @@ -160,7 +160,7 @@ class ListWithSearchForm(forms.Form): placeholder=_('Filtrar Lista'), css_class='input-lg'), StrictButton( - _('Filtrar'), css_class='btn-default btn-lg', + _('Filtrar'), css_class='btn-outline-primary btn-lg', type='submit')) ) diff --git a/sapl/crud/tests/stub_app/templates/base.html b/sapl/crud/tests/stub_app/templates/base.html index 8a9dc002b..fcf92e5eb 100644 --- a/sapl/crud/tests/stub_app/templates/base.html +++ b/sapl/crud/tests/stub_app/templates/base.html @@ -12,9 +12,9 @@ {# Feedback messages #} {% for message in messages %} -