diff --git a/Dockerfile b/Dockerfile index d970a4e4c..015357a40 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,7 +3,7 @@ FROM alpine:3.8 ENV BUILD_PACKAGES postgresql-dev graphviz-dev graphviz build-base git pkgconfig \ python3-dev libxml2-dev jpeg-dev libressl-dev libffi-dev libxslt-dev \ nodejs py3-lxml py3-magic postgresql-client poppler-utils antiword \ - curl jq openssh-client vim openssh-client bash + curl jq openssh-client vim bash RUN apk update --update-cache && apk upgrade @@ -32,9 +32,6 @@ RUN pip install -r /var/interlegis/sapl/requirements/dev-requirements.txt --upgr COPY config/env_dockerfile /var/interlegis/sapl/sapl/.env -# Configura timezone para BRT -# RUN cp /usr/share/zoneinfo/America/Sao_Paulo /etc/localtime && echo "America/Sao_Paulo" > /etc/timezone - RUN python3 manage.py collectstatic --noinput --clear # Remove .env(fake) e sapl.db da imagem diff --git a/sapl/materia/migrations/0044_auto_20190327_1409.py b/sapl/materia/migrations/0044_auto_20190327_1409.py new file mode 100644 index 000000000..5322d7833 --- /dev/null +++ b/sapl/materia/migrations/0044_auto_20190327_1409.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.20 on 2019-03-27 17:09 +from __future__ import unicode_literals + +from django.db import migrations, models +import sapl.materia.models +import sapl.utils + + +class Migration(migrations.Migration): + + dependencies = [ + ('materia', '0043_auto_20190320_1749'), + ] + + operations = [ + migrations.AlterField( + model_name='documentoacessorio', + name='arquivo', + field=models.FileField(blank=True, max_length=255, null=True, upload_to=sapl.materia.models.anexo_upload_path, validators=[sapl.utils.restringe_tipos_de_arquivo_txt], verbose_name='Texto Integral'), + ), + ] diff --git a/sapl/materia/models.py b/sapl/materia/models.py index af4cb1231..c7aaaed15 100644 --- a/sapl/materia/models.py +++ b/sapl/materia/models.py @@ -497,6 +497,7 @@ class DocumentoAcessorio(models.Model): arquivo = models.FileField( blank=True, null=True, + max_length=255, upload_to=anexo_upload_path, verbose_name=_('Texto Integral'), validators=[restringe_tipos_de_arquivo_txt]) diff --git a/sapl/materia/views.py b/sapl/materia/views.py index 696b1235a..a2366c8d9 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -1,5 +1,11 @@ -from datetime import datetime import logging +import os +import shutil +import tempfile +import weasyprint +import itertools + +from datetime import datetime from random import choice from string import ascii_letters, digits @@ -45,6 +51,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.settings import MEDIA_ROOT 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, @@ -2035,17 +2042,35 @@ class DocumentoAcessorioEmLoteView(PermissionRequiredMixin, FilterView): messages.add_message(request, messages.ERROR, msg) return self.get(request, self.kwargs) + tmp_name = os.path.join(tempfile.gettempdir(), request.FILES['arquivo'].name) + with open(tmp_name, 'wb') as destination: + for chunk in request.FILES['arquivo'].chunks(): + destination.write(chunk) + + doc_data = tz.localize(datetime.strptime( + request.POST['data'], "%d/%m/%Y")) for materia_id in marcadas: doc = DocumentoAcessorio() doc.materia_id = materia_id doc.tipo = tipo - doc.arquivo = request.FILES['arquivo'] doc.nome = request.POST['nome'] - doc.data = tz.localize(datetime.strptime( - request.POST['data'], "%d/%m/%Y")) + doc.data = doc_data doc.autor = request.POST['autor'] doc.ementa = request.POST['ementa'] doc.save() + diretorio = os.path.join(MEDIA_ROOT, + 'sapl/public/documentoacessorio', + str(doc_data.year), + str(doc.id)) + if not os.path.exists(diretorio): + os.makedirs(diretorio) + file_path = os.path.join(diretorio, + request.FILES['arquivo'].name) + shutil.copy2(tmp_name, file_path) + doc.arquivo.name = file_path.split(MEDIA_ROOT)[1] # Retira MEDIA_ROOT do nome + doc.save() + os.remove(tmp_name) + msg = _('Documento(s) criado(s).') messages.add_message(request, messages.SUCCESS, msg) return self.get(request, self.kwargs) @@ -2225,8 +2250,18 @@ class PrimeiraTramitacaoEmLoteView(PermissionRequiredMixin, FilterView): # issue https://github.com/interlegis/sapl/issues/1123 # TODO: usar Form urgente = request.POST['urgente'] == 'True' - flag_error = False - for materia_id in marcadas: + flag_error = False + + materias_principais = [m for m in MateriaLegislativa.objects.filter(id__in=marcadas)] + materias_anexadas = [m.anexadas.all() for m in MateriaLegislativa.objects.filter(id__in=marcadas) if m.anexadas.all()] + materias_anexadas = list(itertools.chain.from_iterable(materias_anexadas)) + tramitacao_local = int(request.POST['unidade_tramitacao_local']) + materias_anexadas = list(filter(lambda ma : not ma.tramitacao_set.all() or \ + ma.tramitacao_set.last().unidade_tramitacao_destino.id == tramitacao_local, + materias_anexadas)) + materias = set(materias_principais + materias_anexadas) + + for materia in materias: try: data_tramitacao = tz.localize(datetime.strptime( request.POST['data_tramitacao'], "%d/%m/%Y")) @@ -2236,7 +2271,7 @@ class PrimeiraTramitacaoEmLoteView(PermissionRequiredMixin, FilterView): return self.get(request, self.kwargs) t = Tramitacao( - materia_id=materia_id, + materia=materia, data_tramitacao=data_tramitacao, data_encaminhamento=data_encaminhamento, data_fim_prazo=data_fim_prazo, @@ -2270,7 +2305,7 @@ class PrimeiraTramitacaoEmLoteView(PermissionRequiredMixin, FilterView): status = StatusTramitacao.objects.get(id=request.POST['status']) - for materia in MateriaLegislativa.objects.filter(id__in=marcadas): + for materia in materias: if status.indicador == 'F': materia.em_tramitacao = False elif self.primeira_tramitacao: diff --git a/sapl/relatorios/views.py b/sapl/relatorios/views.py index dec1d50b7..9439b1578 100755 --- a/sapl/relatorios/views.py +++ b/sapl/relatorios/views.py @@ -578,6 +578,8 @@ def get_sessao_plenaria(sessao, casa): # unescape HTML codes # https://github.com/interlegis/sapl/issues/1046 conteudo = re.sub('style=".*?"', '', conteudo) + conteudo = re.sub('class=".*?"', '', conteudo) + conteudo = re.sub('
', '
', conteudo) conteudo = html.unescape(conteudo) # escape special character '&' diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index 2d4250fa6..c5a6620c4 100755 --- a/sapl/sessao/views.py +++ b/sapl/sessao/views.py @@ -1379,9 +1379,15 @@ def get_materias_expediente(sessao_plenaria): ementa = m.materia.ementa titulo = m.materia numero = m.numero_ordem - tramitacao = m.materia.tramitacao_set.last() - turno = None + tramitacao = '' + tramitacoes = Tramitacao.objects.filter(materia=m.materia).order_by('-pk') + for aux_tramitacao in tramitacoes: + if aux_tramitacao.turno: + tramitacao = aux_tramitacao + break + + turno = None if tramitacao: turno = get_turno(tramitacao.turno) @@ -1487,7 +1493,14 @@ def get_materias_ordem_do_dia(sessao_plenaria): ementa_observacao = o.observacao titulo = o.materia numero = o.numero_ordem - tramitacao = o.materia.tramitacao_set.last() + + tramitacao = '' + tramitacoes = Tramitacao.objects.filter(materia=o.materia).order_by('-pk') + for aux_tramitacao in tramitacoes: + if aux_tramitacao.turno: + tramitacao = aux_tramitacao + break + turno = None if tramitacao: turno = get_turno(tramitacao.turno)