From f3c91411183083f4ebb05e9057efe9ba99d7190e Mon Sep 17 00:00:00 2001 From: Eduardo Calil Date: Wed, 9 Nov 2016 09:58:51 -0200 Subject: [PATCH 001/139] Bug fix em adicionar varias materias --- sapl/templates/sessao/adicionar_varias_materias_expediente.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sapl/templates/sessao/adicionar_varias_materias_expediente.html b/sapl/templates/sessao/adicionar_varias_materias_expediente.html index 8a56acdc7..697a809db 100644 --- a/sapl/templates/sessao/adicionar_varias_materias_expediente.html +++ b/sapl/templates/sessao/adicionar_varias_materias_expediente.html @@ -52,7 +52,7 @@ {% for m in page_obj %} - + {{m.tipo.sigla}} {{m.numero}}/{{m.ano}} - {{m.tipo}}
Autores: {% for a in m.autoria_set.all %} From 6a5411dd312c4ef03200cd81b114519e205a8c9b Mon Sep 17 00:00:00 2001 From: Eduardo Calil Date: Wed, 9 Nov 2016 10:00:55 -0200 Subject: [PATCH 002/139] Conserta verbose name errado --- sapl/materia/forms.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py index 9f107a87d..e6c6f1260 100644 --- a/sapl/materia/forms.py +++ b/sapl/materia/forms.py @@ -472,7 +472,7 @@ class MateriaLegislativaFilterSet(django_filters.FilterSet): ementa = django_filters.CharFilter(lookup_expr='icontains') em_tramitacao = django_filters.ChoiceFilter(required=False, - label=u'Ano da Matéria', + label=u'Em tramitação', choices=em_tramitacao) o = MateriaPesquisaOrderingFilter() From e41332ed215921c56ba99f4f31ec02394a811eda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rog=C3=A9rio=20Fr=C3=A1?= Date: Wed, 9 Nov 2016 10:04:20 -0200 Subject: [PATCH 003/139] =?UTF-8?q?Instru=C3=A7=C3=B5es=20para=20Importa?= =?UTF-8?q?=C3=A7=C3=A3o=20da=20base=20mysql=202.5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.rst | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/README.rst b/README.rst index 43df9a125..0950ebe10 100644 --- a/README.rst +++ b/README.rst @@ -214,6 +214,24 @@ Instruções para criação do super usuário e de usuários de testes operador_painel operador_geral + +Instruções para Importação da base mysql 2.5 +============================================ + +Criar um arquivo sapl/legacy/.env +Com o seguinte conteúdo (parametros de acesso ao banco 2.5) +DATABASE_URL = mysql://[usuario do mysql]:[senha do myuysql]@[host]:[porta]/[banco] +o conteúdo do arquivo será semelhante a isso +DATABASE_URL = mysql://sapl:sapl@localhost:3306/interlegis + +Posteriormente rodar a seguinte sequencia de comandos: + +./manage.py shell_plus --settings=sapl.legacy_migration_settings +%run sapl/legacy/migration.py +migrate() + + + Instruções para Tradução ======================== From 07bdd4685f8c92aed9e655ac8857b6183138b06a Mon Sep 17 00:00:00 2001 From: Leandro Roberto da Silva Date: Wed, 9 Nov 2016 10:24:24 -0200 Subject: [PATCH 004/139] corrige readme --- README.rst | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/README.rst b/README.rst index 0950ebe10..64cc4d4d5 100644 --- a/README.rst +++ b/README.rst @@ -197,11 +197,11 @@ Instruções para criação do super usuário e de usuários de testes ./manage.py createsuperuser -* `Os perfis semânticos do SAPL `_ são fixos e atualizados a cada execução do comando: +* `Os perfis semânticos do SAPL `_ são fixos e atualizados a cada execução do comando:: ./manage.py migrate - * Os perfis fixos não aceitam customização via admin, porém outros grupos podem ser criados. O SAPL não interferirá no conjunto de permissões definidas em grupos customizados e se comportará diante de usuários segundo seus grupos e suas permissões. +* Os perfis fixos não aceitam customização via admin, porém outros grupos podem ser criados. O SAPL não interferirá no conjunto de permissões definidas em grupos customizados e se comportará diante de usuários segundo seus grupos e suas permissões. * Os usuários de testes de perfil são criados apenas se o SAPL estiver rodando em modo DEBUG=True. Todos com senha "interlegis", serão:: @@ -218,19 +218,19 @@ Instruções para criação do super usuário e de usuários de testes Instruções para Importação da base mysql 2.5 ============================================ -Criar um arquivo sapl/legacy/.env -Com o seguinte conteúdo (parametros de acesso ao banco 2.5) -DATABASE_URL = mysql://[usuario do mysql]:[senha do myuysql]@[host]:[porta]/[banco] -o conteúdo do arquivo será semelhante a isso -DATABASE_URL = mysql://sapl:sapl@localhost:3306/interlegis +Criar um arquivo `sapl/legacy/.env` com o seguinte conteúdo (parametros de acesso ao banco 2.5):: -Posteriormente rodar a seguinte sequencia de comandos: + DATABASE_URL = mysql://[usuario do mysql]:[senha do myuysql]@[host]:[porta]/[banco] + +o conteúdo do arquivo será semelhante a isso:: -./manage.py shell_plus --settings=sapl.legacy_migration_settings -%run sapl/legacy/migration.py -migrate() + DATABASE_URL = mysql://sapl:sapl@localhost:3306/interlegis +Posteriormente rodar a seguinte sequencia de comandos:: + ./manage.py shell_plus --settings=sapl.legacy_migration_settings + >>> %run sapl/legacy/migration.py + >>> migrate() Instruções para Tradução ======================== From c9353205db7341f68c8397ea803363d0774760d2 Mon Sep 17 00:00:00 2001 From: Eduardo Edson Batista Cordeiro Alves Date: Tue, 8 Nov 2016 10:10:22 -0200 Subject: [PATCH 005/139] init pesquisa norma --- sapl/norma/forms.py | 103 ++++--------- sapl/norma/urls.py | 12 +- sapl/norma/views.py | 140 ++++-------------- .../templates/norma/normajuridica_filter.html | 42 ++++++ 4 files changed, 100 insertions(+), 197 deletions(-) create mode 100644 sapl/templates/norma/normajuridica_filter.html diff --git a/sapl/norma/forms.py b/sapl/norma/forms.py index 4fd8c8579..a6d36b883 100644 --- a/sapl/norma/forms.py +++ b/sapl/norma/forms.py @@ -1,16 +1,18 @@ from datetime import datetime +import django_filters from crispy_forms.helper import FormHelper from crispy_forms.layout import Fieldset, Layout from django import forms from django.core.exceptions import ObjectDoesNotExist, ValidationError +from django.db import models from django.forms import ModelForm, widgets from django.utils.translation import ugettext_lazy as _ from sapl.crispy_layout_mixin import form_actions, to_row from sapl.materia.models import MateriaLegislativa, TipoMateriaLegislativa from sapl.settings import MAX_DOC_UPLOAD_SIZE -from sapl.utils import RANGE_ANOS +from sapl.utils import ANO_CHOICES, RANGE_ANOS, RangeWidgetOverride from .models import AssuntoNorma, NormaJuridica @@ -30,94 +32,41 @@ ORDENACAO_CHOICES = [('', '---------'), ('data,tipo,ano,numero', _('Data/Tipo/Ano/Número'))] -# TODO termos, pesquisa textual, assunto(M2M) -class NormaJuridicaPesquisaForm(ModelForm): - - periodo_inicial = forms.DateField(label=u'Período Inicial', - input_formats=['%d/%m/%Y'], - required=False, - widget=forms.DateInput( - format='%d/%m/%Y', - attrs={'class': 'dateinput'})) - - periodo_final = forms.DateField(label=u'Período Final', - input_formats=['%d/%m/%Y'], - required=False, - widget=forms.DateInput( - format='%d/%m/%Y', - attrs={'class': 'dateinput'})) - - publicacao_inicial = forms.DateField(label=u'Publicação Inicial', - input_formats=['%d/%m/%Y'], - required=False, - widget=forms.DateInput( - format='%d/%m/%Y', - attrs={'class': 'dateinput'})) - - publicacao_final = forms.DateField(label=u'Publicação Final', - input_formats=['%d/%m/%Y'], - required=False, - widget=forms.DateInput( - format='%d/%m/%Y', - attrs={'class': 'dateinput'})) - - ano = forms.ModelChoiceField( - label='Ano', - required=False, - queryset=NormaJuridica.objects.order_by('-ano').values_list( - 'ano', flat=True).distinct(), - empty_label='Selecione' - ) - - em_vigencia = forms.ChoiceField( - label='Em vigência?', - choices=YES_NO_CHOICES, - required=False) +class NormaFilterSet(django_filters.FilterSet): - ordenacao = forms.ChoiceField( - label='Ordenação', - choices=ORDENACAO_CHOICES, - required=False) + filter_overrides = {models.DateField: { + 'filter_class': django_filters.DateFromToRangeFilter, + 'extra': lambda f: { + 'label': '%s (%s)' % (f.verbose_name, _('Inicial - Final')), + 'widget': RangeWidgetOverride} + }} - numero = forms.IntegerField(required=False) + ano = django_filters.ChoiceFilter(required=False, + label=u'Ano', + choices=ANO_CHOICES) - assunto = forms.ModelChoiceField( - label='Assunto', - required=False, - queryset=AssuntoNorma.objects.all(), - empty_label='Selecione' - ) + ementa = django_filters.CharFilter(lookup_expr='icontains') class Meta: model = NormaJuridica - fields = ['tipo', - 'numero', - 'ano', - 'periodo_inicial', - 'periodo_final', - 'publicacao_inicial', - 'publicacao_final', - 'assunto'] + fields = ['tipo', 'numero', 'ano', 'data', + 'data_publicacao', 'ementa'] def __init__(self, *args, **kwargs): + super(NormaFilterSet, self).__init__(*args, **kwargs) row1 = to_row([('tipo', 12)]) - row2 = to_row([('numero', 6), ('ano', 6)]) - - row3 = to_row([('periodo_inicial', 6), ('periodo_final', 6)]) - - row4 = to_row([('publicacao_inicial', 6), ('publicacao_final', 6)]) - - row5 = to_row([('em_vigencia', 4), ('ordenacao', 4), ('assunto', 4)]) - - self.helper = FormHelper() - self.helper.layout = Layout( - Fieldset('Pesquisa Norma Juridica', - row1, row2, row3, row4, row5), - form_actions(save_label='Pesquisar') + row3 = to_row([('ementa', 12)]) + row4 = to_row([('data', 6), ('data_publicacao', 6)]) + + self.form.helper = FormHelper() + self.form.helper.form_method = 'GET' + self.form.helper.layout = Layout( + Fieldset(_('Pesquisa de Norma'), + row1, row2, row3, row4, + form_actions(save_label='Pesquisar')) ) - super(NormaJuridicaPesquisaForm, self).__init__(*args, **kwargs) class NormaJuridicaForm(ModelForm): diff --git a/sapl/norma/urls.py b/sapl/norma/urls.py index a8d8c59d7..541abf125 100644 --- a/sapl/norma/urls.py +++ b/sapl/norma/urls.py @@ -1,8 +1,7 @@ from django.conf.urls import include, url -from sapl.norma.views import (AssuntoNormaCrud, - NormaCrud, NormaPesquisaView, NormaTaView, - PesquisaNormaListView, TipoNormaCrud) +from sapl.norma.views import (AssuntoNormaCrud, NormaCrud, NormaPesquisaView, + TipoNormaCrud) from .apps import AppConfig @@ -17,8 +16,7 @@ urlpatterns = [ url(r'^sistema/norma/tipo/', include(TipoNormaCrud.get_urls())), url(r'^sistema/norma/assunto/', include(AssuntoNormaCrud.get_urls())), - url(r'^norma/pesquisa$', - NormaPesquisaView.as_view(), name='norma_pesquisa'), - url(r'^norma/pesquisa-resultado$', - PesquisaNormaListView.as_view(), name='list_pesquisa_norma'), + + url(r'^norma/pesquisar$', + NormaPesquisaView.as_view(), name='pesquisar_norma'), ] diff --git a/sapl/norma/views.py b/sapl/norma/views.py index 1cddc0ca9..7737b95d0 100644 --- a/sapl/norma/views.py +++ b/sapl/norma/views.py @@ -11,9 +11,8 @@ from sapl.crud.base import (RP_DETAIL, RP_LIST, Crud, CrudAux, MasterDetailCrud, make_pagination) from sapl.norma.forms import NormaJuridicaForm -from .forms import NormaJuridicaPesquisaForm -from .models import (AssuntoNorma, NormaJuridica, - TipoNormaJuridica) +from .forms import NormaFilterSet +from .models import AssuntoNorma, NormaJuridica, TipoNormaJuridica # LegislacaoCitadaCrud = Crud.build(LegislacaoCitada, '') AssuntoNormaCrud = CrudAux.build(AssuntoNorma, 'assunto_norma_juridica', @@ -25,6 +24,31 @@ TipoNormaCrud = CrudAux.build( list_field_names=['sigla', 'descricao', 'equivalente_lexml']) +class NormaPesquisaView(FilterView): + model = NormaJuridica + filterset_class = NormaFilterSet + paginate_by = 10 + + def get_context_data(self, **kwargs): + context = super(NormaPesquisaView, self).get_context_data(**kwargs) + + context['title'] = _('Pesquisar Norma Jurídica') + + qr = self.request.GET.copy() + if 'page' in qr: + del qr['page'] + + paginator = context['paginator'] + page_obj = context['page_obj'] + + context['page_range'] = make_pagination( + page_obj.number, paginator.num_pages) + + context['filter_url'] = ('&' + qr.urlencode()) if len(qr) > 0 else '' + + return context + + class NormaTaView(IntegracaoTaView): model = NormaJuridica model_type_foreignkey = TipoNormaJuridica @@ -103,113 +127,3 @@ class NormaCrud(Crud): self.initial['ano_materia'] = norma.materia.ano self.initial['numero_materia'] = norma.materia.numero return self.initial.copy() - - -class NormaPesquisaView(FormView): - template_name = "norma/pesquisa.html" - success_url = "norma:norma_pesquisa" - form_class = NormaJuridicaPesquisaForm - - def post(self, request, *args, **kwargs): - form = NormaJuridicaPesquisaForm(request.POST) - - if form.data['tipo']: - kwargs['tipo'] = form.data['tipo'] - if form.data['numero']: - kwargs['numero'] = form.data['numero'] - if form.data['ano']: - kwargs['ano'] = form.data['ano'] - if form.data['periodo_inicial'] and form.data['periodo_final']: - kwargs['periodo_inicial'] = form.data['periodo_inicial'] - kwargs['periodo_final'] = form.data['periodo_final'] - if form.data['publicacao_inicial'] and form.data['publicacao_final']: - kwargs['publicacao_inicial'] = form.data['publicacao_inicial'] - kwargs['publicacao_final'] = form.data['publicacao_final'] - if form.data['ordenacao']: - kwargs['ordenacao'] = form.data['ordenacao'] - if form.data['em_vigencia']: - kwargs['em_vigencia'] = form.data['em_vigencia'] - if form.data['assunto']: - kwargs['assunto'] = form.data['assunto'] - - request.session['kwargs'] = kwargs - return redirect('sapl.norma:list_pesquisa_norma') - - -class PesquisaNormaListView(ListView): - template_name = 'norma/list_pesquisa.html' - model = NormaJuridica - paginate_by = 10 - - def get_queryset(self): - kwargs = self.request.session['kwargs'] - - if 'ordenacao' in kwargs: - ordenacao = kwargs.pop('ordenacao').split(',') - for o in ordenacao: - normas = NormaJuridica.objects.all().order_by(o) - else: - normas = NormaJuridica.objects.all() - - if 'em_vigencia' in kwargs: - del kwargs['em_vigencia'] - normas = normas.filter( - data_vigencia__lte=datetime.now().date()) - - if 'periodo_inicial' and 'publicacao_inicial' in kwargs: - periodo_inicial = datetime.strptime( - kwargs['periodo_inicial'], - '%d/%m/%Y').strftime('%Y-%m-%d') - periodo_final = datetime.strptime( - kwargs['periodo_final'], - '%d/%m/%Y').strftime('%Y-%m-%d') - publicacao_inicial = datetime.strptime( - kwargs['publicacao_inicial'], - '%d/%m/%Y').strftime('%Y-%m-%d') - publicacao_final = datetime.strptime( - kwargs['publicacao_final'], - '%d/%m/%Y').strftime('%Y-%m-%d') - - normas = normas.filter( - data__range=(periodo_inicial, periodo_final), - data_publicacao__range=(publicacao_inicial, publicacao_final)) - - if 'periodo_inicial' in kwargs: - inicial = datetime.strptime(kwargs['periodo_inicial'], - '%d/%m/%Y').strftime('%Y-%m-%d') - final = datetime.strptime(kwargs['periodo_inicial'], - '%d/%m/%Y').strftime('%Y-%m-%d') - - normas = normas.filter(data__range=(inicial, final)) - - if 'publicacao_inicial' in kwargs: - inicial = datetime.strptime(kwargs['publicacao_inicial'], - '%d/%m/%Y').strftime('%Y-%m-%d') - final = datetime.strptime(kwargs['publicacao_final'], - '%d/%m/%Y').strftime('%Y-%m-%d') - - normas = normas.filter(data_publicacao__range=(inicial, final)) - if 'tipo' in kwargs: - normas = normas.filter(tipo=kwargs['tipo']) - - if 'numero' in kwargs: - normas = normas.filter(numero=kwargs['numero']) - - if 'ano' in kwargs: - normas = normas.filter(ano=kwargs['ano']) - - if 'assunto' in kwargs: - normas = normas.filter(assuntos=kwargs['assunto']) - - return normas - - def get_context_data(self, **kwargs): - context = super(PesquisaNormaListView, self).get_context_data( - **kwargs) - - paginator = context['paginator'] - page_obj = context['page_obj'] - - context['page_range'] = make_pagination( - page_obj.number, paginator.num_pages) - return context diff --git a/sapl/templates/norma/normajuridica_filter.html b/sapl/templates/norma/normajuridica_filter.html new file mode 100644 index 000000000..42c5d0f3a --- /dev/null +++ b/sapl/templates/norma/normajuridica_filter.html @@ -0,0 +1,42 @@ +{% extends "crud/detail.html" %} +{% load i18n %} +{% load crispy_forms_tags %} + +{% block actions %} + +{% endblock %} + +{% block detail_content %} + {% if not filter_url %} + {% crispy filter.form %} + {% endif %} + + {% if filter_url %} + + + + + {% if paginator.count %} + {% if paginator.count > 1 %} +

{% blocktrans with paginator.count as total_normas %}Pesquisa concluída com sucesso! Foram encontradas {{total_normas}} normas.{% endblocktrans %}

+ {% elif paginator.count == 1 %} +

{% trans 'Pesquisa concluída com sucesso! Foi encontrada 1 matéria.'%}

+ {% endif %} + + {% for n in page_obj %} + + {% endfor %} + {% else %} + + {% endif %} +

{% trans "Resultados" %}

{{n}}

Nenhuma norma encontrada com essas especificações

+ {% include "paginacao.html" %} + {% endif %} +{% endblock detail_content %} From e5584126a24100ecb0a046a2860c697715730b42 Mon Sep 17 00:00:00 2001 From: Eduardo Edson Batista Cordeiro Alves Date: Tue, 8 Nov 2016 10:13:43 -0200 Subject: [PATCH 006/139] Ajeita imports --- sapl/norma/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sapl/norma/views.py b/sapl/norma/views.py index 7737b95d0..c508485d4 100644 --- a/sapl/norma/views.py +++ b/sapl/norma/views.py @@ -4,12 +4,12 @@ from django.core.urlresolvers import reverse from django.shortcuts import redirect from django.views.generic import FormView, ListView from django.views.generic.base import RedirectView +from django_filters.views import FilterView from sapl.base.models import AppConfig from sapl.compilacao.views import IntegracaoTaView from sapl.crud.base import (RP_DETAIL, RP_LIST, Crud, CrudAux, MasterDetailCrud, make_pagination) -from sapl.norma.forms import NormaJuridicaForm from .forms import NormaFilterSet from .models import AssuntoNorma, NormaJuridica, TipoNormaJuridica From 16f4b28d80cf518d18a7566dedf03e8095e99a15 Mon Sep 17 00:00:00 2001 From: Eduardo Edson Batista Cordeiro Alves Date: Tue, 8 Nov 2016 10:18:27 -0200 Subject: [PATCH 007/139] Troca url de pesquisa no template base --- sapl/templates/navbar.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sapl/templates/navbar.yaml b/sapl/templates/navbar.yaml index 391f55664..d0e9f1082 100644 --- a/sapl/templates/navbar.yaml +++ b/sapl/templates/navbar.yaml @@ -45,7 +45,7 @@ - title: {% trans 'Normas Jurídicas' %} children: - title: {% trans 'Pesquisar Normas Jurídicas' %} - url: sapl.norma:normajuridica_list + url: sapl.norma:pesquisar_norma - title: {% trans 'Sistema' %} check_permission: base.menu_sistemas From a04a2bf936c40a4f1e71919e87ecc09067a0b01e Mon Sep 17 00:00:00 2001 From: Eduardo Edson Batista Cordeiro Alves Date: Tue, 8 Nov 2016 10:20:02 -0200 Subject: [PATCH 008/139] Remove ANOS_CHOICES --- sapl/norma/forms.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sapl/norma/forms.py b/sapl/norma/forms.py index a6d36b883..acfaaad42 100644 --- a/sapl/norma/forms.py +++ b/sapl/norma/forms.py @@ -12,7 +12,7 @@ from django.utils.translation import ugettext_lazy as _ from sapl.crispy_layout_mixin import form_actions, to_row from sapl.materia.models import MateriaLegislativa, TipoMateriaLegislativa from sapl.settings import MAX_DOC_UPLOAD_SIZE -from sapl.utils import ANO_CHOICES, RANGE_ANOS, RangeWidgetOverride +from sapl.utils import RANGE_ANOS, RangeWidgetOverride from .models import AssuntoNorma, NormaJuridica @@ -43,7 +43,7 @@ class NormaFilterSet(django_filters.FilterSet): ano = django_filters.ChoiceFilter(required=False, label=u'Ano', - choices=ANO_CHOICES) + choices=RANGE_ANOS) ementa = django_filters.CharFilter(lookup_expr='icontains') From 7b7147974e3c1b8200d1dc95c6928c14bd943ad8 Mon Sep 17 00:00:00 2001 From: Eduardo Edson Batista Cordeiro Alves Date: Tue, 8 Nov 2016 10:26:57 -0200 Subject: [PATCH 009/139] =?UTF-8?q?Adiciona=20NormaJuridicaForm=20e=20perm?= =?UTF-8?q?iss=C3=A3o=20no=20bot=C3=A3o=20de=20adicionar=20norma=20na=20te?= =?UTF-8?q?la=20de=20pesquisa?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/norma/views.py | 2 +- sapl/templates/norma/normajuridica_filter.html | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/sapl/norma/views.py b/sapl/norma/views.py index c508485d4..1cf1afaf2 100644 --- a/sapl/norma/views.py +++ b/sapl/norma/views.py @@ -11,7 +11,7 @@ from sapl.compilacao.views import IntegracaoTaView from sapl.crud.base import (RP_DETAIL, RP_LIST, Crud, CrudAux, MasterDetailCrud, make_pagination) -from .forms import NormaFilterSet +from .forms import NormaFilterSet, NormaJuridicaForm from .models import AssuntoNorma, NormaJuridica, TipoNormaJuridica # LegislacaoCitadaCrud = Crud.build(LegislacaoCitada, '') diff --git a/sapl/templates/norma/normajuridica_filter.html b/sapl/templates/norma/normajuridica_filter.html index 42c5d0f3a..a5cc486ad 100644 --- a/sapl/templates/norma/normajuridica_filter.html +++ b/sapl/templates/norma/normajuridica_filter.html @@ -5,7 +5,9 @@ {% block actions %}
+ {% if perms.norma.add_normajuridica %} {% blocktrans with verbose_name=view.verbose_name %} Adicionar Norma Jurídica {% endblocktrans %} + {% endif %} {% if filter_url %} {% trans 'Fazer nova pesquisa' %} From 3885e4e82e4a3cc8b555afbf4166824420def8fe Mon Sep 17 00:00:00 2001 From: Eduardo Edson Batista Cordeiro Alves Date: Tue, 8 Nov 2016 10:40:24 -0200 Subject: [PATCH 010/139] adiciona imports faltando --- sapl/norma/urls.py | 2 +- sapl/norma/views.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/sapl/norma/urls.py b/sapl/norma/urls.py index 541abf125..615eae0ce 100644 --- a/sapl/norma/urls.py +++ b/sapl/norma/urls.py @@ -1,7 +1,7 @@ from django.conf.urls import include, url from sapl.norma.views import (AssuntoNormaCrud, NormaCrud, NormaPesquisaView, - TipoNormaCrud) + TipoNormaCrud, NormaTaView) from .apps import AppConfig diff --git a/sapl/norma/views.py b/sapl/norma/views.py index 1cf1afaf2..78636f792 100644 --- a/sapl/norma/views.py +++ b/sapl/norma/views.py @@ -2,6 +2,7 @@ from datetime import datetime from django.core.urlresolvers import reverse from django.shortcuts import redirect +from django.utils.translation import ugettext_lazy as _ from django.views.generic import FormView, ListView from django.views.generic.base import RedirectView from django_filters.views import FilterView From 7f582bedbbe9c3df503cce83c3a5c48caaf78750 Mon Sep 17 00:00:00 2001 From: Eduardo Edson Batista Cordeiro Alves Date: Wed, 9 Nov 2016 15:00:47 -0200 Subject: [PATCH 011/139] Conserta template do resultado da pesquisa de norma --- sapl/norma/forms.py | 6 ++- sapl/norma/urls.py | 2 +- sapl/norma/views.py | 1 + sapl/templates/navbar.yaml | 2 +- .../templates/norma/normajuridica_filter.html | 54 ++++++++++++------- 5 files changed, 41 insertions(+), 24 deletions(-) diff --git a/sapl/norma/forms.py b/sapl/norma/forms.py index acfaaad42..3e9abec99 100644 --- a/sapl/norma/forms.py +++ b/sapl/norma/forms.py @@ -50,7 +50,7 @@ class NormaFilterSet(django_filters.FilterSet): class Meta: model = NormaJuridica fields = ['tipo', 'numero', 'ano', 'data', - 'data_publicacao', 'ementa'] + 'data_publicacao', 'ementa', 'assuntos'] def __init__(self, *args, **kwargs): super(NormaFilterSet, self).__init__(*args, **kwargs) @@ -59,12 +59,14 @@ class NormaFilterSet(django_filters.FilterSet): row2 = to_row([('numero', 6), ('ano', 6)]) row3 = to_row([('ementa', 12)]) row4 = to_row([('data', 6), ('data_publicacao', 6)]) + row5 = to_row([('assuntos', 12)]) + self.form.helper = FormHelper() self.form.helper.form_method = 'GET' self.form.helper.layout = Layout( Fieldset(_('Pesquisa de Norma'), - row1, row2, row3, row4, + row1, row2, row3, row4, row5, form_actions(save_label='Pesquisar')) ) diff --git a/sapl/norma/urls.py b/sapl/norma/urls.py index 615eae0ce..8c261e23e 100644 --- a/sapl/norma/urls.py +++ b/sapl/norma/urls.py @@ -18,5 +18,5 @@ urlpatterns = [ url(r'^sistema/norma/assunto/', include(AssuntoNormaCrud.get_urls())), url(r'^norma/pesquisar$', - NormaPesquisaView.as_view(), name='pesquisar_norma'), + NormaPesquisaView.as_view(), name='norma_pesquisa'), ] diff --git a/sapl/norma/views.py b/sapl/norma/views.py index 78636f792..5a0dc283a 100644 --- a/sapl/norma/views.py +++ b/sapl/norma/views.py @@ -36,6 +36,7 @@ class NormaPesquisaView(FilterView): context['title'] = _('Pesquisar Norma Jurídica') qr = self.request.GET.copy() + if 'page' in qr: del qr['page'] diff --git a/sapl/templates/navbar.yaml b/sapl/templates/navbar.yaml index d0e9f1082..9b3ee0a52 100644 --- a/sapl/templates/navbar.yaml +++ b/sapl/templates/navbar.yaml @@ -45,7 +45,7 @@ - title: {% trans 'Normas Jurídicas' %} children: - title: {% trans 'Pesquisar Normas Jurídicas' %} - url: sapl.norma:pesquisar_norma + url: sapl.norma:norma_pesquisa - title: {% trans 'Sistema' %} check_permission: base.menu_sistemas diff --git a/sapl/templates/norma/normajuridica_filter.html b/sapl/templates/norma/normajuridica_filter.html index a5cc486ad..9ae8e5294 100644 --- a/sapl/templates/norma/normajuridica_filter.html +++ b/sapl/templates/norma/normajuridica_filter.html @@ -7,12 +7,13 @@ {% if perms.norma.add_normajuridica %} {% blocktrans with verbose_name=view.verbose_name %} Adicionar Norma Jurídica {% endblocktrans %} - {% endif %} + {% endif %} {% if filter_url %} - {% trans 'Fazer nova pesquisa' %} + {% trans 'Fazer nova pesquisa' %} {% endif %}
+

{% endblock %} {% block detail_content %} @@ -21,24 +22,37 @@ {% endif %} {% if filter_url %} - - - - - {% if paginator.count %} - {% if paginator.count > 1 %} -

{% blocktrans with paginator.count as total_normas %}Pesquisa concluída com sucesso! Foram encontradas {{total_normas}} normas.{% endblocktrans %}

- {% elif paginator.count == 1 %} -

{% trans 'Pesquisa concluída com sucesso! Foi encontrada 1 matéria.'%}

- {% endif %} - - {% for n in page_obj %} - - {% endfor %} - {% else %} - + {% if page_obj|length %} +
+ {% if page_obj|length > 1 %} +

Pesquisa concluída com sucesso! Foram encontradas {{paginator.count}} normas.

+ {% elif page_obj|length == 1 %} +

{% trans 'Pesquisa concluída com sucesso! Foi encontrada 1 norma.'%}

{% endif %} -

{% trans "Resultados" %}

{{n}}

Nenhuma norma encontrada com essas especificações

- {% include "paginacao.html" %} +
+ + + + + + + + + + + {% for n in page_obj %} + + + + + + + + {% endfor %} +
TipoNúmeroAnoDataEmenta
{{n.tipo}}{{n.numero}}{{n.ano}}{{n.data}}{{n.ementa|safe}}
+ {% else %} +

+

Nenhuma norma encontrada com essas especificações

+ {% endif %} {% endif %} {% endblock detail_content %} From 3546e9f34c222577c890f2b4420ceda63adde8ee Mon Sep 17 00:00:00 2001 From: Eduardo Edson Batista Cordeiro Alves Date: Wed, 9 Nov 2016 15:02:13 -0200 Subject: [PATCH 012/139] Remove template de pesquisa antigo --- sapl/templates/norma/list_pesquisa.html | 39 ------------------------- sapl/templates/norma/pesquisa.html | 20 ------------- 2 files changed, 59 deletions(-) delete mode 100644 sapl/templates/norma/list_pesquisa.html delete mode 100644 sapl/templates/norma/pesquisa.html diff --git a/sapl/templates/norma/list_pesquisa.html b/sapl/templates/norma/list_pesquisa.html deleted file mode 100644 index 8fb65745a..000000000 --- a/sapl/templates/norma/list_pesquisa.html +++ /dev/null @@ -1,39 +0,0 @@ -{% extends "crud/detail.html" %} -{% load i18n %} -{% load crispy_forms_tags %} -{% load common_tags %} - -{% block actions %}{% endblock %} -{% block detail_content %} -
- {% if perms.norma.add_normajuridica %} - Adicionar Norma Jurídica - {% endif %} -
-


- {% if object_list %} - - - - - - - - - - - {% for obj in object_list %} - - - - - - - - {% endfor %} -
Tipo da Norma JuridicaNúmeroAnoDataEmenta
{{obj.tipo}}{{obj.numero}}{{obj.ano}}{{obj.data}}{{obj.ementa|safe}}
- {% else %} -

Nenhum Registro recuperado

- {% endif %} - -{% endblock detail_content %} diff --git a/sapl/templates/norma/pesquisa.html b/sapl/templates/norma/pesquisa.html deleted file mode 100644 index 0a3228575..000000000 --- a/sapl/templates/norma/pesquisa.html +++ /dev/null @@ -1,20 +0,0 @@ -{% extends "crud/detail.html" %} -{% load i18n %} -{% load crispy_forms_tags %} -{% load common_tags %} - - -{% block base_content %} - {% block actions %} -
- {% if perms.norma.add_normajuridica %} - {% trans 'Adicionar Norma Juridica' %} - {% endif %} -
-

- {% endblock %} - - {% block detail_content %} - {% crispy form %} - {% endblock %} -{% endblock %} From 96f442736b21151c2c8449940e5bbec0d0d8d0c8 Mon Sep 17 00:00:00 2001 From: Eduardo Edson Batista Cordeiro Alves Date: Wed, 9 Nov 2016 15:06:00 -0200 Subject: [PATCH 013/139] =?UTF-8?q?Adiciona=20op=C3=A7ao=20vazio=20na=20se?= =?UTF-8?q?le=C3=A7=C3=A3o=20de=20ano?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/norma/forms.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sapl/norma/forms.py b/sapl/norma/forms.py index 3e9abec99..5d57f6620 100644 --- a/sapl/norma/forms.py +++ b/sapl/norma/forms.py @@ -34,6 +34,8 @@ ORDENACAO_CHOICES = [('', '---------'), class NormaFilterSet(django_filters.FilterSet): + RANGE_ANOS.insert(0, ('', 'Selecione')) + filter_overrides = {models.DateField: { 'filter_class': django_filters.DateFromToRangeFilter, 'extra': lambda f: { From 38b9c844d858f2541468343769360be18d931522 Mon Sep 17 00:00:00 2001 From: Eduardo Edson Batista Cordeiro Alves Date: Wed, 9 Nov 2016 15:09:04 -0200 Subject: [PATCH 014/139] Diminui layout --- sapl/norma/forms.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/sapl/norma/forms.py b/sapl/norma/forms.py index 5d57f6620..7ae6b85ba 100644 --- a/sapl/norma/forms.py +++ b/sapl/norma/forms.py @@ -57,18 +57,16 @@ class NormaFilterSet(django_filters.FilterSet): def __init__(self, *args, **kwargs): super(NormaFilterSet, self).__init__(*args, **kwargs) - row1 = to_row([('tipo', 12)]) - row2 = to_row([('numero', 6), ('ano', 6)]) + row1 = to_row([('tipo', 4), ('numero', 4), ('ano', 4)]) + row2 = to_row([('data', 6), ('data_publicacao', 6)]) row3 = to_row([('ementa', 12)]) - row4 = to_row([('data', 6), ('data_publicacao', 6)]) - row5 = to_row([('assuntos', 12)]) - + row4 = to_row([('assuntos', 12)]) self.form.helper = FormHelper() self.form.helper.form_method = 'GET' self.form.helper.layout = Layout( Fieldset(_('Pesquisa de Norma'), - row1, row2, row3, row4, row5, + row1, row2, row3, row4, form_actions(save_label='Pesquisar')) ) From 3e7374d3934f7f377eed229426756136f891b8be Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Thu, 10 Nov 2016 09:02:34 -0200 Subject: [PATCH 015/139] =?UTF-8?q?Corrige=20pagina=C3=A7=C3=A3o=20na=20pe?= =?UTF-8?q?squisa=20de=20normas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/templates/norma/normajuridica_filter.html | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/sapl/templates/norma/normajuridica_filter.html b/sapl/templates/norma/normajuridica_filter.html index 9ae8e5294..a0df2fcb4 100644 --- a/sapl/templates/norma/normajuridica_filter.html +++ b/sapl/templates/norma/normajuridica_filter.html @@ -50,9 +50,13 @@ {% endfor %} + {% include "paginacao.html" %} {% else %}

Nenhuma norma encontrada com essas especificações

{% endif %} {% endif %} {% endblock detail_content %} + +{% block table_content %} +{% endblock table_content %} From 5f1335be4326ebc4f5b70d0aa6813bc63245bd5a Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Thu, 10 Nov 2016 09:11:04 -0200 Subject: [PATCH 016/139] add makemigrations --- .../migrations/0068_auto_20161110_0910.py | 35 +++++++++++++++++++ .../migrations/0022_auto_20161110_0910.py | 20 +++++++++++ .../migrations/0007_auto_20161110_0910.py | 25 +++++++++++++ 3 files changed, 80 insertions(+) create mode 100644 sapl/materia/migrations/0068_auto_20161110_0910.py create mode 100644 sapl/norma/migrations/0022_auto_20161110_0910.py create mode 100644 sapl/protocoloadm/migrations/0007_auto_20161110_0910.py diff --git a/sapl/materia/migrations/0068_auto_20161110_0910.py b/sapl/materia/migrations/0068_auto_20161110_0910.py new file mode 100644 index 000000000..5d4bc7b36 --- /dev/null +++ b/sapl/materia/migrations/0068_auto_20161110_0910.py @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-11-10 09:10 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('materia', '0067_auto_20161025_1630'), + ] + + operations = [ + migrations.AlterField( + model_name='materialegislativa', + name='ano', + field=models.PositiveSmallIntegerField(choices=[('', 'Selecione'), (2016, 2016), (2015, 2015), (2014, 2014), (2013, 2013), (2012, 2012), (2011, 2011), (2010, 2010), (2009, 2009), (2008, 2008), (2007, 2007), (2006, 2006), (2005, 2005), (2004, 2004), (2003, 2003), (2002, 2002), (2001, 2001), (2000, 2000), (1999, 1999), (1998, 1998), (1997, 1997), (1996, 1996), (1995, 1995), (1994, 1994), (1993, 1993), (1992, 1992), (1991, 1991), (1990, 1990), (1989, 1989), (1988, 1988), (1987, 1987), (1986, 1986), (1985, 1985), (1984, 1984), (1983, 1983), (1982, 1982), (1981, 1981), (1980, 1980), (1979, 1979), (1978, 1978), (1977, 1977), (1976, 1976), (1975, 1975), (1974, 1974), (1973, 1973), (1972, 1972), (1971, 1971), (1970, 1970), (1969, 1969), (1968, 1968), (1967, 1967), (1966, 1966), (1965, 1965), (1964, 1964), (1963, 1963), (1962, 1962), (1961, 1961), (1960, 1960), (1959, 1959), (1958, 1958), (1957, 1957), (1956, 1956), (1955, 1955), (1954, 1954), (1953, 1953), (1952, 1952), (1951, 1951), (1950, 1950), (1949, 1949), (1948, 1948), (1947, 1947), (1946, 1946), (1945, 1945), (1944, 1944), (1943, 1943), (1942, 1942), (1941, 1941), (1940, 1940), (1939, 1939), (1938, 1938), (1937, 1937), (1936, 1936), (1935, 1935), (1934, 1934), (1933, 1933), (1932, 1932), (1931, 1931), (1930, 1930), (1929, 1929), (1928, 1928), (1927, 1927), (1926, 1926), (1925, 1925), (1924, 1924), (1923, 1923), (1922, 1922), (1921, 1921), (1920, 1920), (1919, 1919), (1918, 1918), (1917, 1917), (1916, 1916), (1915, 1915), (1914, 1914), (1913, 1913), (1912, 1912), (1911, 1911), (1910, 1910), (1909, 1909), (1908, 1908), (1907, 1907), (1906, 1906), (1905, 1905), (1904, 1904), (1903, 1903), (1902, 1902), (1901, 1901), (1900, 1900), (1899, 1899), (1898, 1898), (1897, 1897), (1896, 1896), (1895, 1895), (1894, 1894), (1893, 1893), (1892, 1892), (1891, 1891), (1890, 1890)], verbose_name='Ano'), + ), + migrations.AlterField( + model_name='materialegislativa', + name='ano_origem_externa', + field=models.PositiveSmallIntegerField(blank=True, choices=[('', 'Selecione'), (2016, 2016), (2015, 2015), (2014, 2014), (2013, 2013), (2012, 2012), (2011, 2011), (2010, 2010), (2009, 2009), (2008, 2008), (2007, 2007), (2006, 2006), (2005, 2005), (2004, 2004), (2003, 2003), (2002, 2002), (2001, 2001), (2000, 2000), (1999, 1999), (1998, 1998), (1997, 1997), (1996, 1996), (1995, 1995), (1994, 1994), (1993, 1993), (1992, 1992), (1991, 1991), (1990, 1990), (1989, 1989), (1988, 1988), (1987, 1987), (1986, 1986), (1985, 1985), (1984, 1984), (1983, 1983), (1982, 1982), (1981, 1981), (1980, 1980), (1979, 1979), (1978, 1978), (1977, 1977), (1976, 1976), (1975, 1975), (1974, 1974), (1973, 1973), (1972, 1972), (1971, 1971), (1970, 1970), (1969, 1969), (1968, 1968), (1967, 1967), (1966, 1966), (1965, 1965), (1964, 1964), (1963, 1963), (1962, 1962), (1961, 1961), (1960, 1960), (1959, 1959), (1958, 1958), (1957, 1957), (1956, 1956), (1955, 1955), (1954, 1954), (1953, 1953), (1952, 1952), (1951, 1951), (1950, 1950), (1949, 1949), (1948, 1948), (1947, 1947), (1946, 1946), (1945, 1945), (1944, 1944), (1943, 1943), (1942, 1942), (1941, 1941), (1940, 1940), (1939, 1939), (1938, 1938), (1937, 1937), (1936, 1936), (1935, 1935), (1934, 1934), (1933, 1933), (1932, 1932), (1931, 1931), (1930, 1930), (1929, 1929), (1928, 1928), (1927, 1927), (1926, 1926), (1925, 1925), (1924, 1924), (1923, 1923), (1922, 1922), (1921, 1921), (1920, 1920), (1919, 1919), (1918, 1918), (1917, 1917), (1916, 1916), (1915, 1915), (1914, 1914), (1913, 1913), (1912, 1912), (1911, 1911), (1910, 1910), (1909, 1909), (1908, 1908), (1907, 1907), (1906, 1906), (1905, 1905), (1904, 1904), (1903, 1903), (1902, 1902), (1901, 1901), (1900, 1900), (1899, 1899), (1898, 1898), (1897, 1897), (1896, 1896), (1895, 1895), (1894, 1894), (1893, 1893), (1892, 1892), (1891, 1891), (1890, 1890)], null=True, verbose_name='Ano'), + ), + migrations.AlterField( + model_name='numeracao', + name='ano_materia', + field=models.PositiveSmallIntegerField(choices=[('', 'Selecione'), (2016, 2016), (2015, 2015), (2014, 2014), (2013, 2013), (2012, 2012), (2011, 2011), (2010, 2010), (2009, 2009), (2008, 2008), (2007, 2007), (2006, 2006), (2005, 2005), (2004, 2004), (2003, 2003), (2002, 2002), (2001, 2001), (2000, 2000), (1999, 1999), (1998, 1998), (1997, 1997), (1996, 1996), (1995, 1995), (1994, 1994), (1993, 1993), (1992, 1992), (1991, 1991), (1990, 1990), (1989, 1989), (1988, 1988), (1987, 1987), (1986, 1986), (1985, 1985), (1984, 1984), (1983, 1983), (1982, 1982), (1981, 1981), (1980, 1980), (1979, 1979), (1978, 1978), (1977, 1977), (1976, 1976), (1975, 1975), (1974, 1974), (1973, 1973), (1972, 1972), (1971, 1971), (1970, 1970), (1969, 1969), (1968, 1968), (1967, 1967), (1966, 1966), (1965, 1965), (1964, 1964), (1963, 1963), (1962, 1962), (1961, 1961), (1960, 1960), (1959, 1959), (1958, 1958), (1957, 1957), (1956, 1956), (1955, 1955), (1954, 1954), (1953, 1953), (1952, 1952), (1951, 1951), (1950, 1950), (1949, 1949), (1948, 1948), (1947, 1947), (1946, 1946), (1945, 1945), (1944, 1944), (1943, 1943), (1942, 1942), (1941, 1941), (1940, 1940), (1939, 1939), (1938, 1938), (1937, 1937), (1936, 1936), (1935, 1935), (1934, 1934), (1933, 1933), (1932, 1932), (1931, 1931), (1930, 1930), (1929, 1929), (1928, 1928), (1927, 1927), (1926, 1926), (1925, 1925), (1924, 1924), (1923, 1923), (1922, 1922), (1921, 1921), (1920, 1920), (1919, 1919), (1918, 1918), (1917, 1917), (1916, 1916), (1915, 1915), (1914, 1914), (1913, 1913), (1912, 1912), (1911, 1911), (1910, 1910), (1909, 1909), (1908, 1908), (1907, 1907), (1906, 1906), (1905, 1905), (1904, 1904), (1903, 1903), (1902, 1902), (1901, 1901), (1900, 1900), (1899, 1899), (1898, 1898), (1897, 1897), (1896, 1896), (1895, 1895), (1894, 1894), (1893, 1893), (1892, 1892), (1891, 1891), (1890, 1890)], verbose_name='Ano'), + ), + migrations.AlterField( + model_name='proposicao', + name='ano', + field=models.PositiveSmallIntegerField(blank=True, choices=[('', 'Selecione'), (2016, 2016), (2015, 2015), (2014, 2014), (2013, 2013), (2012, 2012), (2011, 2011), (2010, 2010), (2009, 2009), (2008, 2008), (2007, 2007), (2006, 2006), (2005, 2005), (2004, 2004), (2003, 2003), (2002, 2002), (2001, 2001), (2000, 2000), (1999, 1999), (1998, 1998), (1997, 1997), (1996, 1996), (1995, 1995), (1994, 1994), (1993, 1993), (1992, 1992), (1991, 1991), (1990, 1990), (1989, 1989), (1988, 1988), (1987, 1987), (1986, 1986), (1985, 1985), (1984, 1984), (1983, 1983), (1982, 1982), (1981, 1981), (1980, 1980), (1979, 1979), (1978, 1978), (1977, 1977), (1976, 1976), (1975, 1975), (1974, 1974), (1973, 1973), (1972, 1972), (1971, 1971), (1970, 1970), (1969, 1969), (1968, 1968), (1967, 1967), (1966, 1966), (1965, 1965), (1964, 1964), (1963, 1963), (1962, 1962), (1961, 1961), (1960, 1960), (1959, 1959), (1958, 1958), (1957, 1957), (1956, 1956), (1955, 1955), (1954, 1954), (1953, 1953), (1952, 1952), (1951, 1951), (1950, 1950), (1949, 1949), (1948, 1948), (1947, 1947), (1946, 1946), (1945, 1945), (1944, 1944), (1943, 1943), (1942, 1942), (1941, 1941), (1940, 1940), (1939, 1939), (1938, 1938), (1937, 1937), (1936, 1936), (1935, 1935), (1934, 1934), (1933, 1933), (1932, 1932), (1931, 1931), (1930, 1930), (1929, 1929), (1928, 1928), (1927, 1927), (1926, 1926), (1925, 1925), (1924, 1924), (1923, 1923), (1922, 1922), (1921, 1921), (1920, 1920), (1919, 1919), (1918, 1918), (1917, 1917), (1916, 1916), (1915, 1915), (1914, 1914), (1913, 1913), (1912, 1912), (1911, 1911), (1910, 1910), (1909, 1909), (1908, 1908), (1907, 1907), (1906, 1906), (1905, 1905), (1904, 1904), (1903, 1903), (1902, 1902), (1901, 1901), (1900, 1900), (1899, 1899), (1898, 1898), (1897, 1897), (1896, 1896), (1895, 1895), (1894, 1894), (1893, 1893), (1892, 1892), (1891, 1891), (1890, 1890)], default=None, null=True, verbose_name='Ano'), + ), + ] diff --git a/sapl/norma/migrations/0022_auto_20161110_0910.py b/sapl/norma/migrations/0022_auto_20161110_0910.py new file mode 100644 index 000000000..c440abb8a --- /dev/null +++ b/sapl/norma/migrations/0022_auto_20161110_0910.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-11-10 09:10 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('norma', '0021_auto_20161028_1335'), + ] + + operations = [ + migrations.AlterField( + model_name='normajuridica', + name='ano', + field=models.PositiveSmallIntegerField(choices=[('', 'Selecione'), (2016, 2016), (2015, 2015), (2014, 2014), (2013, 2013), (2012, 2012), (2011, 2011), (2010, 2010), (2009, 2009), (2008, 2008), (2007, 2007), (2006, 2006), (2005, 2005), (2004, 2004), (2003, 2003), (2002, 2002), (2001, 2001), (2000, 2000), (1999, 1999), (1998, 1998), (1997, 1997), (1996, 1996), (1995, 1995), (1994, 1994), (1993, 1993), (1992, 1992), (1991, 1991), (1990, 1990), (1989, 1989), (1988, 1988), (1987, 1987), (1986, 1986), (1985, 1985), (1984, 1984), (1983, 1983), (1982, 1982), (1981, 1981), (1980, 1980), (1979, 1979), (1978, 1978), (1977, 1977), (1976, 1976), (1975, 1975), (1974, 1974), (1973, 1973), (1972, 1972), (1971, 1971), (1970, 1970), (1969, 1969), (1968, 1968), (1967, 1967), (1966, 1966), (1965, 1965), (1964, 1964), (1963, 1963), (1962, 1962), (1961, 1961), (1960, 1960), (1959, 1959), (1958, 1958), (1957, 1957), (1956, 1956), (1955, 1955), (1954, 1954), (1953, 1953), (1952, 1952), (1951, 1951), (1950, 1950), (1949, 1949), (1948, 1948), (1947, 1947), (1946, 1946), (1945, 1945), (1944, 1944), (1943, 1943), (1942, 1942), (1941, 1941), (1940, 1940), (1939, 1939), (1938, 1938), (1937, 1937), (1936, 1936), (1935, 1935), (1934, 1934), (1933, 1933), (1932, 1932), (1931, 1931), (1930, 1930), (1929, 1929), (1928, 1928), (1927, 1927), (1926, 1926), (1925, 1925), (1924, 1924), (1923, 1923), (1922, 1922), (1921, 1921), (1920, 1920), (1919, 1919), (1918, 1918), (1917, 1917), (1916, 1916), (1915, 1915), (1914, 1914), (1913, 1913), (1912, 1912), (1911, 1911), (1910, 1910), (1909, 1909), (1908, 1908), (1907, 1907), (1906, 1906), (1905, 1905), (1904, 1904), (1903, 1903), (1902, 1902), (1901, 1901), (1900, 1900), (1899, 1899), (1898, 1898), (1897, 1897), (1896, 1896), (1895, 1895), (1894, 1894), (1893, 1893), (1892, 1892), (1891, 1891), (1890, 1890)], verbose_name='Ano'), + ), + ] diff --git a/sapl/protocoloadm/migrations/0007_auto_20161110_0910.py b/sapl/protocoloadm/migrations/0007_auto_20161110_0910.py new file mode 100644 index 000000000..79aa42f23 --- /dev/null +++ b/sapl/protocoloadm/migrations/0007_auto_20161110_0910.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-11-10 09:10 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('protocoloadm', '0006_auto_20161103_1721'), + ] + + operations = [ + migrations.AlterField( + model_name='documentoadministrativo', + name='ano', + field=models.PositiveSmallIntegerField(choices=[('', 'Selecione'), (2016, 2016), (2015, 2015), (2014, 2014), (2013, 2013), (2012, 2012), (2011, 2011), (2010, 2010), (2009, 2009), (2008, 2008), (2007, 2007), (2006, 2006), (2005, 2005), (2004, 2004), (2003, 2003), (2002, 2002), (2001, 2001), (2000, 2000), (1999, 1999), (1998, 1998), (1997, 1997), (1996, 1996), (1995, 1995), (1994, 1994), (1993, 1993), (1992, 1992), (1991, 1991), (1990, 1990), (1989, 1989), (1988, 1988), (1987, 1987), (1986, 1986), (1985, 1985), (1984, 1984), (1983, 1983), (1982, 1982), (1981, 1981), (1980, 1980), (1979, 1979), (1978, 1978), (1977, 1977), (1976, 1976), (1975, 1975), (1974, 1974), (1973, 1973), (1972, 1972), (1971, 1971), (1970, 1970), (1969, 1969), (1968, 1968), (1967, 1967), (1966, 1966), (1965, 1965), (1964, 1964), (1963, 1963), (1962, 1962), (1961, 1961), (1960, 1960), (1959, 1959), (1958, 1958), (1957, 1957), (1956, 1956), (1955, 1955), (1954, 1954), (1953, 1953), (1952, 1952), (1951, 1951), (1950, 1950), (1949, 1949), (1948, 1948), (1947, 1947), (1946, 1946), (1945, 1945), (1944, 1944), (1943, 1943), (1942, 1942), (1941, 1941), (1940, 1940), (1939, 1939), (1938, 1938), (1937, 1937), (1936, 1936), (1935, 1935), (1934, 1934), (1933, 1933), (1932, 1932), (1931, 1931), (1930, 1930), (1929, 1929), (1928, 1928), (1927, 1927), (1926, 1926), (1925, 1925), (1924, 1924), (1923, 1923), (1922, 1922), (1921, 1921), (1920, 1920), (1919, 1919), (1918, 1918), (1917, 1917), (1916, 1916), (1915, 1915), (1914, 1914), (1913, 1913), (1912, 1912), (1911, 1911), (1910, 1910), (1909, 1909), (1908, 1908), (1907, 1907), (1906, 1906), (1905, 1905), (1904, 1904), (1903, 1903), (1902, 1902), (1901, 1901), (1900, 1900), (1899, 1899), (1898, 1898), (1897, 1897), (1896, 1896), (1895, 1895), (1894, 1894), (1893, 1893), (1892, 1892), (1891, 1891), (1890, 1890)], verbose_name='Ano'), + ), + migrations.AlterField( + model_name='protocolo', + name='ano', + field=models.PositiveSmallIntegerField(choices=[('', 'Selecione'), (2016, 2016), (2015, 2015), (2014, 2014), (2013, 2013), (2012, 2012), (2011, 2011), (2010, 2010), (2009, 2009), (2008, 2008), (2007, 2007), (2006, 2006), (2005, 2005), (2004, 2004), (2003, 2003), (2002, 2002), (2001, 2001), (2000, 2000), (1999, 1999), (1998, 1998), (1997, 1997), (1996, 1996), (1995, 1995), (1994, 1994), (1993, 1993), (1992, 1992), (1991, 1991), (1990, 1990), (1989, 1989), (1988, 1988), (1987, 1987), (1986, 1986), (1985, 1985), (1984, 1984), (1983, 1983), (1982, 1982), (1981, 1981), (1980, 1980), (1979, 1979), (1978, 1978), (1977, 1977), (1976, 1976), (1975, 1975), (1974, 1974), (1973, 1973), (1972, 1972), (1971, 1971), (1970, 1970), (1969, 1969), (1968, 1968), (1967, 1967), (1966, 1966), (1965, 1965), (1964, 1964), (1963, 1963), (1962, 1962), (1961, 1961), (1960, 1960), (1959, 1959), (1958, 1958), (1957, 1957), (1956, 1956), (1955, 1955), (1954, 1954), (1953, 1953), (1952, 1952), (1951, 1951), (1950, 1950), (1949, 1949), (1948, 1948), (1947, 1947), (1946, 1946), (1945, 1945), (1944, 1944), (1943, 1943), (1942, 1942), (1941, 1941), (1940, 1940), (1939, 1939), (1938, 1938), (1937, 1937), (1936, 1936), (1935, 1935), (1934, 1934), (1933, 1933), (1932, 1932), (1931, 1931), (1930, 1930), (1929, 1929), (1928, 1928), (1927, 1927), (1926, 1926), (1925, 1925), (1924, 1924), (1923, 1923), (1922, 1922), (1921, 1921), (1920, 1920), (1919, 1919), (1918, 1918), (1917, 1917), (1916, 1916), (1915, 1915), (1914, 1914), (1913, 1913), (1912, 1912), (1911, 1911), (1910, 1910), (1909, 1909), (1908, 1908), (1907, 1907), (1906, 1906), (1905, 1905), (1904, 1904), (1903, 1903), (1902, 1902), (1901, 1901), (1900, 1900), (1899, 1899), (1898, 1898), (1897, 1897), (1896, 1896), (1895, 1895), (1894, 1894), (1893, 1893), (1892, 1892), (1891, 1891), (1890, 1890)], verbose_name='Ano do Protocolo'), + ), + ] From 8927cbf9c9d9f990f92e442e0394912fe740753b Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Thu, 10 Nov 2016 18:01:28 -0200 Subject: [PATCH 017/139] corrige erro na vld de user na integr de prop --- sapl/compilacao/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sapl/compilacao/views.py b/sapl/compilacao/views.py index 1d5e6d459..6a2c5aacd 100644 --- a/sapl/compilacao/views.py +++ b/sapl/compilacao/views.py @@ -162,7 +162,7 @@ class IntegracaoTaView(TemplateView): (request.user.has_perm( 'compilacao.change_your_dispositivo_edicao_dinamica') and ta_values.get('privacidade', STATUS_TA_EDITION - ) == STATUS_TA_PUBLIC)): + ) == STATUS_TA_PRIVATE)): """ o texto articulado será criado/atualizado se: - texto articulado já foi criado. From 41674d72328a81557d51b2befe6b597ca7065789 Mon Sep 17 00:00:00 2001 From: Luciano Almeida Date: Thu, 10 Nov 2016 18:33:41 -0200 Subject: [PATCH 018/139] =?UTF-8?q?Ajusta=20problema=20de=20objetos=20marc?= =?UTF-8?q?ados=20pra=20exclus=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Luciano Almeida --- sapl/legacy/migration.py | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/sapl/legacy/migration.py b/sapl/legacy/migration.py index aed78fd88..3a28f6fa4 100644 --- a/sapl/legacy/migration.py +++ b/sapl/legacy/migration.py @@ -12,8 +12,8 @@ from django.db.models.base import ModelBase from model_mommy import mommy from model_mommy.mommy import foreign_key_required, make -from sapl.base.models import Autor, ProblemaMigracao, TipoAutor -from sapl.comissoes.models import Composicao, Participacao +from sapl.base.models import Autor, ProblemaMigracao +from sapl.comissoes.models import Comissao, Composicao, Participacao from sapl.materia.models import (Proposicao, StatusTramitacao, TipoDocumento, TipoMateriaLegislativa, TipoProposicao, Tramitacao) @@ -338,16 +338,18 @@ class DataMigrator: self._do_migrate(obj) # exclude logically deleted in legacy base info('Deletando models com ind_excluido...') - for obj in self.to_delete: - try: - obj.delete() - except ProtectedError: - msg = 'A entrada de PK %s da model %s não pode ser excluida' %\ - (obj.pk, obj._meta.model_name) - descricao = 'Um ou mais objetos protegidos ' - warn(msg + ' => ' + descricao) - save_relation(obj=obj, problema=msg, - descricao=descricao, eh_stub=False) + while self.to_delete: + for obj in self.to_delete: + try: + obj.delete() + self.to_delete.remove(obj) + except ProtectedError: + msg = 'A entrada de PK %s da model %s não pode ser ' \ + 'excluida' % (obj.pk, obj._meta.model_name) + descricao = 'Um ou mais objetos protegidos ' + warn(msg + ' => ' + descricao) + save_relation(obj=obj, problema=msg, + descricao=descricao, eh_stub=False) info('Deletando stubs desnecessários...') while self.delete_stubs(): @@ -532,7 +534,11 @@ def adjust_normajuridica_depois_salvar(new, old): def adjust_autor(new, old): - new.autor_related = TipoAutor.objects.get(pk=old.tip_autor) + if old.cod_parlamentar: + new.autor_related = Parlamentar.objects.get(pk=old.cod_parlamentar) + elif old.cod_comissao: + new.autor_related = Comissao.objects.get(pk=old.cod_comissao) + if old.col_username: if not User.objects.filter(username=old.col_username).exists(): user = User(username=old.col_username, password=12345) From 0f85ede6dab901719e312b9d235711154561c522 Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Fri, 11 Nov 2016 18:46:56 -0200 Subject: [PATCH 019/139] =?UTF-8?q?Apaga=20linha=20desnecess=C3=A1ria=20do?= =?UTF-8?q?=20roteiro=20de=20instala=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.rst | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/README.rst b/README.rst index 64cc4d4d5..26068f1f9 100644 --- a/README.rst +++ b/README.rst @@ -34,8 +34,6 @@ Instalar as seguintes dependências do sistema:: software-properties-common build-essential libxml2-dev libjpeg-dev \ libmysqlclient-dev libssl-dev libffi-dev libxslt1-dev python3-setuptools curl - sudo easy_install3 pip lxml - sudo -i curl -sL https://deb.nodesource.com/setup_5.x | bash - exit @@ -221,7 +219,7 @@ Instruções para Importação da base mysql 2.5 Criar um arquivo `sapl/legacy/.env` com o seguinte conteúdo (parametros de acesso ao banco 2.5):: DATABASE_URL = mysql://[usuario do mysql]:[senha do myuysql]@[host]:[porta]/[banco] - + o conteúdo do arquivo será semelhante a isso:: DATABASE_URL = mysql://sapl:sapl@localhost:3306/interlegis From b4e87d1a1fddb74adcb0041c617101965f8ff692 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Fri, 11 Nov 2016 11:01:00 -0200 Subject: [PATCH 020/139] Add disponibilidade de perfis para TipoProposicao --- sapl/materia/forms.py | 19 +++++++------ .../migrations/0069_tipoproposicao_perfis.py | 21 +++++++++++++++ sapl/materia/models.py | 27 +++++++++---------- .../materia/tipoproposicao_form.html | 6 ++--- 4 files changed, 48 insertions(+), 25 deletions(-) create mode 100644 sapl/materia/migrations/0069_tipoproposicao_perfis.py diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py index e6c6f1260..f9f8ad7c1 100644 --- a/sapl/materia/forms.py +++ b/sapl/materia/forms.py @@ -22,7 +22,8 @@ import django_filters from sapl.base.models import Autor from sapl.comissoes.models import Comissao from sapl.compilacao.models import STATUS_TA_PRIVATE,\ - STATUS_TA_IMMUTABLE_PUBLIC, TextoArticulado, STATUS_TA_PUBLIC + STATUS_TA_IMMUTABLE_PUBLIC, TextoArticulado, STATUS_TA_PUBLIC,\ + PerfilEstruturalTextoArticulado from sapl.crispy_layout_mixin import (SaplFormLayout, form_actions, to_column, to_row) from sapl.materia.models import TipoProposicao, MateriaLegislativa,\ @@ -747,16 +748,20 @@ class TipoProposicaoForm(ModelForm): fields = ['descricao', 'content_type', 'tipo_conteudo_related_radio', - 'tipo_conteudo_related'] + 'tipo_conteudo_related', + 'perfis'] - widgets = {'tipo_conteudo_related': forms.HiddenInput()} + widgets = {'tipo_conteudo_related': forms.HiddenInput(), + 'perfis': widgets.CheckboxSelectMultiple()} def __init__(self, *args, **kwargs): tipo_select = Fieldset(TipoProposicao._meta.verbose_name, to_column(('descricao', 5)), to_column(('content_type', 7)), - to_column(('tipo_conteudo_related_radio', 12))) + to_column(('tipo_conteudo_related_radio', 6)), + + to_column(('perfis', 6))) self.helper = FormHelper() self.helper.layout = SaplFormLayout(tipo_select) @@ -795,7 +800,7 @@ class TipoProposicaoForm(ModelForm): @transaction.atomic def save(self, commit=False): - tipo_proposicao = super(TipoProposicaoForm, self).save(commit) + tipo_proposicao = self.instance assert tipo_proposicao.content_type @@ -803,9 +808,7 @@ class TipoProposicaoForm(ModelForm): tipo_proposicao.content_type.model_class( ).objects.get(pk=self.cleaned_data['tipo_conteudo_related']) - tipo_proposicao.save() - - return tipo_proposicao + return super().save(True) class ProposicaoForm(forms.ModelForm): diff --git a/sapl/materia/migrations/0069_tipoproposicao_perfis.py b/sapl/materia/migrations/0069_tipoproposicao_perfis.py new file mode 100644 index 000000000..e6bcb3076 --- /dev/null +++ b/sapl/materia/migrations/0069_tipoproposicao_perfis.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-11-11 10:05 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('compilacao', '0069_auto_20161107_1932'), + ('materia', '0068_auto_20161110_0910'), + ] + + operations = [ + migrations.AddField( + model_name='tipoproposicao', + name='perfis', + field=models.ManyToManyField(blank=True, to='compilacao.PerfilEstruturalTextoArticulado', verbose_name='Perfis Estruturais de Textos Articulados'), + ), + ] diff --git a/sapl/materia/models.py b/sapl/materia/models.py index 589f039ce..dccdb66e7 100644 --- a/sapl/materia/models.py +++ b/sapl/materia/models.py @@ -8,7 +8,8 @@ from model_utils import Choices from sapl.base.models import Autor from sapl.comissoes.models import Comissao -from sapl.compilacao.models import TextoArticulado +from sapl.compilacao.models import TextoArticulado,\ + PerfilEstruturalTextoArticulado from sapl.parlamentares.models import Parlamentar from sapl.utils import (RANGE_ANOS, YES_NO_CHOICES, SaplGenericForeignKey, SaplGenericRelation, restringe_tipos_de_arquivo_txt, @@ -38,19 +39,17 @@ class TipoProposicao(models.Model): tipo_conteudo_related = SaplGenericForeignKey( 'content_type', 'object_id', verbose_name=_('Seleção de Tipo')) - """materia_ou_documento = models.CharField( - max_length=1, verbose_name=_('Gera'), choices=MAT_OU_DOC_CHOICES) - modelo = models.CharField(max_length=50, verbose_name=_('Modelo XML')) - - # mutually exclusive (depend on materia_ou_documento) - tipo_materia = models.ForeignKey( - TipoMateriaLegislativa, - blank=True, - null=True, - verbose_name=_('Tipo de Matéria')) - tipo_documento = models.ForeignKey( - TipoDocumento, blank=True, null=True, - verbose_name=_('Tipo de Documento'))""" + perfis = models.ManyToManyField( + PerfilEstruturalTextoArticulado, + blank=True, verbose_name=_('Perfis Estruturais de Textos Articulados'), + help_text=_(""" + Mesmo que em Configurações da Aplicação nas + Tabelas Auxiliares esteja definido que Proposições possam + utilizar Textos Articulados, ao gerar uma proposição, + a solução de Textos Articulados será disponibilizada se + o Tipo escolhido para a Proposição estiver associada a ao + menos um Perfil Estrutural de Texto Articulado. + """)) class Meta: verbose_name = _('Tipo de Proposição') diff --git a/sapl/templates/materia/tipoproposicao_form.html b/sapl/templates/materia/tipoproposicao_form.html index ede423c40..25943b466 100644 --- a/sapl/templates/materia/tipoproposicao_form.html +++ b/sapl/templates/materia/tipoproposicao_form.html @@ -6,7 +6,7 @@ aaa @@ -16,12 +17,11 @@ + +

-

+

- - + +

-

________________________________________________

-

-

________________________________________________

- -

Cronômetros

- - - - - - - - - - -
Discurso:
Aparte:
Questão de Ordem:
- -

________________________________________________

- -

Parlamentares e Votos

- - - - - -
- -

________________________________________________

- -

Matéria em Votação

+

+ +
+
+
+

Parlamentares

+ + + + +

+
+ +
+

Cronômetros

+ + + + + + + + + + +
Discurso:
Aparte:
Questão de Ordem:
+
+ +
+

Resultado

+ + + + +

+
+
+
+ +
+

Matéria em Votação

- - + +

- + \ No newline at end of file diff --git a/sapl/templates/sessao/painel.html b/sapl/templates/sessao/painel.html index f4e95163a..cd6f80f3f 100644 --- a/sapl/templates/sessao/painel.html +++ b/sapl/templates/sessao/painel.html @@ -11,7 +11,6 @@ {% block detail_content %} -
@@ -95,8 +94,6 @@ $(function() { startTime(); - var audioAlertFinish = document.getElementById("audio"); - $('#discurso').prop('disabled', true); $('#aparte').prop('disabled', true); $('#ordem').prop('disabled', true); @@ -108,8 +105,17 @@ $(function() { stopAt: 0, milliseconds: false }).on('runnerFinish', function(eventObject, info){ - audioAlertFinish.play(); - }); + $.get('/painel/cronometro', { tipo: 'discurso', action: 'stop' } ); + + $('#discursoReset').show(); + $('#discurso').runner('stop'); + $('#discursoStart').text('Iniciar'); + $('#aparteStart').prop('disabled', false); + $('#aparteReset').prop('disabled', false); + $('#ordemStart').prop('disabled', false); + $('#ordemReset').prop('disabled', false); + + }); $('#discursoStart').click(function() { @@ -154,8 +160,17 @@ $(function() { stopAt: 0, milliseconds: false }).on('runnerFinish', function(eventObject, info){ - audioAlertFinish.play(); - }); + $.get('/painel/cronometro', { tipo: 'aparte', action: 'stop' } ); + + $('#aparteReset').show(); + $('#aparte').runner('stop'); + $('#aparteStart').text('Iniciar'); + $('#discursoStart').prop('disabled', false); + $('#discursoReset').prop('disabled', false); + $('#ordemStart').prop('disabled', false); + $('#ordemReset').prop('disabled', false); + + }); $('#aparteStart').click(function(){ if ($('#aparteStart').text() == 'Iniciar') { @@ -199,8 +214,16 @@ $(function() { stopAt: 0, milliseconds: false }).on('runnerFinish', function(eventObject, info){ - audioAlertFinish.play(); - }); + $.get('/painel/cronometro', { tipo: 'ordem', action: 'stop' } ); + + $('#ordemReset').show(); + $('#ordem').runner('stop'); + $('#ordemStart').text('Iniciar'); + $('#discursoStart').prop('disabled', false); + $('#discursoReset').prop('disabled', false); + $('#aparteStart').prop('disabled', false); + $('#aparteReset').prop('disabled', false); + }); $('#ordemStart').click(function() { if ($('#ordemStart').text() == 'Iniciar') { From a58b88a170f40a4a0558670276c19c2b00e45f84 Mon Sep 17 00:00:00 2001 From: Eduardo Calil Date: Mon, 21 Nov 2016 08:46:55 -0200 Subject: [PATCH 024/139] Fix #795 --- sapl/materia/views.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/sapl/materia/views.py b/sapl/materia/views.py index dade1932b..c916c222d 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -1101,6 +1101,11 @@ class MateriaLegislativaPesquisaView(FilterView): lista = filtra_tramitacao_destino(unidade_destino) qs = qs.filter(id__in=lista).distinct() + if 'o' in self.request.GET: + if not self.request.GET['o']: + qs = qs.order_by( + '-data_apresentacao', '-tipo__sigla', '-ano', '-numero') + kwargs.update({ 'queryset': qs, }) From 1a94816cd899ae2666e6c73743c6df2105712b1e Mon Sep 17 00:00:00 2001 From: Eduardo Edson Batista Cordeiro Alves Date: Mon, 21 Nov 2016 08:58:42 -0200 Subject: [PATCH 025/139] Fix #794 --- .../parlamentares/parlamentar_perfil_publico.html | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/sapl/templates/parlamentares/parlamentar_perfil_publico.html b/sapl/templates/parlamentares/parlamentar_perfil_publico.html index 84bb03a5c..11bfc6bfc 100644 --- a/sapl/templates/parlamentares/parlamentar_perfil_publico.html +++ b/sapl/templates/parlamentares/parlamentar_perfil_publico.html @@ -28,7 +28,7 @@

Nome Completo:   {{object.nome_completo}}

- +

Partido:   {{object.filiacao_set.first.partido|default_if_none:"Não informado"}}

@@ -65,7 +65,11 @@
- +
+
+

Biografia:   {{object.biografia|safe}}

+
+
{% endblock detail_content %} From 5af931dde891734613048ba45ff2a75c5efeb728 Mon Sep 17 00:00:00 2001 From: Eduardo Calil Date: Mon, 21 Nov 2016 09:07:00 -0200 Subject: [PATCH 026/139] Ajustes no layout do painel --- sapl/templates/painel/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sapl/templates/painel/index.html b/sapl/templates/painel/index.html index 2b668564e..a68f3b8b9 100644 --- a/sapl/templates/painel/index.html +++ b/sapl/templates/painel/index.html @@ -86,7 +86,7 @@

Matéria em Votação

- +
From 9eabe5db15f59615577b98ed60d6ee145427458e Mon Sep 17 00:00:00 2001 From: Eduardo Calil Date: Mon, 21 Nov 2016 09:11:37 -0200 Subject: [PATCH 027/139] Fix #793 --- sapl/sessao/views.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index 9c377b713..99a992bba 100644 --- a/sapl/sessao/views.py +++ b/sapl/sessao/views.py @@ -80,10 +80,14 @@ def reordernar_materias_ordem(request, pk): @permission_required('sessao.change_expedientemateria') def abrir_votacao_expediente_view(request, pk, spk): - existe_votacao_aberta = ExpedienteMateria.objects.filter( + existe_expediente_aberto = ExpedienteMateria.objects.filter( sessao_plenaria_id=spk, votacao_aberta=True ).exists() - if existe_votacao_aberta: + existe_ordem_aberta = OrdemDia.objects.filter( + sessao_plenaria_id=spk, votacao_aberta=True + ).exists() + + if existe_expediente_aberto or existe_ordem_aberta: msg = _('Já existe uma matéria com votação aberta. Para abrir ' 'outra, termine ou feche a votação existente.') messages.add_message(request, messages.INFO, msg) @@ -97,10 +101,14 @@ def abrir_votacao_expediente_view(request, pk, spk): @permission_required('sessao.change_ordemdia') def abrir_votacao_ordem_view(request, pk, spk): - existe_votacao_aberta = OrdemDia.objects.filter( + existe_ordem_aberta = OrdemDia.objects.filter( sessao_plenaria_id=spk, votacao_aberta=True ).exists() - if existe_votacao_aberta: + existe_expediente_aberto = ExpedienteMateria.objects.filter( + sessao_plenaria_id=spk, votacao_aberta=True + ).exists() + + if existe_ordem_aberta or existe_expediente_aberto: msg = _('Já existe uma matéria com votação aberta. Para abrir ' 'outra, termine ou feche a votação existente.') messages.add_message(request, messages.INFO, msg) From 5d06baa56e2f0f24a9342e98758d28391d9f3b3f Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Mon, 21 Nov 2016 09:36:27 -0200 Subject: [PATCH 028/139] Corrige erro no registro de comp em blocos vazios --- sapl/compilacao/compilacao_data_tables.sql | 13 +++++++++---- sapl/compilacao/views.py | 6 +++++- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/sapl/compilacao/compilacao_data_tables.sql b/sapl/compilacao/compilacao_data_tables.sql index ed7c70525..f7df6ff00 100644 --- a/sapl/compilacao/compilacao_data_tables.sql +++ b/sapl/compilacao/compilacao_data_tables.sql @@ -1,7 +1,8 @@ -INSERT INTO compilacao_perfilestruturaltextoarticulado (id, sigla, nome, padrao) VALUES (1, 'LC95', 'Lei Complementar 95', true); -INSERT INTO compilacao_perfilestruturaltextoarticulado (id, sigla, nome, padrao) VALUES (2, 'LC95-v', 'Lei Complementar 95 com Variação', false); -INSERT INTO compilacao_perfilestruturaltextoarticulado (id, sigla, nome, padrao) VALUES (3, 'PLOL', 'Projeto de Lei Ordinária do Legislativo', false); -SELECT pg_catalog.setval('compilacao_perfilestruturaltextoarticulado_id_seq', 3, true); +INSERT INTO compilacao_perfilestruturaltextoarticulado (id, sigla, nome, padrao, parent_id) VALUES (1, 'LC95', 'Lei Complementar 95', true, null); +INSERT INTO compilacao_perfilestruturaltextoarticulado (id, sigla, nome, padrao, parent_id) VALUES (2, 'LC95-v', 'Lei Complementar 95 com Variação', false, null); +INSERT INTO compilacao_perfilestruturaltextoarticulado (id, sigla, nome, padrao, parent_id) VALUES (3, 'PLOL', 'Projeto de Lei Ordinária do Legislativo', false, 1); +INSERT INTO compilacao_perfilestruturaltextoarticulado (id, sigla, nome, padrao, parent_id) VALUES (4, 'REQ', 'Requerimento', false, null); +SELECT pg_catalog.setval('compilacao_perfilestruturaltextoarticulado_id_seq', 4, true); INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (1, 'Articulação', 'articulacao', '', '', 0, '', '', '', '', '', '', true, 'N', 'N', 'N', 'N', 'N', 'N', '-', '-', '-', '-', '-', true, false); INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (2, 'Ementa', 'ementa', '', '', 0, '', '', '', '', '', '', false, 'N', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false, false); @@ -250,6 +251,10 @@ INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (126, 1, false, 3, -1, false); +INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (2, 1, false, 4, -1, false); +INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (125, 1, false, 4, -1, false); +INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (126, 1, false, 4, -1, false); + INSERT INTO compilacao_tiponota (id, sigla, nome, modelo) VALUES (1, 'NE', 'Nota Explicativa', ''); INSERT INTO compilacao_tiponota (id, sigla, nome, modelo) VALUES (2, 'NI', 'Nota de Inconstitucionalidade', 'Declaração de Inconstitucionalidade conforme n...'); diff --git a/sapl/compilacao/views.py b/sapl/compilacao/views.py index 5eab491dc..67c37adcd 100644 --- a/sapl/compilacao/views.py +++ b/sapl/compilacao/views.py @@ -1169,6 +1169,8 @@ class TextEditView(CompMixin, TemplateView): a.inicio_eficacia = ta.data a.save() + return + td = TipoDispositivo.objects.filter(class_css='ementa')[0] e = Dispositivo() e.nivel = 1 @@ -2419,9 +2421,11 @@ class ActionsEditMixin(ActionDragAndMoveDispositivoAlteradoMixin, dispositivos_do_bloco = \ bloco_alteracao.dispositivos_alterados_set.order_by( 'ordem_bloco_atualizador') - if dispositivos_do_bloco.exists: + if dispositivos_do_bloco.exists(): ndp.ordem_bloco_atualizador = dispositivos_do_bloco.last( ).ordem_bloco_atualizador + Dispositivo.INTERVALO_ORDEM + else: + ndp.ordem_bloco_atualizador = Dispositivo.INTERVALO_ORDEM ndp.save() p.dispositivo_subsequente = ndp From 8b5eb121700be402ca7e69ee64a123f44d2d8987 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rog=C3=A9rio=20Fr=C3=A1?= Date: Mon, 21 Nov 2016 10:16:18 -0200 Subject: [PATCH 029/139] =?UTF-8?q?Cria=C3=A7=C3=A3o=20docs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/deploy.rst | 1 + 1 file changed, 1 insertion(+) create mode 100644 docs/deploy.rst diff --git a/docs/deploy.rst b/docs/deploy.rst new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/docs/deploy.rst @@ -0,0 +1 @@ + From 60e17a9d6807d86288fe9972ed4fe180698e7cb5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rog=C3=A9rio=20Fr=C3=A1?= Date: Mon, 21 Nov 2016 11:26:42 -0200 Subject: [PATCH 030/139] deploy.rst deploy.rst --- docs/deploy.rst | 94 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) diff --git a/docs/deploy.rst b/docs/deploy.rst index 8b1378917..cff5bacb5 100644 --- a/docs/deploy.rst +++ b/docs/deploy.rst @@ -1 +1,95 @@ +============================== +Instruções para fazer o Deploy +============================== +Para efeitos deste doc, foram consideradas as tecnologias NGINX + GUNICORN para servir a aplicação Django SAPL. + +O NGINX é o servidor WEB, e o GUNICORN é o servidor da aplicação para o servidor WEB. + + +Instalar o NGINX:: + + sudo pip install nginx + + +Instalar o Gunicorn:: + + sudo pip install gunicorn + + +Preparando o NGINX +------------------ +vi /etc/nginx/sites-available/sapl31:: + + upstream ENDERECO_SITE { + server unix:~/sapl/gunicorn.sock fail_timeout=0; + } + + server { + + listen 80; + server_name ENDERECO_SITE; + + client_max_body_size 4G; + + access_log /var/log/nginx-access.log; + error_log /var/log/nginx-error.log; + + location /static/ { + alias ~/sapl/collected_static/; + } + + location /media/ { + alias ~/sapl/media/; + } + + location / { + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header Host $http_host; + proxy_redirect off; + if (!-f $request_filename) { + proxy_pass http://ENDERECO_SITE; + break; + } + } + + # Error pages + error_page 500 502 503 504 /500.html; + location = /500.html { + root ~/sapl/sapl/static/; + } + } + + +Criar link simbólico para ativar o site:: + + sudo ln -s /etc/nginx/sites-available/sapl3.conf /etc/nginx/sites-enabled/sapl3 + + + +Preparando o Gunicorn +--------------------- +Na raiz do Projeto sapl, existe o arquivo chamado gunicorn_start.sh +onde ~/ devem ser alterados pelos caminhos correspondentes. + +Para definir o parametro NUM_WORKERS utilize a seguinte fórmula: 2 * CPUs 1. +Para uma máquina de CPU única o valor seria 3 + +Para dar Permissão de execução para o script:: + + chmod ux bin/gunicorn_start + +Para rodar o gunicorn:: + + ./~/.gunicorn_start.sh + + + +#Referências. + +http://michal.karzynski.pl/blog/2013/06/09/django-nginx-gunicorn-virtualenv-supervisor/ + +Para multiplas aplicações Django. + +http://michal.karzynski.pl/blog/2013/10/29/serving-multiple-django-applications-with-nginx-gunicorn-supervisor/ + From 80910d055ef246859ddb70e0653907e9de503be3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rog=C3=A9rio=20Fr=C3=A1?= Date: Mon, 21 Nov 2016 11:39:48 -0200 Subject: [PATCH 031/139] =?UTF-8?q?Documenta=C3=A7=C3=A3o=20Deploy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.rst | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 26068f1f9..1ddf5e214 100644 --- a/README.rst +++ b/README.rst @@ -29,7 +29,7 @@ Instalar as seguintes dependências do sistema:: * :: - sudo apt-get install git nginx python3-dev libpq-dev graphviz-dev graphviz \ + sudo apt-get install git python3-dev libpq-dev graphviz-dev graphviz \ 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 curl @@ -230,6 +230,14 @@ Posteriormente rodar a seguinte sequencia de comandos:: >>> %run sapl/legacy/migration.py >>> migrate() + + +Instruções para Deploy +====================== + `Deploy SAPL com Nginx + Gunicorn `_ + + + Instruções para Tradução ======================== From e9f128f5111d521406299cd37c61c0cf068e61d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rog=C3=A9rio=20Fr=C3=A1?= Date: Mon, 21 Nov 2016 12:54:58 -0200 Subject: [PATCH 032/139] Create importacao_25_31.rst --- docs/importacao_25_31.rst | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 docs/importacao_25_31.rst diff --git a/docs/importacao_25_31.rst b/docs/importacao_25_31.rst new file mode 100644 index 000000000..0050cabb6 --- /dev/null +++ b/docs/importacao_25_31.rst @@ -0,0 +1,22 @@ +Instruções para Importação da base mysql 2.5 +============================================ + + +Criar um arquivo sapl/legacy/.env com o seguinte conteúdo (parametros de acesso ao banco 2.5):: + + DATABASE_URL = mysql://[usuario do mysql]:[senha do myuysql]@[host]:[porta]/[banco] + + +o conteúdo do arquivo será semelhante a isso: +DATABASE_URL = mysql://sapl:sapl@localhost:3306/interlegis + + +Posteriormente rodar a seguinte sequencia de comandos:: + + + ./manage.py shell_plus --settings=sapl.legacy_migration_settings + + >>> %run sapl/legacy/migration.py + + >>> migrate() + From 12a651928c193a9206b3959d9b8d12224af1cfd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rog=C3=A9rio=20Fr=C3=A1?= Date: Mon, 21 Nov 2016 12:59:01 -0200 Subject: [PATCH 033/139] Update README.rst --- README.rst | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/README.rst b/README.rst index 1ddf5e214..fd0c812f7 100644 --- a/README.rst +++ b/README.rst @@ -216,20 +216,7 @@ Instruções para criação do super usuário e de usuários de testes Instruções para Importação da base mysql 2.5 ============================================ -Criar um arquivo `sapl/legacy/.env` com o seguinte conteúdo (parametros de acesso ao banco 2.5):: - - DATABASE_URL = mysql://[usuario do mysql]:[senha do myuysql]@[host]:[porta]/[banco] - -o conteúdo do arquivo será semelhante a isso:: - - DATABASE_URL = mysql://sapl:sapl@localhost:3306/interlegis - -Posteriormente rodar a seguinte sequencia de comandos:: - - ./manage.py shell_plus --settings=sapl.legacy_migration_settings - >>> %run sapl/legacy/migration.py - >>> migrate() - + `Importação da Base do SAPL 2.5 para SAPL 3.1 `_ Instruções para Deploy From 552da53dccf7eea921ffd1dd9e6dfb27b5d83284 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rog=C3=A9rio=20Fr=C3=A1?= Date: Mon, 21 Nov 2016 13:03:54 -0200 Subject: [PATCH 034/139] Update importacao_25_31.rst --- docs/importacao_25_31.rst | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/docs/importacao_25_31.rst b/docs/importacao_25_31.rst index 0050cabb6..240ed959e 100644 --- a/docs/importacao_25_31.rst +++ b/docs/importacao_25_31.rst @@ -11,8 +11,7 @@ o conteúdo do arquivo será semelhante a isso: DATABASE_URL = mysql://sapl:sapl@localhost:3306/interlegis -Posteriormente rodar a seguinte sequencia de comandos:: - +Posteriormente rodar a seguinte sequencia de comandos estando no ambiente virtual:: ./manage.py shell_plus --settings=sapl.legacy_migration_settings @@ -20,3 +19,8 @@ Posteriormente rodar a seguinte sequencia de comandos:: >>> migrate() + + +Para entrar no ambiente virtual:: + + workon sapl From 8d8c4efdf2923a7bab88f775e5d1e7476ba194eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rog=C3=A9rio=20Fr=C3=A1?= Date: Mon, 21 Nov 2016 16:32:39 -0200 Subject: [PATCH 035/139] Update README.rst --- README.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.rst b/README.rst index fd0c812f7..41bd817d5 100644 --- a/README.rst +++ b/README.rst @@ -216,12 +216,12 @@ Instruções para criação do super usuário e de usuários de testes Instruções para Importação da base mysql 2.5 ============================================ - `Importação da Base do SAPL 2.5 para SAPL 3.1 `_ + `Importação da Base do SAPL 2.5 para SAPL 3.1 `_ Instruções para Deploy ====================== - `Deploy SAPL com Nginx + Gunicorn `_ + `Deploy SAPL com Nginx + Gunicorn `_ From 663eb386dc6a9c3b69a2fcca264f483802d703dc Mon Sep 17 00:00:00 2001 From: Leandro Roberto da Silva Date: Mon, 21 Nov 2016 16:55:45 -0200 Subject: [PATCH 036/139] Add python3-pip no apt-get inicial --- README.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.rst b/README.rst index fd0c812f7..adfa09b70 100644 --- a/README.rst +++ b/README.rst @@ -32,7 +32,8 @@ Instalar as seguintes dependências do sistema:: sudo apt-get install git python3-dev libpq-dev graphviz-dev graphviz \ 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 curl + libmysqlclient-dev libssl-dev libffi-dev libxslt1-dev python3-setuptools \ + python3-pip curl sudo -i curl -sL https://deb.nodesource.com/setup_5.x | bash - From dc9e28f96146ba034b723f6b9a56daec83fad331 Mon Sep 17 00:00:00 2001 From: Leandro Roberto da Silva Date: Mon, 21 Nov 2016 17:27:07 -0200 Subject: [PATCH 037/139] =?UTF-8?q?corrige=20ordem=20de=20instru=C3=A7?= =?UTF-8?q?=C3=A3o=20em=20docs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/importacao_25_31.rst | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/docs/importacao_25_31.rst b/docs/importacao_25_31.rst index 240ed959e..76acc5eaa 100644 --- a/docs/importacao_25_31.rst +++ b/docs/importacao_25_31.rst @@ -10,6 +10,13 @@ Criar um arquivo sapl/legacy/.env com o seguinte conteúdo (parametros de acesso o conteúdo do arquivo será semelhante a isso: DATABASE_URL = mysql://sapl:sapl@localhost:3306/interlegis + + + +Para entrar no ambiente virtual:: + + workon sapl + Posteriormente rodar a seguinte sequencia de comandos estando no ambiente virtual:: @@ -18,9 +25,3 @@ Posteriormente rodar a seguinte sequencia de comandos estando no ambiente virtua >>> %run sapl/legacy/migration.py >>> migrate() - - - -Para entrar no ambiente virtual:: - - workon sapl From 79566ecd6c0056e8686a262966d4b4e87abb0f52 Mon Sep 17 00:00:00 2001 From: Leandro Roberto da Silva Date: Mon, 21 Nov 2016 17:28:44 -0200 Subject: [PATCH 038/139] =?UTF-8?q?corrige=20formata=C3=A7=C3=A3o=20rst?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/importacao_25_31.rst | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/docs/importacao_25_31.rst b/docs/importacao_25_31.rst index 76acc5eaa..5f9fab366 100644 --- a/docs/importacao_25_31.rst +++ b/docs/importacao_25_31.rst @@ -4,20 +4,17 @@ Instruções para Importação da base mysql 2.5 Criar um arquivo sapl/legacy/.env com o seguinte conteúdo (parametros de acesso ao banco 2.5):: - DATABASE_URL = mysql://[usuario do mysql]:[senha do myuysql]@[host]:[porta]/[banco] + DATABASE_URL = mysql://[usuario do mysql]:[senha do myuysql]@[host]:[porta]/[banco] -o conteúdo do arquivo será semelhante a isso: -DATABASE_URL = mysql://sapl:sapl@localhost:3306/interlegis - - +o conteúdo do arquivo será semelhante a isso:: + DATABASE_URL = mysql://sapl:sapl@localhost:3306/interlegis Para entrar no ambiente virtual:: workon sapl - Posteriormente rodar a seguinte sequencia de comandos estando no ambiente virtual:: ./manage.py shell_plus --settings=sapl.legacy_migration_settings From 5c92825bd1be461dbf3ad8e58bf1a1aea11fc9db Mon Sep 17 00:00:00 2001 From: Leandro Roberto da Silva Date: Mon, 21 Nov 2016 17:32:22 -0200 Subject: [PATCH 039/139] corrige caminho de gunicorn socket --- docs/deploy.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/deploy.rst b/docs/deploy.rst index cff5bacb5..a8d49fa8b 100644 --- a/docs/deploy.rst +++ b/docs/deploy.rst @@ -22,7 +22,7 @@ Preparando o NGINX vi /etc/nginx/sites-available/sapl31:: upstream ENDERECO_SITE { - server unix:~/sapl/gunicorn.sock fail_timeout=0; + server unix:~/sapl/run/gunicorn.sock fail_timeout=0; } server { From a0ef5f4a93138b2bc35fa54a1f24c07cb6245fd6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rog=C3=A9rio=20Fr=C3=A1?= Date: Tue, 22 Nov 2016 08:23:50 -0200 Subject: [PATCH 040/139] Create traducao.rst --- docs/traducao.rst | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 docs/traducao.rst diff --git a/docs/traducao.rst b/docs/traducao.rst new file mode 100644 index 000000000..25173dc4b --- /dev/null +++ b/docs/traducao.rst @@ -0,0 +1,27 @@ + +Instruções para Tradução +======================== + +Nós utilizamos o `Transifex `_ para gerenciar as traduções do projeto. +Se você deseja contribuir, por favor crie uma conta no site e peça para se juntar a nós em `Transifex SAPL Page `_. +Assim que for aceito, você já pode começar a traduzir. + +Para integrar as últimas traduções ao projeto atual, siga estes passos: + +* Siga as instruções em `Development Environment Installation`_. + +* Instale `Transifex Client `_. + +Aviso: + + O Transifex Client armazena senhas em 'plain text' no arquivo ``~/.transifexrc``. + + Nós preferimos logar no site do Transifex por meio de redes sociais (GitHub, Google Plus, Linkedin) e modificar, frequentemente, a senha utilizada pelo client. + +* `Pull translations `_ ou `push translations `_ usando o client. Faça o Pull somente com o repositório vazio, isto é, faça o commit de suas mudanças antes de fazer o Pull de novas traduções. + +* Execute o programa com ``.manage.py runserver`` e cheque o sistema para ver se as traduções tiveram efeito. + +Nota: + + O idioma do browser é utilizado para escolher as traduções que devem mostradas. From 7bb8eda214a658b4fb07406687de03eaa07ce3f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rog=C3=A9rio=20Fr=C3=A1?= Date: Tue, 22 Nov 2016 08:28:01 -0200 Subject: [PATCH 041/139] Update README.rst --- README.rst | 25 +------------------------ 1 file changed, 1 insertion(+), 24 deletions(-) diff --git a/README.rst b/README.rst index 68749a6a5..e10b3b254 100644 --- a/README.rst +++ b/README.rst @@ -228,30 +228,7 @@ Instruções para Deploy Instruções para Tradução ======================== - -Nós utilizamos o `Transifex `_ para gerenciar as traduções do projeto. -Se você deseja contribuir, por favor crie uma conta no site e peça para se juntar a nós em `Transifex SAPL Page `_. -Assim que for aceito, você já pode começar a traduzir. - -Para integrar as últimas traduções ao projeto atual, siga estes passos: - -* Siga as instruções em `Development Environment Installation`_. - -* Instale `Transifex Client `_. - -Aviso: - - O Transifex Client armazena senhas em 'plain text' no arquivo ``~/.transifexrc``. - - Nós preferimos logar no site do Transifex por meio de redes sociais (GitHub, Google Plus, Linkedin) e modificar, frequentemente, a senha utilizada pelo client. - -* `Pull translations `_ ou `push translations `_ usando o client. Faça o Pull somente com o repositório vazio, isto é, faça o commit de suas mudanças antes de fazer o Pull de novas traduções. - -* Execute o programa com ``.manage.py runserver`` e cheque o sistema para ver se as traduções tiveram efeito. - -Nota: - - O idioma do browser é utilizado para escolher as traduções que devem mostradas. + `Instruções para Tradução `_ From 273db7117270a55fa893e2ae22a1f0b3ea0e5a52 Mon Sep 17 00:00:00 2001 From: Eduardo Edson Batista Cordeiro Alves Date: Tue, 22 Nov 2016 10:53:22 -0200 Subject: [PATCH 042/139] Fix #426 --- sapl/materia/views.py | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/sapl/materia/views.py b/sapl/materia/views.py index c916c222d..32c18b50b 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -12,7 +12,7 @@ from django.core.mail import send_mail from django.core.urlresolvers import reverse from django.http import JsonResponse from django.http.response import Http404, HttpResponseRedirect -from django.shortcuts import redirect, get_object_or_404 +from django.shortcuts import get_object_or_404, redirect from django.template import Context, loader from django.utils import formats from django.utils.translation import ugettext_lazy as _ @@ -21,10 +21,11 @@ from django.views.generic.base import RedirectView from django.views.generic.edit import FormView from django_filters.views import FilterView +import sapl from sapl.base.models import Autor, CasaLegislativa -from sapl.compilacao.models import STATUS_TA_PRIVATE, STATUS_TA_EDITION,\ - STATUS_TA_IMMUTABLE_RESTRICT - +from sapl.compilacao.models import (STATUS_TA_EDITION, + STATUS_TA_IMMUTABLE_RESTRICT, + STATUS_TA_PRIVATE) from sapl.compilacao.views import IntegracaoTaView from sapl.crispy_layout_mixin import SaplFormLayout, form_actions from sapl.crud.base import (ACTION_CREATE, ACTION_DELETE, ACTION_DETAIL, @@ -39,7 +40,6 @@ from sapl.protocoloadm.models import Protocolo from sapl.utils import (TURNO_TRAMITACAO_CHOICES, YES_NO_CHOICES, autor_label, autor_modal, gerar_hash_arquivo, get_base_url, montar_row_autor) -import sapl from .forms import (AcessorioEmLoteFilterSet, AcompanhamentoMateriaForm, DocumentoAcessorioForm, MateriaLegislativaFilterSet, @@ -55,7 +55,6 @@ from .models import (AcompanhamentoMateria, Anexada, Autoria, DespachoInicial, TipoMateriaLegislativa, TipoProposicao, Tramitacao, UnidadeTramitacao) - OrigemCrud = Crud.build(Origem, '') TipoMateriaCrud = CrudAux.build( @@ -1101,10 +1100,8 @@ class MateriaLegislativaPesquisaView(FilterView): lista = filtra_tramitacao_destino(unidade_destino) qs = qs.filter(id__in=lista).distinct() - if 'o' in self.request.GET: - if not self.request.GET['o']: - qs = qs.order_by( - '-data_apresentacao', '-tipo__sigla', '-ano', '-numero') + if 'o' not in self.request.GET: + qs = qs.order_by('tipo', 'ano', 'numero') kwargs.update({ 'queryset': qs, From 19f955c1b3efb6806b714a42ab0f8a42abe80a5b Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Wed, 23 Nov 2016 10:44:48 -0200 Subject: [PATCH 043/139] =?UTF-8?q?corrige=20associa=C3=A7=C3=A3o=20com=20?= =?UTF-8?q?username=20e=20erro=20na=20api=20rest?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/api/serializers.py | 1 + sapl/base/forms.py | 48 +++++++++++++++++++++++++++++------------ setup.py | 26 +++++++++++----------- 3 files changed, 48 insertions(+), 27 deletions(-) diff --git a/sapl/api/serializers.py b/sapl/api/serializers.py index bd3fb7def..a7ff559e3 100644 --- a/sapl/api/serializers.py +++ b/sapl/api/serializers.py @@ -51,3 +51,4 @@ class MateriaLegislativaSerializer(serializers.ModelSerializer): class Meta: model = MateriaLegislativa + fields = '__all__' diff --git a/sapl/base/forms.py b/sapl/base/forms.py index 5b4d9f734..75145bba7 100644 --- a/sapl/base/forms.py +++ b/sapl/base/forms.py @@ -1,4 +1,3 @@ -import django_filters from crispy_forms.bootstrap import FieldWithButtons, InlineRadios, StrictButton from crispy_forms.helper import FormHelper from crispy_forms.layout import HTML, Button, Div, Field, Fieldset, Layout, Row @@ -12,8 +11,9 @@ from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ValidationError from django.db import models, transaction from django.forms import ModelForm -from django.utils.translation import ugettext_lazy as _ from django.utils.translation import string_concat +from django.utils.translation import ugettext_lazy as _ +import django_filters from sapl.base.models import Autor, TipoAutor from sapl.crispy_layout_mixin import (SaplFormLayout, form_actions, to_column, @@ -27,6 +27,7 @@ from sapl.utils import (RANGE_ANOS, ChoiceWithoutValidationField, from .models import AppConfig, CasaLegislativa + ACTION_CREATE_USERS_AUTOR_CHOICE = [ ('C', _('Criar novo Usuário')), ('A', _('Associar um usuário existente')), @@ -96,7 +97,7 @@ class AutorForm(ModelForm): label=_('Confirmar Email')) username = forms.CharField(label=get_user_model()._meta.get_field( - 'username').verbose_name.capitalize(), + get_user_model().USERNAME_FIELD).verbose_name.capitalize(), required=False, max_length=50) @@ -188,26 +189,36 @@ class AutorForm(ModelForm): self.fields['autor_related'].initial = self.instance.autor_related if self.instance.user: - self.fields['username'].initial = self.instance.user.username + self.fields['username'].initial = getattr( + self.instance.user, + get_user_model().USERNAME_FIELD) self.fields['action_user'].initial = 'A' self.fields['username'].label = string_concat( self.fields['username'].label, - ' (', self.instance.user.username, ')') + ' (', getattr( + self.instance.user, + get_user_model().USERNAME_FIELD), ')') if 'status_user' in self.Meta.fields: self.fields['status_user'].initial = 'R' self.fields['status_user'].label = string_concat( self.fields['status_user'].label, - ' (', self.instance.user.username, ')') + ' (', getattr( + self.instance.user, + get_user_model().USERNAME_FIELD), ')') self.fields['username'].widget.attrs.update({ - 'data': self.instance.user.username + 'data': getattr( + self.instance.user, + get_user_model().USERNAME_FIELD) if self.instance.user else ''}) if 'status_user' in self.Meta.fields: self.fields['status_user'].widget.attrs.update({ - 'data': self.instance.user.username + 'data': getattr( + self.instance.user, + get_user_model().USERNAME_FIELD) if self.instance.user else ''}) def valida_igualdade(self, texto1, texto2, msg): @@ -225,7 +236,9 @@ class AutorForm(ModelForm): if 'status_user' in self.Meta.fields: if self.instance.pk and self.instance.user_id: - if self.instance.user.username != cd['username']: + if getattr( + self.instance.user.username, + get_user_model().USERNAME_FIELD) != cd['username']: if 'status_user' not in cd or not cd['status_user']: raise ValidationError( _('Foi trocado ou removido o usuário deste Autor, ' @@ -241,7 +254,8 @@ class AutorForm(ModelForm): qs_user = qs_user.exclude(pk=self.instance.user.pk) if cd['action_user'] == 'C': - if User.objects.filter(username=cd['username']).exists(): + param_username = {get_user_model().USERNAME_FIELD: cd['username']} + if User.objects.filter(**param_username).exists(): raise ValidationError( _('Já existe usuário com o username "%s". ' 'Para utilizar esse username você deve selecionar ' @@ -275,7 +289,8 @@ class AutorForm(ModelForm): _('Já existe um Autor com este email.')) elif cd['action_user'] == 'A': - if not User.objects.filter(username=cd['username']).exists(): + param_username = {get_user_model().USERNAME_FIELD: cd['username']} + if not User.objects.filter(**param_username).exists(): raise ValidationError( _('Não existe usuário com username "%s". ' 'Para utilizar esse username você deve selecionar ' @@ -286,7 +301,9 @@ class AutorForm(ModelForm): if 'username' not in cd or not cd['username']: raise ValidationError(_('O username deve ser informado.')) - if qs_autor.filter(user__username=cd['username']).exists(): + param_username = { + 'user__' + get_user_model().USERNAME_FIELD: cd['username']} + if qs_autor.filter(**param_username).exists(): raise ValidationError( _('Já existe um Autor para este usuário.')) @@ -332,16 +349,19 @@ class AutorForm(ModelForm): user_old = autor.user if autor.user_id else None u = None + param_username = { + get_user_model().USERNAME_FIELD: self.cleaned_data['username']} if self.cleaned_data['action_user'] == 'A': - u = get_user_model().objects.get( - username=self.cleaned_data['username']) + u = get_user_model().objects.get(**param_username) if not u.is_active: u.is_active = settings.DEBUG u.save() elif self.cleaned_data['action_user'] == 'C': + u = get_user_model().objects.create( username=self.cleaned_data['username'], email=self.cleaned_data['email']) + u.set_password(self.cleaned_data['senha']) # Define usuário como ativo em ambiente de desenvolvimento # pode logar sem a necessidade de passar pela validação de email diff --git a/setup.py b/setup.py index 330749885..ab6d283ac 100644 --- a/setup.py +++ b/setup.py @@ -13,27 +13,27 @@ install_requires = [ 'django-admin-bootstrapped==2.5.7', 'django-bootstrap3==7.0.1', 'django-bower==5.1.0', - 'django-braces==1.8.1', + 'django-braces==1.9.0', 'django-compressor==2.0', 'django-crispy-forms==1.6.0', - 'django-extensions==1.6.1', - 'django-extra-views==0.7.1', - 'django-filter==0.13.0', - 'django-floppyforms==1.6.1', - 'django-model-utils==2.4', - 'django-sass-processor==0.3.4', - 'django>=1.9.5', + 'django-extensions==1.6.7', + 'django-extra-views==0.8.0', + 'django-filter==0.15.3', + 'django-floppyforms==1.6.2', + 'django-model-utils==2.5', + 'django-sass-processor==0.4.6', + 'django==1.9.7', 'djangorestframework', 'easy-thumbnails==2.3', - 'libsass==0.11.0', - 'psycopg2==2.6.1', + 'libsass==0.11.1', + 'psycopg2==2.6.2', 'python-decouple==3.0', - 'pytz==2016.3', + 'pytz==2016.4', 'pyyaml==3.11', - 'rtyaml==0.0.2', + 'rtyaml==0.0.3', 'unipath==1.1', 'python-magic==0.4.10', - 'gunicorn==19.4.5', + 'gunicorn==19.6.0', # git+git://github.com/interlegis/trml2pdf.git ] setup( From e805450a60e2f78b6060921a24ed4c7821697a66 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Wed, 23 Nov 2016 13:28:23 -0200 Subject: [PATCH 044/139] Fix #811 --- sapl/materia/forms.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py index d4eadfee4..f5ca6d8bd 100644 --- a/sapl/materia/forms.py +++ b/sapl/materia/forms.py @@ -1158,7 +1158,7 @@ class ConfirmarProposicaoForm(ProposicaoForm): if 'regime_tramitacao' not in cd or\ not cd['regime_tramitacao']: raise ValidationError( - _('Regimente de Tramitação deve ser informado.')) + _('Regime de Tramitação deve ser informado.')) elif self.instance.tipo.content_type.model_class( ) == TipoDocumento and not cd['materia_de_vinculo']: From d4ccf80839bb0f661a28dacdd22937b2f9c2dcce Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Wed, 23 Nov 2016 15:25:02 -0200 Subject: [PATCH 045/139] =?UTF-8?q?Conserta=20bug=20na=20exibi=C3=A7=C3=A3?= =?UTF-8?q?o=20de=20hora=20em=20listagem,=20etiqueta=20e=20detalhe=20de=20?= =?UTF-8?q?protocolo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/relatorios/views.py | 2 +- sapl/templates/protocoloadm/protocolo_mostrar.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sapl/relatorios/views.py b/sapl/relatorios/views.py index ac10778aa..5ad572c51 100644 --- a/sapl/relatorios/views.py +++ b/sapl/relatorios/views.py @@ -920,7 +920,7 @@ def get_etiqueta_protocolos(prots): dic['titulo'] = str(p.numero) + '/' + str(p.ano) dic['data'] = 'Data: ' + p.data.strftime( - "%d/%m/%Y") + ' - Horário: ' + p.hora.strftime("%H:%m") + "%d/%m/%Y") + ' - Horário: ' + p.hora.strftime("%H:%M") dic['txt_assunto'] = p.assunto_ementa dic['txt_interessado'] = p.interessado diff --git a/sapl/templates/protocoloadm/protocolo_mostrar.html b/sapl/templates/protocoloadm/protocolo_mostrar.html index df35a92e6..476f19d5f 100644 --- a/sapl/templates/protocoloadm/protocolo_mostrar.html +++ b/sapl/templates/protocoloadm/protocolo_mostrar.html @@ -5,7 +5,7 @@ {% block detail_content %} Protocolo:{{ protocolo.numero|stringformat:'06d' }}/{{ protocolo.ano }}
Assunto: {{ protocolo.assunto_ementa }}
- Data Protocolo: {{ protocolo.data|date:"d/m/Y" }} - Horário: {{ protocolo.timestamp|date:"H:m:s" }}
+ Data Protocolo: {{ protocolo.data|date:"d/m/Y" }} - Horário: {{ protocolo.hora|date:"H:i" }}
Interessado: {{ protocolo.interessado }}
Natureza do Processo:{% if protocolo.tipo_processo == 0 %} Administrativo {% elif protocolo.tipo_processo == 1 %} Matéria Legislativa {% endif %}
From 4bd019249b08be6f0efc10d00a80011cbcb807c8 Mon Sep 17 00:00:00 2001 From: Eduardo Edson Batista Cordeiro Alves Date: Wed, 23 Nov 2016 14:38:07 -0200 Subject: [PATCH 046/139] Cria tabela auxiliar para tipo de vinculo --- .../migrations/0023_auto_20161123_1359.py | 41 +++++++++++++++++++ .../migrations/0024_auto_20161123_1430.py | 25 +++++++++++ sapl/norma/models.py | 37 ++++------------- sapl/norma/urls.py | 5 ++- sapl/norma/views.py | 5 ++- sapl/templates/norma/layouts.yaml | 4 ++ sapl/templates/sistema.html | 3 +- 7 files changed, 87 insertions(+), 33 deletions(-) create mode 100644 sapl/norma/migrations/0023_auto_20161123_1359.py create mode 100644 sapl/norma/migrations/0024_auto_20161123_1430.py diff --git a/sapl/norma/migrations/0023_auto_20161123_1359.py b/sapl/norma/migrations/0023_auto_20161123_1359.py new file mode 100644 index 000000000..450071cc8 --- /dev/null +++ b/sapl/norma/migrations/0023_auto_20161123_1359.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-11-23 13:59 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('norma', '0022_auto_20161110_0910'), + ] + + operations = [ + migrations.AlterModelOptions( + name='vinculonormajuridica', + options={'verbose_name': 'Tipo de Vínculo entre Normas Jurídicas', 'verbose_name_plural': 'Tipos de Vínculos entre Normas Jurídicas'}, + ), + migrations.RemoveField( + model_name='vinculonormajuridica', + name='norma_referente', + ), + migrations.RemoveField( + model_name='vinculonormajuridica', + name='norma_referida', + ), + migrations.RemoveField( + model_name='vinculonormajuridica', + name='tipo_vinculo', + ), + migrations.AddField( + model_name='vinculonormajuridica', + name='descricao', + field=models.CharField(blank=True, max_length=20, verbose_name='Descrição'), + ), + migrations.AddField( + model_name='vinculonormajuridica', + name='sigla', + field=models.CharField(blank=True, max_length=1, verbose_name='Nome'), + ), + ] diff --git a/sapl/norma/migrations/0024_auto_20161123_1430.py b/sapl/norma/migrations/0024_auto_20161123_1430.py new file mode 100644 index 000000000..e531c2a38 --- /dev/null +++ b/sapl/norma/migrations/0024_auto_20161123_1430.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-11-23 14:30 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('norma', '0023_auto_20161123_1359'), + ] + + operations = [ + migrations.AlterField( + model_name='vinculonormajuridica', + name='descricao', + field=models.CharField(blank=True, max_length=50, verbose_name='Descrição'), + ), + migrations.AlterField( + model_name='vinculonormajuridica', + name='sigla', + field=models.CharField(blank=True, max_length=1, verbose_name='Sigla'), + ), + ] diff --git a/sapl/norma/models.py b/sapl/norma/models.py index debbdadc9..484ccd99d 100644 --- a/sapl/norma/models.py +++ b/sapl/norma/models.py @@ -171,37 +171,14 @@ class LegislacaoCitada(models.Model): class VinculoNormaJuridica(models.Model): - TIPO_VINCULO_CHOICES = ( - ('A', _('Altera a norma')), - ('R', _('Revoga integralmente a norma')), - ('P', _('Revoga parcialmente a norma')), - ('T', _('Revoga integralmente por consolidação')), - ('C', _('Norma correlata')), - ('S', _('Ressalva a norma')), - ('E', _('Reedita a norma')), - ('I', _('Reedita a norma com alteração')), - ('G', _('Regulamenta a norma')), - ('K', _('Suspende parcialmente a norma')), - ('L', _('Suspende integralmente a norma')), - ('N', _('Julgada integralmente inconstitucional')), - ('O', _('Julgada parcialmente inconstitucional')), - ) - - # TODO M2M ??? - norma_referente = models.ForeignKey( - NormaJuridica, related_name='norma_referente_set') - norma_referida = models.ForeignKey( - NormaJuridica, related_name='norma_referida_set') - tipo_vinculo = models.CharField( - max_length=1, blank=True, choices=TIPO_VINCULO_CHOICES) + sigla = models.CharField( + max_length=1, blank=True, verbose_name=_('Sigla')) + descricao = models.CharField( + max_length=50, blank=True, verbose_name=_('Descrição')) class Meta: - verbose_name = _('Vínculo entre Normas Jurídicas') - verbose_name_plural = _('Vínculos entre Normas Jurídicas') + verbose_name = _('Tipo de Vínculo entre Normas Jurídicas') + verbose_name_plural = _('Tipos de Vínculos entre Normas Jurídicas') def __str__(self): - return _('Referente: %(referente)s \n' - 'Referida: %(referida)s \nVínculo: %(vinculo)s') % { - 'referente': self.norma_referente, - 'referida': self.norma_referida, - 'vinculo': self.tipo_vinculo} + return self.descricao diff --git a/sapl/norma/urls.py b/sapl/norma/urls.py index 8c261e23e..dfbc34f83 100644 --- a/sapl/norma/urls.py +++ b/sapl/norma/urls.py @@ -1,7 +1,8 @@ from django.conf.urls import include, url from sapl.norma.views import (AssuntoNormaCrud, NormaCrud, NormaPesquisaView, - TipoNormaCrud, NormaTaView) + NormaTaView, TipoNormaCrud, + VinculoNormaJuridicaCrud) from .apps import AppConfig @@ -16,6 +17,8 @@ urlpatterns = [ url(r'^sistema/norma/tipo/', include(TipoNormaCrud.get_urls())), url(r'^sistema/norma/assunto/', include(AssuntoNormaCrud.get_urls())), + url(r'^sistema/norma/vinculo/', include( + VinculoNormaJuridicaCrud.get_urls())), url(r'^norma/pesquisar$', NormaPesquisaView.as_view(), name='norma_pesquisa'), diff --git a/sapl/norma/views.py b/sapl/norma/views.py index 5a0dc283a..610e4ba64 100644 --- a/sapl/norma/views.py +++ b/sapl/norma/views.py @@ -13,7 +13,8 @@ from sapl.crud.base import (RP_DETAIL, RP_LIST, Crud, CrudAux, MasterDetailCrud, make_pagination) from .forms import NormaFilterSet, NormaJuridicaForm -from .models import AssuntoNorma, NormaJuridica, TipoNormaJuridica +from .models import (AssuntoNorma, NormaJuridica, TipoNormaJuridica, + VinculoNormaJuridica) # LegislacaoCitadaCrud = Crud.build(LegislacaoCitada, '') AssuntoNormaCrud = CrudAux.build(AssuntoNorma, 'assunto_norma_juridica', @@ -23,6 +24,8 @@ AssuntoNormaCrud = CrudAux.build(AssuntoNorma, 'assunto_norma_juridica', TipoNormaCrud = CrudAux.build( TipoNormaJuridica, 'tipo_norma_juridica', list_field_names=['sigla', 'descricao', 'equivalente_lexml']) +VinculoNormaJuridicaCrud = CrudAux.build( + VinculoNormaJuridica, '', list_field_names=['sigla', 'descricao']) class NormaPesquisaView(FilterView): diff --git a/sapl/templates/norma/layouts.yaml b/sapl/templates/norma/layouts.yaml index 99e14640c..a00f1d5d3 100644 --- a/sapl/templates/norma/layouts.yaml +++ b/sapl/templates/norma/layouts.yaml @@ -49,3 +49,7 @@ LegislacaoCitadaDetail: - disposicoes parte livro titulo - capitulo secao subsecao artigo - paragrafo inciso alinea item + +VinculoNormaJuridica: + {% trans 'Tipo de Vínculo entre Normas Jurídicas' %}: + - sigla:2 descricao diff --git a/sapl/templates/sistema.html b/sapl/templates/sistema.html index 9db02b417..6b9d1f5d4 100644 --- a/sapl/templates/sistema.html +++ b/sapl/templates/sistema.html @@ -70,7 +70,8 @@

Módulo Normas Jurídicas


From 176947cb4e355051f2e0f0e4b3f1b1e78986d213 Mon Sep 17 00:00:00 2001 From: Eduardo Edson Batista Cordeiro Alves Date: Wed, 23 Nov 2016 15:06:32 -0200 Subject: [PATCH 047/139] Cria form para relacionamento de normas --- sapl/norma/forms.py | 49 ++++++++++++++++++- .../norma/migrations/0025_normarelacionada.py | 29 +++++++++++ .../migrations/0026_auto_20161123_1450.py | 21 ++++++++ sapl/norma/models.py | 19 +++++++ 4 files changed, 117 insertions(+), 1 deletion(-) create mode 100644 sapl/norma/migrations/0025_normarelacionada.py create mode 100644 sapl/norma/migrations/0026_auto_20161123_1450.py diff --git a/sapl/norma/forms.py b/sapl/norma/forms.py index 7ae6b85ba..4c01178e3 100644 --- a/sapl/norma/forms.py +++ b/sapl/norma/forms.py @@ -14,7 +14,8 @@ from sapl.materia.models import MateriaLegislativa, TipoMateriaLegislativa from sapl.settings import MAX_DOC_UPLOAD_SIZE from sapl.utils import RANGE_ANOS, RangeWidgetOverride -from .models import AssuntoNorma, NormaJuridica +from .models import (AssuntoNorma, NormaJuridica, NormaRelacionada, + TipoNormaJuridica) def get_esferas(): @@ -146,3 +147,49 @@ class NormaJuridicaForm(ModelForm): norma.materia = self.cleaned_data['materia'] norma = super(NormaJuridicaForm, self).save(commit=True) return norma + + +class NormaRelacionadaForm(ModelForm): + + tipo = forms.ModelChoiceField( + label='Tipo', + required=True, + queryset=TipoNormaJuridica.objects.all(), + empty_label='----------', + ) + numero = forms.CharField(label='Número', required=True) + ano = forms.CharField(label='Ano', required=True) + ementa = forms.CharField(widget=forms.Textarea) + + class Meta: + model = NormaRelacionada + fields = ['tipo', 'numero', 'ano', 'ementa', 'tipo_vinculo'] + widgets = {'ementa': forms.Select(attrs={'disabled': 'disabled'})} + + def __init__(self, *args, **kwargs): + super(NormaRelacionadaForm, self).__init__(*args, **kwargs) + + def clean(self): + if self.errors: + return self.errors + cleaned_data = self.cleaned_data + + try: + norma_relacionada = MateriaLegislativa.objects.get( + numero=cleaned_data['numero'], + ano=cleaned_data['ano'], + ementa=cleaned_data['ementa'], + tipo=cleaned_data['tipo']) + except ObjectDoesNotExist: + msg = _('A norma a ser relacionada não existe.') + raise ValidationError(msg) + else: + cleaned_data['norma_relacionada'] = norma_relacionada + + return cleaned_data + + def save(self, commit=False): + relacionada = super(NormaRelacionadaForm, self).save(commit) + relacionada.norma_relacionada = self.cleaned_data['norma_relacionada'] + relacionada.save() + return relacionada diff --git a/sapl/norma/migrations/0025_normarelacionada.py b/sapl/norma/migrations/0025_normarelacionada.py new file mode 100644 index 000000000..1cfafedb2 --- /dev/null +++ b/sapl/norma/migrations/0025_normarelacionada.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-11-23 14:44 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('norma', '0024_auto_20161123_1430'), + ] + + operations = [ + migrations.CreateModel( + name='NormaRelacionada', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('norma_principal', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='norma_principal', to='norma.NormaJuridica')), + ('norma_relacionada', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='norma_relacionada', to='norma.NormaJuridica')), + ('tipo_vinculo', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='norma.VinculoNormaJuridica')), + ], + options={ + 'verbose_name': 'Norma Relacionada', + 'verbose_name_plural': 'Normas Relacionadas', + }, + ), + ] diff --git a/sapl/norma/migrations/0026_auto_20161123_1450.py b/sapl/norma/migrations/0026_auto_20161123_1450.py new file mode 100644 index 000000000..6fda19247 --- /dev/null +++ b/sapl/norma/migrations/0026_auto_20161123_1450.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-11-23 14:50 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('norma', '0025_normarelacionada'), + ] + + operations = [ + migrations.AlterField( + model_name='normarelacionada', + name='tipo_vinculo', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='norma.VinculoNormaJuridica', verbose_name='Tipo de Vínculo'), + ), + ] diff --git a/sapl/norma/models.py b/sapl/norma/models.py index 484ccd99d..517209009 100644 --- a/sapl/norma/models.py +++ b/sapl/norma/models.py @@ -182,3 +182,22 @@ class VinculoNormaJuridica(models.Model): def __str__(self): return self.descricao + + +class NormaRelacionada(models.Model): + norma_principal = models.ForeignKey( + NormaJuridica, related_name='norma_principal') + norma_relacionada = models.ForeignKey( + NormaJuridica, related_name='norma_relacionada') + tipo_vinculo = models.ForeignKey( + VinculoNormaJuridica, verbose_name='Tipo de Vínculo') + + class Meta: + verbose_name = _('Norma Relacionada') + verbose_name_plural = _('Normas Relacionadas') + + def __str__(self): + return _('Principal: %(norma_principal)s' + ' - Relacionada: %(norma_relacionada)s') % { + 'norma_principal': self.norma_principal, + 'norma_relacionada': self.norma_relacionada} From b1f4b7da13c8a6658fa30fdcc745bf83efcb2884 Mon Sep 17 00:00:00 2001 From: Eduardo Edson Batista Cordeiro Alves Date: Wed, 23 Nov 2016 15:39:07 -0200 Subject: [PATCH 048/139] Cria vinculo de normas --- sapl/norma/forms.py | 8 +-- .../migrations/0027_auto_20161123_1538.py | 26 +++++++++ sapl/norma/models.py | 10 ++-- sapl/norma/urls.py | 10 ++-- sapl/norma/views.py | 53 +++++++++++++++++-- sapl/templates/norma/layouts.yaml | 11 ++++ .../norma/normarelacionada_form.html | 27 ++++++++++ sapl/templates/norma/subnav.yaml | 2 + 8 files changed, 134 insertions(+), 13 deletions(-) create mode 100644 sapl/norma/migrations/0027_auto_20161123_1538.py create mode 100644 sapl/templates/norma/normarelacionada_form.html diff --git a/sapl/norma/forms.py b/sapl/norma/forms.py index 4c01178e3..071d959b3 100644 --- a/sapl/norma/forms.py +++ b/sapl/norma/forms.py @@ -159,12 +159,13 @@ class NormaRelacionadaForm(ModelForm): ) numero = forms.CharField(label='Número', required=True) ano = forms.CharField(label='Ano', required=True) - ementa = forms.CharField(widget=forms.Textarea) + ementa = forms.CharField( + required=False, + widget=forms.Textarea(attrs={'disabled': 'disabled'})) class Meta: model = NormaRelacionada fields = ['tipo', 'numero', 'ano', 'ementa', 'tipo_vinculo'] - widgets = {'ementa': forms.Select(attrs={'disabled': 'disabled'})} def __init__(self, *args, **kwargs): super(NormaRelacionadaForm, self).__init__(*args, **kwargs) @@ -175,10 +176,9 @@ class NormaRelacionadaForm(ModelForm): cleaned_data = self.cleaned_data try: - norma_relacionada = MateriaLegislativa.objects.get( + norma_relacionada = NormaJuridica.objects.get( numero=cleaned_data['numero'], ano=cleaned_data['ano'], - ementa=cleaned_data['ementa'], tipo=cleaned_data['tipo']) except ObjectDoesNotExist: msg = _('A norma a ser relacionada não existe.') diff --git a/sapl/norma/migrations/0027_auto_20161123_1538.py b/sapl/norma/migrations/0027_auto_20161123_1538.py new file mode 100644 index 000000000..f44348b0e --- /dev/null +++ b/sapl/norma/migrations/0027_auto_20161123_1538.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-11-23 15:38 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('norma', '0026_auto_20161123_1450'), + ] + + operations = [ + migrations.AlterField( + model_name='normarelacionada', + name='norma_principal', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='norma_principal', to='norma.NormaJuridica', verbose_name='Norma Principal'), + ), + migrations.AlterField( + model_name='normarelacionada', + name='norma_relacionada', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='norma_relacionada', to='norma.NormaJuridica', verbose_name='Norma Relacionada'), + ), + ] diff --git a/sapl/norma/models.py b/sapl/norma/models.py index 517209009..49e85182c 100644 --- a/sapl/norma/models.py +++ b/sapl/norma/models.py @@ -186,11 +186,15 @@ class VinculoNormaJuridica(models.Model): class NormaRelacionada(models.Model): norma_principal = models.ForeignKey( - NormaJuridica, related_name='norma_principal') + NormaJuridica, + related_name='norma_principal', + verbose_name=_('Norma Principal')) norma_relacionada = models.ForeignKey( - NormaJuridica, related_name='norma_relacionada') + NormaJuridica, + related_name='norma_relacionada', + verbose_name=_('Norma Relacionada')) tipo_vinculo = models.ForeignKey( - VinculoNormaJuridica, verbose_name='Tipo de Vínculo') + VinculoNormaJuridica, verbose_name=_('Tipo de Vínculo')) class Meta: verbose_name = _('Norma Relacionada') diff --git a/sapl/norma/urls.py b/sapl/norma/urls.py index dfbc34f83..59d8f3473 100644 --- a/sapl/norma/urls.py +++ b/sapl/norma/urls.py @@ -1,8 +1,8 @@ from django.conf.urls import include, url from sapl.norma.views import (AssuntoNormaCrud, NormaCrud, NormaPesquisaView, - NormaTaView, TipoNormaCrud, - VinculoNormaJuridicaCrud) + NormaRelacionadaCrud, NormaTaView, TipoNormaCrud, + VinculoNormaJuridicaCrud, recuperar_norma) from .apps import AppConfig @@ -10,7 +10,8 @@ app_name = AppConfig.name urlpatterns = [ - url(r'^norma/', include(NormaCrud.get_urls())), + url(r'^norma/', include(NormaCrud.get_urls() + + NormaRelacionadaCrud.get_urls())), # Integração com Compilação url(r'^norma/(?P[0-9]+)/ta$', NormaTaView.as_view(), name='norma_ta'), @@ -22,4 +23,7 @@ urlpatterns = [ url(r'^norma/pesquisar$', NormaPesquisaView.as_view(), name='norma_pesquisa'), + + url(r'^norma/recuperar-norma/', recuperar_norma), + ] diff --git a/sapl/norma/views.py b/sapl/norma/views.py index 610e4ba64..8f90190e4 100644 --- a/sapl/norma/views.py +++ b/sapl/norma/views.py @@ -1,6 +1,7 @@ from datetime import datetime from django.core.urlresolvers import reverse +from django.http import JsonResponse from django.shortcuts import redirect from django.utils.translation import ugettext_lazy as _ from django.views.generic import FormView, ListView @@ -12,9 +13,9 @@ from sapl.compilacao.views import IntegracaoTaView from sapl.crud.base import (RP_DETAIL, RP_LIST, Crud, CrudAux, MasterDetailCrud, make_pagination) -from .forms import NormaFilterSet, NormaJuridicaForm -from .models import (AssuntoNorma, NormaJuridica, TipoNormaJuridica, - VinculoNormaJuridica) +from .forms import NormaFilterSet, NormaJuridicaForm, NormaRelacionadaForm +from .models import (AssuntoNorma, NormaJuridica, NormaRelacionada, + TipoNormaJuridica, VinculoNormaJuridica) # LegislacaoCitadaCrud = Crud.build(LegislacaoCitada, '') AssuntoNormaCrud = CrudAux.build(AssuntoNorma, 'assunto_norma_juridica', @@ -28,6 +29,35 @@ VinculoNormaJuridicaCrud = CrudAux.build( VinculoNormaJuridica, '', list_field_names=['sigla', 'descricao']) +class NormaRelacionadaCrud(MasterDetailCrud): + model = NormaRelacionada + parent_field = 'norma_principal' + help_path = '' + public = [RP_LIST, RP_DETAIL] + + class BaseMixin(MasterDetailCrud.BaseMixin): + list_field_names = ['norma_relacionada'] + + class CreateView(MasterDetailCrud.CreateView): + form_class = NormaRelacionadaForm + + class UpdateView(MasterDetailCrud.UpdateView): + form_class = NormaRelacionadaForm + + def get_initial(self): + self.initial['tipo'] = self.object.norma_relacionada.tipo.id + self.initial['numero'] = self.object.norma_relacionada.numero + self.initial['ano'] = self.object.norma_relacionada.ano + self.initial['ementa'] = self.object.norma_relacionada.ementa + return self.initial + + class DetailView(MasterDetailCrud.DetailView): + + @property + def layout_key(self): + return 'NormaRelacionadaDetail' + + class NormaPesquisaView(FilterView): model = NormaJuridica filterset_class = NormaFilterSet @@ -132,3 +162,20 @@ class NormaCrud(Crud): self.initial['ano_materia'] = norma.materia.ano self.initial['numero_materia'] = norma.materia.numero return self.initial.copy() + + +def recuperar_norma(request): + tipo = TipoNormaJuridica.objects.get(pk=request.GET['tipo']) + numero = request.GET['numero'] + ano = request.GET['ano'] + + try: + norma = NormaJuridica.objects.get(tipo=tipo, + ano=ano, + numero=numero) + response = JsonResponse({'ementa': norma.ementa, + 'id': norma.id}) + except ObjectDoesNotExist: + response = JsonResponse({'ementa': '', 'id': 0}) + + return response diff --git a/sapl/templates/norma/layouts.yaml b/sapl/templates/norma/layouts.yaml index a00f1d5d3..52d16d587 100644 --- a/sapl/templates/norma/layouts.yaml +++ b/sapl/templates/norma/layouts.yaml @@ -53,3 +53,14 @@ LegislacaoCitadaDetail: VinculoNormaJuridica: {% trans 'Tipo de Vínculo entre Normas Jurídicas' %}: - sigla:2 descricao + +NormaRelacionada: + {% trans 'Norma Relacionada' %}: + - tipo numero ano + - tipo_vinculo + - ementa + +NormaRelacionadaDetail: + {% trans 'Norma Relacionada' %}: + - norma_relacionada + - tipo_vinculo diff --git a/sapl/templates/norma/normarelacionada_form.html b/sapl/templates/norma/normarelacionada_form.html new file mode 100644 index 000000000..300f7e3b3 --- /dev/null +++ b/sapl/templates/norma/normarelacionada_form.html @@ -0,0 +1,27 @@ +{% extends "crud/form.html" %} +{% load i18n %} +{% load crispy_forms_tags %} +{% load common_tags %} + +{% block extra_js %} + +{% endblock %} diff --git a/sapl/templates/norma/subnav.yaml b/sapl/templates/norma/subnav.yaml index be3cf3c0a..0599efdfb 100644 --- a/sapl/templates/norma/subnav.yaml +++ b/sapl/templates/norma/subnav.yaml @@ -2,6 +2,8 @@ - title: {% trans 'Início' %} url: normajuridica_detail +- title: {% trans 'Normas Relacionadas' %} + url: normarelacionada_list # Opção adicionada para chamar o TextoArticulado da norma. # para integração foram necessárias apenas criar a url norma_ta em urls.py From 3c1156ffc576ddfee0baeb9351847236d9e1b892 Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Wed, 23 Nov 2016 18:12:28 -0200 Subject: [PATCH 049/139] =?UTF-8?q?Permite=20pesquisa=20de=20autor=20por?= =?UTF-8?q?=20usu=C3=A1rio=20an=C3=B4nimo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/api/views.py | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/sapl/api/views.py b/sapl/api/views.py index 41d327bff..5dd86cf09 100644 --- a/sapl/api/views.py +++ b/sapl/api/views.py @@ -5,7 +5,7 @@ from django.utils.translation import ugettext_lazy as _ from rest_framework.filters import DjangoFilterBackend from rest_framework.generics import ListAPIView from rest_framework.mixins import ListModelMixin, RetrieveModelMixin -from rest_framework.permissions import IsAuthenticated +from rest_framework.permissions import IsAuthenticated, IsAuthenticatedOrReadOnly from rest_framework.viewsets import GenericViewSet from sapl.api.forms import AutorChoiceFilterSet @@ -59,10 +59,6 @@ class AutorListView(ListAPIView): de Autores mas feito para Possíveis Autores armazenados segundo o ContentType associado ao Tipo de Autor via relacionamento genérico. -<<<<<<< HEAD - -======= ->>>>>>> master Busca feita sem django-filter processada no get_queryset -> processo no cadastro de autores para seleção e busca dos possíveis autores @@ -87,7 +83,7 @@ class AutorListView(ListAPIView): TR_AUTOR_SERIALIZER = 3 # FIXME aplicar permissão correta de usuário - permission_classes = (IsAuthenticated,) + permission_classes = (IsAuthenticatedOrReadOnly,) queryset = Autor.objects.all() model = Autor @@ -116,7 +112,6 @@ class AutorListView(ListAPIView): desativa o django-filter se a busca for por possiveis autores parametro tr = TR_CHOICE_SERIALIZER """ - if self.tr == AutorListView.TR_CHOICE_SERIALIZER: self.filter_class = None self.filter_backends = [] From 6ad08b73b4cf2c665b1a0196473eb10f9fb68746 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Thu, 24 Nov 2016 11:36:38 -0200 Subject: [PATCH 050/139] Fix #807 --- sapl/norma/views.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/sapl/norma/views.py b/sapl/norma/views.py index 8f90190e4..f206b7dd7 100644 --- a/sapl/norma/views.py +++ b/sapl/norma/views.py @@ -128,6 +128,11 @@ class NormaCrud(Crud): namespace = self.model._meta.app_config.name return reverse('%s:%s' % (namespace, 'norma_pesquisa')) + class DeleteView(Crud.DeleteView): + + def get_success_url(self): + return self.search_url + class CreateView(Crud.CreateView): form_class = NormaJuridicaForm From 276ab39b03a510e434a8b697b20e909031119626 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Thu, 24 Nov 2016 16:04:22 -0200 Subject: [PATCH 051/139] Corrige #812, #815 e #816 --- sapl/materia/forms.py | 31 +++++++------ sapl/materia/models.py | 21 +++++++++ sapl/norma/models.py | 7 +++ sapl/protocoloadm/models.py | 48 +++++++++++++++++++++ sapl/sessao/models.py | 39 +++++++++++++++-- sapl/templates/materia/proposicao_form.html | 10 +++-- sapl/utils.py | 21 +++++---- 7 files changed, 151 insertions(+), 26 deletions(-) diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py index f5ca6d8bd..7b3797b81 100644 --- a/sapl/materia/forms.py +++ b/sapl/materia/forms.py @@ -986,29 +986,35 @@ class ProposicaoForm(forms.ModelForm): return cd def save(self, commit=True): + cd = self.cleaned_data + inst = self.instance + if inst.pk: + if 'tipo_texto' in cd: - if self.instance.pk: - if 'tipo_texto' in self.cleaned_data: - if self.cleaned_data['tipo_texto'] in ['T', ''] and\ - self.instance.texto_original: - self.instance.texto_original.delete() + if cd['tipo_texto'] == 'T' and inst.texto_original: + inst.texto_original.delete() + + elif cd['tipo_texto'] != 'T': + inst.texto_articulado.all().delete() - if self.cleaned_data['tipo_texto'] in ['D', '']: - self.instance.texto_articulado.all().delete() + if 'texto_original' in cd and\ + not cd['texto_original'] and \ + inst.texto_original: + inst.texto_original.delete() return super().save(commit) - self.instance.ano = datetime.now().year + inst.ano = datetime.now().year numero__max = Proposicao.objects.filter( - autor=self.instance.autor, + autor=inst.autor, ano=datetime.now().year).aggregate(Max('numero_proposicao')) numero__max = numero__max['numero_proposicao__max'] - self.instance.numero_proposicao = ( + inst.numero_proposicao = ( numero__max + 1) if numero__max else 1 - self.instance.save() + inst.save() - return self.instance + return inst class ConfirmarProposicaoForm(ProposicaoForm): @@ -1209,6 +1215,7 @@ class ConfirmarProposicaoForm(ProposicaoForm): self.instance.justificativa_devolucao = '' self.instance.data_devolucao = None self.instance.data_recebimento = datetime.now() + self.instance.materia_de_vinculo = cd['materia_de_vinculo'] if self.instance.texto_articulado.exists(): ta = self.instance.texto_articulado.first() diff --git a/sapl/materia/models.py b/sapl/materia/models.py index d84e0f2bf..26937e6a4 100644 --- a/sapl/materia/models.py +++ b/sapl/materia/models.py @@ -200,6 +200,13 @@ class MateriaLegislativa(models.Model): return _('%(tipo)s nº %(numero)s de %(ano)s') % { 'tipo': self.tipo, 'numero': self.numero, 'ano': self.ano} + def delete(self, using=None, keep_parents=False): + if self.texto_original: + self.texto_original.delete() + + return models.Model.delete( + self, using=using, keep_parents=keep_parents) + def save(self, force_insert=False, force_update=False, using=None, update_fields=None): @@ -346,6 +353,13 @@ class DocumentoAcessorio(models.Model): 'data': self.data, 'autor': self.autor} + def delete(self, using=None, keep_parents=False): + if self.arquivo: + self.arquivo.delete() + + return models.Model.delete( + self, using=using, keep_parents=keep_parents) + def save(self, force_insert=False, force_update=False, using=None, update_fields=None): @@ -590,6 +604,13 @@ class Proposicao(models.Model): self.numero_proposicao, self.ano) + def delete(self, using=None, keep_parents=False): + if self.texto_original: + self.texto_original.delete() + + return models.Model.delete( + self, using=using, keep_parents=keep_parents) + def save(self, force_insert=False, force_update=False, using=None, update_fields=None): diff --git a/sapl/norma/models.py b/sapl/norma/models.py index 49e85182c..5b30933e6 100644 --- a/sapl/norma/models.py +++ b/sapl/norma/models.py @@ -116,6 +116,13 @@ class NormaJuridica(models.Model): 'numero': self.numero, 'data': defaultfilters.date(self.data, "d \d\e F \d\e Y")} + def delete(self, using=None, keep_parents=False): + if self.texto_integral: + self.texto_integral.delete() + + return models.Model.delete( + self, using=using, keep_parents=keep_parents) + def save(self, force_insert=False, force_update=False, using=None, update_fields=None): diff --git a/sapl/protocoloadm/models.py b/sapl/protocoloadm/models.py index 68401a7d8..d472155ed 100644 --- a/sapl/protocoloadm/models.py +++ b/sapl/protocoloadm/models.py @@ -81,6 +81,30 @@ class DocumentoAdministrativo(models.Model): 'tipo': self.tipo, 'assunto': self.assunto } + def delete(self, using=None, keep_parents=False): + if self.texto_integral: + self.texto_integral.delete() + + return models.Model.delete( + self, using=using, keep_parents=keep_parents) + + def save(self, force_insert=False, force_update=False, using=None, + update_fields=None): + + if not self.pk and self.texto_integral: + texto_integral = self.texto_integral + self.texto_integral = None + models.Model.save(self, force_insert=force_insert, + force_update=force_update, + using=using, + update_fields=update_fields) + self.texto_integral = texto_integral + + return models.Model.save(self, force_insert=force_insert, + force_update=force_update, + using=using, + update_fields=update_fields) + class DocumentoAcessorioAdministrativo(models.Model): documento = models.ForeignKey(DocumentoAdministrativo) @@ -106,6 +130,30 @@ class DocumentoAcessorioAdministrativo(models.Model): def __str__(self): return self.nome + def delete(self, using=None, keep_parents=False): + if self.arquivo: + self.arquivo.delete() + + return models.Model.delete( + self, using=using, keep_parents=keep_parents) + + def save(self, force_insert=False, force_update=False, using=None, + update_fields=None): + + if not self.pk and self.arquivo: + arquivo = self.arquivo + self.arquivo = None + models.Model.save(self, force_insert=force_insert, + force_update=force_update, + using=using, + update_fields=update_fields) + self.arquivo = arquivo + + return models.Model.save(self, force_insert=force_insert, + force_update=force_update, + using=using, + update_fields=update_fields) + class Protocolo(models.Model): numero = models.PositiveIntegerField( diff --git a/sapl/sessao/models.py b/sapl/sessao/models.py index cf74399b5..f29194710 100644 --- a/sapl/sessao/models.py +++ b/sapl/sessao/models.py @@ -7,7 +7,7 @@ from sapl.materia.models import MateriaLegislativa from sapl.parlamentares.models import (CargoMesa, Legislatura, Parlamentar, Partido, SessaoLegislativa) from sapl.utils import (YES_NO_CHOICES, SaplGenericRelation, - restringe_tipos_de_arquivo_txt) + restringe_tipos_de_arquivo_txt, texto_upload_path) class CargoBancada(models.Model): @@ -77,11 +77,13 @@ def get_sessao_media_path(instance, subpath, filename): def pauta_upload_path(instance, filename): - return get_sessao_media_path(instance, 'pauta', filename) + return texto_upload_path(instance, filename, subpath='pauta') + # return get_sessao_media_path(instance, 'pauta', filename) def ata_upload_path(instance, filename): - return get_sessao_media_path(instance, 'ata', filename) + return texto_upload_path(instance, filename, subpath='ata') + # return get_sessao_media_path(instance, 'ata', filename) class SessaoPlenaria(models.Model): @@ -144,6 +146,37 @@ class SessaoPlenaria(models.Model): # XXX check if it shouldn't be legislatura.numero 'legislatura_id': self.legislatura.numero} + def delete(self, using=None, keep_parents=False): + if self.upload_pauta: + self.upload_pauta.delete() + + if self.upload_ata: + self.upload_ata.delete() + + return models.Model.delete( + self, using=using, keep_parents=keep_parents) + + def save(self, force_insert=False, force_update=False, using=None, + update_fields=None): + + if not self.pk and (self.upload_pauta or self.upload_ata): + upload_pauta = self.upload_pauta + upload_ata = self.upload_ata + self.upload_pauta = None + self.upload_ata = None + models.Model.save(self, force_insert=force_insert, + force_update=force_update, + using=using, + update_fields=update_fields) + + self.upload_pauta = upload_pauta + self.upload_ata = upload_ata + + return models.Model.save(self, force_insert=force_insert, + force_update=force_update, + using=using, + update_fields=update_fields) + class AbstractOrdemDia(models.Model): TIPO_VOTACAO_CHOICES = Choices( diff --git a/sapl/templates/materia/proposicao_form.html b/sapl/templates/materia/proposicao_form.html index 3ebd898ba..f9f9414b6 100644 --- a/sapl/templates/materia/proposicao_form.html +++ b/sapl/templates/materia/proposicao_form.html @@ -17,15 +17,19 @@ if (this.selectedOptions[0].getAttribute('data-has-perfil') === "True") { $("input[name=tipo_texto]").closest('label').removeClass('disabled'); + $("input[name=tipo_texto]").closest('.form-group').parent().removeClass('hidden'); $("input[name=tipo_texto]").prop('disabled', false); } else { $("input[name=tipo_texto]").closest('label').addClass('disabled'); + $("input[name=tipo_texto]").closest('.form-group').parent().addClass('hidden'); $("input[name=tipo_texto]").prop('disabled', true); } + if ($("input[name=tipo_texto]:checked").length == 0) { + $("input[name=tipo_texto]").first().prop('checked', true); + $("input[name=tipo_texto]").first().closest('label').addClass('checked'); + } - $("input[name=tipo_texto]").first().prop('checked', true); - $("input[name=tipo_texto]").first().closest('label').addClass('checked'); }); $("select[name=tipo_materia], input[name=numero_materia], input[name=ano_materia]").change(function(event) { @@ -46,7 +50,7 @@ }); }); - $("input[name=tipo_texto], select[name=tipo_materia]").trigger('change'); + $("input[name=tipo_texto], select[name=tipo_materia], select[name=tipo]").trigger('change'); }); diff --git a/sapl/utils.py b/sapl/utils.py index e61d68f85..89f3829c8 100644 --- a/sapl/utils.py +++ b/sapl/utils.py @@ -1,12 +1,10 @@ -import hashlib -import logging -import re from datetime import date from functools import wraps from unicodedata import normalize as unicodedata_normalize +import hashlib +import logging +import re -import django_filters -import magic from crispy_forms.helper import FormHelper from crispy_forms.layout import HTML, Button from django import forms @@ -18,10 +16,13 @@ from django.contrib.contenttypes.fields import (GenericForeignKey, GenericRel, from django.core.exceptions import ValidationError from django.utils.translation import ugettext_lazy as _ from floppyforms import ClearableFileInput +import django_filters +import magic from sapl.crispy_layout_mixin import SaplFormLayout, form_actions, to_row from sapl.settings import BASE_DIR + sapl_logger = logging.getLogger(BASE_DIR.name) @@ -573,7 +574,7 @@ def generic_relations_for_model(model): )) -def texto_upload_path(instance, filename): +def texto_upload_path(instance, filename, subpath=''): """ O path gerado por essa função leva em conta a pk de instance. isso não é possível naturalmente em uma inclusão pois a implementação @@ -595,11 +596,15 @@ def texto_upload_path(instance, filename): seguida para armazenar o arquivo. """ - filename = re.sub('[^a-zA-Z0-9]', '-', filename).strip('-').lower() + if subpath and '/' not in subpath: + subpath = subpath + '/' + + filename = re.sub('[^a-zA-Z0-9.]', '-', filename).strip('-').lower() filename = re.sub('[-]+', '-', filename) - path = './sapl/%(model_name)s/%(pk)s/%(filename)s' % { + path = './sapl/%(model_name)s/%(pk)s/%(subpath)s%(filename)s' % { 'model_name': instance._meta.model_name, 'pk': instance.pk, + 'subpath': subpath, 'filename': filename} return path From 2e7c6f79264a1372737119347510c144a790acd6 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Fri, 25 Nov 2016 10:51:35 -0200 Subject: [PATCH 052/139] Add NormaRelacionada no map_rules e generaliza username --- sapl/rules/apps.py | 7 ++++--- sapl/rules/map_rules.py | 6 ++++-- setup.py | 1 - 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/sapl/rules/apps.py b/sapl/rules/apps.py index affce7bec..d41e308c8 100644 --- a/sapl/rules/apps.py +++ b/sapl/rules/apps.py @@ -1,6 +1,5 @@ from builtins import LookupError -import django from django.apps import apps from django.conf import settings from django.contrib.auth import get_user_model @@ -8,8 +7,9 @@ from django.contrib.auth.management import _get_all_permissions from django.core import exceptions from django.db import models, router from django.db.utils import DEFAULT_DB_ALIAS -from django.utils.translation import ugettext_lazy as _ from django.utils.translation import string_concat +from django.utils.translation import ugettext_lazy as _ +import django from sapl.rules import (SAPL_GROUP_ADMINISTRATIVO, SAPL_GROUP_COMISSOES, SAPL_GROUP_GERAL, SAPL_GROUP_MATERIA, SAPL_GROUP_NORMA, @@ -205,8 +205,9 @@ def update_groups(app_config, verbosity=2, interactive=True, def cria_usuario(self, nome, grupo): nome_usuario = nome + param_username = {get_user_model().USERNAME_FIELD: nome_usuario} usuario = get_user_model().objects.get_or_create( - username=nome_usuario)[0] + **param_username)[0] usuario.set_password('interlegis') usuario.save() grupo.user_set.add(usuario) diff --git a/sapl/rules/map_rules.py b/sapl/rules/map_rules.py index ff5208f4a..6f9a4165f 100644 --- a/sapl/rules/map_rules.py +++ b/sapl/rules/map_rules.py @@ -128,7 +128,7 @@ rules_group_norma = { 'group': SAPL_GROUP_NORMA, 'rules': [ (norma.NormaJuridica, __base__), - (norma.VinculoNormaJuridica, __base__), + (norma.NormaRelacionada, __base__), # Publicacao está com permissão apenas para norma e não para matéria # e proposições apenas por análise do contexto, não é uma limitação @@ -221,6 +221,7 @@ rules_group_geral = { (norma.AssuntoNorma, __base__), (norma.TipoNormaJuridica, __base__), + (norma.VinculoNormaJuridica, __base__), (parlamentares.Legislatura, __base__), (parlamentares.SessaoLegislativa, __base__), @@ -259,7 +260,8 @@ rules_group_geral = { # este model é um espelho do model integrado e sua edição pode # confundir Autores, operadores de matéria e/ou norma. # Por isso está adicionado apenas para o operador geral - (compilacao.TextoArticulado, __base__ + ['lock_unlock_textoarticulado']), + (compilacao.TextoArticulado, + __base__ + ['lock_unlock_textoarticulado']), # estes tres models são complexos e a principio apenas o admin tem perm (compilacao.TipoDispositivo, []), diff --git a/setup.py b/setup.py index ab6d283ac..c376e8f24 100644 --- a/setup.py +++ b/setup.py @@ -10,7 +10,6 @@ os.chdir(os.path.normpath(os.path.join(os.path.abspath(__file__), os.pardir))) install_requires = [ 'dj-database-url==0.4.1', - 'django-admin-bootstrapped==2.5.7', 'django-bootstrap3==7.0.1', 'django-bower==5.1.0', 'django-braces==1.9.0', From 57d87b43b890101194b2939ac1b4b6733af31c5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rog=C3=A9rio=20Fr=C3=A1?= Date: Fri, 25 Nov 2016 09:31:39 -0200 Subject: [PATCH 053/139] Update importacao_25_31.rst --- docs/importacao_25_31.rst | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/docs/importacao_25_31.rst b/docs/importacao_25_31.rst index 5f9fab366..8be87ce7c 100644 --- a/docs/importacao_25_31.rst +++ b/docs/importacao_25_31.rst @@ -1,6 +1,9 @@ Instruções para Importação da base mysql 2.5 ============================================ +Instalar Dependências:: + + pip install -r requirements/migration-requirements.txt Criar um arquivo sapl/legacy/.env com o seguinte conteúdo (parametros de acesso ao banco 2.5):: @@ -17,8 +20,8 @@ Para entrar no ambiente virtual:: Posteriormente rodar a seguinte sequencia de comandos estando no ambiente virtual:: - ./manage.py shell_plus --settings=sapl.legacy_migration_settings + ./manage.py shell --settings=sapl.legacy_migration_settings - >>> %run sapl/legacy/migration.py + %run sapl/legacy/migration.py - >>> migrate() + migrate() From 4766a698a5400e8fb00ca1a2b846acff41c35454 Mon Sep 17 00:00:00 2001 From: Eduardo Edson Batista Cordeiro Alves Date: Fri, 25 Nov 2016 13:54:22 -0200 Subject: [PATCH 054/139] Fix #819 --- sapl/templates/materia/materialegislativa_filter.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sapl/templates/materia/materialegislativa_filter.html b/sapl/templates/materia/materialegislativa_filter.html index 79c9a5a69..cc6b3418b 100644 --- a/sapl/templates/materia/materialegislativa_filter.html +++ b/sapl/templates/materia/materialegislativa_filter.html @@ -61,7 +61,8 @@
{% endif %} Data da última Tramitação:  {{m.tramitacao_set.last.data_tramitacao|default_if_none:"Não Informada"}}
- Ementa: {{ m.ementa|safe }}
+ Ementa: {{ m.ementa|safe }} + {% if m.texto_original %}

Texto Original{% endif %}

{% endfor %} From f4b3af0f63bd1de0997839f920dbcfb097e39a13 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Mon, 28 Nov 2016 11:23:13 -0200 Subject: [PATCH 055/139] Ajst Autor para trabalhar com username_field de user --- sapl/base/forms.py | 10 +++++++--- sapl/base/views.py | 2 +- sapl/templates/base/layouts.yaml | 2 +- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/sapl/base/forms.py b/sapl/base/forms.py index 75145bba7..ea30726ae 100644 --- a/sapl/base/forms.py +++ b/sapl/base/forms.py @@ -358,9 +358,13 @@ class AutorForm(ModelForm): u.save() elif self.cleaned_data['action_user'] == 'C': - u = get_user_model().objects.create( - username=self.cleaned_data['username'], - email=self.cleaned_data['email']) + param_username = { + get_user_model().USERNAME_FIELD: self.cleaned_data['username']} + + if get_user_model().USERNAME_FIELD != 'email': + param_username['email'] = self.cleaned_data['email'] + + u = get_user_model().objects.create(**param_username) u.set_password(self.cleaned_data['senha']) # Define usuário como ativo em ambiente de desenvolvimento diff --git a/sapl/base/views.py b/sapl/base/views.py index 4de2da9fc..9d50c7176 100644 --- a/sapl/base/views.py +++ b/sapl/base/views.py @@ -62,7 +62,7 @@ class AutorCrud(CrudAux): help_path = 'autor' class BaseMixin(CrudAux.BaseMixin): - list_field_names = ['tipo', 'nome', 'user__username'] + list_field_names = ['tipo', 'nome', 'user'] class DeleteView(CrudAux.DeleteView): diff --git a/sapl/templates/base/layouts.yaml b/sapl/templates/base/layouts.yaml index be1901b0f..ac9607c3f 100644 --- a/sapl/templates/base/layouts.yaml +++ b/sapl/templates/base/layouts.yaml @@ -27,7 +27,7 @@ TipoAutor: Autor: {% trans 'Autor' %}: - tipo:3 nome - - user:6 cargo + - cargo AutorCreate: {% trans 'Cadastro de Usuários Autores' %}: From a83a90ca391c3d45737711584d511fe1b132c7f5 Mon Sep 17 00:00:00 2001 From: Luciano Almeida Date: Mon, 28 Nov 2016 12:02:53 -0200 Subject: [PATCH 056/139] Muda User para get_user_model() Signed-off-by: Luciano Almeida --- sapl/legacy/migration.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/sapl/legacy/migration.py b/sapl/legacy/migration.py index 3a28f6fa4..ffe48cd9a 100644 --- a/sapl/legacy/migration.py +++ b/sapl/legacy/migration.py @@ -4,7 +4,7 @@ import pkg_resources import yaml from django.apps import apps from django.apps.config import AppConfig -from django.contrib.auth.models import User +from django.contrib.auth import get_user_model from django.core.exceptions import ObjectDoesNotExist from django.db import connections, models from django.db.models import CharField, TextField, ProtectedError @@ -332,7 +332,7 @@ class DataMigrator: # warning: model/app migration order is of utmost importance self.to_delete = [] ProblemaMigracao.objects.all().delete() - User.objects.all().delete() + get_user_model().objects.exclude(is_superuser=True).delete() info('Começando migração: %s...' % obj) self._do_migrate(obj) @@ -540,12 +540,15 @@ def adjust_autor(new, old): new.autor_related = Comissao.objects.get(pk=old.cod_comissao) if old.col_username: - if not User.objects.filter(username=old.col_username).exists(): - user = User(username=old.col_username, password=12345) + if not get_user_model().objects.filter( + username=old.col_username).exists(): + user = get_user_model()( + username=old.col_username, password=12345) user.save() new.user = user else: - new.user = User.objects.filter(username=old.col_username)[0] + new.user = get_user_model().objects.filter( + username=old.col_username)[0] AJUSTE_ANTES_SALVAR = { From ebd9ed51c24a17596fe95b147a0f4d1b11f029e1 Mon Sep 17 00:00:00 2001 From: Eduardo Edson Batista Cordeiro Alves Date: Tue, 29 Nov 2016 09:31:09 -0200 Subject: [PATCH 057/139] =?UTF-8?q?Remove=20bot=C3=A3o=20de=20adicionar=20?= =?UTF-8?q?em=20pesquisa=20de=20norma=20para=20usu=C3=A1rio=20anonimo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 +- sapl/templates/norma/normajuridica_filter.html | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index b30c9723f..38805b350 100644 --- a/.gitignore +++ b/.gitignore @@ -87,8 +87,8 @@ target/ # specific to this project +whoosh_index collected_static bower bower_components media - diff --git a/sapl/templates/norma/normajuridica_filter.html b/sapl/templates/norma/normajuridica_filter.html index a0df2fcb4..854340f60 100644 --- a/sapl/templates/norma/normajuridica_filter.html +++ b/sapl/templates/norma/normajuridica_filter.html @@ -4,11 +4,11 @@ {% block actions %}
- - {% if perms.norma.add_normajuridica %} + {% if perms.norma.add_normajuridica %} + {% blocktrans with verbose_name=view.verbose_name %} Adicionar Norma Jurídica {% endblocktrans %} - {% endif %} - + + {% endif %} {% if filter_url %} {% trans 'Fazer nova pesquisa' %} {% endif %} From eb7d03b73f15a55b35d65385b23cfb05f762bdf1 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Tue, 29 Nov 2016 10:49:39 -0200 Subject: [PATCH 058/139] Atualiza pinagem do django --- requirements/requirements.txt | 2 +- setup.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/requirements/requirements.txt b/requirements/requirements.txt index 4387cb37d..c99b8303c 100644 --- a/requirements/requirements.txt +++ b/requirements/requirements.txt @@ -1,5 +1,5 @@ dj-database-url==0.4.1 -django==1.9.7 +django>=1.9,<1.10 django-admin-bootstrapped==2.5.7 django-bootstrap3==7.0.1 django-bower==5.1.0 diff --git a/setup.py b/setup.py index c376e8f24..e123f703f 100644 --- a/setup.py +++ b/setup.py @@ -21,7 +21,7 @@ install_requires = [ 'django-floppyforms==1.6.2', 'django-model-utils==2.5', 'django-sass-processor==0.4.6', - 'django==1.9.7', + 'django>=1.9,<1.10', 'djangorestframework', 'easy-thumbnails==2.3', 'libsass==0.11.1', @@ -31,7 +31,7 @@ install_requires = [ 'pyyaml==3.11', 'rtyaml==0.0.3', 'unipath==1.1', - 'python-magic==0.4.10', + 'python-magic==0.4.12', 'gunicorn==19.6.0', # git+git://github.com/interlegis/trml2pdf.git ] From 3d7791565491968734dfab161a0a7ac25904a2d9 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Tue, 29 Nov 2016 16:17:27 -0200 Subject: [PATCH 059/139] Fix #836 --- sapl/materia/views.py | 8 +++++++- sapl/norma/forms.py | 10 ++++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/sapl/materia/views.py b/sapl/materia/views.py index 32c18b50b..16770ac91 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -21,7 +21,6 @@ from django.views.generic.base import RedirectView from django.views.generic.edit import FormView from django_filters.views import FilterView -import sapl from sapl.base.models import Autor, CasaLegislativa from sapl.compilacao.models import (STATUS_TA_EDITION, STATUS_TA_IMMUTABLE_RESTRICT, @@ -40,6 +39,7 @@ from sapl.protocoloadm.models import Protocolo from sapl.utils import (TURNO_TRAMITACAO_CHOICES, YES_NO_CHOICES, autor_label, autor_modal, gerar_hash_arquivo, get_base_url, montar_row_autor) +import sapl from .forms import (AcessorioEmLoteFilterSet, AcompanhamentoMateriaForm, DocumentoAcessorioForm, MateriaLegislativaFilterSet, @@ -55,6 +55,7 @@ from .models import (AcompanhamentoMateria, Anexada, Autoria, DespachoInicial, TipoMateriaLegislativa, TipoProposicao, Tramitacao, UnidadeTramitacao) + OrigemCrud = Crud.build(Origem, '') TipoMateriaCrud = CrudAux.build( @@ -987,6 +988,11 @@ class MateriaLegislativaCrud(Crud): def cancel_url(self): return self.search_url + class DeleteView(Crud.DeleteView): + + def get_success_url(self): + return self.search_url + class ListView(Crud.ListView, RedirectView): def get_redirect_url(self, *args, **kwargs): diff --git a/sapl/norma/forms.py b/sapl/norma/forms.py index 071d959b3..68b059436 100644 --- a/sapl/norma/forms.py +++ b/sapl/norma/forms.py @@ -1,6 +1,5 @@ from datetime import datetime -import django_filters from crispy_forms.helper import FormHelper from crispy_forms.layout import Fieldset, Layout from django import forms @@ -8,6 +7,7 @@ from django.core.exceptions import ObjectDoesNotExist, ValidationError from django.db import models from django.forms import ModelForm, widgets from django.utils.translation import ugettext_lazy as _ +import django_filters from sapl.crispy_layout_mixin import form_actions, to_row from sapl.materia.models import MateriaLegislativa, TipoMateriaLegislativa @@ -50,6 +50,9 @@ class NormaFilterSet(django_filters.FilterSet): ementa = django_filters.CharFilter(lookup_expr='icontains') + assuntos = django_filters.ModelChoiceFilter( + queryset=AssuntoNorma.objects.all()) + class Meta: model = NormaJuridica fields = ['tipo', 'numero', 'ano', 'data', @@ -60,14 +63,13 @@ class NormaFilterSet(django_filters.FilterSet): row1 = to_row([('tipo', 4), ('numero', 4), ('ano', 4)]) row2 = to_row([('data', 6), ('data_publicacao', 6)]) - row3 = to_row([('ementa', 12)]) - row4 = to_row([('assuntos', 12)]) + row3 = to_row([('ementa', 8), ('assuntos', 4)]) self.form.helper = FormHelper() self.form.helper.form_method = 'GET' self.form.helper.layout = Layout( Fieldset(_('Pesquisa de Norma'), - row1, row2, row3, row4, + row1, row2, row3, form_actions(save_label='Pesquisar')) ) From e8d703ba44bbb6d72e783d941798013346ec525c Mon Sep 17 00:00:00 2001 From: Eduardo Edson Batista Cordeiro Alves Date: Wed, 30 Nov 2016 11:12:31 -0200 Subject: [PATCH 060/139] Cria detailview --- sapl/materia/views.py | 35 +++++++++++++++++++++++++++++ sapl/templates/materia/layouts.yaml | 17 ++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/sapl/materia/views.py b/sapl/materia/views.py index 16770ac91..b8931102e 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -1,6 +1,7 @@ from datetime import datetime from random import choice from string import ascii_letters, digits +from django.views.generic import DetailView from crispy_forms.helper import FormHelper from crispy_forms.layout import HTML @@ -993,6 +994,40 @@ class MateriaLegislativaCrud(Crud): def get_success_url(self): return self.search_url + class DetailView(Crud.DetailView): + + def get_context_data(self, **kwargs): + context = super().get_context_data() + data = {} + + if self.object.numeracao_set.all().count() > 1: + string = ' - ' + for n in self.object.numeracao_set.all(): + _str = n.numero + '/' + n.ano + ' - ' + string += _str + + data = {'text': string, + 'span': 12, + 'verbose_name': 'Processo', + 'id': 'processo'} + + elif self.object.numeracao_set.all().count() == 1: + n = self.object.numeracao_set.first() + string = n.numero + '/' + n.ano + + data = {'text': string, + 'span': 12, + 'verbose_name': 'Processo', + 'id': 'processo'} + + context['view'].layout_display[0]['rows'].insert(3, data) + import ipdb; ipdb.set_trace() + return context + + @property + def layout_key(self): + return 'MateriaLegislativaDetail' + class ListView(Crud.ListView, RedirectView): def get_redirect_url(self, *args, **kwargs): diff --git a/sapl/templates/materia/layouts.yaml b/sapl/templates/materia/layouts.yaml index 79edce4ee..b7e43e7b1 100644 --- a/sapl/templates/materia/layouts.yaml +++ b/sapl/templates/materia/layouts.yaml @@ -119,3 +119,20 @@ LegislacaoCitadaDetail: - disposicoes parte livro titulo - capitulo secao subsecao artigo - paragrafo inciso alinea item + +MateriaLegislativaDetail: + {% trans 'Identificação Básica' %}: + - tipo ano numero + - data_apresentacao numero_protocolo tipo_apresentacao + - texto_original + {% trans 'Outras Informações' %}: + - apelido dias_prazo polemica + - objeto regime_tramitacao em_tramitacao + - data_fim_prazo data_publicacao complementar + {% trans 'Origem Externa' %}: + - tipo_origem_externa numero_origem_externa ano_origem_externa + - local_origem_externa data_origem_externa + {% trans 'Dados Textuais' %}: + - ementa + - indexacao + - observacao From 8930a2576f2d99352a18685862dba893d6419561 Mon Sep 17 00:00:00 2001 From: Eduardo Edson Batista Cordeiro Alves Date: Wed, 30 Nov 2016 11:15:01 -0200 Subject: [PATCH 061/139] Fix fields --- sapl/materia/views.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/sapl/materia/views.py b/sapl/materia/views.py index b8931102e..b337cb85e 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -1003,7 +1003,7 @@ class MateriaLegislativaCrud(Crud): if self.object.numeracao_set.all().count() > 1: string = ' - ' for n in self.object.numeracao_set.all(): - _str = n.numero + '/' + n.ano + ' - ' + _str = n.numero_materia + '/' + n.ano_materia + ' - ' string += _str data = {'text': string, @@ -1013,7 +1013,7 @@ class MateriaLegislativaCrud(Crud): elif self.object.numeracao_set.all().count() == 1: n = self.object.numeracao_set.first() - string = n.numero + '/' + n.ano + string = n.numero_materia + '/' + n.ano_materia data = {'text': string, 'span': 12, @@ -1021,7 +1021,6 @@ class MateriaLegislativaCrud(Crud): 'id': 'processo'} context['view'].layout_display[0]['rows'].insert(3, data) - import ipdb; ipdb.set_trace() return context @property From d082c9e1cd2dda4ee625ca8ad15e7659e5582615 Mon Sep 17 00:00:00 2001 From: Eduardo Edson Batista Cordeiro Alves Date: Wed, 30 Nov 2016 11:20:17 -0200 Subject: [PATCH 062/139] Fix strings --- sapl/materia/views.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/sapl/materia/views.py b/sapl/materia/views.py index b337cb85e..6941ee040 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -1003,7 +1003,8 @@ class MateriaLegislativaCrud(Crud): if self.object.numeracao_set.all().count() > 1: string = ' - ' for n in self.object.numeracao_set.all(): - _str = n.numero_materia + '/' + n.ano_materia + ' - ' + _str = str(n.numero_materia) + '/' + str( + n.ano_materia) + ' - ' string += _str data = {'text': string, @@ -1013,7 +1014,7 @@ class MateriaLegislativaCrud(Crud): elif self.object.numeracao_set.all().count() == 1: n = self.object.numeracao_set.first() - string = n.numero_materia + '/' + n.ano_materia + string = str(n.numero_materia) + '/' + str(n.ano_materia) data = {'text': string, 'span': 12, From 959d6ceff939c4705101667b5249c56874cffce9 Mon Sep 17 00:00:00 2001 From: Eduardo Edson Batista Cordeiro Alves Date: Wed, 30 Nov 2016 12:00:49 -0200 Subject: [PATCH 063/139] Fix __max --- sapl/protocoloadm/views.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/sapl/protocoloadm/views.py b/sapl/protocoloadm/views.py index e45c943b4..d217005c2 100644 --- a/sapl/protocoloadm/views.py +++ b/sapl/protocoloadm/views.py @@ -220,12 +220,9 @@ class ProtocoloDocumentoView(PermissionRequiredMixin, elif numeracao == 'U': numero = Protocolo.objects.all().aggregate(Max('numero')) - if numero['numero__max'] is None: - numero['numero__max'] = 0 - f.tipo_processo = '0' # TODO validar o significado f.anulado = False - f.numero = numero['numero__max'] + 1 + f.numero = (numero['numero__max'] + 1) if numero__max else 1 f.ano = datetime.now().year f.data = datetime.now().strftime('%Y-%m-%d') f.hora = datetime.now().strftime('%H:%M') @@ -356,7 +353,7 @@ class ProtocoloMateriaView(PermissionRequiredMixin, CreateView): protocolo = Protocolo() - protocolo.numero = numero['numero__max'] + 1 + protocolo.numero = (numero['numero__max'] + 1) if numero__max else 1 protocolo.ano = datetime.now().year protocolo.data = datetime.now().strftime("%Y-%m-%d") protocolo.hora = datetime.now().strftime("%H:%M") From f1b7b089d96a2ed74695ebf1a413ea7e472cfb0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rog=C3=A9rio=20Fr=C3=A1?= Date: Wed, 30 Nov 2016 13:34:27 -0200 Subject: [PATCH 064/139] Update materialegislativa_filter.html --- sapl/templates/materia/materialegislativa_filter.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sapl/templates/materia/materialegislativa_filter.html b/sapl/templates/materia/materialegislativa_filter.html index cc6b3418b..8452383e2 100644 --- a/sapl/templates/materia/materialegislativa_filter.html +++ b/sapl/templates/materia/materialegislativa_filter.html @@ -48,7 +48,7 @@ Localização Atual:  {{m.tramitacao_set.last.unidade_tramitacao_destino|default_if_none:"Não Informada"}}
Status:  {{m.tramitacao_set.last.status|default_if_none:"Não Informada"}}
{% if m.registrovotacao_set.exists %} - Data Votação: + Data da última Votação: {% if m.registrovotacao_set.last.ordem %} {{ m.registrovotacao_set.last.ordem.data_ordem }} From 203c891009f4c52c41ccefbe967d81f5d3a851b2 Mon Sep 17 00:00:00 2001 From: Leandro Roberto da Silva Date: Wed, 30 Nov 2016 14:26:21 -0200 Subject: [PATCH 065/139] Cust. crispy_layout para render. de related_name MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Nos layouts (layouts.yaml) pode-se criar layouts específicos para renderização de related_names. Veja exemplo de MateriaLegislativaDetail que renderiza numeracao_set --- sapl/crispy_layout_mixin.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/sapl/crispy_layout_mixin.py b/sapl/crispy_layout_mixin.py index 028301502..555a04f19 100644 --- a/sapl/crispy_layout_mixin.py +++ b/sapl/crispy_layout_mixin.py @@ -61,8 +61,12 @@ def get_field_display(obj, fieldname): try: field = obj._meta.get_field(fieldname) except: - value = getattr(obj, fieldname) - return '', str(value) + field = getattr(obj, fieldname) + if 'ManyRelatedManager' not in str(type(field))\ + and 'RelatedManager' not in str(type(field))\ + and 'GenericRelatedObjectManager' not in str(type(field)): + return '', str(field) + verbose_name = str(field.verbose_name)\ if hasattr(field, 'verbose_name') else '' if hasattr(field, 'choices') and field.choices: @@ -98,7 +102,11 @@ def get_field_display(obj, fieldname): display += '
  • %s
  • ' % str(v) display += '' if not verbose_name: - verbose_name = str(field.related_model._meta.verbose_name_plural) + if hasattr(field, 'related_model'): + verbose_name = str( + field.related_model._meta.verbose_name_plural) + elif hasattr(field, 'model'): + verbose_name = str(field.model._meta.verbose_name_plural) else: display = str(value) return verbose_name, display From 671def24a77e4fc9702fc02bece13d49a2cc04bf Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Wed, 30 Nov 2016 14:43:49 -0200 Subject: [PATCH 066/139] HOT-FIX: conserta numero__max__ --- sapl/protocoloadm/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sapl/protocoloadm/views.py b/sapl/protocoloadm/views.py index d217005c2..37c4608f8 100644 --- a/sapl/protocoloadm/views.py +++ b/sapl/protocoloadm/views.py @@ -222,7 +222,7 @@ class ProtocoloDocumentoView(PermissionRequiredMixin, f.tipo_processo = '0' # TODO validar o significado f.anulado = False - f.numero = (numero['numero__max'] + 1) if numero__max else 1 + f.numero = (numero['numero__max'] + 1) if numero else 1 f.ano = datetime.now().year f.data = datetime.now().strftime('%Y-%m-%d') f.hora = datetime.now().strftime('%H:%M') From b0fe318fc8cc8cfd0b549901ef8f8cf71f003a31 Mon Sep 17 00:00:00 2001 From: Leandro Roberto da Silva Date: Wed, 30 Nov 2016 15:07:45 -0200 Subject: [PATCH 067/139] corrige numero__max --- sapl/protocoloadm/views.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sapl/protocoloadm/views.py b/sapl/protocoloadm/views.py index 37c4608f8..a97d3d758 100644 --- a/sapl/protocoloadm/views.py +++ b/sapl/protocoloadm/views.py @@ -222,7 +222,7 @@ class ProtocoloDocumentoView(PermissionRequiredMixin, f.tipo_processo = '0' # TODO validar o significado f.anulado = False - f.numero = (numero['numero__max'] + 1) if numero else 1 + f.numero = (numero['numero__max'] + 1) if numero['numero__max'] else 1 f.ano = datetime.now().year f.data = datetime.now().strftime('%Y-%m-%d') f.hora = datetime.now().strftime('%H:%M') @@ -353,7 +353,7 @@ class ProtocoloMateriaView(PermissionRequiredMixin, CreateView): protocolo = Protocolo() - protocolo.numero = (numero['numero__max'] + 1) if numero__max else 1 + protocolo.numero = (numero['numero__max'] + 1) if numero['numero__max'] else 1 protocolo.ano = datetime.now().year protocolo.data = datetime.now().strftime("%Y-%m-%d") protocolo.hora = datetime.now().strftime("%H:%M") From f64aa0010cced208568e3945b6dd3b196a5edc68 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Wed, 30 Nov 2016 16:20:28 -0200 Subject: [PATCH 068/139] =?UTF-8?q?Ref=20list=20de=20prop=20nao=20recebida?= =?UTF-8?q?s/n=C3=A3o=20incorp/incorp.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/crud/base.py | 14 ++++-- .../migrations/0071_auto_20161130_1001.py | 19 ++++++++ .../migrations/0072_auto_20161130_1618.py | 19 ++++++++ sapl/materia/models.py | 8 ++++ sapl/materia/views.py | 43 +++++++++++++++++-- sapl/rules/__init__.py | 15 +++++++ sapl/rules/map_rules.py | 20 +++------ .../materia/prop_devolvidas_list.html | 9 +--- sapl/templates/materia/proposicao_detail.html | 16 ++++--- 9 files changed, 128 insertions(+), 35 deletions(-) create mode 100644 sapl/materia/migrations/0071_auto_20161130_1001.py create mode 100644 sapl/materia/migrations/0072_auto_20161130_1618.py diff --git a/sapl/crud/base.py b/sapl/crud/base.py index cc84c7b4e..7c39850bf 100644 --- a/sapl/crud/base.py +++ b/sapl/crud/base.py @@ -180,7 +180,15 @@ class PermissionRequiredContainerCrudMixin(PermissionRequiredMixin): perms = self.get_permission_required() # Torna a view pública se não possuir conteudo # no atributo permission_required - return self.request.user.has_perms(perms) if len(perms) else True + if not len(perms): + return True + + for perm in perms: + if self.request.user.has_perm(perm): + return True + return False + + # return self.request.user.has_perms(perms) if len(perms) else True def dispatch(self, request, *args, **kwargs): if not self.has_permission(): @@ -257,9 +265,7 @@ class CrudBaseMixin(CrispyLayoutFormMixin): self.permission_required = list( set(self.permission_required) - set(obj.public)) else: - obj.public = list( - set(self.permission_required) - - set((RP_LIST, RP_DETAIL, RP_ADD, RP_CHANGE, RP_DELETE))) + obj.public = [] self.permission_required = tuple(( self.permission(pr) for pr in self.permission_required)) diff --git a/sapl/materia/migrations/0071_auto_20161130_1001.py b/sapl/materia/migrations/0071_auto_20161130_1001.py new file mode 100644 index 000000000..c1b688121 --- /dev/null +++ b/sapl/materia/migrations/0071_auto_20161130_1001.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.11 on 2016-11-30 10:01 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('materia', '0070_auto_20161111_1301'), + ] + + operations = [ + migrations.AlterModelOptions( + name='proposicao', + options={'permissions': (('detail_proposicao_enviada', 'Pode acessar detalhes de uma proposição enviada.'), ('detail_proposicao_devolvida', 'Pode acessar detalhes de uma proposição devolvida.')), 'verbose_name': 'Proposição', 'verbose_name_plural': 'Proposições'}, + ), + ] diff --git a/sapl/materia/migrations/0072_auto_20161130_1618.py b/sapl/materia/migrations/0072_auto_20161130_1618.py new file mode 100644 index 000000000..da265d3ff --- /dev/null +++ b/sapl/materia/migrations/0072_auto_20161130_1618.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.11 on 2016-11-30 16:18 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('materia', '0071_auto_20161130_1001'), + ] + + operations = [ + migrations.AlterModelOptions( + name='proposicao', + options={'permissions': (('detail_proposicao_enviada', 'Pode acessar detalhes de uma proposição enviada.'), ('detail_proposicao_devolvida', 'Pode acessar detalhes de uma proposição devolvida.'), ('detail_proposicao_incorporada', 'Pode acessar detalhes de uma proposição incorporada.')), 'verbose_name': 'Proposição', 'verbose_name_plural': 'Proposições'}, + ), + ] diff --git a/sapl/materia/models.py b/sapl/materia/models.py index 26937e6a4..8bdd6eecb 100644 --- a/sapl/materia/models.py +++ b/sapl/materia/models.py @@ -598,6 +598,14 @@ class Proposicao(models.Model): verbose_name = _('Proposição') verbose_name_plural = _('Proposições') unique_together = (('content_type', 'object_id'), ) + permissions = ( + ('detail_proposicao_enviada', + _('Pode acessar detalhes de uma proposição enviada.')), + ('detail_proposicao_devolvida', + _('Pode acessar detalhes de uma proposição devolvida.')), + ('detail_proposicao_incorporada', + _('Pode acessar detalhes de uma proposição incorporada.')), + ) def __str__(self): return '%s %s/%s' % (Proposicao._meta.verbose_name, diff --git a/sapl/materia/views.py b/sapl/materia/views.py index 16770ac91..28d97884b 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -251,7 +251,7 @@ class ProposicaoDevolvida(PermissionRequiredMixin, ListView): model = Proposicao ordering = ['data_envio'] paginate_by = 10 - permission_required = ('materia.list_proposicao', ) + permission_required = ('materia.detail_proposicao_devolvida', ) def get_queryset(self): return Proposicao.objects.filter( @@ -275,7 +275,7 @@ class ProposicaoPendente(PermissionRequiredMixin, ListView): model = Proposicao ordering = ['data_envio', 'autor', 'tipo', 'descricao'] paginate_by = 10 - permission_required = ('materia.list_proposicao', ) + permission_required = ('materia.detail_proposicao_enviada', ) def get_queryset(self): return Proposicao.objects.filter( @@ -300,7 +300,7 @@ class ProposicaoRecebida(PermissionRequiredMixin, ListView): model = Proposicao ordering = ['data_envio'] paginate_by = 10 - permission_required = ('materia.list_proposicao', ) + permission_required = 'materia.detail_proposicao_incorporada' def get_queryset(self): return Proposicao.objects.filter( @@ -472,10 +472,16 @@ class ProposicaoCrud(Crud): class DetailView(Crud.DetailView): layout_key = 'Proposicao' + permission_required = (RP_DETAIL, 'materia.detail_proposicao_enviada', + 'materia.detail_proposicao_devolvida', + 'materia.detail_proposicao_incorporada') def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context['subnav_template_name'] = '' + + context['title'] = '%s (%s)' % ( + self.object, self.object.autor) return context def get(self, request, *args, **kwargs): @@ -535,6 +541,37 @@ class ProposicaoCrud(Crud): return redirect(reverse('sapl.materia:proposicao_detail', kwargs={'pk': kwargs['pk']})) + def dispatch(self, request, *args, **kwargs): + + try: + p = Proposicao.objects.get(id=kwargs['pk']) + except: + raise Http404() + + if not self.has_permission(): + return self.handle_no_permission() + + if p.autor.user != request.user: + if not p.data_envio and not p.data_devolucao: + raise Http404() + + if p.data_devolucao and not request.user.has_perm( + 'materia.detail_proposicao_devolvida'): + raise Http404() + + if p.data_envio and not p.data_recebimento\ + and not request.user.has_perm( + 'materia.detail_proposicao_enviada'): + raise Http404() + + if p.data_envio and p.data_recebimento\ + and not request.user.has_perm( + 'materia.detail_proposicao_incorporada'): + raise Http404() + + return super(PermissionRequiredMixin, self).dispatch( + request, *args, **kwargs) + class DeleteView(BaseLocalMixin, Crud.DeleteView): def _action_is_valid(self, request, *args, **kwargs): diff --git a/sapl/rules/__init__.py b/sapl/rules/__init__.py index 407b77ba1..6c5987c64 100644 --- a/sapl/rules/__init__.py +++ b/sapl/rules/__init__.py @@ -2,6 +2,21 @@ from django.utils.translation import ugettext_lazy as _ default_app_config = 'sapl.rules.apps.AppConfig' +""" +Os cinco radicais de permissão completa são: + + RP_LIST, RP_DETAIL, RP_ADD, RP_CHANGE, RP_DELETE =\ + '.list_', '.detail_', '.add_', '.change_', '.delete_', + +Tanto a app crud quanto a app rules estão sempre ligadas a um model. Ao lidar +com permissões, sempre é analisado se é apenas um radical ou permissão +completa, sendo apenas um radical, a permissão completa é montada com base +no model associado. +""" + +RP_LIST, RP_DETAIL, RP_ADD, RP_CHANGE, RP_DELETE =\ + '.list_', '.detail_', '.add_', '.change_', '.delete_', + SAPL_GROUP_ADMINISTRATIVO = _("Operador Administrativo") SAPL_GROUP_PROTOCOLO = _("Operador de Protocolo Administrativo") diff --git a/sapl/rules/map_rules.py b/sapl/rules/map_rules.py index 6f9a4165f..f5565b372 100644 --- a/sapl/rules/map_rules.py +++ b/sapl/rules/map_rules.py @@ -12,7 +12,9 @@ from sapl.rules import (SAPL_GROUP_ADMINISTRATIVO, SAPL_GROUP_ANONYMOUS, SAPL_GROUP_GERAL, SAPL_GROUP_LOGIN_SOCIAL, SAPL_GROUP_MATERIA, SAPL_GROUP_NORMA, SAPL_GROUP_PAINEL, SAPL_GROUP_PARLAMENTAR, - SAPL_GROUP_PROTOCOLO, SAPL_GROUP_SESSAO) + SAPL_GROUP_PROTOCOLO, SAPL_GROUP_SESSAO, + RP_LIST, RP_DETAIL, RP_ADD, RP_CHANGE, RP_DELETE) + from sapl.sessao import models as sessao """ @@ -42,20 +44,8 @@ arquivo (sapl.rules.map_rules.py) e criar os grupos definidos na regra de negócio trabalham com os cinco radiais de permissão e com qualquer outro tipo de permissão customizada, nesta ordem de precedência. -Os cinco radicais de permissão completa são: - - RP_LIST, RP_DETAIL, RP_ADD, RP_CHANGE, RP_DELETE =\ - '.list_', '.detail_', '.add_', '.change_', '.delete_', - -Tanto a app crud quanto a app rules estão sempre ligadas a um model. Ao lidar -com permissões, sempre é analisado se é apenas um radical ou permissão -completa, sendo apenas um radical, a permissão completa é montada com base -no model associado. """ -RP_LIST, RP_DETAIL, RP_ADD, RP_CHANGE, RP_DELETE =\ - '.list_', '.detail_', '.add_', '.change_', '.delete_', - __base__ = [RP_LIST, RP_DETAIL, RP_ADD, RP_CHANGE, RP_DELETE] __listdetailchange__ = [RP_LIST, RP_DETAIL, RP_CHANGE] @@ -83,7 +73,9 @@ rules_group_protocolo = { (materia.Anexada, __base__), (materia.Autoria, __base__), - (materia.Proposicao, __listdetailchange__), + (materia.Proposicao, ['detail_proposicao_enviada', + 'detail_proposicao_devolvida', + 'detail_proposicao_incorporada']), (compilacao.TextoArticulado, ['view_restricted_textoarticulado']) ] } diff --git a/sapl/templates/materia/prop_devolvidas_list.html b/sapl/templates/materia/prop_devolvidas_list.html index 153c7d778..79c9bd531 100644 --- a/sapl/templates/materia/prop_devolvidas_list.html +++ b/sapl/templates/materia/prop_devolvidas_list.html @@ -14,7 +14,7 @@
    - + @@ -24,12 +24,7 @@ - {% endfor %} diff --git a/sapl/templates/materia/proposicao_detail.html b/sapl/templates/materia/proposicao_detail.html index 2a0f6e6de..61669d168 100644 --- a/sapl/templates/materia/proposicao_detail.html +++ b/sapl/templates/materia/proposicao_detail.html @@ -15,14 +15,16 @@ {% block editions %} {% if object.data_envio %} - {% block editions_actions_return %} -
    - {% trans "Recibo de Envio" %} - {% if not object.data_recebimento %} - {% trans 'Retornar Proposição Enviada' %} - {% endif %} -
    + {% if user == object.autor.user %} + {% block editions_actions_return %} +
    + {% trans "Recibo de Envio" %} + {% if not object.data_recebimento %} + {% trans 'Retornar Proposição Enviada' %} + {% endif %} +
    {% endblock %} + {% endif %} {% else %} From e56215a74e0d9966a2a557ab7b4f9c00e315f8b8 Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Wed, 30 Nov 2016 17:57:12 -0200 Subject: [PATCH 069/139] Muda o backend de mensagens de cookies para session --- sapl/settings.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sapl/settings.py b/sapl/settings.py index cfeefdd0f..3a2212de2 100644 --- a/sapl/settings.py +++ b/sapl/settings.py @@ -32,6 +32,8 @@ SECRET_KEY = config('SECRET_KEY', default='') # SECURITY WARNING: don't run with debug turned on in production! DEBUG = config('DEBUG', default=False, cast=bool) +MESSAGE_STORAGE = 'django.contrib.messages.storage.session.SessionStorage' + ALLOWED_HOSTS = ['*'] LOGIN_REDIRECT_URL = '/' From 89831cd290fdb0c076ce8a97d47a1884b2f04290 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Thu, 1 Dec 2016 10:06:34 -0200 Subject: [PATCH 070/139] =?UTF-8?q?Diversas=20corre=C3=A7=C3=B5es=20m?= =?UTF-8?q?=C3=ADnimas=20em=20proposi=C3=A7=C3=A3o=20e=20protocolo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/materia/forms.py | 7 ++++--- sapl/templates/protocoloadm/comprovante.html | 2 +- sapl/templates/protocoloadm/protocolo_filter.html | 4 +++- sapl/templates/protocoloadm/protocolo_list.html | 8 +++++++- 4 files changed, 15 insertions(+), 6 deletions(-) diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py index 7b3797b81..3517f0ad2 100644 --- a/sapl/materia/forms.py +++ b/sapl/materia/forms.py @@ -1382,19 +1382,19 @@ class ConfirmarProposicaoForm(ProposicaoForm): protocolo.timestamp = datetime.now() protocolo.tipo_protocolo = '1' - # 1 Processo Legislativo - # 0 Processo Administrativo - protocolo.tipo_processo = '1' protocolo.interessado = str(proposicao.autor) protocolo.autor = proposicao.autor + protocolo.assunto_ementa = proposicao.descricao protocolo.numero_paginas = cd['numero_de_paginas'] protocolo.anulado = False if self.instance.tipo.content_type.model_class( ) == TipoMateriaLegislativa: protocolo.tipo_materia = proposicao.tipo.tipo_conteudo_related + protocolo.tipo_processo = '1' elif self.instance.tipo.content_type.model_class() == TipoDocumento: protocolo.tipo_documento = proposicao.tipo.tipo_conteudo_related + protocolo.tipo_processo = '0' protocolo.save() @@ -1403,6 +1403,7 @@ class ConfirmarProposicaoForm(ProposicaoForm): # FIXME qdo protocoloadm estiver homologado, verifique a necessidade # de redirecionamento para o protocolo. + # complete e libere código abaixo para tal. """ self.instance.results['url'] = reverse( diff --git a/sapl/templates/protocoloadm/comprovante.html b/sapl/templates/protocoloadm/comprovante.html index 9fd9b8b32..ef82a1daa 100644 --- a/sapl/templates/protocoloadm/comprovante.html +++ b/sapl/templates/protocoloadm/comprovante.html @@ -59,7 +59,7 @@ - + diff --git a/sapl/templates/protocoloadm/protocolo_filter.html b/sapl/templates/protocoloadm/protocolo_filter.html index a18ea7fb9..820ad300e 100644 --- a/sapl/templates/protocoloadm/protocolo_filter.html +++ b/sapl/templates/protocoloadm/protocolo_filter.html @@ -45,7 +45,9 @@ Interessado: {{ p.interessado }}
    Natureza do Processo: {% if p.tipo_processo == 0 %} Administrativo {% elif p.tipo_processo == 1 %} Matéria Legislativa {% endif %}
    - Classificação: {{ p.tipo_documento|default_if_none:"Não Informado" }}
    + Classificação: + + {{ p.tipo_documento|default_if_none:p.tipo_materia }}
    {% endfor %} diff --git a/sapl/templates/protocoloadm/protocolo_list.html b/sapl/templates/protocoloadm/protocolo_list.html index 73faa9ed7..d5f3b9a8c 100644 --- a/sapl/templates/protocoloadm/protocolo_list.html +++ b/sapl/templates/protocoloadm/protocolo_list.html @@ -28,7 +28,13 @@ {% elif p.tipo_processo == 1 %} Matéria Legislativa {% endif %}
    - Classificação: {{ p.tipo_documento }}
    + Classificação: + {% if p.tipo_processo == 0 %} + {{ p.tipo_documento }}
    + {% elif p.tipo_processo == 1 %} + {{ p.tipo_materia }}
    + {% endif %}
    +

    From 40b3984d54d1aa0b36bdd090aa4f08121e6cb398 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rog=C3=A9rio=20Fr=C3=A1?= Date: Thu, 1 Dec 2016 11:04:07 -0200 Subject: [PATCH 071/139] Update gunicorn_start.sh --- gunicorn_start.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gunicorn_start.sh b/gunicorn_start.sh index f68613c26..904d76a3a 100755 --- a/gunicorn_start.sh +++ b/gunicorn_start.sh @@ -3,8 +3,8 @@ # As seen in http://tutos.readthedocs.org/en/latest/source/ndg.html NAME="SAPL" # Name of the application (*) -DJANGODIR=/home/sapl31/sapl # Django project directory (*) -SOCKFILE=/home/sapl31/sapl/run/gunicorn.sock # we will communicate using this unix socket (*) +DJANGODIR=/var/interlegis/sapl # Django project directory (*) +SOCKFILE=/var/interlegis/sapl/run/gunicorn.sock # we will communicate using this unix socket (*) USER=`whoami` # the user to run as (*) GROUP=`whoami` # the group to run as (*) NUM_WORKERS=9 # how many worker processes should Gunicorn spawn (*) @@ -16,7 +16,7 @@ echo "Starting $NAME as `whoami`" # Activate the virtual environment cd $DJANGODIR -source ~/.virtualenvs/sapl/bin/activate +source /var/interlegis/.virtualenvs/sapl/bin/activate export DJANGO_SETTINGS_MODULE=$DJANGO_SETTINGS_MODULE export PYTHONPATH=$DJANGODIR:$PYTHONPATH From 14f90392c7dabf2238c194b3e3df59dc05860865 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rog=C3=A9rio=20Fr=C3=A1?= Date: Thu, 1 Dec 2016 11:27:40 -0200 Subject: [PATCH 072/139] Update deploy.rst --- docs/deploy.rst | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/deploy.rst b/docs/deploy.rst index a8d49fa8b..19c13bbf9 100644 --- a/docs/deploy.rst +++ b/docs/deploy.rst @@ -9,7 +9,7 @@ O NGINX é o servidor WEB, e o GUNICORN é o servidor da aplicação para o serv Instalar o NGINX:: - sudo pip install nginx + sudo apt-get install nginx Instalar o Gunicorn:: @@ -19,10 +19,10 @@ Instalar o Gunicorn:: Preparando o NGINX ------------------ -vi /etc/nginx/sites-available/sapl31:: +sudo nano /etc/nginx/sites-available/sapl31.conf:: upstream ENDERECO_SITE { - server unix:~/sapl/run/gunicorn.sock fail_timeout=0; + server unix:/var/interlegis/sapl/run/gunicorn.sock fail_timeout=0; } server { @@ -36,11 +36,11 @@ vi /etc/nginx/sites-available/sapl31:: error_log /var/log/nginx-error.log; location /static/ { - alias ~/sapl/collected_static/; + alias /var/interlegis/sapl/collected_static/; } location /media/ { - alias ~/sapl/media/; + alias /var/interlegis/sapl/media/; } location / { @@ -56,32 +56,32 @@ vi /etc/nginx/sites-available/sapl31:: # Error pages error_page 500 502 503 504 /500.html; location = /500.html { - root ~/sapl/sapl/static/; + root /var/interlegis/sapl/sapl/static/; } } Criar link simbólico para ativar o site:: - sudo ln -s /etc/nginx/sites-available/sapl3.conf /etc/nginx/sites-enabled/sapl3 + sudo ln -s /etc/nginx/sites-available/sapl31.conf /etc/nginx/sites-enabled/sapl3 +Reiniciar o nginx + + sudo service nginx restart Preparando o Gunicorn --------------------- Na raiz do Projeto sapl, existe o arquivo chamado gunicorn_start.sh -onde ~/ devem ser alterados pelos caminhos correspondentes. Para definir o parametro NUM_WORKERS utilize a seguinte fórmula: 2 * CPUs 1. Para uma máquina de CPU única o valor seria 3 -Para dar Permissão de execução para o script:: - - chmod ux bin/gunicorn_start Para rodar o gunicorn:: + workon sapl - ./~/.gunicorn_start.sh + /var/interlegis/sapl/.gunicorn_start.sh From 142e70ac07ca31028da1f3cbbff22e75c510d7c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rog=C3=A9rio=20Fr=C3=A1?= Date: Thu, 1 Dec 2016 09:32:12 -0200 Subject: [PATCH 073/139] Create instacao31.rst --- docs/instacao31.rst | 201 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 201 insertions(+) create mode 100644 docs/instacao31.rst diff --git a/docs/instacao31.rst b/docs/instacao31.rst new file mode 100644 index 000000000..3b6d09295 --- /dev/null +++ b/docs/instacao31.rst @@ -0,0 +1,201 @@ +Instalação do Ambiente de Desenvolvimento +========================================= + +* Procedimento testado nos seguintes SO's: + + * `Ubuntu 16.04 64bits `_; + +* Para esta instalação foi utilizado o usuário de sistema sapl31 + + +Atualizar o sistema +------------------- + + sudo apt-get update + sudo apt-get upgrade + + + +Instalar as seguintes dependências do sistema:: +---------------------------------------------------------------------------------------- + +* :: + + sudo apt-get install git python3-dev libpq-dev graphviz-dev graphviz \ + 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 + + sudo -i + curl -sL https://deb.nodesource.com/setup_5.x | bash - + exit + sudo apt-get install nodejs + + sudo npm install npm -g + sudo npm install -g bower + +Instalar o virtualenv usando python 3 para o projeto. +----------------------------------------------------- + +* Para usar `virtualenvwrapper `_, instale com:: + + sudo pip3 install virtualenvwrapper + + sudo mkdir -p /var/interlegis/.virtualenvs + +* Ajustar as permissões - onde sapl31 trocar por usuario + sudo chown -R sapl31:sapl31 /var/interlegis/ + + +* Edite o arquivo ``.bashrc`` e adicione ao seu final as configurações abaixo para o virtualenvwrapper:: + + nano /home/sapl31/.bashrc + + export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3 + export WORKON_HOME=/var/interlegis/.virtualenvs + export PROJECT_HOME=/var/interlegis + source /usr/local/bin/virtualenvwrapper.sh + +* Carregue as configurações do virtualenvwrapper. + source /home/sapl31/.bashrc + +Clonar o projeto do github, ou fazer um fork e depois clonar +------------------------------------------------------------ + +* Para apenas clonar do repositório do Interlegis:: + + cd /var/interlegis + git clone git://github.com/interlegis/sapl + +* Para fazer um fork e depois clonar, siga as instruções em https://help.github.com/articles/fork-a-repo que basicamente são: + + * Criar uma conta no github - é gratuíto. + * Acessar https://github.com/interlegis/sapl e clicar em **Fork**. + + Será criado um domínio pelo qual será possível **clonar, corrigir, customizar, melhorar, contribuir, etc**:: + + cd /var/interlegis + git clone git://github.com/[SEU NOME]/sapl + +* As configurações e instruções de uso para o git estão espalhadas pela internet e possui muito coisa bacana. As tarefas básicas de git e suas interações com github são tranquilas de se aprender. + + +Criar o ambiente virtual de desenvolvimento para o SAPL +------------------------------------------------------- +* :: + + mkvirtualenv sapl -a /var/interlegis/sapl -p /usr/bin/python3 + +Instalação e configuração das dependências do projeto +----------------------------------------------------- + +* **Acesse o terminal e entre no virtualenv**:: + + workon sapl + +* **Instalar dependências python**:: + + pip install -r /var/interlegis/sapl/requirements/dev-requirements.txt + +* **Configurar Postgresql**: + +sudo -u postgres psql -c "CREATE ROLE sapl LOGIN ENCRYPTED PASSWORD 'sapl' NOSUPERUSER INHERIT CREATEDB NOCREATEROLE NOREPLICATION;" +sudo -u postgres psql -c "ALTER ROLE sapl VALID UNTIL 'infinity';" +sudo -u postgres psql -c "CREATE DATABASE sapl WITH OWNER = sapl ENCODING = 'UTF8' TABLESPACE = pg_default LC_COLLATE = 'pt_BR.UTF-8' LC_CTYPE = 'pt_BR.UTF-8' CONNECTION LIMIT = -1;" + + * Se você possui uma cópia da base de dados do SAPL, essa é a hora para restaurá-la. + * Obs: no ambiente de desenvolvimento, a role deve ter permissão para criar outro banco. Isso é usado pelos testes automatizados. + * (caso você já possua uma instalação do postrgresql anterior ao processo de instalação do ambiente de desenvolvimento do SAPL em sua máquina e sábia como fazer, esteja livre para proceder como desejar, porém, ao configurar o arquivo ``.env`` no próximo passo, as mesmas definições deverão ser usadas) + +* **Configurar arquivo .env**: + + * Criação da `SECRET_KEY `_: + + É necessário criar um projeto fake para extrair uma chave SECRET_KEY:: + + mkdir /var/interlegis/temp + cd /var/interlegis/temp + + django-admin startproject sapl_temp + + grep SECRET_KEY sapl_temp/sapl_temp/settings.py + + Copie a linha que aparecerá, volte para a pasta do projeto SAPL e apague sua pasta temporária:: + + cd /var/interlegis/ + rm -R /var/interlegis/temp + +* Ajustar as permissões - onde sapl31 trocar por usuario + sudo chown -R sapl31:sapl31 /var/interlegis/ + + * Criar o arquivo ``.env`` dentro da pasta ~/Envs/sapl/sapl/.env:: + +DATABASE_URL = postgresql://USER:PASSWORD@HOST:PORT/NAME + SECRET_KEY = Gere alguma chave e coloque aqui + DEBUG = [True/False] + EMAIL_USE_TLS = [True/False] + EMAIL_PORT = [Insira este parâmetro] + EMAIL_HOST = [Insira este parâmetro] + EMAIL_HOST_USER = [Insira este parâmetro] + EMAIL_HOST_PASSWORD = [Insira este parâmetro] + + * Uma configuração mínima para atender os procedimentos acima seria:: + + nano /var/interlegis/sapl/sapl/.env + + DATABASE_URL = postgresql://sapl:sapl@localhost:5432/sapl + SECRET_KEY = 'Substitua esta linha pela copiada acima' + DEBUG = True + EMAIL_USE_TLS = True + EMAIL_PORT = 587 + EMAIL_HOST = + EMAIL_HOST_USER = + EMAIL_HOST_PASSWORD = + + +cd /var/interlegis/sapl + +* Instalar as dependências do ``bower``:: + + ./manage.py bower install + +* Atualizar e/ou criar as tabelas da base de dados para refletir o modelo da versão clonada:: + + ./manage.py migrate + +* Atualizar arquivos estáticos:: + + ./manage.py collectstatic --noinput + +* Subir o servidor do django:: + + ./manage.py runserver 0.0.0.0:8001 + +* Acesse o SAPL em:: + + http://localhost:8000/ + +Instruções para criação do super usuário e de usuários de testes +=========================================================================== + +* Criar super usuário do django-contrib-admin (Será solicitado alguns dados para criação):: + + ./manage.py createsuperuser + +* `Os perfis semânticos do SAPL `_ são fixos e atualizados a cada execução do comando:: + + ./manage.py migrate + +* Os perfis fixos não aceitam customização via admin, porém outros grupos podem ser criados. O SAPL não interferirá no conjunto de permissões definidas em grupos customizados e se comportará diante de usuários segundo seus grupos e suas permissões. + +* Os usuários de testes de perfil são criados apenas se o SAPL estiver rodando em modo DEBUG=True. Todos com senha "interlegis", serão:: + + operador_administrativo + operador_protocoloadm + operador_comissoes + operador_materia + operador_norma + operador_sessao + operador_painel + operador_geral From c7d07235a57db8bf62ce87388a9f53010d794386 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rog=C3=A9rio=20Fr=C3=A1?= Date: Thu, 1 Dec 2016 10:03:44 -0200 Subject: [PATCH 074/139] Update instacao31.rst --- docs/instacao31.rst | 45 +++++++++++++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 16 deletions(-) diff --git a/docs/instacao31.rst b/docs/instacao31.rst index 3b6d09295..0dee5bd9a 100644 --- a/docs/instacao31.rst +++ b/docs/instacao31.rst @@ -8,10 +8,13 @@ Instalação do Ambiente de Desenvolvimento * Para esta instalação foi utilizado o usuário de sistema sapl31 -Atualizar o sistema +Atualizar o sistema:: ------------------- +* :: + sudo apt-get update + sudo apt-get upgrade @@ -44,7 +47,8 @@ Instalar o virtualenv usando python 3 para o projeto. sudo mkdir -p /var/interlegis/.virtualenvs -* Ajustar as permissões - onde sapl31 trocar por usuario +* Ajustar as permissões - onde sapl31 trocar por usuario:: + sudo chown -R sapl31:sapl31 /var/interlegis/ @@ -57,9 +61,13 @@ Instalar o virtualenv usando python 3 para o projeto. export PROJECT_HOME=/var/interlegis source /usr/local/bin/virtualenvwrapper.sh -* Carregue as configurações do virtualenvwrapper. + +* Carregue as configurações do virtualenvwrapper:: + source /home/sapl31/.bashrc + + Clonar o projeto do github, ou fazer um fork e depois clonar ------------------------------------------------------------ @@ -98,21 +106,25 @@ Instalação e configuração das dependências do projeto pip install -r /var/interlegis/sapl/requirements/dev-requirements.txt -* **Configurar Postgresql**: +* **Configurar Postgresql**:: -sudo -u postgres psql -c "CREATE ROLE sapl LOGIN ENCRYPTED PASSWORD 'sapl' NOSUPERUSER INHERIT CREATEDB NOCREATEROLE NOREPLICATION;" -sudo -u postgres psql -c "ALTER ROLE sapl VALID UNTIL 'infinity';" -sudo -u postgres psql -c "CREATE DATABASE sapl WITH OWNER = sapl ENCODING = 'UTF8' TABLESPACE = pg_default LC_COLLATE = 'pt_BR.UTF-8' LC_CTYPE = 'pt_BR.UTF-8' CONNECTION LIMIT = -1;" + sudo -u postgres psql -c "CREATE ROLE sapl LOGIN ENCRYPTED PASSWORD 'sapl' NOSUPERUSER INHERIT CREATEDB NOCREATEROLE NOREPLICATION;" + + sudo -u postgres psql -c "ALTER ROLE sapl VALID UNTIL 'infinity';" + + sudo -u postgres psql -c "CREATE DATABASE sapl WITH OWNER = sapl ENCODING = 'UTF8' TABLESPACE = pg_default LC_COLLATE = 'pt_BR.UTF-8' LC_CTYPE = 'pt_BR.UTF-8' CONNECTION LIMIT = -1;" * Se você possui uma cópia da base de dados do SAPL, essa é a hora para restaurá-la. * Obs: no ambiente de desenvolvimento, a role deve ter permissão para criar outro banco. Isso é usado pelos testes automatizados. * (caso você já possua uma instalação do postrgresql anterior ao processo de instalação do ambiente de desenvolvimento do SAPL em sua máquina e sábia como fazer, esteja livre para proceder como desejar, porém, ao configurar o arquivo ``.env`` no próximo passo, as mesmas definições deverão ser usadas) -* **Configurar arquivo .env**: + + + *Configurar arquivo .env - * Criação da `SECRET_KEY `_: + Criação da `SECRET_KEY `_: - É necessário criar um projeto fake para extrair uma chave SECRET_KEY:: +* **É necessário criar um projeto fake para extrair uma chave SECRET_KEY**:: mkdir /var/interlegis/temp cd /var/interlegis/temp @@ -126,12 +138,15 @@ sudo -u postgres psql -c "CREATE DATABASE sapl WITH OWNER = sapl ENCODING = 'UTF cd /var/interlegis/ rm -R /var/interlegis/temp -* Ajustar as permissões - onde sapl31 trocar por usuario +* **Ajustar as permissões - onde sapl31 trocar por usuario**:: + sudo chown -R sapl31:sapl31 /var/interlegis/ - * Criar o arquivo ``.env`` dentro da pasta ~/Envs/sapl/sapl/.env:: +* **Criar o arquivo ``.env`` dentro da pasta /var/interlegis/sapl/sapl/.env**:: + + nano /var/interlegis/sapl/sapl/.env -DATABASE_URL = postgresql://USER:PASSWORD@HOST:PORT/NAME + DATABASE_URL = postgresql://USER:PASSWORD@HOST:PORT/NAME SECRET_KEY = Gere alguma chave e coloque aqui DEBUG = [True/False] EMAIL_USE_TLS = [True/False] @@ -141,9 +156,7 @@ DATABASE_URL = postgresql://USER:PASSWORD@HOST:PORT/NAME EMAIL_HOST_PASSWORD = [Insira este parâmetro] * Uma configuração mínima para atender os procedimentos acima seria:: - - nano /var/interlegis/sapl/sapl/.env - + DATABASE_URL = postgresql://sapl:sapl@localhost:5432/sapl SECRET_KEY = 'Substitua esta linha pela copiada acima' DEBUG = True From 4010fe48d284750555cf38517d86a617fcfb4ade Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rog=C3=A9rio=20Fr=C3=A1?= Date: Thu, 1 Dec 2016 13:21:58 -0200 Subject: [PATCH 075/139] Update instacao31.rst --- docs/instacao31.rst | 50 ++++++++++++++++++++++----------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/docs/instacao31.rst b/docs/instacao31.rst index 0dee5bd9a..b9457c5b0 100644 --- a/docs/instacao31.rst +++ b/docs/instacao31.rst @@ -9,13 +9,13 @@ Instalação do Ambiente de Desenvolvimento Atualizar o sistema:: -------------------- +---------------------- -* :: + :: - sudo apt-get update + sudo apt-get update - sudo apt-get upgrade + sudo apt-get upgrade @@ -118,29 +118,18 @@ Instalação e configuração das dependências do projeto * Obs: no ambiente de desenvolvimento, a role deve ter permissão para criar outro banco. Isso é usado pelos testes automatizados. * (caso você já possua uma instalação do postrgresql anterior ao processo de instalação do ambiente de desenvolvimento do SAPL em sua máquina e sábia como fazer, esteja livre para proceder como desejar, porém, ao configurar o arquivo ``.env`` no próximo passo, as mesmas definições deverão ser usadas) - - - *Configurar arquivo .env - Criação da `SECRET_KEY `_: - -* **É necessário criar um projeto fake para extrair uma chave SECRET_KEY**:: +* **Ajustar as permissões - onde sapl31 trocar por usuario**:: + + sudo chown -R sapl31:sapl31 /var/interlegis/ - mkdir /var/interlegis/temp - cd /var/interlegis/temp - django-admin startproject sapl_temp - grep SECRET_KEY sapl_temp/sapl_temp/settings.py +* **Configurar arquivo .env**:: + + +Criação da `SECRET_KEY `_: - Copie a linha que aparecerá, volte para a pasta do projeto SAPL e apague sua pasta temporária:: - - cd /var/interlegis/ - rm -R /var/interlegis/temp - -* **Ajustar as permissões - onde sapl31 trocar por usuario**:: - - sudo chown -R sapl31:sapl31 /var/interlegis/ * **Criar o arquivo ``.env`` dentro da pasta /var/interlegis/sapl/sapl/.env**:: @@ -158,7 +147,7 @@ Instalação e configuração das dependências do projeto * Uma configuração mínima para atender os procedimentos acima seria:: DATABASE_URL = postgresql://sapl:sapl@localhost:5432/sapl - SECRET_KEY = 'Substitua esta linha pela copiada acima' + SECRET_KEY = 'cole aqui entre as aspas simples a chave gerada pelo comando abaixo' DEBUG = True EMAIL_USE_TLS = True EMAIL_PORT = 587 @@ -167,7 +156,18 @@ Instalação e configuração das dependências do projeto EMAIL_HOST_PASSWORD = -cd /var/interlegis/sapl + +Rodar o comando abaixo, um detalhe importante, esse comando só funciona com o django extensions, mas ele já está presente no arquivo requirements/requirements.txt desse projeto:: + + python manage.py generate_secret_key + +Copie a chave que aparecerá, edite o arquivo .env e altere o valor do parâmetro SECRET_KEY. + + +* Posicionar-se no diretorio do Projeto:: + + cd /var/interlegis/sapl + * Instalar as dependências do ``bower``:: @@ -187,7 +187,7 @@ cd /var/interlegis/sapl * Acesse o SAPL em:: - http://localhost:8000/ + http://localhost:8001/ Instruções para criação do super usuário e de usuários de testes =========================================================================== From 81683a4def8868242a96154983fd801204d81ed6 Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Thu, 1 Dec 2016 17:21:08 -0200 Subject: [PATCH 076/139] =?UTF-8?q?Ajusta=20simple=5Fgunicorn.sh=20para=20?= =?UTF-8?q?novo=20padr=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- simple_gunicorn.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/simple_gunicorn.sh b/simple_gunicorn.sh index 673ff526f..970e67a04 100755 --- a/simple_gunicorn.sh +++ b/simple_gunicorn.sh @@ -1,9 +1,9 @@ -DJANGODIR=/home/sapl31/sapl # Django project directory (*) +DJANGODIR=/var/interlegis/sapl # Django project directory (*) DJANGO_SETTINGS_MODULE=sapl.settings # which settings file should Django use (*) DJANGO_WSGI_MODULE=sapl.wsgi # WSGI module name (*) cd $DJANGODIR -source ~/.virtualenvs/sapl/bin/activate +source /var/interlegis/.virtualenvs/sapl/bin/activate export DJANGO_SETTINGS_MODULE=$DJANGO_SETTINGS_MODULE export PYTHONPATH=$DJANGODIR:$PYTHONPATH From 1736e9d56d3c28360e337f9f94e21400da2eb1a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rog=C3=A9rio=20Fr=C3=A1?= Date: Thu, 1 Dec 2016 15:46:48 -0200 Subject: [PATCH 077/139] Update README.rst --- README.rst | 197 +---------------------------------------------------- 1 file changed, 1 insertion(+), 196 deletions(-) diff --git a/README.rst b/README.rst index e10b3b254..5ffdda86f 100644 --- a/README.rst +++ b/README.rst @@ -17,206 +17,11 @@ atual do sistema (2.5), visite a página do `projeto na Interlegis wiki `_; - - * edite e incremente outros, ou ainda, crie outros readme's dentro do projeto para outros SO's e adicione o link aqui. - -Instalar as seguintes dependências do sistema:: ----------------------------------------------------------------------------------------- - -* :: - - sudo apt-get install git python3-dev libpq-dev graphviz-dev graphviz \ - 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 - - sudo -i - curl -sL https://deb.nodesource.com/setup_5.x | bash - - exit - sudo apt-get install nodejs - - sudo npm install npm -g - sudo npm install -g bower - -Instalar o virtualenv usando python 3 para o projeto. ------------------------------------------------------ - -* Para usar `virtualenvwrapper `_, instale com:: - - sudo pip install virtualenvwrapper - - mkdir ~/Envs - -* Edite o arquivo ``.bashrc`` e adicione ao seu final as configurações abaixo para o virtualenvwrapper:: - - export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3 - export WORKON_HOME=$HOME/.virtualenvs - export PROJECT_HOME=$HOME/Envs - source /usr/local/bin/virtualenvwrapper.sh - -* Saia do terminal e entre novamente para que as configurações do virtualenvwrapper sejam carregadas. - -Clonar o projeto do github, ou fazer um fork e depois clonar ------------------------------------------------------------- - -* Para apenas clonar do repositório do Interlegis:: - - cd ~/Envs - git clone git://github.com/interlegis/sapl - -* Para fazer um fork e depois clonar, siga as instruções em https://help.github.com/articles/fork-a-repo que basicamente são: - - * Criar uma conta no github - é gratuíto. - * Acessar https://github.com/interlegis/sapl e clicar em **Fork**. - - Será criado um domínio pelo qual será possível **clonar, corrigir, customizar, melhorar, contribuir, etc**:: - - cd ~/Envs - git clone git://github.com/[SEU NOME]/sapl - -* As configurações e instruções de uso para o git estão espalhadas pela internet e possui muito coisa bacana. As tarefas básicas de git e suas interações com github são tranquilas de se aprender. - - -Criar o ambiente virtual de desenvolvimento para o SAPL -------------------------------------------------------- -* :: - - mkvirtualenv sapl -a $HOME/Envs/sapl -p /usr/bin/python3 - -Instalação e configuração das dependências do projeto ------------------------------------------------------ - -* **Acesse o terminal e entre no virtualenv**:: - - workon sapl - -* **Instalar dependências python**:: - - pip install -r requirements/dev-requirements.txt - -* **Configurar Postgresql**: - - * Acessar Postrgresql para criar o banco ``sapl`` com a role ``sapl``:: - - sudo su - postgres - psql - - CREATE ROLE sapl LOGIN - ENCRYPTED PASSWORD 'sapl' - NOSUPERUSER INHERIT CREATEDB NOCREATEROLE NOREPLICATION; - - ALTER ROLE sapl VALID UNTIL 'infinity'; - - CREATE DATABASE sapl - WITH OWNER = sapl - ENCODING = 'UTF8' - TABLESPACE = pg_default - LC_COLLATE = 'pt_BR.UTF-8' - LC_CTYPE = 'pt_BR.UTF-8' - CONNECTION LIMIT = -1; - - \q - exit - - * Se você possui uma cópia da base de dados do SAPL, essa é a hora para restaurá-la. - * Obs: no ambiente de desenvolvimento, a role deve ter permissão para criar outro banco. Isso é usado pelos testes automatizados. - * (caso você já possua uma instalação do postrgresql anterior ao processo de instalação do ambiente de desenvolvimento do SAPL em sua máquina e sábia como fazer, esteja livre para proceder como desejar, porém, ao configurar o arquivo ``.env`` no próximo passo, as mesmas definições deverão ser usadas) - -* **Configurar arquivo .env**: - - * Criação da `SECRET_KEY `_: - - É necessário criar um projeto fake para extrair uma chave SECRET_KEY:: - - mkdir ~/Envs/temp - cd ~/Envs/temp - - django-admin startproject sapl_temp - - grep SECRET_KEY sapl_temp/sapl_temp/settings.py - - Copie a linha que aparecerá, volte para a pasta do projeto SAPL e apague sua pasta temporária:: - - cd ~/Envs/sapl - rm -R ~/Envs/temp - - * Criar o arquivo ``.env`` dentro da pasta ~/Envs/sapl/sapl/.env:: - - DATABASE_URL = postgresql://USER:PASSWORD@HOST:PORT/NAME - SECRET_KEY = Gere alguma chave e coloque aqui - DEBUG = [True/False] - EMAIL_USE_TLS = [True/False] - EMAIL_PORT = [Insira este parâmetro] - EMAIL_HOST = [Insira este parâmetro] - EMAIL_HOST_USER = [Insira este parâmetro] - EMAIL_HOST_PASSWORD = [Insira este parâmetro] - - * Uma configuração mínima para atender os procedimentos acima seria:: - - DATABASE_URL = postgresql://sapl:sapl@localhost:5432/sapl - SECRET_KEY = 'Substitua esta linha pela copiada acima' - DEBUG = True - EMAIL_USE_TLS = True - EMAIL_PORT = 587 - EMAIL_HOST = - EMAIL_HOST_USER = - EMAIL_HOST_PASSWORD = - - - -* Instalar as dependências do ``bower``:: - - ./manage.py bower install - -* Atualizar e/ou criar as tabelas da base de dados para refletir o modelo da versão clonada:: - - ./manage.py migrate - -* Atualizar arquivos estáticos:: - - ./manage.py collectstatic --noinput - -* Subir o servidor do django:: - - ./manage.py runserver - -* Acesse o SAPL em:: - - http://localhost:8000/ - -Instruções para criação do super usuário e de usuários de testes -=========================================================================== - -* Criar super usuário do django-contrib-admin (Será solicitado alguns dados para criação):: - - ./manage.py createsuperuser - -* `Os perfis semânticos do SAPL `_ são fixos e atualizados a cada execução do comando:: - - ./manage.py migrate - -* Os perfis fixos não aceitam customização via admin, porém outros grupos podem ser criados. O SAPL não interferirá no conjunto de permissões definidas em grupos customizados e se comportará diante de usuários segundo seus grupos e suas permissões. - -* Os usuários de testes de perfil são criados apenas se o SAPL estiver rodando em modo DEBUG=True. Todos com senha "interlegis", serão:: - - operador_administrativo - operador_protocoloadm - operador_comissoes - operador_materia - operador_norma - operador_sessao - operador_painel - operador_geral + `Instalação do Ambiente de Desenvolvimento `_ Instruções para Importação da base mysql 2.5 ============================================ - `Importação da Base do SAPL 2.5 para SAPL 3.1 `_ From 52461126fe388e32fda841bd8949f327d55dabef Mon Sep 17 00:00:00 2001 From: Eduardo Edson Batista Cordeiro Alves Date: Wed, 30 Nov 2016 12:00:49 -0200 Subject: [PATCH 078/139] Fix __max --- sapl/protocoloadm/views.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/sapl/protocoloadm/views.py b/sapl/protocoloadm/views.py index e45c943b4..d217005c2 100644 --- a/sapl/protocoloadm/views.py +++ b/sapl/protocoloadm/views.py @@ -220,12 +220,9 @@ class ProtocoloDocumentoView(PermissionRequiredMixin, elif numeracao == 'U': numero = Protocolo.objects.all().aggregate(Max('numero')) - if numero['numero__max'] is None: - numero['numero__max'] = 0 - f.tipo_processo = '0' # TODO validar o significado f.anulado = False - f.numero = numero['numero__max'] + 1 + f.numero = (numero['numero__max'] + 1) if numero__max else 1 f.ano = datetime.now().year f.data = datetime.now().strftime('%Y-%m-%d') f.hora = datetime.now().strftime('%H:%M') @@ -356,7 +353,7 @@ class ProtocoloMateriaView(PermissionRequiredMixin, CreateView): protocolo = Protocolo() - protocolo.numero = numero['numero__max'] + 1 + protocolo.numero = (numero['numero__max'] + 1) if numero__max else 1 protocolo.ano = datetime.now().year protocolo.data = datetime.now().strftime("%Y-%m-%d") protocolo.hora = datetime.now().strftime("%H:%M") From 877a2a33e7d0a9a84ce74dc89c362a0f477fde5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rog=C3=A9rio=20Fr=C3=A1?= Date: Wed, 30 Nov 2016 13:34:27 -0200 Subject: [PATCH 079/139] Update materialegislativa_filter.html --- sapl/templates/materia/materialegislativa_filter.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sapl/templates/materia/materialegislativa_filter.html b/sapl/templates/materia/materialegislativa_filter.html index cc6b3418b..8452383e2 100644 --- a/sapl/templates/materia/materialegislativa_filter.html +++ b/sapl/templates/materia/materialegislativa_filter.html @@ -48,7 +48,7 @@ Localização Atual:  {{m.tramitacao_set.last.unidade_tramitacao_destino|default_if_none:"Não Informada"}}
    Status:  {{m.tramitacao_set.last.status|default_if_none:"Não Informada"}}
    {% if m.registrovotacao_set.exists %} - Data Votação: + Data da última Votação: {% if m.registrovotacao_set.last.ordem %} {{ m.registrovotacao_set.last.ordem.data_ordem }} From 0258044977e99bcc9c17fb014600fe25e1ecb74f Mon Sep 17 00:00:00 2001 From: Leandro Roberto da Silva Date: Wed, 30 Nov 2016 14:26:21 -0200 Subject: [PATCH 080/139] Cust. crispy_layout para render. de related_name MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Nos layouts (layouts.yaml) pode-se criar layouts específicos para renderização de related_names. Veja exemplo de MateriaLegislativaDetail que renderiza numeracao_set --- sapl/crispy_layout_mixin.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/sapl/crispy_layout_mixin.py b/sapl/crispy_layout_mixin.py index 028301502..555a04f19 100644 --- a/sapl/crispy_layout_mixin.py +++ b/sapl/crispy_layout_mixin.py @@ -61,8 +61,12 @@ def get_field_display(obj, fieldname): try: field = obj._meta.get_field(fieldname) except: - value = getattr(obj, fieldname) - return '', str(value) + field = getattr(obj, fieldname) + if 'ManyRelatedManager' not in str(type(field))\ + and 'RelatedManager' not in str(type(field))\ + and 'GenericRelatedObjectManager' not in str(type(field)): + return '', str(field) + verbose_name = str(field.verbose_name)\ if hasattr(field, 'verbose_name') else '' if hasattr(field, 'choices') and field.choices: @@ -98,7 +102,11 @@ def get_field_display(obj, fieldname): display += '
  • %s
  • ' % str(v) display += '' if not verbose_name: - verbose_name = str(field.related_model._meta.verbose_name_plural) + if hasattr(field, 'related_model'): + verbose_name = str( + field.related_model._meta.verbose_name_plural) + elif hasattr(field, 'model'): + verbose_name = str(field.model._meta.verbose_name_plural) else: display = str(value) return verbose_name, display From 29c13bf9d4bb20ba24136681383675153fdf0a1c Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Wed, 30 Nov 2016 14:43:49 -0200 Subject: [PATCH 081/139] HOT-FIX: conserta numero__max__ --- sapl/protocoloadm/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sapl/protocoloadm/views.py b/sapl/protocoloadm/views.py index d217005c2..37c4608f8 100644 --- a/sapl/protocoloadm/views.py +++ b/sapl/protocoloadm/views.py @@ -222,7 +222,7 @@ class ProtocoloDocumentoView(PermissionRequiredMixin, f.tipo_processo = '0' # TODO validar o significado f.anulado = False - f.numero = (numero['numero__max'] + 1) if numero__max else 1 + f.numero = (numero['numero__max'] + 1) if numero else 1 f.ano = datetime.now().year f.data = datetime.now().strftime('%Y-%m-%d') f.hora = datetime.now().strftime('%H:%M') From 9e7abab34ec9d2329ae7157f2ef3bd46041edec8 Mon Sep 17 00:00:00 2001 From: Leandro Roberto da Silva Date: Wed, 30 Nov 2016 15:07:45 -0200 Subject: [PATCH 082/139] corrige numero__max --- sapl/protocoloadm/views.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sapl/protocoloadm/views.py b/sapl/protocoloadm/views.py index 37c4608f8..a97d3d758 100644 --- a/sapl/protocoloadm/views.py +++ b/sapl/protocoloadm/views.py @@ -222,7 +222,7 @@ class ProtocoloDocumentoView(PermissionRequiredMixin, f.tipo_processo = '0' # TODO validar o significado f.anulado = False - f.numero = (numero['numero__max'] + 1) if numero else 1 + f.numero = (numero['numero__max'] + 1) if numero['numero__max'] else 1 f.ano = datetime.now().year f.data = datetime.now().strftime('%Y-%m-%d') f.hora = datetime.now().strftime('%H:%M') @@ -353,7 +353,7 @@ class ProtocoloMateriaView(PermissionRequiredMixin, CreateView): protocolo = Protocolo() - protocolo.numero = (numero['numero__max'] + 1) if numero__max else 1 + protocolo.numero = (numero['numero__max'] + 1) if numero['numero__max'] else 1 protocolo.ano = datetime.now().year protocolo.data = datetime.now().strftime("%Y-%m-%d") protocolo.hora = datetime.now().strftime("%H:%M") From 4b733be859d6050275ba7ec234c6204965a89e47 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Wed, 30 Nov 2016 16:20:28 -0200 Subject: [PATCH 083/139] =?UTF-8?q?Ref=20list=20de=20prop=20nao=20recebida?= =?UTF-8?q?s/n=C3=A3o=20incorp/incorp.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/crud/base.py | 14 ++++-- .../migrations/0071_auto_20161130_1001.py | 19 ++++++++ .../migrations/0072_auto_20161130_1618.py | 19 ++++++++ sapl/materia/models.py | 8 ++++ sapl/materia/views.py | 43 +++++++++++++++++-- sapl/rules/__init__.py | 15 +++++++ sapl/rules/map_rules.py | 20 +++------ .../materia/prop_devolvidas_list.html | 9 +--- sapl/templates/materia/proposicao_detail.html | 16 ++++--- 9 files changed, 128 insertions(+), 35 deletions(-) create mode 100644 sapl/materia/migrations/0071_auto_20161130_1001.py create mode 100644 sapl/materia/migrations/0072_auto_20161130_1618.py diff --git a/sapl/crud/base.py b/sapl/crud/base.py index cc84c7b4e..7c39850bf 100644 --- a/sapl/crud/base.py +++ b/sapl/crud/base.py @@ -180,7 +180,15 @@ class PermissionRequiredContainerCrudMixin(PermissionRequiredMixin): perms = self.get_permission_required() # Torna a view pública se não possuir conteudo # no atributo permission_required - return self.request.user.has_perms(perms) if len(perms) else True + if not len(perms): + return True + + for perm in perms: + if self.request.user.has_perm(perm): + return True + return False + + # return self.request.user.has_perms(perms) if len(perms) else True def dispatch(self, request, *args, **kwargs): if not self.has_permission(): @@ -257,9 +265,7 @@ class CrudBaseMixin(CrispyLayoutFormMixin): self.permission_required = list( set(self.permission_required) - set(obj.public)) else: - obj.public = list( - set(self.permission_required) - - set((RP_LIST, RP_DETAIL, RP_ADD, RP_CHANGE, RP_DELETE))) + obj.public = [] self.permission_required = tuple(( self.permission(pr) for pr in self.permission_required)) diff --git a/sapl/materia/migrations/0071_auto_20161130_1001.py b/sapl/materia/migrations/0071_auto_20161130_1001.py new file mode 100644 index 000000000..c1b688121 --- /dev/null +++ b/sapl/materia/migrations/0071_auto_20161130_1001.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.11 on 2016-11-30 10:01 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('materia', '0070_auto_20161111_1301'), + ] + + operations = [ + migrations.AlterModelOptions( + name='proposicao', + options={'permissions': (('detail_proposicao_enviada', 'Pode acessar detalhes de uma proposição enviada.'), ('detail_proposicao_devolvida', 'Pode acessar detalhes de uma proposição devolvida.')), 'verbose_name': 'Proposição', 'verbose_name_plural': 'Proposições'}, + ), + ] diff --git a/sapl/materia/migrations/0072_auto_20161130_1618.py b/sapl/materia/migrations/0072_auto_20161130_1618.py new file mode 100644 index 000000000..da265d3ff --- /dev/null +++ b/sapl/materia/migrations/0072_auto_20161130_1618.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.11 on 2016-11-30 16:18 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('materia', '0071_auto_20161130_1001'), + ] + + operations = [ + migrations.AlterModelOptions( + name='proposicao', + options={'permissions': (('detail_proposicao_enviada', 'Pode acessar detalhes de uma proposição enviada.'), ('detail_proposicao_devolvida', 'Pode acessar detalhes de uma proposição devolvida.'), ('detail_proposicao_incorporada', 'Pode acessar detalhes de uma proposição incorporada.')), 'verbose_name': 'Proposição', 'verbose_name_plural': 'Proposições'}, + ), + ] diff --git a/sapl/materia/models.py b/sapl/materia/models.py index 26937e6a4..8bdd6eecb 100644 --- a/sapl/materia/models.py +++ b/sapl/materia/models.py @@ -598,6 +598,14 @@ class Proposicao(models.Model): verbose_name = _('Proposição') verbose_name_plural = _('Proposições') unique_together = (('content_type', 'object_id'), ) + permissions = ( + ('detail_proposicao_enviada', + _('Pode acessar detalhes de uma proposição enviada.')), + ('detail_proposicao_devolvida', + _('Pode acessar detalhes de uma proposição devolvida.')), + ('detail_proposicao_incorporada', + _('Pode acessar detalhes de uma proposição incorporada.')), + ) def __str__(self): return '%s %s/%s' % (Proposicao._meta.verbose_name, diff --git a/sapl/materia/views.py b/sapl/materia/views.py index 6941ee040..ed759f57e 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -252,7 +252,7 @@ class ProposicaoDevolvida(PermissionRequiredMixin, ListView): model = Proposicao ordering = ['data_envio'] paginate_by = 10 - permission_required = ('materia.list_proposicao', ) + permission_required = ('materia.detail_proposicao_devolvida', ) def get_queryset(self): return Proposicao.objects.filter( @@ -276,7 +276,7 @@ class ProposicaoPendente(PermissionRequiredMixin, ListView): model = Proposicao ordering = ['data_envio', 'autor', 'tipo', 'descricao'] paginate_by = 10 - permission_required = ('materia.list_proposicao', ) + permission_required = ('materia.detail_proposicao_enviada', ) def get_queryset(self): return Proposicao.objects.filter( @@ -301,7 +301,7 @@ class ProposicaoRecebida(PermissionRequiredMixin, ListView): model = Proposicao ordering = ['data_envio'] paginate_by = 10 - permission_required = ('materia.list_proposicao', ) + permission_required = 'materia.detail_proposicao_incorporada' def get_queryset(self): return Proposicao.objects.filter( @@ -473,10 +473,16 @@ class ProposicaoCrud(Crud): class DetailView(Crud.DetailView): layout_key = 'Proposicao' + permission_required = (RP_DETAIL, 'materia.detail_proposicao_enviada', + 'materia.detail_proposicao_devolvida', + 'materia.detail_proposicao_incorporada') def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context['subnav_template_name'] = '' + + context['title'] = '%s (%s)' % ( + self.object, self.object.autor) return context def get(self, request, *args, **kwargs): @@ -536,6 +542,37 @@ class ProposicaoCrud(Crud): return redirect(reverse('sapl.materia:proposicao_detail', kwargs={'pk': kwargs['pk']})) + def dispatch(self, request, *args, **kwargs): + + try: + p = Proposicao.objects.get(id=kwargs['pk']) + except: + raise Http404() + + if not self.has_permission(): + return self.handle_no_permission() + + if p.autor.user != request.user: + if not p.data_envio and not p.data_devolucao: + raise Http404() + + if p.data_devolucao and not request.user.has_perm( + 'materia.detail_proposicao_devolvida'): + raise Http404() + + if p.data_envio and not p.data_recebimento\ + and not request.user.has_perm( + 'materia.detail_proposicao_enviada'): + raise Http404() + + if p.data_envio and p.data_recebimento\ + and not request.user.has_perm( + 'materia.detail_proposicao_incorporada'): + raise Http404() + + return super(PermissionRequiredMixin, self).dispatch( + request, *args, **kwargs) + class DeleteView(BaseLocalMixin, Crud.DeleteView): def _action_is_valid(self, request, *args, **kwargs): diff --git a/sapl/rules/__init__.py b/sapl/rules/__init__.py index 407b77ba1..6c5987c64 100644 --- a/sapl/rules/__init__.py +++ b/sapl/rules/__init__.py @@ -2,6 +2,21 @@ from django.utils.translation import ugettext_lazy as _ default_app_config = 'sapl.rules.apps.AppConfig' +""" +Os cinco radicais de permissão completa são: + + RP_LIST, RP_DETAIL, RP_ADD, RP_CHANGE, RP_DELETE =\ + '.list_', '.detail_', '.add_', '.change_', '.delete_', + +Tanto a app crud quanto a app rules estão sempre ligadas a um model. Ao lidar +com permissões, sempre é analisado se é apenas um radical ou permissão +completa, sendo apenas um radical, a permissão completa é montada com base +no model associado. +""" + +RP_LIST, RP_DETAIL, RP_ADD, RP_CHANGE, RP_DELETE =\ + '.list_', '.detail_', '.add_', '.change_', '.delete_', + SAPL_GROUP_ADMINISTRATIVO = _("Operador Administrativo") SAPL_GROUP_PROTOCOLO = _("Operador de Protocolo Administrativo") diff --git a/sapl/rules/map_rules.py b/sapl/rules/map_rules.py index 6f9a4165f..f5565b372 100644 --- a/sapl/rules/map_rules.py +++ b/sapl/rules/map_rules.py @@ -12,7 +12,9 @@ from sapl.rules import (SAPL_GROUP_ADMINISTRATIVO, SAPL_GROUP_ANONYMOUS, SAPL_GROUP_GERAL, SAPL_GROUP_LOGIN_SOCIAL, SAPL_GROUP_MATERIA, SAPL_GROUP_NORMA, SAPL_GROUP_PAINEL, SAPL_GROUP_PARLAMENTAR, - SAPL_GROUP_PROTOCOLO, SAPL_GROUP_SESSAO) + SAPL_GROUP_PROTOCOLO, SAPL_GROUP_SESSAO, + RP_LIST, RP_DETAIL, RP_ADD, RP_CHANGE, RP_DELETE) + from sapl.sessao import models as sessao """ @@ -42,20 +44,8 @@ arquivo (sapl.rules.map_rules.py) e criar os grupos definidos na regra de negócio trabalham com os cinco radiais de permissão e com qualquer outro tipo de permissão customizada, nesta ordem de precedência. -Os cinco radicais de permissão completa são: - - RP_LIST, RP_DETAIL, RP_ADD, RP_CHANGE, RP_DELETE =\ - '.list_', '.detail_', '.add_', '.change_', '.delete_', - -Tanto a app crud quanto a app rules estão sempre ligadas a um model. Ao lidar -com permissões, sempre é analisado se é apenas um radical ou permissão -completa, sendo apenas um radical, a permissão completa é montada com base -no model associado. """ -RP_LIST, RP_DETAIL, RP_ADD, RP_CHANGE, RP_DELETE =\ - '.list_', '.detail_', '.add_', '.change_', '.delete_', - __base__ = [RP_LIST, RP_DETAIL, RP_ADD, RP_CHANGE, RP_DELETE] __listdetailchange__ = [RP_LIST, RP_DETAIL, RP_CHANGE] @@ -83,7 +73,9 @@ rules_group_protocolo = { (materia.Anexada, __base__), (materia.Autoria, __base__), - (materia.Proposicao, __listdetailchange__), + (materia.Proposicao, ['detail_proposicao_enviada', + 'detail_proposicao_devolvida', + 'detail_proposicao_incorporada']), (compilacao.TextoArticulado, ['view_restricted_textoarticulado']) ] } diff --git a/sapl/templates/materia/prop_devolvidas_list.html b/sapl/templates/materia/prop_devolvidas_list.html index 153c7d778..79c9bd531 100644 --- a/sapl/templates/materia/prop_devolvidas_list.html +++ b/sapl/templates/materia/prop_devolvidas_list.html @@ -14,7 +14,7 @@
    - + @@ -24,12 +24,7 @@ - {% endfor %} diff --git a/sapl/templates/materia/proposicao_detail.html b/sapl/templates/materia/proposicao_detail.html index 2a0f6e6de..61669d168 100644 --- a/sapl/templates/materia/proposicao_detail.html +++ b/sapl/templates/materia/proposicao_detail.html @@ -15,14 +15,16 @@ {% block editions %} {% if object.data_envio %} - {% block editions_actions_return %} -
    - {% trans "Recibo de Envio" %} - {% if not object.data_recebimento %} - {% trans 'Retornar Proposição Enviada' %} - {% endif %} -
    + {% if user == object.autor.user %} + {% block editions_actions_return %} +
    + {% trans "Recibo de Envio" %} + {% if not object.data_recebimento %} + {% trans 'Retornar Proposição Enviada' %} + {% endif %} +
    {% endblock %} + {% endif %} {% else %} From 8314292146f08ac8bbc58e79d7274f87b9132add Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Wed, 30 Nov 2016 17:57:12 -0200 Subject: [PATCH 084/139] Muda o backend de mensagens de cookies para session --- sapl/settings.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sapl/settings.py b/sapl/settings.py index cfeefdd0f..3a2212de2 100644 --- a/sapl/settings.py +++ b/sapl/settings.py @@ -32,6 +32,8 @@ SECRET_KEY = config('SECRET_KEY', default='') # SECURITY WARNING: don't run with debug turned on in production! DEBUG = config('DEBUG', default=False, cast=bool) +MESSAGE_STORAGE = 'django.contrib.messages.storage.session.SessionStorage' + ALLOWED_HOSTS = ['*'] LOGIN_REDIRECT_URL = '/' From 820ce182f360695c54dfd9b4bad70090c79554d3 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Thu, 1 Dec 2016 10:06:34 -0200 Subject: [PATCH 085/139] =?UTF-8?q?Diversas=20corre=C3=A7=C3=B5es=20m?= =?UTF-8?q?=C3=ADnimas=20em=20proposi=C3=A7=C3=A3o=20e=20protocolo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/materia/forms.py | 7 ++++--- sapl/templates/protocoloadm/comprovante.html | 2 +- sapl/templates/protocoloadm/protocolo_filter.html | 4 +++- sapl/templates/protocoloadm/protocolo_list.html | 8 +++++++- 4 files changed, 15 insertions(+), 6 deletions(-) diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py index 7b3797b81..3517f0ad2 100644 --- a/sapl/materia/forms.py +++ b/sapl/materia/forms.py @@ -1382,19 +1382,19 @@ class ConfirmarProposicaoForm(ProposicaoForm): protocolo.timestamp = datetime.now() protocolo.tipo_protocolo = '1' - # 1 Processo Legislativo - # 0 Processo Administrativo - protocolo.tipo_processo = '1' protocolo.interessado = str(proposicao.autor) protocolo.autor = proposicao.autor + protocolo.assunto_ementa = proposicao.descricao protocolo.numero_paginas = cd['numero_de_paginas'] protocolo.anulado = False if self.instance.tipo.content_type.model_class( ) == TipoMateriaLegislativa: protocolo.tipo_materia = proposicao.tipo.tipo_conteudo_related + protocolo.tipo_processo = '1' elif self.instance.tipo.content_type.model_class() == TipoDocumento: protocolo.tipo_documento = proposicao.tipo.tipo_conteudo_related + protocolo.tipo_processo = '0' protocolo.save() @@ -1403,6 +1403,7 @@ class ConfirmarProposicaoForm(ProposicaoForm): # FIXME qdo protocoloadm estiver homologado, verifique a necessidade # de redirecionamento para o protocolo. + # complete e libere código abaixo para tal. """ self.instance.results['url'] = reverse( diff --git a/sapl/templates/protocoloadm/comprovante.html b/sapl/templates/protocoloadm/comprovante.html index 9fd9b8b32..ef82a1daa 100644 --- a/sapl/templates/protocoloadm/comprovante.html +++ b/sapl/templates/protocoloadm/comprovante.html @@ -59,7 +59,7 @@ - + diff --git a/sapl/templates/protocoloadm/protocolo_filter.html b/sapl/templates/protocoloadm/protocolo_filter.html index a18ea7fb9..820ad300e 100644 --- a/sapl/templates/protocoloadm/protocolo_filter.html +++ b/sapl/templates/protocoloadm/protocolo_filter.html @@ -45,7 +45,9 @@ Interessado: {{ p.interessado }}
    Natureza do Processo: {% if p.tipo_processo == 0 %} Administrativo {% elif p.tipo_processo == 1 %} Matéria Legislativa {% endif %}
    - Classificação: {{ p.tipo_documento|default_if_none:"Não Informado" }}
    + Classificação: + + {{ p.tipo_documento|default_if_none:p.tipo_materia }}
    {% endfor %} diff --git a/sapl/templates/protocoloadm/protocolo_list.html b/sapl/templates/protocoloadm/protocolo_list.html index 73faa9ed7..d5f3b9a8c 100644 --- a/sapl/templates/protocoloadm/protocolo_list.html +++ b/sapl/templates/protocoloadm/protocolo_list.html @@ -28,7 +28,13 @@ {% elif p.tipo_processo == 1 %} Matéria Legislativa {% endif %}
    - Classificação: {{ p.tipo_documento }}
    + Classificação: + {% if p.tipo_processo == 0 %} + {{ p.tipo_documento }}
    + {% elif p.tipo_processo == 1 %} + {{ p.tipo_materia }}
    + {% endif %}
    +

    From dc8af113b142038e8251bb84278672ec223df5b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rog=C3=A9rio=20Fr=C3=A1?= Date: Thu, 1 Dec 2016 11:04:07 -0200 Subject: [PATCH 086/139] Update gunicorn_start.sh --- gunicorn_start.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gunicorn_start.sh b/gunicorn_start.sh index f68613c26..904d76a3a 100755 --- a/gunicorn_start.sh +++ b/gunicorn_start.sh @@ -3,8 +3,8 @@ # As seen in http://tutos.readthedocs.org/en/latest/source/ndg.html NAME="SAPL" # Name of the application (*) -DJANGODIR=/home/sapl31/sapl # Django project directory (*) -SOCKFILE=/home/sapl31/sapl/run/gunicorn.sock # we will communicate using this unix socket (*) +DJANGODIR=/var/interlegis/sapl # Django project directory (*) +SOCKFILE=/var/interlegis/sapl/run/gunicorn.sock # we will communicate using this unix socket (*) USER=`whoami` # the user to run as (*) GROUP=`whoami` # the group to run as (*) NUM_WORKERS=9 # how many worker processes should Gunicorn spawn (*) @@ -16,7 +16,7 @@ echo "Starting $NAME as `whoami`" # Activate the virtual environment cd $DJANGODIR -source ~/.virtualenvs/sapl/bin/activate +source /var/interlegis/.virtualenvs/sapl/bin/activate export DJANGO_SETTINGS_MODULE=$DJANGO_SETTINGS_MODULE export PYTHONPATH=$DJANGODIR:$PYTHONPATH From 099aaa72a5f9c9731b6ed3b38e4ae7837b2834dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rog=C3=A9rio=20Fr=C3=A1?= Date: Thu, 1 Dec 2016 11:27:40 -0200 Subject: [PATCH 087/139] Update deploy.rst --- docs/deploy.rst | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/deploy.rst b/docs/deploy.rst index a8d49fa8b..19c13bbf9 100644 --- a/docs/deploy.rst +++ b/docs/deploy.rst @@ -9,7 +9,7 @@ O NGINX é o servidor WEB, e o GUNICORN é o servidor da aplicação para o serv Instalar o NGINX:: - sudo pip install nginx + sudo apt-get install nginx Instalar o Gunicorn:: @@ -19,10 +19,10 @@ Instalar o Gunicorn:: Preparando o NGINX ------------------ -vi /etc/nginx/sites-available/sapl31:: +sudo nano /etc/nginx/sites-available/sapl31.conf:: upstream ENDERECO_SITE { - server unix:~/sapl/run/gunicorn.sock fail_timeout=0; + server unix:/var/interlegis/sapl/run/gunicorn.sock fail_timeout=0; } server { @@ -36,11 +36,11 @@ vi /etc/nginx/sites-available/sapl31:: error_log /var/log/nginx-error.log; location /static/ { - alias ~/sapl/collected_static/; + alias /var/interlegis/sapl/collected_static/; } location /media/ { - alias ~/sapl/media/; + alias /var/interlegis/sapl/media/; } location / { @@ -56,32 +56,32 @@ vi /etc/nginx/sites-available/sapl31:: # Error pages error_page 500 502 503 504 /500.html; location = /500.html { - root ~/sapl/sapl/static/; + root /var/interlegis/sapl/sapl/static/; } } Criar link simbólico para ativar o site:: - sudo ln -s /etc/nginx/sites-available/sapl3.conf /etc/nginx/sites-enabled/sapl3 + sudo ln -s /etc/nginx/sites-available/sapl31.conf /etc/nginx/sites-enabled/sapl3 +Reiniciar o nginx + + sudo service nginx restart Preparando o Gunicorn --------------------- Na raiz do Projeto sapl, existe o arquivo chamado gunicorn_start.sh -onde ~/ devem ser alterados pelos caminhos correspondentes. Para definir o parametro NUM_WORKERS utilize a seguinte fórmula: 2 * CPUs 1. Para uma máquina de CPU única o valor seria 3 -Para dar Permissão de execução para o script:: - - chmod ux bin/gunicorn_start Para rodar o gunicorn:: + workon sapl - ./~/.gunicorn_start.sh + /var/interlegis/sapl/.gunicorn_start.sh From eac4be5e33ebe5d574f646bded7bbe4e97d82ee7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rog=C3=A9rio=20Fr=C3=A1?= Date: Thu, 1 Dec 2016 09:32:12 -0200 Subject: [PATCH 088/139] Create instacao31.rst --- docs/instacao31.rst | 201 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 201 insertions(+) create mode 100644 docs/instacao31.rst diff --git a/docs/instacao31.rst b/docs/instacao31.rst new file mode 100644 index 000000000..3b6d09295 --- /dev/null +++ b/docs/instacao31.rst @@ -0,0 +1,201 @@ +Instalação do Ambiente de Desenvolvimento +========================================= + +* Procedimento testado nos seguintes SO's: + + * `Ubuntu 16.04 64bits `_; + +* Para esta instalação foi utilizado o usuário de sistema sapl31 + + +Atualizar o sistema +------------------- + + sudo apt-get update + sudo apt-get upgrade + + + +Instalar as seguintes dependências do sistema:: +---------------------------------------------------------------------------------------- + +* :: + + sudo apt-get install git python3-dev libpq-dev graphviz-dev graphviz \ + 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 + + sudo -i + curl -sL https://deb.nodesource.com/setup_5.x | bash - + exit + sudo apt-get install nodejs + + sudo npm install npm -g + sudo npm install -g bower + +Instalar o virtualenv usando python 3 para o projeto. +----------------------------------------------------- + +* Para usar `virtualenvwrapper `_, instale com:: + + sudo pip3 install virtualenvwrapper + + sudo mkdir -p /var/interlegis/.virtualenvs + +* Ajustar as permissões - onde sapl31 trocar por usuario + sudo chown -R sapl31:sapl31 /var/interlegis/ + + +* Edite o arquivo ``.bashrc`` e adicione ao seu final as configurações abaixo para o virtualenvwrapper:: + + nano /home/sapl31/.bashrc + + export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3 + export WORKON_HOME=/var/interlegis/.virtualenvs + export PROJECT_HOME=/var/interlegis + source /usr/local/bin/virtualenvwrapper.sh + +* Carregue as configurações do virtualenvwrapper. + source /home/sapl31/.bashrc + +Clonar o projeto do github, ou fazer um fork e depois clonar +------------------------------------------------------------ + +* Para apenas clonar do repositório do Interlegis:: + + cd /var/interlegis + git clone git://github.com/interlegis/sapl + +* Para fazer um fork e depois clonar, siga as instruções em https://help.github.com/articles/fork-a-repo que basicamente são: + + * Criar uma conta no github - é gratuíto. + * Acessar https://github.com/interlegis/sapl e clicar em **Fork**. + + Será criado um domínio pelo qual será possível **clonar, corrigir, customizar, melhorar, contribuir, etc**:: + + cd /var/interlegis + git clone git://github.com/[SEU NOME]/sapl + +* As configurações e instruções de uso para o git estão espalhadas pela internet e possui muito coisa bacana. As tarefas básicas de git e suas interações com github são tranquilas de se aprender. + + +Criar o ambiente virtual de desenvolvimento para o SAPL +------------------------------------------------------- +* :: + + mkvirtualenv sapl -a /var/interlegis/sapl -p /usr/bin/python3 + +Instalação e configuração das dependências do projeto +----------------------------------------------------- + +* **Acesse o terminal e entre no virtualenv**:: + + workon sapl + +* **Instalar dependências python**:: + + pip install -r /var/interlegis/sapl/requirements/dev-requirements.txt + +* **Configurar Postgresql**: + +sudo -u postgres psql -c "CREATE ROLE sapl LOGIN ENCRYPTED PASSWORD 'sapl' NOSUPERUSER INHERIT CREATEDB NOCREATEROLE NOREPLICATION;" +sudo -u postgres psql -c "ALTER ROLE sapl VALID UNTIL 'infinity';" +sudo -u postgres psql -c "CREATE DATABASE sapl WITH OWNER = sapl ENCODING = 'UTF8' TABLESPACE = pg_default LC_COLLATE = 'pt_BR.UTF-8' LC_CTYPE = 'pt_BR.UTF-8' CONNECTION LIMIT = -1;" + + * Se você possui uma cópia da base de dados do SAPL, essa é a hora para restaurá-la. + * Obs: no ambiente de desenvolvimento, a role deve ter permissão para criar outro banco. Isso é usado pelos testes automatizados. + * (caso você já possua uma instalação do postrgresql anterior ao processo de instalação do ambiente de desenvolvimento do SAPL em sua máquina e sábia como fazer, esteja livre para proceder como desejar, porém, ao configurar o arquivo ``.env`` no próximo passo, as mesmas definições deverão ser usadas) + +* **Configurar arquivo .env**: + + * Criação da `SECRET_KEY `_: + + É necessário criar um projeto fake para extrair uma chave SECRET_KEY:: + + mkdir /var/interlegis/temp + cd /var/interlegis/temp + + django-admin startproject sapl_temp + + grep SECRET_KEY sapl_temp/sapl_temp/settings.py + + Copie a linha que aparecerá, volte para a pasta do projeto SAPL e apague sua pasta temporária:: + + cd /var/interlegis/ + rm -R /var/interlegis/temp + +* Ajustar as permissões - onde sapl31 trocar por usuario + sudo chown -R sapl31:sapl31 /var/interlegis/ + + * Criar o arquivo ``.env`` dentro da pasta ~/Envs/sapl/sapl/.env:: + +DATABASE_URL = postgresql://USER:PASSWORD@HOST:PORT/NAME + SECRET_KEY = Gere alguma chave e coloque aqui + DEBUG = [True/False] + EMAIL_USE_TLS = [True/False] + EMAIL_PORT = [Insira este parâmetro] + EMAIL_HOST = [Insira este parâmetro] + EMAIL_HOST_USER = [Insira este parâmetro] + EMAIL_HOST_PASSWORD = [Insira este parâmetro] + + * Uma configuração mínima para atender os procedimentos acima seria:: + + nano /var/interlegis/sapl/sapl/.env + + DATABASE_URL = postgresql://sapl:sapl@localhost:5432/sapl + SECRET_KEY = 'Substitua esta linha pela copiada acima' + DEBUG = True + EMAIL_USE_TLS = True + EMAIL_PORT = 587 + EMAIL_HOST = + EMAIL_HOST_USER = + EMAIL_HOST_PASSWORD = + + +cd /var/interlegis/sapl + +* Instalar as dependências do ``bower``:: + + ./manage.py bower install + +* Atualizar e/ou criar as tabelas da base de dados para refletir o modelo da versão clonada:: + + ./manage.py migrate + +* Atualizar arquivos estáticos:: + + ./manage.py collectstatic --noinput + +* Subir o servidor do django:: + + ./manage.py runserver 0.0.0.0:8001 + +* Acesse o SAPL em:: + + http://localhost:8000/ + +Instruções para criação do super usuário e de usuários de testes +=========================================================================== + +* Criar super usuário do django-contrib-admin (Será solicitado alguns dados para criação):: + + ./manage.py createsuperuser + +* `Os perfis semânticos do SAPL `_ são fixos e atualizados a cada execução do comando:: + + ./manage.py migrate + +* Os perfis fixos não aceitam customização via admin, porém outros grupos podem ser criados. O SAPL não interferirá no conjunto de permissões definidas em grupos customizados e se comportará diante de usuários segundo seus grupos e suas permissões. + +* Os usuários de testes de perfil são criados apenas se o SAPL estiver rodando em modo DEBUG=True. Todos com senha "interlegis", serão:: + + operador_administrativo + operador_protocoloadm + operador_comissoes + operador_materia + operador_norma + operador_sessao + operador_painel + operador_geral From 2750a57f12319b9fe5249bb0e46adc3ecfe45296 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rog=C3=A9rio=20Fr=C3=A1?= Date: Thu, 1 Dec 2016 10:03:44 -0200 Subject: [PATCH 089/139] Update instacao31.rst --- docs/instacao31.rst | 45 +++++++++++++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 16 deletions(-) diff --git a/docs/instacao31.rst b/docs/instacao31.rst index 3b6d09295..0dee5bd9a 100644 --- a/docs/instacao31.rst +++ b/docs/instacao31.rst @@ -8,10 +8,13 @@ Instalação do Ambiente de Desenvolvimento * Para esta instalação foi utilizado o usuário de sistema sapl31 -Atualizar o sistema +Atualizar o sistema:: ------------------- +* :: + sudo apt-get update + sudo apt-get upgrade @@ -44,7 +47,8 @@ Instalar o virtualenv usando python 3 para o projeto. sudo mkdir -p /var/interlegis/.virtualenvs -* Ajustar as permissões - onde sapl31 trocar por usuario +* Ajustar as permissões - onde sapl31 trocar por usuario:: + sudo chown -R sapl31:sapl31 /var/interlegis/ @@ -57,9 +61,13 @@ Instalar o virtualenv usando python 3 para o projeto. export PROJECT_HOME=/var/interlegis source /usr/local/bin/virtualenvwrapper.sh -* Carregue as configurações do virtualenvwrapper. + +* Carregue as configurações do virtualenvwrapper:: + source /home/sapl31/.bashrc + + Clonar o projeto do github, ou fazer um fork e depois clonar ------------------------------------------------------------ @@ -98,21 +106,25 @@ Instalação e configuração das dependências do projeto pip install -r /var/interlegis/sapl/requirements/dev-requirements.txt -* **Configurar Postgresql**: +* **Configurar Postgresql**:: -sudo -u postgres psql -c "CREATE ROLE sapl LOGIN ENCRYPTED PASSWORD 'sapl' NOSUPERUSER INHERIT CREATEDB NOCREATEROLE NOREPLICATION;" -sudo -u postgres psql -c "ALTER ROLE sapl VALID UNTIL 'infinity';" -sudo -u postgres psql -c "CREATE DATABASE sapl WITH OWNER = sapl ENCODING = 'UTF8' TABLESPACE = pg_default LC_COLLATE = 'pt_BR.UTF-8' LC_CTYPE = 'pt_BR.UTF-8' CONNECTION LIMIT = -1;" + sudo -u postgres psql -c "CREATE ROLE sapl LOGIN ENCRYPTED PASSWORD 'sapl' NOSUPERUSER INHERIT CREATEDB NOCREATEROLE NOREPLICATION;" + + sudo -u postgres psql -c "ALTER ROLE sapl VALID UNTIL 'infinity';" + + sudo -u postgres psql -c "CREATE DATABASE sapl WITH OWNER = sapl ENCODING = 'UTF8' TABLESPACE = pg_default LC_COLLATE = 'pt_BR.UTF-8' LC_CTYPE = 'pt_BR.UTF-8' CONNECTION LIMIT = -1;" * Se você possui uma cópia da base de dados do SAPL, essa é a hora para restaurá-la. * Obs: no ambiente de desenvolvimento, a role deve ter permissão para criar outro banco. Isso é usado pelos testes automatizados. * (caso você já possua uma instalação do postrgresql anterior ao processo de instalação do ambiente de desenvolvimento do SAPL em sua máquina e sábia como fazer, esteja livre para proceder como desejar, porém, ao configurar o arquivo ``.env`` no próximo passo, as mesmas definições deverão ser usadas) -* **Configurar arquivo .env**: + + + *Configurar arquivo .env - * Criação da `SECRET_KEY `_: + Criação da `SECRET_KEY `_: - É necessário criar um projeto fake para extrair uma chave SECRET_KEY:: +* **É necessário criar um projeto fake para extrair uma chave SECRET_KEY**:: mkdir /var/interlegis/temp cd /var/interlegis/temp @@ -126,12 +138,15 @@ sudo -u postgres psql -c "CREATE DATABASE sapl WITH OWNER = sapl ENCODING = 'UTF cd /var/interlegis/ rm -R /var/interlegis/temp -* Ajustar as permissões - onde sapl31 trocar por usuario +* **Ajustar as permissões - onde sapl31 trocar por usuario**:: + sudo chown -R sapl31:sapl31 /var/interlegis/ - * Criar o arquivo ``.env`` dentro da pasta ~/Envs/sapl/sapl/.env:: +* **Criar o arquivo ``.env`` dentro da pasta /var/interlegis/sapl/sapl/.env**:: + + nano /var/interlegis/sapl/sapl/.env -DATABASE_URL = postgresql://USER:PASSWORD@HOST:PORT/NAME + DATABASE_URL = postgresql://USER:PASSWORD@HOST:PORT/NAME SECRET_KEY = Gere alguma chave e coloque aqui DEBUG = [True/False] EMAIL_USE_TLS = [True/False] @@ -141,9 +156,7 @@ DATABASE_URL = postgresql://USER:PASSWORD@HOST:PORT/NAME EMAIL_HOST_PASSWORD = [Insira este parâmetro] * Uma configuração mínima para atender os procedimentos acima seria:: - - nano /var/interlegis/sapl/sapl/.env - + DATABASE_URL = postgresql://sapl:sapl@localhost:5432/sapl SECRET_KEY = 'Substitua esta linha pela copiada acima' DEBUG = True From dc86c230caee3cd7e7e93c688a1f84a8fb905c1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rog=C3=A9rio=20Fr=C3=A1?= Date: Thu, 1 Dec 2016 13:21:58 -0200 Subject: [PATCH 090/139] Update instacao31.rst --- docs/instacao31.rst | 50 ++++++++++++++++++++++----------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/docs/instacao31.rst b/docs/instacao31.rst index 0dee5bd9a..b9457c5b0 100644 --- a/docs/instacao31.rst +++ b/docs/instacao31.rst @@ -9,13 +9,13 @@ Instalação do Ambiente de Desenvolvimento Atualizar o sistema:: -------------------- +---------------------- -* :: + :: - sudo apt-get update + sudo apt-get update - sudo apt-get upgrade + sudo apt-get upgrade @@ -118,29 +118,18 @@ Instalação e configuração das dependências do projeto * Obs: no ambiente de desenvolvimento, a role deve ter permissão para criar outro banco. Isso é usado pelos testes automatizados. * (caso você já possua uma instalação do postrgresql anterior ao processo de instalação do ambiente de desenvolvimento do SAPL em sua máquina e sábia como fazer, esteja livre para proceder como desejar, porém, ao configurar o arquivo ``.env`` no próximo passo, as mesmas definições deverão ser usadas) - - - *Configurar arquivo .env - Criação da `SECRET_KEY `_: - -* **É necessário criar um projeto fake para extrair uma chave SECRET_KEY**:: +* **Ajustar as permissões - onde sapl31 trocar por usuario**:: + + sudo chown -R sapl31:sapl31 /var/interlegis/ - mkdir /var/interlegis/temp - cd /var/interlegis/temp - django-admin startproject sapl_temp - grep SECRET_KEY sapl_temp/sapl_temp/settings.py +* **Configurar arquivo .env**:: + + +Criação da `SECRET_KEY `_: - Copie a linha que aparecerá, volte para a pasta do projeto SAPL e apague sua pasta temporária:: - - cd /var/interlegis/ - rm -R /var/interlegis/temp - -* **Ajustar as permissões - onde sapl31 trocar por usuario**:: - - sudo chown -R sapl31:sapl31 /var/interlegis/ * **Criar o arquivo ``.env`` dentro da pasta /var/interlegis/sapl/sapl/.env**:: @@ -158,7 +147,7 @@ Instalação e configuração das dependências do projeto * Uma configuração mínima para atender os procedimentos acima seria:: DATABASE_URL = postgresql://sapl:sapl@localhost:5432/sapl - SECRET_KEY = 'Substitua esta linha pela copiada acima' + SECRET_KEY = 'cole aqui entre as aspas simples a chave gerada pelo comando abaixo' DEBUG = True EMAIL_USE_TLS = True EMAIL_PORT = 587 @@ -167,7 +156,18 @@ Instalação e configuração das dependências do projeto EMAIL_HOST_PASSWORD = -cd /var/interlegis/sapl + +Rodar o comando abaixo, um detalhe importante, esse comando só funciona com o django extensions, mas ele já está presente no arquivo requirements/requirements.txt desse projeto:: + + python manage.py generate_secret_key + +Copie a chave que aparecerá, edite o arquivo .env e altere o valor do parâmetro SECRET_KEY. + + +* Posicionar-se no diretorio do Projeto:: + + cd /var/interlegis/sapl + * Instalar as dependências do ``bower``:: @@ -187,7 +187,7 @@ cd /var/interlegis/sapl * Acesse o SAPL em:: - http://localhost:8000/ + http://localhost:8001/ Instruções para criação do super usuário e de usuários de testes =========================================================================== From 95b138ac9f17f255b5b9231e9be53ae2427704e1 Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Thu, 1 Dec 2016 17:21:08 -0200 Subject: [PATCH 091/139] =?UTF-8?q?Ajusta=20simple=5Fgunicorn.sh=20para=20?= =?UTF-8?q?novo=20padr=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- simple_gunicorn.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/simple_gunicorn.sh b/simple_gunicorn.sh index 673ff526f..970e67a04 100755 --- a/simple_gunicorn.sh +++ b/simple_gunicorn.sh @@ -1,9 +1,9 @@ -DJANGODIR=/home/sapl31/sapl # Django project directory (*) +DJANGODIR=/var/interlegis/sapl # Django project directory (*) DJANGO_SETTINGS_MODULE=sapl.settings # which settings file should Django use (*) DJANGO_WSGI_MODULE=sapl.wsgi # WSGI module name (*) cd $DJANGODIR -source ~/.virtualenvs/sapl/bin/activate +source /var/interlegis/.virtualenvs/sapl/bin/activate export DJANGO_SETTINGS_MODULE=$DJANGO_SETTINGS_MODULE export PYTHONPATH=$DJANGODIR:$PYTHONPATH From e6c53e80ce0948be34a946d41d8f26431a7e606b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rog=C3=A9rio=20Fr=C3=A1?= Date: Thu, 1 Dec 2016 15:46:48 -0200 Subject: [PATCH 092/139] Update README.rst --- README.rst | 197 +---------------------------------------------------- 1 file changed, 1 insertion(+), 196 deletions(-) diff --git a/README.rst b/README.rst index e10b3b254..5ffdda86f 100644 --- a/README.rst +++ b/README.rst @@ -17,206 +17,11 @@ atual do sistema (2.5), visite a página do `projeto na Interlegis wiki `_; - - * edite e incremente outros, ou ainda, crie outros readme's dentro do projeto para outros SO's e adicione o link aqui. - -Instalar as seguintes dependências do sistema:: ----------------------------------------------------------------------------------------- - -* :: - - sudo apt-get install git python3-dev libpq-dev graphviz-dev graphviz \ - 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 - - sudo -i - curl -sL https://deb.nodesource.com/setup_5.x | bash - - exit - sudo apt-get install nodejs - - sudo npm install npm -g - sudo npm install -g bower - -Instalar o virtualenv usando python 3 para o projeto. ------------------------------------------------------ - -* Para usar `virtualenvwrapper `_, instale com:: - - sudo pip install virtualenvwrapper - - mkdir ~/Envs - -* Edite o arquivo ``.bashrc`` e adicione ao seu final as configurações abaixo para o virtualenvwrapper:: - - export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3 - export WORKON_HOME=$HOME/.virtualenvs - export PROJECT_HOME=$HOME/Envs - source /usr/local/bin/virtualenvwrapper.sh - -* Saia do terminal e entre novamente para que as configurações do virtualenvwrapper sejam carregadas. - -Clonar o projeto do github, ou fazer um fork e depois clonar ------------------------------------------------------------- - -* Para apenas clonar do repositório do Interlegis:: - - cd ~/Envs - git clone git://github.com/interlegis/sapl - -* Para fazer um fork e depois clonar, siga as instruções em https://help.github.com/articles/fork-a-repo que basicamente são: - - * Criar uma conta no github - é gratuíto. - * Acessar https://github.com/interlegis/sapl e clicar em **Fork**. - - Será criado um domínio pelo qual será possível **clonar, corrigir, customizar, melhorar, contribuir, etc**:: - - cd ~/Envs - git clone git://github.com/[SEU NOME]/sapl - -* As configurações e instruções de uso para o git estão espalhadas pela internet e possui muito coisa bacana. As tarefas básicas de git e suas interações com github são tranquilas de se aprender. - - -Criar o ambiente virtual de desenvolvimento para o SAPL -------------------------------------------------------- -* :: - - mkvirtualenv sapl -a $HOME/Envs/sapl -p /usr/bin/python3 - -Instalação e configuração das dependências do projeto ------------------------------------------------------ - -* **Acesse o terminal e entre no virtualenv**:: - - workon sapl - -* **Instalar dependências python**:: - - pip install -r requirements/dev-requirements.txt - -* **Configurar Postgresql**: - - * Acessar Postrgresql para criar o banco ``sapl`` com a role ``sapl``:: - - sudo su - postgres - psql - - CREATE ROLE sapl LOGIN - ENCRYPTED PASSWORD 'sapl' - NOSUPERUSER INHERIT CREATEDB NOCREATEROLE NOREPLICATION; - - ALTER ROLE sapl VALID UNTIL 'infinity'; - - CREATE DATABASE sapl - WITH OWNER = sapl - ENCODING = 'UTF8' - TABLESPACE = pg_default - LC_COLLATE = 'pt_BR.UTF-8' - LC_CTYPE = 'pt_BR.UTF-8' - CONNECTION LIMIT = -1; - - \q - exit - - * Se você possui uma cópia da base de dados do SAPL, essa é a hora para restaurá-la. - * Obs: no ambiente de desenvolvimento, a role deve ter permissão para criar outro banco. Isso é usado pelos testes automatizados. - * (caso você já possua uma instalação do postrgresql anterior ao processo de instalação do ambiente de desenvolvimento do SAPL em sua máquina e sábia como fazer, esteja livre para proceder como desejar, porém, ao configurar o arquivo ``.env`` no próximo passo, as mesmas definições deverão ser usadas) - -* **Configurar arquivo .env**: - - * Criação da `SECRET_KEY `_: - - É necessário criar um projeto fake para extrair uma chave SECRET_KEY:: - - mkdir ~/Envs/temp - cd ~/Envs/temp - - django-admin startproject sapl_temp - - grep SECRET_KEY sapl_temp/sapl_temp/settings.py - - Copie a linha que aparecerá, volte para a pasta do projeto SAPL e apague sua pasta temporária:: - - cd ~/Envs/sapl - rm -R ~/Envs/temp - - * Criar o arquivo ``.env`` dentro da pasta ~/Envs/sapl/sapl/.env:: - - DATABASE_URL = postgresql://USER:PASSWORD@HOST:PORT/NAME - SECRET_KEY = Gere alguma chave e coloque aqui - DEBUG = [True/False] - EMAIL_USE_TLS = [True/False] - EMAIL_PORT = [Insira este parâmetro] - EMAIL_HOST = [Insira este parâmetro] - EMAIL_HOST_USER = [Insira este parâmetro] - EMAIL_HOST_PASSWORD = [Insira este parâmetro] - - * Uma configuração mínima para atender os procedimentos acima seria:: - - DATABASE_URL = postgresql://sapl:sapl@localhost:5432/sapl - SECRET_KEY = 'Substitua esta linha pela copiada acima' - DEBUG = True - EMAIL_USE_TLS = True - EMAIL_PORT = 587 - EMAIL_HOST = - EMAIL_HOST_USER = - EMAIL_HOST_PASSWORD = - - - -* Instalar as dependências do ``bower``:: - - ./manage.py bower install - -* Atualizar e/ou criar as tabelas da base de dados para refletir o modelo da versão clonada:: - - ./manage.py migrate - -* Atualizar arquivos estáticos:: - - ./manage.py collectstatic --noinput - -* Subir o servidor do django:: - - ./manage.py runserver - -* Acesse o SAPL em:: - - http://localhost:8000/ - -Instruções para criação do super usuário e de usuários de testes -=========================================================================== - -* Criar super usuário do django-contrib-admin (Será solicitado alguns dados para criação):: - - ./manage.py createsuperuser - -* `Os perfis semânticos do SAPL `_ são fixos e atualizados a cada execução do comando:: - - ./manage.py migrate - -* Os perfis fixos não aceitam customização via admin, porém outros grupos podem ser criados. O SAPL não interferirá no conjunto de permissões definidas em grupos customizados e se comportará diante de usuários segundo seus grupos e suas permissões. - -* Os usuários de testes de perfil são criados apenas se o SAPL estiver rodando em modo DEBUG=True. Todos com senha "interlegis", serão:: - - operador_administrativo - operador_protocoloadm - operador_comissoes - operador_materia - operador_norma - operador_sessao - operador_painel - operador_geral + `Instalação do Ambiente de Desenvolvimento `_ Instruções para Importação da base mysql 2.5 ============================================ - `Importação da Base do SAPL 2.5 para SAPL 3.1 `_ From 67519621ea925d84444b0cd3c8e7ceb42baf85e3 Mon Sep 17 00:00:00 2001 From: Eduardo Edson Batista Cordeiro Alves Date: Fri, 2 Dec 2016 09:49:38 -0200 Subject: [PATCH 093/139] =?UTF-8?q?Adiciona=20numera=C3=A7=C3=A3o=20ao=20d?= =?UTF-8?q?etail=20da=20mat=C3=A9ria?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/materia/models.py | 5 ++--- sapl/materia/views.py | 35 +++-------------------------- sapl/templates/materia/layouts.yaml | 1 + 3 files changed, 6 insertions(+), 35 deletions(-) diff --git a/sapl/materia/models.py b/sapl/materia/models.py index 8bdd6eecb..48604629c 100644 --- a/sapl/materia/models.py +++ b/sapl/materia/models.py @@ -412,10 +412,9 @@ class Numeracao(models.Model): 'data_materia',) def __str__(self): - return _('Nº%(numero)s %(tipo)s - %(data)s') % { + return _('%(numero)s/%(ano)s') % { 'numero': self.numero_materia, - 'tipo': self.tipo_materia, - 'data': self.data_materia} + 'ano': self.data_materia.year} class Orgao(models.Model): diff --git a/sapl/materia/views.py b/sapl/materia/views.py index ed759f57e..5d1a71eb4 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -1,7 +1,6 @@ from datetime import datetime from random import choice from string import ascii_letters, digits -from django.views.generic import DetailView from crispy_forms.helper import FormHelper from crispy_forms.layout import HTML @@ -17,11 +16,13 @@ from django.shortcuts import get_object_or_404, redirect from django.template import Context, loader from django.utils import formats from django.utils.translation import ugettext_lazy as _ -from django.views.generic import CreateView, ListView, TemplateView, UpdateView +from django.views.generic import (CreateView, DetailView, ListView, + TemplateView, UpdateView) from django.views.generic.base import RedirectView from django.views.generic.edit import FormView from django_filters.views import FilterView +import sapl from sapl.base.models import Autor, CasaLegislativa from sapl.compilacao.models import (STATUS_TA_EDITION, STATUS_TA_IMMUTABLE_RESTRICT, @@ -40,7 +41,6 @@ from sapl.protocoloadm.models import Protocolo from sapl.utils import (TURNO_TRAMITACAO_CHOICES, YES_NO_CHOICES, autor_label, autor_modal, gerar_hash_arquivo, get_base_url, montar_row_autor) -import sapl from .forms import (AcessorioEmLoteFilterSet, AcompanhamentoMateriaForm, DocumentoAcessorioForm, MateriaLegislativaFilterSet, @@ -56,7 +56,6 @@ from .models import (AcompanhamentoMateria, Anexada, Autoria, DespachoInicial, TipoMateriaLegislativa, TipoProposicao, Tramitacao, UnidadeTramitacao) - OrigemCrud = Crud.build(Origem, '') TipoMateriaCrud = CrudAux.build( @@ -1033,34 +1032,6 @@ class MateriaLegislativaCrud(Crud): class DetailView(Crud.DetailView): - def get_context_data(self, **kwargs): - context = super().get_context_data() - data = {} - - if self.object.numeracao_set.all().count() > 1: - string = ' - ' - for n in self.object.numeracao_set.all(): - _str = str(n.numero_materia) + '/' + str( - n.ano_materia) + ' - ' - string += _str - - data = {'text': string, - 'span': 12, - 'verbose_name': 'Processo', - 'id': 'processo'} - - elif self.object.numeracao_set.all().count() == 1: - n = self.object.numeracao_set.first() - string = str(n.numero_materia) + '/' + str(n.ano_materia) - - data = {'text': string, - 'span': 12, - 'verbose_name': 'Processo', - 'id': 'processo'} - - context['view'].layout_display[0]['rows'].insert(3, data) - return context - @property def layout_key(self): return 'MateriaLegislativaDetail' diff --git a/sapl/templates/materia/layouts.yaml b/sapl/templates/materia/layouts.yaml index b7e43e7b1..99b91afa3 100644 --- a/sapl/templates/materia/layouts.yaml +++ b/sapl/templates/materia/layouts.yaml @@ -125,6 +125,7 @@ MateriaLegislativaDetail: - tipo ano numero - data_apresentacao numero_protocolo tipo_apresentacao - texto_original + - numeracao_set {% trans 'Outras Informações' %}: - apelido dias_prazo polemica - objeto regime_tramitacao em_tramitacao From e2e3c9f1a5d7de19086d6808c37db4fdb083f90e Mon Sep 17 00:00:00 2001 From: Eduardo Edson Batista Cordeiro Alves Date: Fri, 2 Dec 2016 10:16:16 -0200 Subject: [PATCH 094/139] Fix #852 --- sapl/protocoloadm/views.py | 9 ++++--- sapl/templates/protocoloadm/comprovante.html | 24 ++++++++++--------- .../protocoloadm/protocolo_mostrar.html | 11 ++++----- 3 files changed, 24 insertions(+), 20 deletions(-) diff --git a/sapl/protocoloadm/views.py b/sapl/protocoloadm/views.py index a97d3d758..87a1a3710 100644 --- a/sapl/protocoloadm/views.py +++ b/sapl/protocoloadm/views.py @@ -353,19 +353,22 @@ class ProtocoloMateriaView(PermissionRequiredMixin, CreateView): protocolo = Protocolo() - protocolo.numero = (numero['numero__max'] + 1) if numero['numero__max'] else 1 + protocolo.numero = ( + numero['numero__max'] + 1) if numero['numero__max'] else 1 protocolo.ano = datetime.now().year protocolo.data = datetime.now().strftime("%Y-%m-%d") protocolo.hora = datetime.now().strftime("%H:%M") protocolo.timestamp = datetime.now().strftime("%Y-%m-%d %H:%M") - protocolo.tipo_processo = '0' # TODO validar o significado + protocolo.tipo_processo = '1' # TODO validar o significado + protocolo.anulado = False + if form.cleaned_data['autor']: protocolo.autor = form.cleaned_data['autor'] - protocolo.anulado = False protocolo.tipo_materia = TipoMateriaLegislativa.objects.get( id=self.request.POST['tipo_materia']) protocolo.numero_paginas = self.request.POST['numero_paginas'] protocolo.observacao = self.request.POST['observacao'] + protocolo.save() return redirect(self.get_success_url(protocolo)) diff --git a/sapl/templates/protocoloadm/comprovante.html b/sapl/templates/protocoloadm/comprovante.html index ef82a1daa..4c88ca195 100644 --- a/sapl/templates/protocoloadm/comprovante.html +++ b/sapl/templates/protocoloadm/comprovante.html @@ -61,23 +61,25 @@ - - - - - - - - + {% if protocolo.tipo_processo == 0 %} + + + + + + + + + {% endif %} - - + + diff --git a/sapl/templates/protocoloadm/protocolo_mostrar.html b/sapl/templates/protocoloadm/protocolo_mostrar.html index 476f19d5f..a48a7d29a 100644 --- a/sapl/templates/protocoloadm/protocolo_mostrar.html +++ b/sapl/templates/protocoloadm/protocolo_mostrar.html @@ -4,14 +4,13 @@ {% block detail_content %} Protocolo:{{ protocolo.numero|stringformat:'06d' }}/{{ protocolo.ano }}
    - Assunto: {{ protocolo.assunto_ementa }}
    + Assunto: {{ protocolo.assunto_ementa|default:" Não informado." }}
    Data Protocolo: {{ protocolo.data|date:"d/m/Y" }} - Horário: {{ protocolo.hora|date:"H:i" }}
    - Interessado: {{ protocolo.interessado }}
    + Interessado: {{ protocolo.interessado|default:" Não informado." }}
    - Natureza do Processo:{% if protocolo.tipo_processo == 0 %} Administrativo {% elif protocolo.tipo_processo == 1 %} Matéria Legislativa {% endif %}
    - Classificação: {{ protocolo.tipo_documento }}
    + Natureza do Processo:{% if protocolo.tipo_processo == 0 %} Administrativo {% elif protocolo.tipo_processo == 1 %} Legislativo {% endif %}
    Número de Páginas: {{ protocolo.numero_paginas }}
    - Observação:{{ protocolo.observacao|default:"Não há" }}
    + Observação:{{ protocolo.observacao|default:" Não informado." }}

    @@ -37,6 +36,6 @@      - Comprovante + Comprovante {% endblock detail_content %} From a09ca294e13a6b2a9330578535a671f4937ff9b7 Mon Sep 17 00:00:00 2001 From: Eduardo Edson Batista Cordeiro Alves Date: Fri, 2 Dec 2016 10:33:34 -0200 Subject: [PATCH 095/139] Deixa campo de norma em maiusculo --- .../migrations/0028_auto_20161202_1025.py | 21 +++++++++++++++++++ sapl/norma/models.py | 3 ++- 2 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 sapl/norma/migrations/0028_auto_20161202_1025.py diff --git a/sapl/norma/migrations/0028_auto_20161202_1025.py b/sapl/norma/migrations/0028_auto_20161202_1025.py new file mode 100644 index 000000000..2bfebb011 --- /dev/null +++ b/sapl/norma/migrations/0028_auto_20161202_1025.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-12-02 10:25 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('norma', '0027_auto_20161123_1538'), + ] + + operations = [ + migrations.AlterField( + model_name='normajuridica', + name='materia', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='materia.MateriaLegislativa', verbose_name='Matéria'), + ), + ] diff --git a/sapl/norma/models.py b/sapl/norma/models.py index 5b30933e6..442340540 100644 --- a/sapl/norma/models.py +++ b/sapl/norma/models.py @@ -68,7 +68,8 @@ class NormaJuridica(models.Model): verbose_name=_('Texto Integral')) tipo = models.ForeignKey( TipoNormaJuridica, verbose_name=_('Tipo da Norma Juridica')) - materia = models.ForeignKey(MateriaLegislativa, blank=True, null=True) + materia = models.ForeignKey( + MateriaLegislativa, blank=True, null=True, verbose_name=_('Matéria')) numero = models.PositiveIntegerField(verbose_name=_('Número')) ano = models.PositiveSmallIntegerField(verbose_name=_('Ano'), choices=RANGE_ANOS) From ccc030c7df90c08c936facdbda133a526f416785 Mon Sep 17 00:00:00 2001 From: Eduardo Edson Batista Cordeiro Alves Date: Fri, 2 Dec 2016 10:41:07 -0200 Subject: [PATCH 096/139] Fix #838 --- sapl/materia/forms.py | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py index 3517f0ad2..883b0946e 100644 --- a/sapl/materia/forms.py +++ b/sapl/materia/forms.py @@ -1,13 +1,14 @@ +import os from datetime import date, datetime from itertools import chain -import os +import django_filters from crispy_forms.bootstrap import (Alert, FormActions, InlineCheckboxes, InlineRadios) from crispy_forms.helper import FormHelper -from crispy_forms.layout import (HTML, Button, Column, Field, Fieldset, Layout, - Submit, Div) +from crispy_forms.layout import (HTML, Button, Column, Div, Field, Fieldset, + Layout, Submit) from django import forms from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ObjectDoesNotExist, ValidationError @@ -22,17 +23,18 @@ from django.utils.encoding import force_text from django.utils.html import format_html from django.utils.safestring import mark_safe from django.utils.translation import ugettext_lazy as _ -import django_filters +import sapl from sapl.base.models import Autor from sapl.comissoes.models import Comissao -from sapl.compilacao.models import STATUS_TA_PRIVATE,\ - STATUS_TA_IMMUTABLE_PUBLIC, TextoArticulado, STATUS_TA_PUBLIC,\ - PerfilEstruturalTextoArticulado +from sapl.compilacao.models import (STATUS_TA_IMMUTABLE_PUBLIC, + STATUS_TA_PRIVATE, STATUS_TA_PUBLIC, + PerfilEstruturalTextoArticulado, + TextoArticulado) from sapl.crispy_layout_mixin import (SaplFormLayout, form_actions, to_column, to_row) -from sapl.materia.models import TipoProposicao, MateriaLegislativa,\ - RegimeTramitacao, TipoDocumento +from sapl.materia.models import (MateriaLegislativa, RegimeTramitacao, + TipoDocumento, TipoProposicao) from sapl.norma.models import (LegislacaoCitada, NormaJuridica, TipoNormaJuridica) from sapl.parlamentares.models import Parlamentar @@ -42,12 +44,10 @@ from sapl.utils import (RANGE_ANOS, YES_NO_CHOICES, ChoiceWithoutValidationField, MateriaPesquisaOrderingFilter, RangeWidgetOverride, autor_label, autor_modal, models_with_gr_for_model) -import sapl from .models import (AcompanhamentoMateria, Anexada, Autoria, DespachoInicial, - DocumentoAcessorio, Numeracao, - Proposicao, Relatoria, TipoMateriaLegislativa, Tramitacao, - UnidadeTramitacao) + DocumentoAcessorio, Numeracao, Proposicao, Relatoria, + TipoMateriaLegislativa, Tramitacao, UnidadeTramitacao) def ANO_CHOICES(): @@ -679,7 +679,7 @@ class PrimeiraTramitacaoEmLoteFilterSet(django_filters.FilterSet): self.filters['tipo'].label = 'Tipo de Matéria' self.filters['data_apresentacao'].label = 'Data (Inicial - Final)' self.form.fields['tipo'].required = True - self.form.fields['data_apresentacao'].required = True + self.form.fields['data_apresentacao'].required = False row1 = to_row([('tipo', 12)]) row2 = to_row([('data_apresentacao', 12)]) @@ -714,7 +714,7 @@ class TramitacaoEmLoteFilterSet(django_filters.FilterSet): self.filters['tramitacao__unidade_tramitacao_destino' ].label = 'Unidade Destino (Último Destino)' self.form.fields['tipo'].required = True - self.form.fields['data_apresentacao'].required = True + self.form.fields['data_apresentacao'].required = False self.form.fields['tramitacao__status'].required = True self.form.fields[ 'tramitacao__unidade_tramitacao_destino'].required = True From 75e991e4b12f04e353a6f6b4ea30d560f4755b89 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Fri, 2 Dec 2016 10:43:12 -0200 Subject: [PATCH 097/139] =?UTF-8?q?Add=20rela=C3=A7=C3=A3o=20entre=20incis?= =?UTF-8?q?os=20e=20artigos=20aos=20T.A.s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/compilacao/compilacao_data_tables.sql | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/sapl/compilacao/compilacao_data_tables.sql b/sapl/compilacao/compilacao_data_tables.sql index f7df6ff00..d5754839a 100644 --- a/sapl/compilacao/compilacao_data_tables.sql +++ b/sapl/compilacao/compilacao_data_tables.sql @@ -3,6 +3,8 @@ INSERT INTO compilacao_perfilestruturaltextoarticulado (id, sigla, nome, padrao, INSERT INTO compilacao_perfilestruturaltextoarticulado (id, sigla, nome, padrao, parent_id) VALUES (3, 'PLOL', 'Projeto de Lei Ordinária do Legislativo', false, 1); INSERT INTO compilacao_perfilestruturaltextoarticulado (id, sigla, nome, padrao, parent_id) VALUES (4, 'REQ', 'Requerimento', false, null); SELECT pg_catalog.setval('compilacao_perfilestruturaltextoarticulado_id_seq', 4, true); +update compilacao_perfilestruturaltextoarticulado set nome = 'Projeto de Lei Ordinária', sigla = 'PLO' where id = 3; + INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (1, 'Articulação', 'articulacao', '', '', 0, '', '', '', '', '', '', true, 'N', 'N', 'N', 'N', 'N', 'N', '-', '-', '-', '-', '-', true, false); INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (2, 'Ementa', 'ementa', '', '', 0, '', '', '', '', '', '', false, 'N', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false, false); @@ -255,6 +257,13 @@ INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (125, 1, false, 4, -1, false); INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (126, 1, false, 4, -1, false); +INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (122, 119, false, 1, -1, false); +INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (122, 119, false, 1, -1, false); + +INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (122, 119, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (122, 119, false, 2, -1, true); + + INSERT INTO compilacao_tiponota (id, sigla, nome, modelo) VALUES (1, 'NE', 'Nota Explicativa', ''); INSERT INTO compilacao_tiponota (id, sigla, nome, modelo) VALUES (2, 'NI', 'Nota de Inconstitucionalidade', 'Declaração de Inconstitucionalidade conforme n...'); From 71c5023c4fca560c9726966f4239c21fe1e8352b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rog=C3=A9rio=20Fr=C3=A1?= Date: Mon, 5 Dec 2016 09:54:44 -0200 Subject: [PATCH 098/139] Update importacao_25_31.rst --- docs/importacao_25_31.rst | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/docs/importacao_25_31.rst b/docs/importacao_25_31.rst index 8be87ce7c..62850d1bc 100644 --- a/docs/importacao_25_31.rst +++ b/docs/importacao_25_31.rst @@ -1,9 +1,16 @@ Instruções para Importação da base mysql 2.5 ============================================ + +Para entrar no ambiente virtual:: + + workon sapl + + + Instalar Dependências:: - pip install -r requirements/migration-requirements.txt + pip3 install -r requirements/migration-requirements.txt Criar um arquivo sapl/legacy/.env com o seguinte conteúdo (parametros de acesso ao banco 2.5):: @@ -14,9 +21,6 @@ o conteúdo do arquivo será semelhante a isso:: DATABASE_URL = mysql://sapl:sapl@localhost:3306/interlegis -Para entrar no ambiente virtual:: - - workon sapl Posteriormente rodar a seguinte sequencia de comandos estando no ambiente virtual:: From 533842aa24faf4593f30522cd4a2c3198e7951c3 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Tue, 6 Dec 2016 09:13:23 -0200 Subject: [PATCH 099/139] =?UTF-8?q?Altera=20mensagem=20na=20execu=C3=A7?= =?UTF-8?q?=C3=A3o=20de=20./manage.py=20migrate?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/rules/apps.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sapl/rules/apps.py b/sapl/rules/apps.py index d41e308c8..66fd06632 100644 --- a/sapl/rules/apps.py +++ b/sapl/rules/apps.py @@ -215,7 +215,7 @@ def update_groups(app_config, verbosity=2, interactive=True, def update_groups(self): print('') print(string_concat('\033[93m\033[1m', - _('Atualizando grupos:'), + _('Atualizando grupos do SAPL:'), '\033[0m')) for rules_group in self.rules_patterns: group_name = rules_group['group'] From a361c81e3eb9c709d42e954fef89fceceedd1a3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rog=C3=A9rio=20Fr=C3=A1?= Date: Tue, 6 Dec 2016 14:25:15 -0200 Subject: [PATCH 100/139] Update deploy.rst (#857) --- docs/deploy.rst | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/docs/deploy.rst b/docs/deploy.rst index 19c13bbf9..d8f2ec9bb 100644 --- a/docs/deploy.rst +++ b/docs/deploy.rst @@ -6,7 +6,21 @@ Para efeitos deste doc, foram consideradas as tecnologias NGINX + GUNICORN para O NGINX é o servidor WEB, e o GUNICORN é o servidor da aplicação para o servidor WEB. - + + +É altamente recomendável que para produção o SAPL não seja executado em modo debug. +Para isso edite o arquivo ``.env`` criado anteriormente em:: + + sudo nano /var/interlegis/sapl/sapl/.env + +alterando o variável DEBUG para false:: + + DEBUG = False + + +Instalando Pacotes +------------------ + Instalar o NGINX:: sudo apt-get install nginx @@ -79,6 +93,7 @@ Para uma máquina de CPU única o valor seria 3 Para rodar o gunicorn:: + workon sapl /var/interlegis/sapl/.gunicorn_start.sh From 09735ecca37a76331722ad57980f157cf21d5dd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rog=C3=A9rio=20Fr=C3=A1?= Date: Tue, 6 Dec 2016 14:35:31 -0200 Subject: [PATCH 101/139] Update README.rst --- README.rst | 67 +----------------------------------------------------- 1 file changed, 1 insertion(+), 66 deletions(-) diff --git a/README.rst b/README.rst index 5ffdda86f..4e3c2d187 100644 --- a/README.rst +++ b/README.rst @@ -39,75 +39,10 @@ Instruções para Tradução Orientações gerais de implementação =================================== + `Instruções para Implementação `_ -Boas Práticas --------------- -* Utilize a língua portuguesa em todo o código, nas mensagens de commit e na documentação do projeto. -* Mensagens de commit seguem o padrão de 50/72 colunas. Comece toda mensagem de commit com o verbo no infinitivo. Para mais informações, clique nos links abaixo: - - - Http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html - - Http://stackoverflow.com/questions/2290016/git-commit-messages-50-72-formatting - -* Mantenha todo o código de acordo com o padrão da PEP8 (sem exceções). - -* Antes de todo ``git push``: - - - Execute ``git pull --rebase`` (quase sempre). - - Em casos excepcionais, faça somente ``git pull`` para criar um merge. - -* Antes de ``git commit``, sempre: - - - Execute ``./manage.py check`` - - Execute todos os testes com ``py.test`` na pasta raiz do projeto - -* Em caso de Implementação de modelo que envolva a classe ``django.contrib.auth.models.User``, não a use diretamente, use para isso a função ``get_settings_auth_user_model()`` de ``sapl.utils``. Exemplo: - - - no lugar de ``owner = models.ForeignKey(User, ... )`` - - use ``owner = models.ForeignKey(get_settings_auth_user_model(), ... )`` - - - Não use em qualquer modelagem futura, ``ForeignKey`` com ``User`` ou mesmo ``settings.AUTH_USER_MODEL`` sem o import correto que não é o do projeto e sim o que está em ``sapl.utils``, ou seja (``from django.conf import settings``) - - - em https://docs.djangoproject.com/en/1.9/topics/auth/customizing/#referencing-the-user-model é explicado por que ser dessa forma! - - - Já em qualquer uso em implementação de execução, ao fazer uma query, por exemplo: - - - não use ``django.contrib.auth.models.User`` para utilizar as caracteristicas do model, para isso, use esta função: django.contrib.auth.get_user_model() - - - Seguir esses passos simplificará qualquer customização futura que venha a ser feita na autenticação do usuários ao evitar correções de inúmeros import's e ainda, desta forma, torna a funcionalidade de autenticação reimplementável por qualquer outro projeto que venha usar partes ou o todo do SAPL. - -Atenção: - - O usuário do banco de dados ``sapl`` deve ter a permissão ``create database`` no postgres para que os testes tenham sucesso - -* Se você não faz parte da equipe principal, faça o fork deste repositório e envie pull requests. - Todos são bem-vindos para contribuir. Por favor, faça uma pull request separada para cada correção ou criação de novas funcionalidades. - -* Novas funcionalidades estão sujeitas a aprovação, uma vez que elas podem ter impacto em várias pessoas. - Nós sugerimos que você abra uma nova issue para discutir novas funcionalidades. Elas podem ser escritas tanto em Português, quanto em Inglês. - - - -Testes ------- - -* Escrever testes para todas as funcionalidades que você implementar. - -* Manter a cobertura de testes próximo a 100%. - -* Para executar todos os testes você deve entrar em seu virtualenv e executar este comando **na raiz do seu projeto**:: - - py.test - -* Para executar os teste de cobertura use:: - - py.test --cov . --cov-report term --cov-report html && firefox htmlcov/index.html - -* Na primeira vez que for executar os testes após uma migração (``./manage.py migrate``) use a opção de recriação da base de testes. - É necessário fazer usar esta opção apenas uma vez:: - - py.test --create-db Issues ------ From 16f48a6abdf4dcbf62fa5ec64fbec48a0993ce1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rog=C3=A9rio=20Fr=C3=A1?= Date: Tue, 6 Dec 2016 14:32:07 -0200 Subject: [PATCH 102/139] Create implementacoes.rst --- docs/implementacoes.rst | 73 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 docs/implementacoes.rst diff --git a/docs/implementacoes.rst b/docs/implementacoes.rst new file mode 100644 index 000000000..0a8aed013 --- /dev/null +++ b/docs/implementacoes.rst @@ -0,0 +1,73 @@ + +Orientações gerais de implementação +------------------------------------ + + +Boas Práticas +-------------- + +* Utilize a língua portuguesa em todo o código, nas mensagens de commit e na documentação do projeto. + +* Mensagens de commit seguem o padrão de 50/72 colunas. Comece toda mensagem de commit com o verbo no infinitivo. Para mais informações, clique nos links abaixo: + + - Http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html + - Http://stackoverflow.com/questions/2290016/git-commit-messages-50-72-formatting + +* Mantenha todo o código de acordo com o padrão da PEP8 (sem exceções). + +* Antes de todo ``git push``: + + - Execute ``git pull --rebase`` (quase sempre). + - Em casos excepcionais, faça somente ``git pull`` para criar um merge. + +* Antes de ``git commit``, sempre: + + - Execute ``./manage.py check`` + - Execute todos os testes com ``py.test`` na pasta raiz do projeto + +* Em caso de Implementação de modelo que envolva a classe ``django.contrib.auth.models.User``, não a use diretamente, use para isso a função ``get_settings_auth_user_model()`` de ``sapl.utils``. Exemplo: + + - no lugar de ``owner = models.ForeignKey(User, ... )`` + - use ``owner = models.ForeignKey(get_settings_auth_user_model(), ... )`` + + - Não use em qualquer modelagem futura, ``ForeignKey`` com ``User`` ou mesmo ``settings.AUTH_USER_MODEL`` sem o import correto que não é o do projeto e sim o que está em ``sapl.utils``, ou seja (``from django.conf import settings``) + + - em https://docs.djangoproject.com/en/1.9/topics/auth/customizing/#referencing-the-user-model é explicado por que ser dessa forma! + + - Já em qualquer uso em implementação de execução, ao fazer uma query, por exemplo: + + - não use ``django.contrib.auth.models.User`` para utilizar as caracteristicas do model, para isso, use esta função: django.contrib.auth.get_user_model() + + - Seguir esses passos simplificará qualquer customização futura que venha a ser feita na autenticação do usuários ao evitar correções de inúmeros import's e ainda, desta forma, torna a funcionalidade de autenticação reimplementável por qualquer outro projeto que venha usar partes ou o todo do SAPL. + +Atenção: + + O usuário do banco de dados ``sapl`` deve ter a permissão ``create database`` no postgres para que os testes tenham sucesso + +* Se você não faz parte da equipe principal, faça o fork deste repositório e envie pull requests. + Todos são bem-vindos para contribuir. Por favor, faça uma pull request separada para cada correção ou criação de novas funcionalidades. + +* Novas funcionalidades estão sujeitas a aprovação, uma vez que elas podem ter impacto em várias pessoas. + Nós sugerimos que você abra uma nova issue para discutir novas funcionalidades. Elas podem ser escritas tanto em Português, quanto em Inglês. + + + +Testes +------ + +* Escrever testes para todas as funcionalidades que você implementar. + +* Manter a cobertura de testes próximo a 100%. + +* Para executar todos os testes você deve entrar em seu virtualenv e executar este comando **na raiz do seu projeto**:: + + py.test + +* Para executar os teste de cobertura use:: + + py.test --cov . --cov-report term --cov-report html && firefox htmlcov/index.html + +* Na primeira vez que for executar os testes após uma migração (``./manage.py migrate``) use a opção de recriação da base de testes. + É necessário fazer usar esta opção apenas uma vez:: + + py.test --create-db From 73c8f0a5cd1176adc5abbf7b7e0fc83951d6dbfd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rog=C3=A9rio=20Fr=C3=A1?= Date: Wed, 7 Dec 2016 14:14:50 -0200 Subject: [PATCH 103/139] Update models.py --- sapl/sessao/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sapl/sessao/models.py b/sapl/sessao/models.py index f29194710..2ad10beed 100644 --- a/sapl/sessao/models.py +++ b/sapl/sessao/models.py @@ -31,7 +31,7 @@ class Bancada(models.Model): legislatura = models.ForeignKey(Legislatura, verbose_name=_('Legislatura')) nome = models.CharField( max_length=80, - verbose_name=_('Nome da Bancada, Bloco, ou Frente')) + verbose_name=_('Nome da Bancada')) partido = models.ForeignKey(Partido, blank=True, null=True, verbose_name=_('Partido')) data_criacao = models.DateField(blank=True, null=True, From cfa183e5546134415eff2819358fbf8fc5819524 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rog=C3=A9rio=20Fr=C3=A1?= Date: Wed, 7 Dec 2016 14:33:10 -0200 Subject: [PATCH 104/139] Create howtogit.rst --- docs/howtogit.rst | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 docs/howtogit.rst diff --git a/docs/howtogit.rst b/docs/howtogit.rst new file mode 100644 index 000000000..926d3193b --- /dev/null +++ b/docs/howtogit.rst @@ -0,0 +1,41 @@ +De forma muito simples e em linhas gerais o básico sobre GIT + +Glosário +--------- + + Git - Sistema de controle de versão de aquivos + + GitHub - É um serviço web que oferece diversas funcionalidades extras aplicadas ao git + + Branch - Significa ramificar seu projeto, criar um snapshot. + + Merge - Significa incorporar seu branch no master + + +Pode ser útil +------------- + +Atualizar a base local: + + git pull --rebase git://github.com/interlegis/sapl + +Exibir informações: + + git status + + +Na base local descartar alguma alteração feita nos arquivos: + + git checkout sapl/legacy_migration_settings.py + +Atualizar para alguma brach especifica (ex:785-atualizar-migracao): + + git checkout 785-atualizar-migracao + +Voltar para a branch master + + git checkout master + +Verificar 5 ultimos comits: + + git log --oneline -n 5 From f4bdabfdcdab36d32749fb0bd8b15526c18456a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rog=C3=A9rio=20Fr=C3=A1?= Date: Wed, 7 Dec 2016 14:35:35 -0200 Subject: [PATCH 105/139] Update README.rst --- README.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.rst b/README.rst index 4e3c2d187..8717e7086 100644 --- a/README.rst +++ b/README.rst @@ -43,6 +43,11 @@ Orientações gerais de implementação +Orientações gerais sobre o GitHub +=================================== + `Instruções para GitHub `_ + + Issues ------ From bf203d8ffeb7e321087a09caf7f909e022b3b01f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rog=C3=A9rio=20Fr=C3=A1?= Date: Wed, 7 Dec 2016 15:23:59 -0200 Subject: [PATCH 106/139] Update views.py --- sapl/materia/views.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sapl/materia/views.py b/sapl/materia/views.py index 5d1a71eb4..cef5e6622 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -1149,8 +1149,8 @@ class MateriaLegislativaPesquisaView(FilterView): lista = filtra_tramitacao_destino(unidade_destino) qs = qs.filter(id__in=lista).distinct() - if 'o' not in self.request.GET: - qs = qs.order_by('tipo', 'ano', 'numero') + if 'o' in self.request.GET and not self.request.GET['o']: + qs = qs.order_by('-ano', '-numero') kwargs.update({ 'queryset': qs, From 3a306f8da4c4885f83b88566c3efca6ab05f3023 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rog=C3=A9rio=20Fr=C3=A1?= Date: Wed, 7 Dec 2016 16:00:31 -0200 Subject: [PATCH 107/139] ordena pesquisa doc administrativo -data --- sapl/protocoloadm/views.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sapl/protocoloadm/views.py b/sapl/protocoloadm/views.py index 87a1a3710..33bade736 100644 --- a/sapl/protocoloadm/views.py +++ b/sapl/protocoloadm/views.py @@ -403,6 +403,9 @@ class PesquisarDocumentoAdministrativoView(DocumentoAdministrativoMixin, qs = self.get_queryset() qs = qs.distinct() + + if 'o' in self.request.GET and not self.request.GET['o']: + qs = qs.order_by('-ano', '-numero') kwargs.update({ 'queryset': qs, From 940c193fe3f04e7d1477e4e499f46188028195a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rog=C3=A9rio=20Fr=C3=A1?= Date: Wed, 7 Dec 2016 16:08:43 -0200 Subject: [PATCH 108/139] resultado pesquisa protocolo data decrescente --- sapl/protocoloadm/views.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sapl/protocoloadm/views.py b/sapl/protocoloadm/views.py index 33bade736..3c9f592dd 100644 --- a/sapl/protocoloadm/views.py +++ b/sapl/protocoloadm/views.py @@ -92,6 +92,9 @@ class ProtocoloPesquisaView(PermissionRequiredMixin, FilterView): qs = self.get_queryset().order_by('ano', 'numero') qs = qs.distinct() + + if 'o' in self.request.GET and not self.request.GET['o']: + qs = qs.order_by('-ano', '-numero') kwargs.update({ 'queryset': qs, From fa6894112ff8f0581699d6bab24ed372f8904f85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rog=C3=A9rio=20Fr=C3=A1?= Date: Thu, 8 Dec 2016 08:43:25 -0200 Subject: [PATCH 109/139] Update forms.py --- sapl/protocoloadm/forms.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/sapl/protocoloadm/forms.py b/sapl/protocoloadm/forms.py index 3e8a44ec5..539c89f50 100644 --- a/sapl/protocoloadm/forms.py +++ b/sapl/protocoloadm/forms.py @@ -275,7 +275,7 @@ class ProtocoloDocumentForm(ModelForm): tipo_documento = forms.ModelChoiceField( label=_('Tipo de Documento'), - required=False, + required=True, queryset=TipoDocumentoAdministrativo.objects.all(), empty_label='Selecione', ) @@ -332,6 +332,19 @@ class ProtocoloDocumentForm(ModelForm): class ProtocoloMateriaForm(ModelForm): autor = forms.IntegerField(widget=forms.HiddenInput(), required=False) + + tipo_materia = forms.ModelChoiceField( + label=_('Tipo de Matéria'), + required=True, + queryset=TipoDocumentoAdministrativo.objects.all(), + empty_label='Selecione', + ) + + numero_paginas = forms.CharField(label=_('Núm. Páginas'), required=True) + + observacao = forms.CharField(required=True, + widget=forms.Textarea, label='Observação') + def clean_autor(self): autor_field = self.cleaned_data['autor'] From 7ac8fc6a134e3a9c27cf81eef854b38523472de9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rog=C3=A9rio=20Fr=C3=A1?= Date: Thu, 8 Dec 2016 09:22:27 -0200 Subject: [PATCH 110/139] Update forms.py --- sapl/protocoloadm/forms.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sapl/protocoloadm/forms.py b/sapl/protocoloadm/forms.py index 539c89f50..1003786d1 100644 --- a/sapl/protocoloadm/forms.py +++ b/sapl/protocoloadm/forms.py @@ -336,7 +336,7 @@ class ProtocoloMateriaForm(ModelForm): tipo_materia = forms.ModelChoiceField( label=_('Tipo de Matéria'), required=True, - queryset=TipoDocumentoAdministrativo.objects.all(), + queryset=TipoMateriaLegislativa.objects.all(), empty_label='Selecione', ) From a6c6c0dc095a8d5d238d692d3ffa31226de449d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rog=C3=A9rio=20Fr=C3=A1?= Date: Thu, 8 Dec 2016 09:34:49 -0200 Subject: [PATCH 111/139] Update forms.py --- sapl/protocoloadm/forms.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/sapl/protocoloadm/forms.py b/sapl/protocoloadm/forms.py index 1003786d1..4713902df 100644 --- a/sapl/protocoloadm/forms.py +++ b/sapl/protocoloadm/forms.py @@ -12,13 +12,14 @@ from django.utils.translation import ugettext_lazy as _ from sapl.base.models import Autor from sapl.crispy_layout_mixin import form_actions, to_row -from sapl.materia.models import UnidadeTramitacao +from sapl.materia.models import UnidadeTramitacao, TipoMateriaLegislativa +from sapl.materia.models import TipoMateriaLegislativa from sapl.utils import (RANGE_ANOS, AnoNumeroOrderingFilter, RangeWidgetOverride, autor_label, autor_modal) from .models import (DocumentoAcessorioAdministrativo, DocumentoAdministrativo, Protocolo, TipoDocumentoAdministrativo, - TramitacaoAdministrativo) + TramitacaoAdministrativo, TipoMateriaLegislativa) TIPOS_PROTOCOLO = [('0', 'Enviado'), ('1', 'Recebido'), ('', 'Ambos')] TIPOS_PROTOCOLO_CREATE = [('0', 'Enviado'), ('1', 'Recebido')] From 60a719f7cfc7e37b1023c26593639195fb7aca40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rog=C3=A9rio=20Fr=C3=A1?= Date: Thu, 8 Dec 2016 09:37:30 -0200 Subject: [PATCH 112/139] Update forms.py --- sapl/protocoloadm/forms.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sapl/protocoloadm/forms.py b/sapl/protocoloadm/forms.py index 4713902df..bdf24e201 100644 --- a/sapl/protocoloadm/forms.py +++ b/sapl/protocoloadm/forms.py @@ -19,7 +19,7 @@ from sapl.utils import (RANGE_ANOS, AnoNumeroOrderingFilter, from .models import (DocumentoAcessorioAdministrativo, DocumentoAdministrativo, Protocolo, TipoDocumentoAdministrativo, - TramitacaoAdministrativo, TipoMateriaLegislativa) + TramitacaoAdministrativo) TIPOS_PROTOCOLO = [('0', 'Enviado'), ('1', 'Recebido'), ('', 'Ambos')] TIPOS_PROTOCOLO_CREATE = [('0', 'Enviado'), ('1', 'Recebido')] From f3ef458b65e88314a47268ed827c8536c9edea13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rog=C3=A9rio=20Fr=C3=A1?= Date: Thu, 8 Dec 2016 09:39:00 -0200 Subject: [PATCH 113/139] Update forms.py --- sapl/protocoloadm/forms.py | 1 - 1 file changed, 1 deletion(-) diff --git a/sapl/protocoloadm/forms.py b/sapl/protocoloadm/forms.py index bdf24e201..300078e20 100644 --- a/sapl/protocoloadm/forms.py +++ b/sapl/protocoloadm/forms.py @@ -13,7 +13,6 @@ from django.utils.translation import ugettext_lazy as _ from sapl.base.models import Autor from sapl.crispy_layout_mixin import form_actions, to_row from sapl.materia.models import UnidadeTramitacao, TipoMateriaLegislativa -from sapl.materia.models import TipoMateriaLegislativa from sapl.utils import (RANGE_ANOS, AnoNumeroOrderingFilter, RangeWidgetOverride, autor_label, autor_modal) From 2a29c596c08162f50da75bd9521d7f4da8727eed Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Thu, 8 Dec 2016 15:20:22 -0200 Subject: [PATCH 114/139] =?UTF-8?q?Separa=20identa=C3=A7=C3=A3o=20em=20cla?= =?UTF-8?q?ss=20css=20aparte?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/compilacao/views.py | 3 ++- sapl/static/js/app.js | 6 +++--- sapl/static/js/compilacao.js | 4 ---- sapl/static/js/compilacao_view.js | 8 +++++++- sapl/static/styles/compilacao.scss | 16 ++++++++-------- sapl/templates/compilacao/text_list.html | 6 ++++-- sapl/templates/compilacao/text_list_bloco.html | 2 +- 7 files changed, 25 insertions(+), 20 deletions(-) diff --git a/sapl/compilacao/views.py b/sapl/compilacao/views.py index 67c37adcd..bfb0903d9 100644 --- a/sapl/compilacao/views.py +++ b/sapl/compilacao/views.py @@ -1154,9 +1154,10 @@ class TextEditView(CompMixin, TemplateView): result = Dispositivo.objects.filter(ta_id=self.kwargs['ta_id']) if not result.exists(): + # FIXME a inserção básica deve ser refatorada para não depender + # das classes css ta = self.object - td = TipoDispositivo.objects.filter(class_css='articulacao')[0] a = Dispositivo() a.nivel = 0 diff --git a/sapl/static/js/app.js b/sapl/static/js/app.js index 9b7f2297d..139806ffb 100644 --- a/sapl/static/js/app.js +++ b/sapl/static/js/app.js @@ -13,9 +13,9 @@ function initTinymce(elements, readonly=false) { } if (readonly) { - config_tinymce.readonly = 1, - config_tinymce.menubar = false, - config_tinymce.toolbar = false + config_tinymce.readonly = 1; + config_tinymce.menubar = false; + config_tinymce.toolbar = false; } if (elements != null) { diff --git a/sapl/static/js/compilacao.js b/sapl/static/js/compilacao.js index 6d797ea41..fb9104917 100644 --- a/sapl/static/js/compilacao.js +++ b/sapl/static/js/compilacao.js @@ -22,12 +22,8 @@ function insertWaitAjax(element) { jQuery(element).append('
    '); } - - function DispostivoSearch(opts) { - $(function() { - var container_ds = $('body').children("#container_ds"); if (container_ds.length > 0) $(container_ds).remove(); diff --git a/sapl/static/js/compilacao_view.js b/sapl/static/js/compilacao_view.js index ffb96dd8b..e4860bb76 100644 --- a/sapl/static/js/compilacao_view.js +++ b/sapl/static/js/compilacao_view.js @@ -142,6 +142,7 @@ function textoVigente(item, link) { } $(document).ready(function() { + setTimeout(function() { var href = location.href.split('#') if (href.length == 2) { @@ -155,7 +156,6 @@ $(document).ready(function() { } }, 100); - $("#btn_font_menos").click(function() { $(".dpt").css("font-size", "-=1"); }); @@ -169,4 +169,10 @@ $(document).ready(function() { $(this).css('z-index', 15-nivel) }); + + + /*$(".indent").each(function() { + $(this).removeClass('indent'); + $(this.parentElement).addClass('indent'); + });*/ }); diff --git a/sapl/static/styles/compilacao.scss b/sapl/static/styles/compilacao.scss index ac397b0a8..946852703 100644 --- a/sapl/static/styles/compilacao.scss +++ b/sapl/static/styles/compilacao.scss @@ -165,7 +165,6 @@ a:link:after, a:visited:after { .cp { .desativado { - .dtxt, .dtxt *, .dpt-link, .dpt-link * { text-decoration: line-through; color: #999 !important; @@ -180,6 +179,7 @@ a:link:after, a:visited:after { text-decoration: none; cursor: pointer; } + .diff { .desativado, .desativado * { text-decoration: line-through; @@ -194,7 +194,9 @@ a:link:after, a:visited:after { .dpt { font-size:1em; position: relative; - + &.indent { + padding-left: 1em; + } .ementa { padding: 2em 0em 2em 35%; font-weight: bold; @@ -259,26 +261,22 @@ a:link:after, a:visited:after { } .paragrafo { - padding-left: 1.5em; font-size: 1.1em; margin-top: 0.2222em; } .inciso { font-size: 1.1em; - padding-left: 2.5em; margin-top: 0.1667em; } .alinea { font-size: 1.0em; - padding-left: 3.5em; margin-top: 2px; } .item { font-size: 1.0em; - padding-left: 4.5em; margin-top: 2px; } @@ -294,6 +292,7 @@ a:link:after, a:visited:after { a, table, table td { color: #018 !important; } + } .dn { /* Notas de Dispositivo*/ @@ -376,7 +375,6 @@ a:link:after, a:visited:after { &:hover { display: block; - * { display: block; } @@ -524,6 +522,7 @@ a:link:after, a:visited:after { color: #02baf2 !important; } } + .dpt { display: block; & > .dpt-actions-fixed { @@ -592,6 +591,7 @@ a:link:after, a:visited:after { } } } /* fim .dpt */ + .dpt-alts { margin: 0; margin-bottom: 1em; @@ -768,7 +768,7 @@ a:link:after, a:visited:after { } } -.cp.cpe1 { +.cp.cpe1_old_apagar { margin-bottom: 15em; diff --git a/sapl/templates/compilacao/text_list.html b/sapl/templates/compilacao/text_list.html index b091c70e5..7d3526cc1 100644 --- a/sapl/templates/compilacao/text_list.html +++ b/sapl/templates/compilacao/text_list.html @@ -113,13 +113,15 @@ {% endblock base_content %} - - {% block foot_js %} + {{block.super}} + + {% if perms.compilacao.add_nota %} {% endif %} + {% endblock %} diff --git a/sapl/templates/compilacao/text_list_bloco.html b/sapl/templates/compilacao/text_list_bloco.html index 9ea6f507e..41f6de04b 100644 --- a/sapl/templates/compilacao/text_list_bloco.html +++ b/sapl/templates/compilacao/text_list_bloco.html @@ -13,7 +13,7 @@ {% if forloop.first and not view|isinst:'TextView' %} {% else %} -
    +
    {% endif%} {% spaceless %} From 3bcde83c87d453c960fe6b9801cf3a2d47969034 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Thu, 8 Dec 2016 15:22:31 -0200 Subject: [PATCH 115/139] Add indent a alguns tipos de dispositivos --- sapl/compilacao/compilacao_data_tables.sql | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/sapl/compilacao/compilacao_data_tables.sql b/sapl/compilacao/compilacao_data_tables.sql index d5754839a..663dbc682 100644 --- a/sapl/compilacao/compilacao_data_tables.sql +++ b/sapl/compilacao/compilacao_data_tables.sql @@ -23,10 +23,10 @@ INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (117, 'SubSeção', 'subsecao', '', 'SubSeção ', 0, '', '
    ', '', '
    ', '
    ', '', false, '1', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false, false); INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (119, 'Artigo', 'artigo', '', 'Art. ', 9, '.', ' – ', '', '', '', '', true, '1', 'A', '1', '1', '1', '1', '-', '-', '-', '-', '-', true, false); INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (120, 'Caput', 'caput', '', '', 0, '', '', '', '', '', '', false, 'N', 'N', 'N', 'N', 'N', 'N', '-', '-', '-', '-', '-', false, false); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (121, 'Parágrafo', 'paragrafo', '', '§ ;Parágrafo Único ', 9, '', ' – ', '', '', '', '', false, '1', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false, false); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (122, 'Inciso', 'inciso', '', '', 0, '', ' – ', '', '', '', '', false, 'I', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false, false); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (123, 'Alinea', 'alinea', '', '', 0, ')', ' – ', '', '', '', '', false, 'a', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false, false); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (124, 'Item', 'item', '', '', 0, '', ' – ', '', '', '', '', false, '1', '1', '1', '1', '1', '1', '.', '.', '.', '.', '.', false, false); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (121, 'Parágrafo', 'paragrafo indent', '', '§ ;Parágrafo Único ', 9, '', ' – ', '', '', '', '', false, '1', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false, false); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (122, 'Inciso', 'inciso indent', '', '', 0, '', ' – ', '', '', '', '', false, 'I', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false, false); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (123, 'Alinea', 'alinea indent', '', '', 0, ')', ' – ', '', '', '', '', false, 'a', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false, false); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (124, 'Item', 'item indent', '', '', 0, '', ' – ', '', '', '', '', false, '1', '1', '1', '1', '1', '1', '.', '.', '.', '.', '.', false, false); INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (125, 'Texto Não Estruturado', 'texto_n_estruturado', '', '', 0, '', '', '', '', '', '', true, 'N', 'N', 'N', 'N', 'N', 'N', '-', '-', '-', '-', '-', false, false); INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (126, 'Justificativa', 'justificativa', '', '', 0, '', '', '', '
    Justificativa
    ', '', '', true, 'N', 'N', 'N', 'N', 'N', 'N', '-', '-', '-', '-', '-', false, false); From 4df627a750e87434af3853f8d3cf7ba3120cf053 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Wed, 14 Dec 2016 09:37:16 -0200 Subject: [PATCH 116/139] Fix #869 --- sapl/parlamentares/views.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/sapl/parlamentares/views.py b/sapl/parlamentares/views.py index b461cdbee..21c171c68 100644 --- a/sapl/parlamentares/views.py +++ b/sapl/parlamentares/views.py @@ -416,12 +416,13 @@ class MesaDiretoraView(FormView): [p.parlamentar for p in parlamentares]) - set( parlamentares_ocupados)) - sessao_selecionada = SessaoLegislativa.objects.get( + sessao_sel = SessaoLegislativa.objects.get( id=int(request.POST['sessao'])) - if str(sessao_selecionada.legislatura_id) != int( - request.POST['legislatura']): - sessao_selecionada = SessaoLegislativa.objects.filter( + + if str(sessao_sel.legislatura_id) != request.POST['legislatura']: + sessao_sel = SessaoLegislativa.objects.filter( legislatura=Legislatura.objects.first()).first() + return self.render_to_response( {'legislaturas': Legislatura.objects.all( ).order_by('-numero'), @@ -429,7 +430,7 @@ class MesaDiretoraView(FormView): id=int(request.POST['legislatura'])), 'sessoes': SessaoLegislativa.objects.filter( legislatura_id=int(request.POST['legislatura'])), - 'sessao_selecionada': sessao_selecionada, + 'sessao_selecionada': sessao_sel, 'composicao_mesa': mesa, 'parlamentares': parlamentares_vagos, 'cargos_vagos': cargos_vagos From 9e75b78244e8a6134614532ff0c497e2d4f962df Mon Sep 17 00:00:00 2001 From: Eduardo Edson Batista Cordeiro Alves Date: Wed, 14 Dec 2016 10:00:03 -0200 Subject: [PATCH 117/139] Fix #837 --- sapl/materia/views.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sapl/materia/views.py b/sapl/materia/views.py index cef5e6622..22dc20bee 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -1512,6 +1512,9 @@ class PrimeiraTramitacaoEmLoteView(PermissionRequiredMixin, FilterView): context['unidade_local'] = [UnidadeTramitacao.objects.get( id=qr['tramitacao__unidade_tramitacao_destino'])] + context['object_list'] = context['object_list'].order_by( + 'ano', 'numero') + context['filter_url'] = ('&' + qr.urlencode()) if len(qr) > 0 else '' return context From 96087659cbb107711813e19868a104966a3b52f6 Mon Sep 17 00:00:00 2001 From: Eduardo Edson Batista Cordeiro Alves Date: Wed, 14 Dec 2016 10:10:57 -0200 Subject: [PATCH 118/139] Fix #839 --- .../documentoadministrativo_filter.html | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/sapl/templates/protocoloadm/documentoadministrativo_filter.html b/sapl/templates/protocoloadm/documentoadministrativo_filter.html index c7f3debac..9849c3444 100644 --- a/sapl/templates/protocoloadm/documentoadministrativo_filter.html +++ b/sapl/templates/protocoloadm/documentoadministrativo_filter.html @@ -6,10 +6,11 @@ {% block sections_nav %} {% endblock %} {% block actions %} -

    Documentos Administrativos

    {% if filter_url %} @@ -18,8 +19,10 @@
    {% endif %} {% endblock actions %} -{% block base_content %} + +{% block detail_content %} {% if not filter_url %} {% crispy filter.form %} {% endif %} + {% if filter_url %}

    Tipo Descrição AutorVínculoMotivo da Devolução
    {{ prop.tipo.descricao }} {{ prop.descricao }} {{ prop.autor }} - {% if prop.materia_gerada %} - {{ prop.materia_gerada.tipo.sigla }} {{ prop.materia_gerada.numero }}/{{ prop.materia_gerada.ano }} - {% elif prop.documento_gerado %} - {{ prop.documento_gerado.materia.tipo.sigla }} {{ prop.documento_gerado.materia.numero }}/{{ prop.documento_gerado.materia.ano }} - {% endif %} + {{ prop.justificativa_devolucao}}
    Data / Horário{{ protocolo.data|date:"d/m/Y" }} - {{ protocolo.timestamp|date:"H:m:s" }}{{ protocolo.data|date:"d/m/Y" }} - {{ protocolo.timestamp|date:"H:i:s" }}
    Ementa
    Tipo Descrição AutorVínculoMotivo da Devolução
    {{ prop.tipo.descricao }} {{ prop.descricao }} {{ prop.autor }} - {% if prop.materia_gerada %} - {{ prop.materia_gerada.tipo.sigla }} {{ prop.materia_gerada.numero }}/{{ prop.materia_gerada.ano }} - {% elif prop.documento_gerado %} - {{ prop.documento_gerado.materia.tipo.sigla }} {{ prop.documento_gerado.materia.numero }}/{{ prop.documento_gerado.materia.ano }} - {% endif %} + {{ prop.justificativa_devolucao}}
    Data / Horário{{ protocolo.data|date:"d/m/Y" }} - {{ protocolo.timestamp|date:"H:m:s" }}{{ protocolo.data|date:"d/m/Y" }} - {{ protocolo.timestamp|date:"H:i:s" }}
    Ementa
    Data / Horário {{ protocolo.data|date:"d/m/Y" }} - {{ protocolo.timestamp|date:"H:i:s" }}
    Ementa{{ protocolo.assunto_ementa }}
    Interessado{{ protocolo.interessado }}
    Ementa{{ protocolo.assunto_ementa }}
    Interessado{{ protocolo.interessado }}
    Natureza - {% if protocolo.tipo_protocolo == 0 %} Administrativo {% elif protocolo.tipo_protocolo == 1 %} Matéria Legislativa {% endif %} + {% if protocolo.tipo_processo == 0 %} Administrativo {% elif protocolo.tipo_processo == 1 %} Legislativo {% endif %}
    Tipo Documento{{ protocolo.tipo_documento }}{% if protocolo.tipo_documento %} Tipo Documento {% else %} Tipo Matéria {% endif %}{% if protocolo.tipo_documento %} {{protocolo.tipo_documento}} {% else %} {{protocolo.tipo_materia}} {% endif %}
    Número Páginas
    @@ -45,4 +48,4 @@

    Resultados

    {% include "paginacao.html" %} {% endif %} -{% endblock base_content %} +{% endblock detail_content %} From b936a6d9f9b66798a18adfc9415c31530fafd72c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rog=C3=A9rio=20Fr=C3=A1?= Date: Wed, 14 Dec 2016 09:22:18 -0200 Subject: [PATCH 119/139] =?UTF-8?q?Lista=20materia=20ordem=20alfab=C3=A9ti?= =?UTF-8?q?ca?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/materia/models.py | 1 + 1 file changed, 1 insertion(+) diff --git a/sapl/materia/models.py b/sapl/materia/models.py index 48604629c..e9cfcf452 100644 --- a/sapl/materia/models.py +++ b/sapl/materia/models.py @@ -83,6 +83,7 @@ class TipoMateriaLegislativa(models.Model): class Meta: verbose_name = _('Tipo de Matéria Legislativa') verbose_name_plural = _('Tipos de Matérias Legislativas') + ordering = ['descricao'] def __str__(self): return self.descricao From 889cc995698968ad8a6fd2a8e68099d84ead7c9f Mon Sep 17 00:00:00 2001 From: Eduardo Edson Batista Cordeiro Alves Date: Wed, 14 Dec 2016 10:17:25 -0200 Subject: [PATCH 120/139] Fix #851 --- sapl/protocoloadm/forms.py | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/sapl/protocoloadm/forms.py b/sapl/protocoloadm/forms.py index 300078e20..375229710 100644 --- a/sapl/protocoloadm/forms.py +++ b/sapl/protocoloadm/forms.py @@ -12,7 +12,7 @@ from django.utils.translation import ugettext_lazy as _ from sapl.base.models import Autor from sapl.crispy_layout_mixin import form_actions, to_row -from sapl.materia.models import UnidadeTramitacao, TipoMateriaLegislativa +from sapl.materia.models import TipoMateriaLegislativa, UnidadeTramitacao from sapl.utils import (RANGE_ANOS, AnoNumeroOrderingFilter, RangeWidgetOverride, autor_label, autor_modal) @@ -332,19 +332,21 @@ class ProtocoloDocumentForm(ModelForm): class ProtocoloMateriaForm(ModelForm): autor = forms.IntegerField(widget=forms.HiddenInput(), required=False) - + tipo_materia = forms.ModelChoiceField( label=_('Tipo de Matéria'), required=True, queryset=TipoMateriaLegislativa.objects.all(), empty_label='Selecione', ) - + numero_paginas = forms.CharField(label=_('Núm. Páginas'), required=True) - - observacao = forms.CharField(required=True, + + observacao = forms.CharField(required=False, widget=forms.Textarea, label='Observação') + assunto_ementa = forms.CharField(required=True, + widget=forms.Textarea, label='Ementa') def clean_autor(self): autor_field = self.cleaned_data['autor'] @@ -361,6 +363,7 @@ class ProtocoloMateriaForm(ModelForm): fields = ['tipo_materia', 'numero_paginas', 'autor', + 'assunto_ementa', 'observacao'] def __init__(self, *args, **kwargs): @@ -377,19 +380,15 @@ class ProtocoloMateriaForm(ModelForm): 'limpar Autor', css_class='btn btn-primary btn-sm'), 10)]) row3 = to_row( + [('assunto_ementa', 12)]) + row4 = to_row( [('observacao', 12)]) self.helper = FormHelper() self.helper.layout = Layout( Fieldset(_('Identificação da Matéria'), - row1, - HTML(autor_label), - HTML(autor_modal), - row2, - row3, - form_actions(save_label='Protocolar Matéria') - ) - ) + row1, HTML(autor_label), HTML(autor_modal), row2, row3, + row4, form_actions(save_label='Protocolar Matéria'))) super(ProtocoloMateriaForm, self).__init__( *args, **kwargs) From faf6fe3bee30d1cdd916facacb71acf1f3e3317e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rog=C3=A9rio=20Fr=C3=A1?= Date: Wed, 14 Dec 2016 10:23:20 -0200 Subject: [PATCH 121/139] =?UTF-8?q?Lista=20tipo=20norma=20em=20ordem=20alf?= =?UTF-8?q?ab=C3=A9tica?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/norma/models.py | 1 + 1 file changed, 1 insertion(+) diff --git a/sapl/norma/models.py b/sapl/norma/models.py index 442340540..4d9780038 100644 --- a/sapl/norma/models.py +++ b/sapl/norma/models.py @@ -50,6 +50,7 @@ class TipoNormaJuridica(models.Model): class Meta: verbose_name = _('Tipo de Norma Jurídica') verbose_name_plural = _('Tipos de Norma Jurídica') + ordering = ['descricao'] def __str__(self): return self.descricao From fe172c7e2d406633feef8d52db987948191a6c53 Mon Sep 17 00:00:00 2001 From: Eduardo Edson Batista Cordeiro Alves Date: Wed, 14 Dec 2016 10:26:15 -0200 Subject: [PATCH 122/139] Fix #841 --- .../protocoloadm/protocolo_filter.html | 5 ++--- .../protocoloadm/protocolo_mostrar.html | 18 +++++++++--------- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/sapl/templates/protocoloadm/protocolo_filter.html b/sapl/templates/protocoloadm/protocolo_filter.html index 820ad300e..a3465992f 100644 --- a/sapl/templates/protocoloadm/protocolo_filter.html +++ b/sapl/templates/protocoloadm/protocolo_filter.html @@ -45,9 +45,8 @@ Interessado: {{ p.interessado }}
    Natureza do Processo: {% if p.tipo_processo == 0 %} Administrativo {% elif p.tipo_processo == 1 %} Matéria Legislativa {% endif %}
    - Classificação: - - {{ p.tipo_documento|default_if_none:p.tipo_materia }}
    + Classificação: {{ p.tipo_documento|default_if_none:p.tipo_materia }}
    + Anulado: {% if p.anulado %} Sim {% else %} Não {% endif %} {% endfor %} diff --git a/sapl/templates/protocoloadm/protocolo_mostrar.html b/sapl/templates/protocoloadm/protocolo_mostrar.html index a48a7d29a..8e054d31e 100644 --- a/sapl/templates/protocoloadm/protocolo_mostrar.html +++ b/sapl/templates/protocoloadm/protocolo_mostrar.html @@ -3,16 +3,16 @@ {% load crispy_forms_tags %} {% block detail_content %} - Protocolo:{{ protocolo.numero|stringformat:'06d' }}/{{ protocolo.ano }}
    - Assunto: {{ protocolo.assunto_ementa|default:" Não informado." }}
    - Data Protocolo: {{ protocolo.data|date:"d/m/Y" }} - Horário: {{ protocolo.hora|date:"H:i" }}
    - Interessado: {{ protocolo.interessado|default:" Não informado." }}
    + Protocolo: {{ protocolo.numero|stringformat:'06d' }}/{{ protocolo.ano }}
    + Assunto: {{ protocolo.assunto_ementa|default:" Não informado." }}
    + Data Protocolo: {{ protocolo.data|date:"d/m/Y" }} - Horário: {{ protocolo.hora|date:"H:i" }}
    + Interessado: {{ protocolo.interessado|default:" Não informado." }}
    - Natureza do Processo:{% if protocolo.tipo_processo == 0 %} Administrativo {% elif protocolo.tipo_processo == 1 %} Legislativo {% endif %}
    - Número de Páginas: {{ protocolo.numero_paginas }}
    - Observação:{{ protocolo.observacao|default:" Não informado." }}
    - -
    + Natureza do Processo: {% if protocolo.tipo_processo == 0 %} Administrativo {% elif protocolo.tipo_processo == 1 %} Legislativo {% endif %}
    + Número de Páginas: {{ protocolo.numero_paginas }}
    + Observação: {{ protocolo.observacao|default:" Não informado." }}
    + Anulado: {% if protocolo.anulado %} Sim {% else %} Não {% endif %} +

    Documento Vinculado: From 45dd89939918b22a5626e41c9eb21d5c634f9769 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rog=C3=A9rio=20Fr=C3=A1?= Date: Wed, 14 Dec 2016 10:34:07 -0200 Subject: [PATCH 123/139] =?UTF-8?q?ordena=20list=20tipo=20doc=20adm=20orde?= =?UTF-8?q?m=20alfab=C3=A9tica?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/protocoloadm/models.py | 1 + 1 file changed, 1 insertion(+) diff --git a/sapl/protocoloadm/models.py b/sapl/protocoloadm/models.py index d472155ed..f3d0a56c2 100644 --- a/sapl/protocoloadm/models.py +++ b/sapl/protocoloadm/models.py @@ -14,6 +14,7 @@ class TipoDocumentoAdministrativo(models.Model): class Meta: verbose_name = _('Tipo de Documento Administrativo') verbose_name_plural = _('Tipos de Documento Administrativo') + ordering = ['descricao'] def __str__(self): return self.descricao From e6faba03753c42612ea0cc4451ac0ee1bff02dcd Mon Sep 17 00:00:00 2001 From: Eduardo Edson Batista Cordeiro Alves Date: Wed, 14 Dec 2016 10:42:51 -0200 Subject: [PATCH 124/139] Completa #841 --- sapl/templates/protocoloadm/protocolo_mostrar.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sapl/templates/protocoloadm/protocolo_mostrar.html b/sapl/templates/protocoloadm/protocolo_mostrar.html index 8e054d31e..6cde6a297 100644 --- a/sapl/templates/protocoloadm/protocolo_mostrar.html +++ b/sapl/templates/protocoloadm/protocolo_mostrar.html @@ -22,7 +22,7 @@
    {% else %}
    - Criar Documento + {% if not protocolo.anulado %} Criar Documento{% endif %} {% endif %} {% elif protocolo.tipo_materia %} {% if materia %} @@ -30,7 +30,7 @@
    {% else %}
    - Criar Matéria + {% if not protocolo.anulado %}Criar Matéria{% endif %} {% endif %} {% endif %} From 33e7370e01f6c71190179a5c45fd358ce0c0a241 Mon Sep 17 00:00:00 2001 From: Eduardo Edson Batista Cordeiro Alves Date: Wed, 14 Dec 2016 10:53:57 -0200 Subject: [PATCH 125/139] Muda layout NULO --- sapl/templates/protocoloadm/protocolo_filter.html | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/sapl/templates/protocoloadm/protocolo_filter.html b/sapl/templates/protocoloadm/protocolo_filter.html index a3465992f..a68501825 100644 --- a/sapl/templates/protocoloadm/protocolo_filter.html +++ b/sapl/templates/protocoloadm/protocolo_filter.html @@ -39,14 +39,15 @@ Protocolo: {{ p.numero|stringformat:'06d' }}/{{ p.ano }}  -   - Etiqueta Individual
    + Etiqueta Individual + {% if p.anulado %}  ** NULO **{% endif %} +
    Assunto: {{ p.assunto_ementa|default_if_none:"Não Informado"}}
    Data Protocolo: {{ p.data|date:"d/m/Y"|default_if_none:"Não Informado" }} - Horário: {{ p.hora|date:"G:i:s" }}
    Interessado: {{ p.interessado }}
    Natureza do Processo: {% if p.tipo_processo == 0 %} Administrativo {% elif p.tipo_processo == 1 %} Matéria Legislativa {% endif %}
    Classificação: {{ p.tipo_documento|default_if_none:p.tipo_materia }}
    - Anulado: {% if p.anulado %} Sim {% else %} Não {% endif %} {% endfor %} From eba9f10c5f4248ba4afea346e4f2e997bb2216bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rog=C3=A9rio=20Fr=C3=A1?= Date: Wed, 14 Dec 2016 10:54:21 -0200 Subject: [PATCH 126/139] =?UTF-8?q?Ordem=20alfab=C3=A9tica=20lista=20statu?= =?UTF-8?q?s=20tramita=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/materia/models.py | 1 + 1 file changed, 1 insertion(+) diff --git a/sapl/materia/models.py b/sapl/materia/models.py index e9cfcf452..fe7fc6331 100644 --- a/sapl/materia/models.py +++ b/sapl/materia/models.py @@ -651,6 +651,7 @@ class StatusTramitacao(models.Model): class Meta: verbose_name = _('Status de Tramitação') verbose_name_plural = _('Status de Tramitação') + ordering = ['descricao'] def __str__(self): return _('%(descricao)s') % { From b8e99d3909d6e1822da798f41f58c5ec79ba65b0 Mon Sep 17 00:00:00 2001 From: Eduardo Edson Batista Cordeiro Alves Date: Wed, 14 Dec 2016 11:15:07 -0200 Subject: [PATCH 127/139] Fix #835 --- sapl/sessao/forms.py | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/sapl/sessao/forms.py b/sapl/sessao/forms.py index 1ade99710..d069e5ce9 100644 --- a/sapl/sessao/forms.py +++ b/sapl/sessao/forms.py @@ -79,11 +79,26 @@ class ExpedienteMateriaForm(ModelForm): fields = ['data_ordem', 'numero_ordem', 'tipo_materia', 'observacao', 'numero_materia', 'ano_materia', 'tipo_votacao'] + def clean_numero_ordem(self): + sessao = self.instance.sessao_plenaria + + ex = ExpedienteMateria.objects.filter( + sessao_plenaria=sessao, + numero_ordem=self.cleaned_data['numero_ordem']).count() + + if ex >= 1: + msg = _('Esse número de ordem já existe.') + raise ValidationError(msg) + + return self.cleaned_data['numero_ordem'] + def clean_data_ordem(self): return datetime.now() def clean(self): cleaned_data = self.cleaned_data + sessao = self.instance.sessao_plenaria + try: materia = MateriaLegislativa.objects.get( numero=self.cleaned_data['numero_materia'], @@ -96,6 +111,14 @@ class ExpedienteMateriaForm(ModelForm): else: cleaned_data['materia'] = materia + ex = ExpedienteMateria.objects.filter( + sessao_plenaria=sessao, + materia=materia).count() + + if ex >= 1: + msg = _('Essa matéria já foi cadastrada.') + raise ValidationError(msg) + return cleaned_data def save(self, commit=False): @@ -117,6 +140,8 @@ class OrdemDiaForm(ExpedienteMateriaForm): def clean(self): cleaned_data = self.cleaned_data + sessao = self.instance.sessao_plenaria + try: materia = MateriaLegislativa.objects.get( numero=self.cleaned_data['numero_materia'], @@ -129,6 +154,14 @@ class OrdemDiaForm(ExpedienteMateriaForm): else: cleaned_data['materia'] = materia + ex = ExpedienteMateria.objects.filter( + sessao_plenaria=sessao, + materia=materia).count() + + if ex >= 1: + msg = _('Essa matéria já foi cadastrada.') + raise ValidationError(msg) + return cleaned_data def save(self, commit=False): From a25a22cda4eb6403197fa5bee0d77e526e116e90 Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Wed, 14 Dec 2016 11:38:48 -0200 Subject: [PATCH 128/139] =?UTF-8?q?Adiciona=20usu=C3=A1rio,=20IP,=20e=20mo?= =?UTF-8?q?tivo=20de=20anula=C3=A7=C3=A3o=20de=20protocolo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/templates/protocoloadm/protocolo_filter.html | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/sapl/templates/protocoloadm/protocolo_filter.html b/sapl/templates/protocoloadm/protocolo_filter.html index a68501825..dc00317cd 100644 --- a/sapl/templates/protocoloadm/protocolo_filter.html +++ b/sapl/templates/protocoloadm/protocolo_filter.html @@ -48,6 +48,10 @@ Natureza do Processo: {% if p.tipo_processo == 0 %} Administrativo {% elif p.tipo_processo == 1 %} Matéria Legislativa {% endif %}
    Classificação: {{ p.tipo_documento|default_if_none:p.tipo_materia }}
    + {% if p.anulado %} + Anulado por: {{ p.user_anulacao }} - IP {{ p.ip_anulacao }}
    + Motivo Anulação: {{ p.justificativa_anulacao }}
    + {% endif %} {% endfor %} From 6f879aaea0947c2c3c03bab86836e30315b74c00 Mon Sep 17 00:00:00 2001 From: Eduardo Calil Date: Wed, 14 Dec 2016 12:22:01 -0200 Subject: [PATCH 129/139] Coloca link para materia no detalhe de norma juridica --- .../templates/norma/normajuridica_detail.html | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 sapl/templates/norma/normajuridica_detail.html diff --git a/sapl/templates/norma/normajuridica_detail.html b/sapl/templates/norma/normajuridica_detail.html new file mode 100644 index 000000000..8d6798dfb --- /dev/null +++ b/sapl/templates/norma/normajuridica_detail.html @@ -0,0 +1,30 @@ +{% extends "crud/detail.html" %} +{% load i18n common_tags%} + +{% block detail_content %} + {% for fieldset in view.layout_display %} +

    {{ fieldset.legend }}

    + {% for row in fieldset.rows %} +
    + {% for column in row %} +
    +
    +

    {{ column.verbose_name }}

    +
    + {% comment %}TODO Transformar os links em URLs diretamente no CRUD{% endcomment %} + + {% if column.text|url %} + + {% elif column.verbose_name == 'Matéria' %} + + {% else %} +
    {{ column.text|safe }}
    + {% endif %} +
    +
    +
    + {% endfor %} +
    + {% endfor %} + {% endfor %} +{% endblock detail_content %} \ No newline at end of file From 4b834dc154714e1c070ecc9a7103b33ec6f5a60b Mon Sep 17 00:00:00 2001 From: Eduardo Edson Batista Cordeiro Alves Date: Wed, 14 Dec 2016 12:24:01 -0200 Subject: [PATCH 130/139] Fix #874 --- .../templates/protocoloadm/documentoadministrativo_filter.html | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sapl/templates/protocoloadm/documentoadministrativo_filter.html b/sapl/templates/protocoloadm/documentoadministrativo_filter.html index 9849c3444..3559b5d56 100644 --- a/sapl/templates/protocoloadm/documentoadministrativo_filter.html +++ b/sapl/templates/protocoloadm/documentoadministrativo_filter.html @@ -49,3 +49,6 @@ {% include "paginacao.html" %} {% endif %} {% endblock detail_content %} + +{% block table_content %} +{% endblock table_content %} From 507321645191cf99c677ba51042491ad5708d250 Mon Sep 17 00:00:00 2001 From: Eduardo Calil Date: Wed, 14 Dec 2016 13:11:50 -0200 Subject: [PATCH 131/139] Filtra criacao e edicao de despachos iniciais por comissoes ativas --- sapl/materia/forms.py | 2 ++ sapl/materia/models.py | 2 ++ sapl/materia/views.py | 7 +++++++ 3 files changed, 11 insertions(+) diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py index 883b0946e..84a60dcb6 100644 --- a/sapl/materia/forms.py +++ b/sapl/materia/forms.py @@ -589,6 +589,8 @@ def filtra_tramitacao_destino_and_status(status, destino): class DespachoInicialForm(ModelForm): + comissao = forms.ModelChoiceField( + queryset=Comissao.objects.filter(ativa=True)) class Meta: model = DespachoInicial diff --git a/sapl/materia/models.py b/sapl/materia/models.py index fe7fc6331..f991e58df 100644 --- a/sapl/materia/models.py +++ b/sapl/materia/models.py @@ -295,6 +295,8 @@ class AssuntoMateria(models.Model): class DespachoInicial(models.Model): # TODO M2M? + # TODO Despachos não são necessáriamente comissoes, podem ser outros + # órgãos, ex: procuradorias materia = models.ForeignKey(MateriaLegislativa) comissao = models.ForeignKey(Comissao) diff --git a/sapl/materia/views.py b/sapl/materia/views.py index 22dc20bee..e177c9301 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -43,6 +43,7 @@ from sapl.utils import (TURNO_TRAMITACAO_CHOICES, YES_NO_CHOICES, autor_label, montar_row_autor) from .forms import (AcessorioEmLoteFilterSet, AcompanhamentoMateriaForm, + DespachoInicialForm, DocumentoAcessorioForm, MateriaLegislativaFilterSet, MateriaSimplificadaForm, PrimeiraTramitacaoEmLoteFilterSet, ReceberProposicaoForm, TramitacaoEmLoteFilterSet, @@ -881,6 +882,12 @@ class DespachoInicialCrud(MasterDetailCrud): help_path = '' public = [RP_LIST, RP_DETAIL] + class CreateView(MasterDetailCrud.CreateView): + form_class = DespachoInicialForm + + class UpdateView(MasterDetailCrud.UpdateView): + form_class = DespachoInicialForm + class LegislacaoCitadaCrud(MasterDetailCrud): model = LegislacaoCitada From 224dc39686d6c2b14943fe10a80a80278480ce45 Mon Sep 17 00:00:00 2001 From: Eduardo Calil Date: Thu, 15 Dec 2016 11:13:03 -0200 Subject: [PATCH 132/139] Conserta bug em norma detail --- sapl/templates/norma/normajuridica_detail.html | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/sapl/templates/norma/normajuridica_detail.html b/sapl/templates/norma/normajuridica_detail.html index 8d6798dfb..c363549a0 100644 --- a/sapl/templates/norma/normajuridica_detail.html +++ b/sapl/templates/norma/normajuridica_detail.html @@ -16,7 +16,11 @@ {% if column.text|url %} {% elif column.verbose_name == 'Matéria' %} + {% if object.materia.id %} + {% else %} +
    {{ column.text|safe }}
    + {% endif %} {% else %}
    {{ column.text|safe }}
    {% endif %} From ff785ebf856cda93614d885901a173e52b7db185 Mon Sep 17 00:00:00 2001 From: Eduardo Calil Date: Thu, 24 Nov 2016 17:05:36 -0200 Subject: [PATCH 133/139] Finaliza a recuperacao de senha --- requirements/requirements.txt | 5 ++- sapl/base/admin.py | 3 ++ sapl/base/forms.py | 28 +++++++++++++-- sapl/base/urls.py | 35 +++++++++++++++++-- sapl/templates/base/login.html | 13 +++---- .../base/recupera_senha_email_enviado.html | 14 ++++++++ .../templates/base/recuperar_senha_email.html | 13 +++++++ .../base/recuperar_senha_email_form.html | 1 + 8 files changed, 101 insertions(+), 11 deletions(-) create mode 100644 sapl/templates/base/recupera_senha_email_enviado.html create mode 100644 sapl/templates/base/recuperar_senha_email.html create mode 100644 sapl/templates/base/recuperar_senha_email_form.html diff --git a/requirements/requirements.txt b/requirements/requirements.txt index c99b8303c..c6e9f2266 100644 --- a/requirements/requirements.txt +++ b/requirements/requirements.txt @@ -1,6 +1,9 @@ dj-database-url==0.4.1 django>=1.9,<1.10 -django-admin-bootstrapped==2.5.7 +# TODO O django-admin-bootstrapped 2.5.7 não inseriu a mudança que permite +# a compatibilidade com Django 1.9+. A linha abaixo será mudada quando uma +# nova versão do django-admin-bootstrapped for lançada +git+git://github.com/django-admin-bootstrapped/django-admin-bootstrapped.git django-bootstrap3==7.0.1 django-bower==5.1.0 django-braces==1.9.0 diff --git a/sapl/base/admin.py b/sapl/base/admin.py index ae581e031..02ccd3c60 100644 --- a/sapl/base/admin.py +++ b/sapl/base/admin.py @@ -8,6 +8,9 @@ register_all_models_in_admin(__name__) admin.site.unregister(ProblemaMigracao) +admin.site.site_title = 'Administração - SAPL' +admin.site.site_header = 'Administração - SAPL' + @admin.register(ProblemaMigracao) class ProblemaMigracaoAdmin(admin.ModelAdmin): diff --git a/sapl/base/forms.py b/sapl/base/forms.py index ea30726ae..98a567261 100644 --- a/sapl/base/forms.py +++ b/sapl/base/forms.py @@ -4,8 +4,8 @@ from crispy_forms.layout import HTML, Button, Div, Field, Fieldset, Layout, Row from django import forms from django.conf import settings from django.contrib.auth import get_user_model -from django.contrib.auth.forms import AuthenticationForm -from django.contrib.auth.models import Group +from django.contrib.auth.forms import AuthenticationForm, PasswordResetForm +from django.contrib.auth.models import Group, User from django.contrib.auth.password_validation import validate_password from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ValidationError @@ -695,3 +695,27 @@ class ConfiguracoesAppForm(ModelForm): 'texto_articulado_materia', 'texto_articulado_norma', 'proposicao_incorporacao_obrigatoria'] + + +class RecuperarSenhaForm(PasswordResetForm): + def __init__(self, *args, **kwargs): + row1 = to_row( + [('email', 12)]) + self.helper = FormHelper() + self.helper.layout = Layout( + Fieldset(_('Insira o e-mail cadastrado com a sua conta'), + row1, + form_actions(save_label='Enviar')) + ) + + super(RecuperarSenhaForm, self).__init__(*args, **kwargs) + + def clean(self): + email_existente = User.objects.filter( + email=self.data['email']).exists() + + if not email_existente: + msg = 'Não existe nenhum usuário cadastrado com este e-mail.' + raise ValidationError(msg) + + return self.cleaned_data diff --git a/sapl/base/urls.py b/sapl/base/urls.py index c2a9fdc4a..6a0473612 100644 --- a/sapl/base/urls.py +++ b/sapl/base/urls.py @@ -1,12 +1,17 @@ from django.conf.urls import include, url from django.contrib.auth import views +from django.contrib.auth.views import (password_reset, + password_reset_done, + password_reset_confirm, + password_reset_complete) from django.contrib.auth.decorators import permission_required from django.views.generic.base import TemplateView from sapl.base.views import AutorCrud, ConfirmarEmailView, TipoAutorCrud from .apps import AppConfig -from .forms import LoginForm +from .forms import LoginForm, RecuperarSenhaForm +from sapl.settings import EMAIL_SEND_USER from .views import (AppConfigCrud, CasaLegislativaCrud, HelpView, RelatorioAtasView, RelatorioHistoricoTramitacaoView, RelatorioMateriasPorAnoAutorTipoView, @@ -16,6 +21,32 @@ from .views import (AppConfigCrud, CasaLegislativaCrud, HelpView, app_name = AppConfig.name +recuperar_senha = [ + url(r'^recuperar-senha/email/$', + password_reset, + {'post_reset_redirect': 'sapl.base:recuperar_senha_finalizado', + 'email_template_name': 'base/recuperar_senha_email.html', + 'html_email_template_name': 'base/recuperar_senha_email.html', + 'template_name': 'base/recuperar_senha_email_form.html', + 'from_email': EMAIL_SEND_USER, + 'password_reset_form': RecuperarSenhaForm}, + name='recuperar_senha_email'), + + url(r'^recuperar-senha/finalizado/$', + password_reset_done, + {'template_name': 'base/recupera_senha_email_enviado.html'}, + name='recuperar_senha_finalizado'), + + url(r'^recuperar-senha/(?P[0-9A-Za-z_\-]+)/(?P.+)/$', + password_reset_confirm, + {'post_reset_redirect': 'sapl.base:recuperar_senha_completo'}, + name='recuperar_senha_confirma'), + + url(r'^recuperar-senha/completo/$', + password_reset_complete, + name='recuperar_senha_completo'), +] + urlpatterns = [ url(r'^sistema/autor/tipo/', include(TipoAutorCrud.get_urls())), @@ -66,4 +97,4 @@ urlpatterns = [ name='login'), url(r'^logout/$', views.logout, {'next_page': '/login'}, name='logout'), -] +] + recuperar_senha diff --git a/sapl/templates/base/login.html b/sapl/templates/base/login.html index 78450f96a..c2c7aa2c6 100644 --- a/sapl/templates/base/login.html +++ b/sapl/templates/base/login.html @@ -18,7 +18,7 @@