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()
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

21
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)

19
sapl/templates/index.html

@ -38,6 +38,25 @@
</div>
{% 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 -->
{% if not is_parlamentar %}
<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}")
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()

Loading…
Cancel
Save