From 44fae6e16728fa19b25ef3478cc3a3800b203dbb Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Thu, 3 Nov 2016 10:36:13 -0200 Subject: [PATCH] Fix #773 --- sapl/compilacao/views.py | 101 +++++++++++++------------------------ sapl/materia/forms.py | 12 ++--- sapl/materia/views.py | 15 +++++- sapl/norma/views.py | 7 +++ sapl/protocoloadm/forms.py | 7 ++- sapl/sessao/forms.py | 7 +-- sapl/utils.py | 11 ++-- 7 files changed, 72 insertions(+), 88 deletions(-) diff --git a/sapl/compilacao/views.py b/sapl/compilacao/views.py index 23a889f3a..d3b4739a0 100644 --- a/sapl/compilacao/views.py +++ b/sapl/compilacao/views.py @@ -1,7 +1,7 @@ -from collections import OrderedDict -from datetime import datetime, timedelta import logging import sys +from collections import OrderedDict +from datetime import datetime, timedelta from braces.views import FormMessagesMixin from django import forms @@ -20,8 +20,8 @@ from django.shortcuts import get_object_or_404, redirect from django.utils.dateparse import parse_date from django.utils.decorators import method_decorator from django.utils.encoding import force_text -from django.utils.translation import string_concat from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import string_concat from django.views.generic.base import TemplateView from django.views.generic.detail import DetailView from django.views.generic.edit import (CreateView, DeleteView, FormView, @@ -46,7 +46,7 @@ from sapl.compilacao.models import (Dispositivo, Nota, VeiculoPublicacao, Vide) from sapl.compilacao.utils import (DISPOSITIVO_SELECT_RELATED, DISPOSITIVO_SELECT_RELATED_EDIT) -from sapl.crud.base import Crud, CrudListView, make_pagination, CrudAux +from sapl.crud.base import CrudAux, CrudListView, make_pagination from sapl.settings import BASE_DIR TipoNotaCrud = CrudAux.build(TipoNota, 'tipo_nota') @@ -110,7 +110,8 @@ class IntegracaoTaView(TemplateView): def get_redirect_deactivated(self): messages.error( self.request, - _('O modulo de Textos Articulados está desativado.')) + _('O modulo de Textos Articulados para %s está desativado.' + ) % self.model._meta.verbose_name_plural) return redirect('/') def get(self, request, *args, **kwargs): @@ -126,6 +127,25 @@ class IntegracaoTaView(TemplateView): str(e))) return self.get_redirect_deactivated() + assert hasattr(self, 'map_fields'), _( + """ + O mapa dos campos não foi definido. Ele deve seguir a estrutura + de chaves abaixo: + + map_fields = { + 'data': 'data', + 'ementa': 'ementa', + 'observacao': 'observacao', + 'numero': 'numero', + 'ano': 'ano', + } + + Caso o model de integração não possua um dos campos, + implemente, ou passe `None` para as chaves que são fixas. + """) + + mf = self.map_fields + item = get_object_or_404(self.model, pk=kwargs['pk']) related_object_type = ContentType.objects.get_for_model(item) @@ -146,35 +166,15 @@ class IntegracaoTaView(TemplateView): else: ta = ta[0] - if hasattr(item, 'ementa') and item.ementa: - ta.ementa = item.ementa - else: - ta.ementa = _('Integração com %s sem ementa.') % item - - if hasattr(item, 'observacao') and item.observacao: - ta.observacao = item.observacao - else: - ta.observacao = _('Integração com %s sem observacao.') % item - - if hasattr(item, 'numero') and item.numero: - ta.numero = item.numero - else: - ta.numero = int('%s%s%s' % ( - int(datetime.now().year), - int(datetime.now().month), - int(datetime.now().day))) - - if hasattr(item, 'ano') and item.ano: - ta.ano = item.ano - else: - ta.ano = datetime.now().year - - if hasattr(item, 'data_apresentacao'): - ta.data = item.data_apresentacao - elif hasattr(item, 'data'): - ta.data = item.data - else: - ta.data = datetime.now() + ta.data = getattr(item, mf['data'], datetime.now()) + ta.ementa = getattr( + item, mf['ementa'], _('Integração com %s sem ementa.') % item) + ta.observacao = getattr(item, mf['observacao'], '') + ta.numero = getattr(item, mf['numero'], int('%s%s%s' % ( + int(datetime.now().year), + int(datetime.now().month), + int(datetime.now().day)))) + ta.ano = getattr(item, mf['ano'], datetime.now().year) ta.save() @@ -691,39 +691,6 @@ class TextView(CompMixin, ListView): def get(self, request, *args, **kwargs): ta = TextoArticulado.objects.get(pk=self.kwargs['ta_id']) self.object = ta - if ta.content_object: - item = ta.content_object - self.object = item - if hasattr(item, 'ementa') and item.ementa: - ta.ementa = item.ementa - else: - ta.ementa = _('Integração com %s sem ementa.') % item - - if hasattr(item, 'observacao') and item.observacao: - ta.observacao = item.observacao - else: - ta.observacao = _('Integração com %s sem observacao.') % item - - if hasattr(item, 'numero') and item.numero: - ta.numero = item.numero - else: - ta.numero = int('%s%s%s' % ( - int(datetime.now().year), - int(datetime.now().month), - int(datetime.now().day))) - - if hasattr(item, 'ano') and item.ano: - ta.ano = item.ano - else: - ta.ano = datetime.now().year - - if hasattr(item, 'data_apresentacao'): - ta.data = item.data_apresentacao - elif hasattr(item, 'data'): - ta.data = item.data - else: - ta.data = datetime.now() - ta.save() return super(TextView, self).get(request, *args, **kwargs) diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py index b887569f4..e95d38f8a 100644 --- a/sapl/materia/forms.py +++ b/sapl/materia/forms.py @@ -1,7 +1,8 @@ -from datetime import date, datetime import os +from datetime import date, datetime +import django_filters from crispy_forms.bootstrap import (Alert, FormActions, InlineCheckboxes, InlineRadios) from crispy_forms.helper import FormHelper @@ -17,8 +18,8 @@ from django.db.models import Max from django.forms import ModelForm, widgets from django.forms.forms import Form 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.crispy_layout_mixin import (SaplFormLayout, form_actions, to_column, @@ -30,10 +31,9 @@ from sapl.parlamentares.models import Parlamentar from sapl.protocoloadm.models import Protocolo from sapl.settings import MAX_DOC_UPLOAD_SIZE from sapl.utils import (RANGE_ANOS, YES_NO_CHOICES, - ChoiceWithoutValidationField, RangeWidgetOverride, - autor_label, autor_modal, models_with_gr_for_model, - MateriaPesquisaOrderingFilter) -import sapl + ChoiceWithoutValidationField, + MateriaPesquisaOrderingFilter, RangeWidgetOverride, + autor_label, autor_modal, models_with_gr_for_model) from .models import (AcompanhamentoMateria, Anexada, Autoria, DespachoInicial, DocumentoAcessorio, MateriaLegislativa, Numeracao, diff --git a/sapl/materia/views.py b/sapl/materia/views.py index 7be1e8560..0e42c8a6e 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -68,6 +68,13 @@ TipoFimRelatoriaCrud = CrudAux.build( class MateriaTaView(IntegracaoTaView): model = MateriaLegislativa model_type_foreignkey = TipoMateriaLegislativa + map_fields = { + 'data': 'data_apresentacao', + 'ementa': 'ementa', + 'observacao': 'observacao', + 'numero': 'numero', + 'ano': 'ano', + } def get(self, request, *args, **kwargs): """ @@ -84,8 +91,12 @@ class MateriaTaView(IntegracaoTaView): class ProposicaoTaView(IntegracaoTaView): model = Proposicao model_type_foreignkey = TipoProposicao - # TODO implementar o mapa de fields e utiliza-lo em IntegracaoTaView - fields = { + map_fields = { + 'data': 'data_recebimento', + 'ementa': 'descricao', + 'observacao': None, + 'numero': 'numero_proposicao', + 'ano': 'ano', } def get(self, request, *args, **kwargs): diff --git a/sapl/norma/views.py b/sapl/norma/views.py index 283c43bb8..27b7d7b4c 100644 --- a/sapl/norma/views.py +++ b/sapl/norma/views.py @@ -28,6 +28,13 @@ TipoNormaCrud = CrudAux.build( class NormaTaView(IntegracaoTaView): model = NormaJuridica model_type_foreignkey = TipoNormaJuridica + map_fields = { + 'data': 'data', + 'ementa': 'ementa', + 'observacao': 'observacao', + 'numero': 'numero', + 'ano': 'ano', + } def get(self, request, *args, **kwargs): """ diff --git a/sapl/protocoloadm/forms.py b/sapl/protocoloadm/forms.py index c3bab49e7..b439ffb88 100644 --- a/sapl/protocoloadm/forms.py +++ b/sapl/protocoloadm/forms.py @@ -1,5 +1,6 @@ from datetime import datetime +import django_filters from crispy_forms.bootstrap import InlineRadios from crispy_forms.helper import FormHelper from crispy_forms.layout import HTML, Button, Fieldset, Layout, Submit @@ -8,19 +9,17 @@ from django.core.exceptions import ObjectDoesNotExist, ValidationError from django.db import models from django.forms import ModelForm from django.utils.translation import ugettext_lazy as _ -import django_filters from sapl.base.models import Autor from sapl.crispy_layout_mixin import form_actions, to_row from sapl.materia.models import UnidadeTramitacao -from sapl.utils import (RANGE_ANOS, RangeWidgetOverride, autor_label, - autor_modal, AnoNumeroOrderingFilter) +from sapl.utils import (RANGE_ANOS, AnoNumeroOrderingFilter, + RangeWidgetOverride, autor_label, autor_modal) from .models import (DocumentoAcessorioAdministrativo, DocumentoAdministrativo, Protocolo, TipoDocumentoAdministrativo, TramitacaoAdministrativo) - TIPOS_PROTOCOLO = [('0', 'Enviado'), ('1', 'Recebido'), ('', 'Ambos')] NATUREZA_PROCESSO = [('', 'Ambos'), diff --git a/sapl/sessao/forms.py b/sapl/sessao/forms.py index 988a0920b..1ade99710 100644 --- a/sapl/sessao/forms.py +++ b/sapl/sessao/forms.py @@ -1,19 +1,20 @@ from datetime import datetime +import django_filters from crispy_forms.helper import FormHelper from crispy_forms.layout import HTML, Button, Fieldset, Layout from django import forms from django.core.exceptions import ObjectDoesNotExist, ValidationError from django.forms import ModelForm from django.utils.translation import ugettext_lazy as _ -import django_filters from sapl.crispy_layout_mixin import form_actions, to_row from sapl.materia.forms import MateriaLegislativaFilterSet from sapl.materia.models import MateriaLegislativa, TipoMateriaLegislativa from sapl.parlamentares.models import Parlamentar -from sapl.utils import RANGE_DIAS_MES, RANGE_MESES, autor_label, autor_modal,\ - MateriaPesquisaOrderingFilter +from sapl.utils import (RANGE_DIAS_MES, RANGE_MESES, + MateriaPesquisaOrderingFilter, autor_label, + autor_modal) from .models import (Bancada, ExpedienteMateria, Orador, OradorExpediente, OrdemDia, SessaoPlenaria, SessaoPlenariaPresenca) diff --git a/sapl/utils.py b/sapl/utils.py index ecf91e613..0d00d1e50 100644 --- a/sapl/utils.py +++ b/sapl/utils.py @@ -1,10 +1,12 @@ -from datetime import date -from functools import wraps -from unicodedata import normalize as unicodedata_normalize import hashlib import logging import re +from datetime import date +from functools import wraps +from unicodedata import normalize as unicodedata_normalize +import django_filters +import magic from crispy_forms.helper import FormHelper from crispy_forms.layout import HTML, Button from django import forms @@ -16,13 +18,10 @@ 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)