diff --git a/sapl/base/views.py b/sapl/base/views.py index 34ccab936..7b7f0d95e 100644 --- a/sapl/base/views.py +++ b/sapl/base/views.py @@ -74,9 +74,13 @@ class IndexView(TemplateView): autor = self.request.user.autor_set.first() context['is_parlamentar'] = autor is not None context['autor_id'] = autor.id if autor else None + # Verifica se é Operador de Protocolo Administrativo + context['is_operador_protocolo'] = self.request.user.has_perm( + 'protocoloadm.add_documentoadministrativo') else: context['is_parlamentar'] = False context['autor_id'] = None + context['is_operador_protocolo'] = False return context diff --git a/sapl/materia/onlyoffice_views.py b/sapl/materia/onlyoffice_views.py index 974132957..0bbc48685 100644 --- a/sapl/materia/onlyoffice_views.py +++ b/sapl/materia/onlyoffice_views.py @@ -55,15 +55,6 @@ def onlyoffice_config(request, pk): reverse('sapl.materia:onlyoffice_callback', kwargs={'pk': pk}) ) - # Substituir localhost/host externo pelo nome do container na rede Docker - # para que o OnlyOffice consiga acessar - host = request.get_host() - # sapl-dev:8000 é o nome do container e porta interna do SAPL - download_url = download_url.replace(f'http://{host}', 'http://sapl-dev:8000') - download_url = download_url.replace(f'https://{host}', 'http://sapl-dev:8000') - callback_url = callback_url.replace(f'http://{host}', 'http://sapl-dev:8000') - callback_url = callback_url.replace(f'https://{host}', 'http://sapl-dev:8000') - # Configuração do documento document_config = { "fileType": "docx", @@ -224,16 +215,18 @@ def onlyoffice_callback(request, pk): if status in [2, 6] and download_url: logger.info(f"URL original recebida: {download_url}") - # Substitui URLs externas por URLs internas da rede Docker - # O OnlyOffice pode retornar localhost:8001 ou o host externo + # Substitui o host da URL pelo ONLYOFFICE_URL configurado + # O OnlyOffice retorna URLs com seu próprio hostname que pode não ser acessível import re - # Padrão para capturar qualquer host:porta antes do path + from urllib.parse import urlparse + onlyoffice_parsed = urlparse(settings.ONLYOFFICE_URL) + onlyoffice_base = f"{onlyoffice_parsed.scheme}://{onlyoffice_parsed.netloc}" download_url = re.sub( r'https?://[^/]+', - 'http://onlyoffice:80', + onlyoffice_base, download_url ) - logger.info(f"URL substituída para rede Docker: {download_url}") + logger.info(f"URL substituída para: {download_url}") logger.info(f"Iniciando download do documento de: {download_url}") proposicao = get_object_or_404(Proposicao, pk=pk) diff --git a/sapl/templates/index.html b/sapl/templates/index.html index 2d5a9f745..37476540d 100644 --- a/sapl/templates/index.html +++ b/sapl/templates/index.html @@ -38,6 +38,25 @@ {% endif %} + + {% if is_operador_protocolo %} +
+
+ +
+

Proposições Pendentes

+

Proposições aguardando recebimento

+
+ + Pendentes + + + Recebidas + +
+
+ {% endif %} + {% if not is_parlamentar %}
diff --git a/sapl/utils_template.py b/sapl/utils_template.py index 37e63b3fd..49d60486b 100644 --- a/sapl/utils_template.py +++ b/sapl/utils_template.py @@ -51,38 +51,48 @@ def criar_documento_com_template(tipo_conteudo, tipo_especifico, dados): logger.error(f"Erro ao carregar template {template.pk}: {e}") return None - # Limpa o corpo do documento mantendo cabeçalho e rodapé - # Remove todos os parágrafos existentes - for paragraph in doc.paragraphs: - p = paragraph._element - p.getparent().remove(p) - - # Remove todas as tabelas existentes - for table in doc.tables: - t = table._element - t.getparent().remove(t) - - # Adiciona o conteúdo inicial do novo documento + # Substitui placeholders no corpo do documento + # Placeholders suportados: {titulo}, {ementa}, {descricao}, {tipo}, {data} titulo = dados.get('titulo', 'Documento') descricao = dados.get('descricao', '') tipo_display = dados.get('tipo_display', tipo_conteudo.title()) - # Adiciona título - doc.add_heading(titulo, level=0) + from datetime import date + data_atual = date.today().strftime('%d/%m/%Y') - # Adiciona informações do documento - if descricao: - if tipo_conteudo in ['proposicao', 'materia', 'norma']: - doc.add_paragraph(f'Ementa: {descricao}') - else: - doc.add_paragraph(f'Assunto: {descricao}') + placeholders = { + '{titulo}': titulo, + '{ementa}': descricao, + '{descricao}': descricao, + '{tipo}': tipo_display, + '{data}': data_atual, + } - doc.add_paragraph('') + # Substitui placeholders nos parágrafos + for paragraph in doc.paragraphs: + for placeholder, valor in placeholders.items(): + if placeholder in paragraph.text: + paragraph.text = paragraph.text.replace(placeholder, valor) - # Texto orientativo - doc.add_paragraph(f'Digite o texto do documento abaixo:') - doc.add_paragraph('') - doc.add_paragraph('') + # Substitui placeholders nas tabelas + for table in doc.tables: + for row in table.rows: + for cell in row.cells: + for paragraph in cell.paragraphs: + for placeholder, valor in placeholders.items(): + if placeholder in paragraph.text: + paragraph.text = paragraph.text.replace(placeholder, valor) + + # Substitui placeholders no cabeçalho e rodapé + for section in doc.sections: + for header_para in section.header.paragraphs: + for placeholder, valor in placeholders.items(): + if placeholder in header_para.text: + header_para.text = header_para.text.replace(placeholder, valor) + for footer_para in section.footer.paragraphs: + for placeholder, valor in placeholders.items(): + if placeholder in footer_para.text: + footer_para.text = footer_para.text.replace(placeholder, valor) # Salva em memória file_stream = BytesIO()