Browse Source

Merge branch '3.1.x' of github.com:Move-System/sapl into 3.1.x

pull/3858/head
root 8 months ago
parent
commit
9854bd6ced
  1. 4
      sapl/base/views.py
  2. 21
      sapl/materia/onlyoffice_views.py
  3. 19
      sapl/templates/index.html
  4. 60
      sapl/utils_template.py

4
sapl/base/views.py

@ -74,9 +74,13 @@ class IndexView(TemplateView):
autor = self.request.user.autor_set.first() autor = self.request.user.autor_set.first()
context['is_parlamentar'] = autor is not None context['is_parlamentar'] = autor is not None
context['autor_id'] = autor.id if autor else 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: else:
context['is_parlamentar'] = False context['is_parlamentar'] = False
context['autor_id'] = None context['autor_id'] = None
context['is_operador_protocolo'] = False
return context return context

21
sapl/materia/onlyoffice_views.py

@ -55,15 +55,6 @@ def onlyoffice_config(request, pk):
reverse('sapl.materia:onlyoffice_callback', kwargs={'pk': 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 # Configuração do documento
document_config = { document_config = {
"fileType": "docx", "fileType": "docx",
@ -224,16 +215,18 @@ def onlyoffice_callback(request, pk):
if status in [2, 6] and download_url: if status in [2, 6] and download_url:
logger.info(f"URL original recebida: {download_url}") logger.info(f"URL original recebida: {download_url}")
# Substitui URLs externas por URLs internas da rede Docker # Substitui o host da URL pelo ONLYOFFICE_URL configurado
# O OnlyOffice pode retornar localhost:8001 ou o host externo # O OnlyOffice retorna URLs com seu próprio hostname que pode não ser acessível
import re 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( download_url = re.sub(
r'https?://[^/]+', r'https?://[^/]+',
'http://onlyoffice:80', onlyoffice_base,
download_url 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}") logger.info(f"Iniciando download do documento de: {download_url}")
proposicao = get_object_or_404(Proposicao, pk=pk) proposicao = get_object_or_404(Proposicao, pk=pk)

19
sapl/templates/index.html

@ -38,6 +38,25 @@
</div> </div>
{% endif %} {% endif %}
<!-- Proposições Pendentes (Operador de Protocolo) -->
{% if is_operador_protocolo %}
<div class="homeBlock">
<div class="card-icon">
<i class="fas fa-inbox"></i>
</div>
<h3 class="card-title">Proposições Pendentes</h3>
<p class="card-description">Proposições aguardando recebimento</p>
<div class="card-actions">
<a href="{% url 'sapl.materia:proposicao-pendente' %}" class="btn-action" title="Ver Pendentes">
<i class="fas fa-clock"></i> Pendentes
</a>
<a href="{% url 'sapl.materia:proposicao-recebida' %}" class="btn-action" title="Ver Recebidas">
<i class="fas fa-check"></i> Recebidas
</a>
</div>
</div>
{% endif %}
<!-- Mesa Diretora --> <!-- Mesa Diretora -->
{% if not is_parlamentar %} {% if not is_parlamentar %}
<div class="homeBlock"> <div class="homeBlock">

60
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}") logger.error(f"Erro ao carregar template {template.pk}: {e}")
return None return None
# Limpa o corpo do documento mantendo cabeçalho e rodapé # Substitui placeholders no corpo do documento
# Remove todos os parágrafos existentes # Placeholders suportados: {titulo}, {ementa}, {descricao}, {tipo}, {data}
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
titulo = dados.get('titulo', 'Documento') titulo = dados.get('titulo', 'Documento')
descricao = dados.get('descricao', '') descricao = dados.get('descricao', '')
tipo_display = dados.get('tipo_display', tipo_conteudo.title()) tipo_display = dados.get('tipo_display', tipo_conteudo.title())
# Adiciona título from datetime import date
doc.add_heading(titulo, level=0) data_atual = date.today().strftime('%d/%m/%Y')
# Adiciona informações do documento placeholders = {
if descricao: '{titulo}': titulo,
if tipo_conteudo in ['proposicao', 'materia', 'norma']: '{ementa}': descricao,
doc.add_paragraph(f'Ementa: {descricao}') '{descricao}': descricao,
else: '{tipo}': tipo_display,
doc.add_paragraph(f'Assunto: {descricao}') '{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 # Substitui placeholders nas tabelas
doc.add_paragraph(f'Digite o texto do documento abaixo:') for table in doc.tables:
doc.add_paragraph('') for row in table.rows:
doc.add_paragraph('') 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 # Salva em memória
file_stream = BytesIO() file_stream = BytesIO()

Loading…
Cancel
Save