diff --git a/sapl/base/templatetags/common_tags.py b/sapl/base/templatetags/common_tags.py index 440f747a4..99582016d 100644 --- a/sapl/base/templatetags/common_tags.py +++ b/sapl/base/templatetags/common_tags.py @@ -6,7 +6,7 @@ from sapl.base.models import AppConfig from sapl.materia.models import DocumentoAcessorio, MateriaLegislativa, Proposicao from sapl.norma.models import NormaJuridica from sapl.parlamentares.models import Filiacao -from sapl.utils import filiacao_data +from sapl.utils import filiacao_data, SEPARADOR_HASH_PROPOSICAO register = template.Library() @@ -96,7 +96,12 @@ def isinst(value, class_str): @register.filter @stringfilter def strip_hash(value): - return value.split('/')[0][1:] + vet = value.split('/') + if len(vet) == 2: + return vet[0][1:] + else: + return value.split(SEPARADOR_HASH_PROPOSICAO)[0][1:] + @register.filter diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py index ca428b277..76a82b7c7 100644 --- a/sapl/materia/forms.py +++ b/sapl/materia/forms.py @@ -39,7 +39,7 @@ from sapl.norma.models import (LegislacaoCitada, NormaJuridica, from sapl.parlamentares.models import Legislatura from sapl.protocoloadm.models import Protocolo, DocumentoAdministrativo from sapl.settings import MAX_DOC_UPLOAD_SIZE -from sapl.utils import (RANGE_ANOS, YES_NO_CHOICES, +from sapl.utils import (RANGE_ANOS, YES_NO_CHOICES, SEPARADOR_HASH_PROPOSICAO, ChoiceWithoutValidationField, MateriaPesquisaOrderingFilter, RangeWidgetOverride, autor_label, autor_modal, gerar_hash_arquivo, @@ -1425,8 +1425,7 @@ class ProposicaoForm(forms.ModelForm): inst.texto_original.path, str(inst.pk)) elif inst.texto_articulado.exists(): ta = inst.texto_articulado.first() - # FIXME hash para textos articulados - inst.hash_code = 'P' + ta.hash() + '/' + str(inst.pk) + inst.hash_code = 'P' + ta.hash() + SEPARADOR_HASH_PROPOSICAO + str(inst.pk) def clean(self): super(ProposicaoForm, self).clean() diff --git a/sapl/materia/views.py b/sapl/materia/views.py index c923ccb0f..6ab69d7d4 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -42,7 +42,7 @@ from sapl.materia.forms import (AnexadaForm, AutoriaForm, from sapl.norma.models import LegislacaoCitada from sapl.parlamentares.models import Legislatura from sapl.protocoloadm.models import Protocolo -from sapl.utils import (YES_NO_CHOICES, autor_label, autor_modal, +from sapl.utils import (YES_NO_CHOICES, autor_label, autor_modal, SEPARADOR_HASH_PROPOSICAO, gerar_hash_arquivo, get_base_url, get_mime_type_from_file_extension, montar_row_autor, show_results_filter_set) @@ -504,7 +504,9 @@ class ReceberProposicao(PermissionRequiredForAppCrudMixin, FormView): if form.is_valid(): try: # A ultima parte do código deve ser a pk da Proposicao - id = form.cleaned_data["cod_hash"].split("/")[1] + cod_hash = form.cleaned_data["cod_hash"]. \ + replace('/', SEPARADOR_HASH_PROPOSICAO) + id = cod_hash.split(SEPARADOR_HASH_PROPOSICAO)[1] proposicao = Proposicao.objects.get(id=id, data_envio__isnull=False, data_recebimento__isnull=True) @@ -512,17 +514,17 @@ class ReceberProposicao(PermissionRequiredForAppCrudMixin, FormView): if proposicao.texto_articulado.exists(): ta = proposicao.texto_articulado.first() # FIXME hash para textos articulados - hasher = 'P' + ta.hash() + '/' + str(proposicao.id) + hasher = 'P' + ta.hash() + SEPARADOR_HASH_PROPOSICAO + str(proposicao.id) else: hasher = gerar_hash_arquivo( proposicao.texto_original.path, str(proposicao.id)) \ if proposicao.texto_original else None - if hasher == form.cleaned_data['cod_hash']: + if hasher == cod_hash: return HttpResponseRedirect( reverse('sapl.materia:proposicao-confirmar', kwargs={ - 'hash': hasher.split('/')[0][1:], + 'hash': hasher.split(SEPARADOR_HASH_PROPOSICAO)[0][1:], 'pk': proposicao.pk})) except ObjectDoesNotExist: messages.error(request, _('Proposição não encontrada!')) @@ -603,13 +605,13 @@ class ConfirmarProposicao(PermissionRequiredForAppCrudMixin, UpdateView): if proposicao.texto_articulado.exists(): ta = proposicao.texto_articulado.first() - hasher = 'P' + ta.hash() + '/' + str(proposicao.id) + hasher = 'P' + ta.hash() + SEPARADOR_HASH_PROPOSICAO + str(proposicao.id) else: hasher = gerar_hash_arquivo( proposicao.texto_original.path, str(proposicao.pk)) if proposicao.texto_original else None - if hasher == 'P%s/%s' % (self.kwargs['hash'], proposicao.pk): + if hasher == 'P%s%s%s' % (self.kwargs['hash'], SEPARADOR_HASH_PROPOSICAO, proposicao.pk): self.object = proposicao except Exception as e: self.logger.error("user=" + username + ". Objeto Proposicao com atributos (pk={}, data_envio=Not Null, " diff --git a/sapl/utils.py b/sapl/utils.py index 257489321..5c8d6e097 100644 --- a/sapl/utils.py +++ b/sapl/utils.py @@ -28,6 +28,10 @@ from unipath.path import Path from sapl.crispy_layout_mixin import SaplFormLayout, form_actions, to_row +# (26/10/2018): O separador foi mudador de '/' para 'K' +# por conta dos leitores de códigos de barra, que trocavam +# a '/' por '&' ou ';' +SEPARADOR_HASH_PROPOSICAO = 'K' def pil_image(source, exif_orientation=False, **options): return source_generators.pil_image(source, exif_orientation, **options) @@ -484,7 +488,7 @@ def gerar_hash_arquivo(arquivo, pk, block_size=2**20): if not data: break md5.update(data) - return 'P' + md5.hexdigest() + '/' + pk + return 'P' + md5.hexdigest() + SEPARADOR_HASH_PROPOSICAO + pk class ChoiceWithoutValidationField(forms.ChoiceField):