diff --git a/sapl/compilacao/models.py b/sapl/compilacao/models.py index 28b963038..ff6cbdab1 100644 --- a/sapl/compilacao/models.py +++ b/sapl/compilacao/models.py @@ -237,7 +237,10 @@ class TextoArticulado(TimestampedMixin): def __str__(self): if self.content_object: - return str(self.content_object) + assert hasattr(self.content_object, 'epigrafe'), _( + 'Modelos integrados aos Textos Articulados devem possuir a ' + 'property "epigrafe"') + return str(self.content_object.epigrafe) else: return _('%(tipo)s nº %(numero)s de %(data)s') % { 'tipo': self.tipo_ta, diff --git a/sapl/compilacao/views.py b/sapl/compilacao/views.py index dac910cc2..a9ebf3fa4 100644 --- a/sapl/compilacao/views.py +++ b/sapl/compilacao/views.py @@ -137,6 +137,7 @@ class IntegracaoTaView(TemplateView): 'observacao': 'observacao', 'numero': 'numero', 'ano': 'ano', + 'tipo': 'tipo', } Caso o model de integração não possua um dos campos, @@ -562,7 +563,7 @@ class TaDetailView(CompMixin, DetailView): 'Metadados para o Texto Articulado de %s\n' '%s') % ( self.get_object().content_object._meta.verbose_name_plural, - self.get_object().content_object) + self.get_object().content_object.epigrafe) else: return self.get_object() diff --git a/sapl/materia/models.py b/sapl/materia/models.py index 606fabbd7..82aea25dd 100644 --- a/sapl/materia/models.py +++ b/sapl/materia/models.py @@ -1,14 +1,15 @@ -import reversion from django.contrib.auth.models import Group from django.contrib.contenttypes.fields import GenericRelation from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ObjectDoesNotExist from django.db import models from django.db.models.functions import Concat +from django.template import defaultfilters from django.utils import formats, timezone from django.utils.translation import ugettext_lazy as _ from model_utils import Choices +import reversion from sapl.base.models import SEQUENCIA_NUMERACAO, Autor from sapl.comissoes.models import Comissao @@ -19,6 +20,7 @@ from sapl.utils import (RANGE_ANOS, YES_NO_CHOICES, SaplGenericForeignKey, SaplGenericRelation, restringe_tipos_de_arquivo_txt, texto_upload_path) + EM_TRAMITACAO = [(1, 'Sim'), (0, 'Não')] @@ -242,6 +244,16 @@ class MateriaLegislativa(models.Model): return _('%(tipo)s nº %(numero)s de %(ano)s') % { 'tipo': self.tipo, 'numero': self.numero, 'ano': self.ano} + @property + def epigrafe(self): + return _('%(tipo)s nº %(numero)s de %(data)s') % { + 'tipo': self.tipo, + 'numero': self.numero, + 'data': defaultfilters.date( + self.data_apresentacao, + "d \d\e F \d\e Y" + )} + def data_entrada_protocolo(self): ''' hack: recuperar a data de entrada do protocolo sem gerar @@ -425,7 +437,8 @@ class DocumentoAcessorio(models.Model): verbose_name=_('Tipo')) nome = models.CharField(max_length=50, verbose_name=_('Nome')) - data = models.DateField(blank=True, null=True, default=None, verbose_name=_('Data')) + data = models.DateField(blank=True, null=True, + default=None, verbose_name=_('Data')) autor = models.CharField( max_length=50, blank=True, verbose_name=_('Autor')) ementa = models.TextField(blank=True, verbose_name=_('Ementa')) @@ -756,6 +769,16 @@ class Proposicao(models.Model): self.id, descricao) + @property + def epigrafe(self): + return _('%(tipo)s nº %(numero)s de %(data)s') % { + 'tipo': self.tipo, + 'numero': self.numero, + 'data': defaultfilters.date( + self.data_envio if self.data_envio else timezone.now(), + "d \d\e F \d\e Y" + )} + def delete(self, using=None, keep_parents=False): if self.texto_original: self.texto_original.delete() diff --git a/sapl/materia/views.py b/sapl/materia/views.py index 5f1b81ccf..1a7319288 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -2,7 +2,6 @@ from datetime import datetime from random import choice from string import ascii_letters, digits -import weasyprint from crispy_forms.helper import FormHelper from crispy_forms.layout import HTML from django.contrib import messages @@ -17,10 +16,11 @@ from django.shortcuts import get_object_or_404, redirect from django.template import RequestContext, loader from django.utils import formats, timezone from django.utils.translation import ugettext_lazy as _ -from django.views.generic import FormView, ListView, TemplateView, CreateView, UpdateView +from django.views.generic import ListView, TemplateView, CreateView, UpdateView from django.views.generic.base import RedirectView from django.views.generic.edit import FormView from django_filters.views import FilterView +import weasyprint import sapl from sapl.base.models import Autor, CasaLegislativa @@ -67,6 +67,7 @@ from .models import (AcompanhamentoMateria, Anexada, AssuntoMateria, Autoria, TipoProposicao, Tramitacao, UnidadeTramitacao) from .signals import tramitacao_signal + AssuntoMateriaCrud = CrudAux.build(AssuntoMateria, 'assunto_materia') OrigemCrud = CrudAux.build(Origem, '') @@ -96,9 +97,10 @@ def proposicao_texto(request, pk): if proposicao.texto_original: if (not proposicao.data_recebimento and proposicao.autor.user_id != request.user.id): - messages.error(request, _('Você não tem permissão para acessar o texto original.')) + messages.error(request, _( + 'Você não tem permissão para acessar o texto original.')) return redirect(reverse('sapl.materia:proposicao_detail', - kwargs={'pk':pk})) + kwargs={'pk': pk})) arquivo = proposicao.texto_original @@ -221,6 +223,7 @@ class MateriaTaView(IntegracaoTaView): 'observacao': None, 'numero': 'numero', 'ano': 'ano', + 'tipo': 'tipo', } map_funcs = { 'publicacao_func': False, @@ -251,6 +254,7 @@ class ProposicaoTaView(IntegracaoTaView): 'observacao': None, 'numero': 'numero_proposicao', 'ano': 'ano', + 'tipo': 'tipo', } map_funcs = { 'publicacao_func': False @@ -1034,7 +1038,7 @@ class TramitacaoCrud(MasterDetailCrud): if local: initial['unidade_tramitacao_local' - ] = local.unidade_tramitacao_destino.pk + ] = local.unidade_tramitacao_destino.pk else: initial['unidade_tramitacao_local'] = '' initial['data_tramitacao'] = timezone.now().date() @@ -2035,10 +2039,13 @@ class ExcluirTramitacaoEmLoteView(PermissionRequiredMixin, FormView): def form_valid(self, form): - tramitacao_set = Tramitacao.objects.filter(data_tramitacao=form.cleaned_data['data_tramitacao'], - unidade_tramitacao_local=form.cleaned_data['unidade_tramitacao_local'], - unidade_tramitacao_destino=form.cleaned_data['unidade_tramitacao_destino'], - status=form.cleaned_data['status']) + tramitacao_set = Tramitacao.objects.filter( + data_tramitacao=form.cleaned_data['data_tramitacao'], + unidade_tramitacao_local=form.cleaned_data[ + 'unidade_tramitacao_local'], + unidade_tramitacao_destino=form.cleaned_data[ + 'unidade_tramitacao_destino'], + status=form.cleaned_data['status']) for tramitacao in tramitacao_set: materia = tramitacao.materia if tramitacao == materia.tramitacao_set.last(): diff --git a/sapl/norma/models.py b/sapl/norma/models.py index ff7b44dca..c011b174e 100644 --- a/sapl/norma/models.py +++ b/sapl/norma/models.py @@ -1,9 +1,9 @@ -import reversion from django.contrib.contenttypes.fields import GenericRelation from django.db import models from django.template import defaultfilters from django.utils.translation import ugettext_lazy as _ from model_utils import Choices +import reversion from sapl.compilacao.models import TextoArticulado from sapl.materia.models import MateriaLegislativa @@ -146,12 +146,18 @@ class NormaJuridica(models.Model): norma=self.id) return anexos - def __str__(self): return _('nº %(numero)s de %(data)s') % { 'numero': self.numero, 'data': defaultfilters.date(self.data, "d \d\e F \d\e Y")} + @property + def epigrafe(self): + return _('%(tipo)s nº %(numero)s de %(data)s') % { + 'tipo': self.tipo, + '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() diff --git a/sapl/norma/views.py b/sapl/norma/views.py index 87b842802..80c30a63d 100644 --- a/sapl/norma/views.py +++ b/sapl/norma/views.py @@ -1,6 +1,6 @@ import re -import weasyprint + from django.contrib.auth.mixins import PermissionRequiredMixin from django.core.exceptions import ObjectDoesNotExist from django.core.urlresolvers import reverse @@ -12,6 +12,7 @@ from django.views.generic import TemplateView, UpdateView from django.views.generic.base import RedirectView from django.views.generic.edit import FormView from django_filters.views import FilterView +import weasyprint from sapl.base.models import AppConfig from sapl.compilacao.views import IntegracaoTaView @@ -24,6 +25,7 @@ from .forms import (AnexoNormaJuridicaForm, NormaFilterSet, NormaJuridicaForm, from .models import (AnexoNormaJuridica, AssuntoNorma, NormaJuridica, NormaRelacionada, TipoNormaJuridica, TipoVinculoNormaJuridica) + # LegislacaoCitadaCrud = Crud.build(LegislacaoCitada, '') AssuntoNormaCrud = CrudAux.build(AssuntoNorma, 'assunto_norma_juridica', list_field_names=['assunto', 'descricao']) @@ -72,7 +74,10 @@ class NormaPesquisaView(FilterView): def get_queryset(self): qs = super().get_queryset() - qs = qs.extra({'norma_i': "CAST(regexp_replace(numero,'[^0-9]','', 'g') AS INTEGER)", 'norma_letra': "regexp_replace(numero,'[^a-zA-Z]','', 'g')"}).order_by('-data', '-norma_i', '-norma_letra') + qs = qs.extra({ + 'nm_i': "CAST(regexp_replace(numero,'[^0-9]','', 'g') AS INTEGER)", + 'norma_letra': "regexp_replace(numero,'[^a-zA-Z]','', 'g')" + }).order_by('-data', '-nm_i', '-norma_letra') return qs @@ -98,6 +103,7 @@ class NormaPesquisaView(FilterView): return context + class AnexoNormaJuridicaCrud(MasterDetailCrud): model = AnexoNormaJuridica parent_field = 'norma' @@ -105,7 +111,7 @@ class AnexoNormaJuridicaCrud(MasterDetailCrud): public = [RP_LIST, RP_DETAIL] class BaseMixin(MasterDetailCrud.BaseMixin): - list_field_names = ['id','anexo_arquivo'] + list_field_names = ['id', 'anexo_arquivo'] class CreateView(MasterDetailCrud.CreateView): form_class = AnexoNormaJuridicaForm @@ -141,6 +147,7 @@ class NormaTaView(IntegracaoTaView): 'observacao': 'observacao', 'numero': 'numero', 'ano': 'ano', + 'tipo': 'tipo', } map_funcs = { @@ -238,7 +245,7 @@ def recuperar_numero_norma(request): param = {'tipo': tipo} param['ano'] = ano if ano else timezone.now().year norma = NormaJuridica.objects.filter(**param).order_by( - 'tipo', 'ano', 'numero').values_list('numero', 'ano').last() + 'tipo', 'ano', 'numero').values_list('numero', 'ano').last() if norma: response = JsonResponse({'numero': int(re.sub("[^0-9].*", '', norma[0])) + 1, 'ano': norma[1]}) diff --git a/sapl/templates/compilacao/textoarticulado_detail.html b/sapl/templates/compilacao/textoarticulado_detail.html index 413752d68..ea76214ba 100644 --- a/sapl/templates/compilacao/textoarticulado_detail.html +++ b/sapl/templates/compilacao/textoarticulado_detail.html @@ -8,9 +8,9 @@ {%if object %}