Browse Source

Feat(OnlyOffice): Criar Documento Acessório direto no editor OnlyOffice

Adiciona botão "Criar e Editar no OnlyOffice" no formulário de criação de
Documento Acessório, permitindo criar o documento sem upload de arquivo e
redirecionar para o editor OnlyOffice. Corrige também NoReverseMatch na
URL de detalhe do documento acessório no editor.

Co-Authored-By: rangelbruno <rangelbruno@users.noreply.github.com>
pull/3858/head
rangelbruno 7 months ago
parent
commit
7b249c4c9e
  1. 9
      sapl/materia/forms.py
  2. 4
      sapl/materia/onlyoffice_materia_views.py
  3. 39
      sapl/materia/views.py

9
sapl/materia/forms.py

@ -345,12 +345,15 @@ class DocumentoAcessorioForm(FileFieldCheckMixin, ModelForm):
arquivo = self.cleaned_data.get('arquivo')
# Quando criando via OnlyOffice, arquivo não é obrigatório
if self.data.get('action') == 'onlyoffice':
if arquivo:
validar_arquivo(arquivo, "Texto Integral")
return self.cleaned_data
if arquivo:
validar_arquivo(arquivo, "Texto Integral")
else:
# TODO: definir arquivo no form e preservar o nome do campo
# que gerou a mensagem de erro.
## arquivo = forms.FileField(required=True, label="Texto Integral")
nome_arquivo = self.fields['arquivo'].label
raise ValidationError(f'Favor anexar arquivo em {nome_arquivo}')

4
sapl/materia/onlyoffice_materia_views.py

@ -654,7 +654,7 @@ def docacessorio_onlyoffice_editor(request, pk):
if not (request.user.is_superuser or
request.user.has_perm('materia.change_documentoacessorio')):
messages.error(request, 'Você não tem permissão para editar este documento.')
return redirect('sapl.materia:documentoacessorio_detail', pk=documento.materia.pk, zpk=pk)
return redirect('sapl.materia:documentoacessorio_detail', pk=pk)
# URL do OnlyOffice acessível pelo navegador do usuário
onlyoffice_url = get_onlyoffice_browser_url(request)
@ -666,7 +666,7 @@ def docacessorio_onlyoffice_editor(request, pk):
'documento_descricao': documento.ementa or f'Matéria: {documento.materia}',
'onlyoffice_url': onlyoffice_url,
'config_url': reverse('sapl.materia:docacessorio_onlyoffice_config', kwargs={'pk': pk}),
'voltar_url': reverse('sapl.materia:documentoacessorio_detail', kwargs={'pk': documento.materia.pk, 'zpk': pk}),
'voltar_url': reverse('sapl.materia:documentoacessorio_detail', kwargs={'pk': pk}),
'check_url': reverse('sapl.materia:docacessorio_check_doc', kwargs={'pk': pk}),
'forcesave_url': reverse('sapl.materia:docacessorio_forcesave', kwargs={'pk': pk}),
}

39
sapl/materia/views.py

@ -10,7 +10,8 @@ import time
import zipfile
from PyPDF4 import PdfFileReader, PdfFileMerger
from crispy_forms.layout import HTML
from crispy_forms.bootstrap import FormActions
from crispy_forms.layout import Div, HTML, Submit
from django.conf import settings
from django.contrib import messages
from django.contrib.auth.decorators import permission_required
@ -1703,18 +1704,46 @@ class DocumentoAcessorioCrud(MasterDetailCrud):
class CreateView(MasterDetailCrud.CreateView):
form_class = DocumentoAcessorioForm
def __init__(self, **kwargs):
super(MasterDetailCrud.CreateView, self).__init__(**kwargs)
def get_initial(self):
initial = super(CreateView, self).get_initial()
initial['data'] = timezone.now().date()
return initial
def get_success_url(self):
if self.request.POST.get('action') == 'onlyoffice':
messages.info(self.request, _(
'Documento Acessório criado com sucesso! '
'Você será redirecionado para o Editor OnlyOffice.'))
return reverse('sapl.materia:docacessorio_onlyoffice_editor',
kwargs={'pk': self.object.pk})
return super().get_success_url()
def get_context_data(self, **kwargs):
context = super(
MasterDetailCrud.CreateView, self).get_context_data(**kwargs)
form = context.get('form')
if form and hasattr(form, 'helper') and form.helper.layout:
btns = FormActions(
HTML('<a href="{{ view.cancel_url }}"'
' class="btn btn-dark">%s</a>' % _('Cancelar')),
Submit('action', _('Criar e Editar no OnlyOffice'),
css_class='btn-primary',
onclick="this.value='onlyoffice';"),
Submit('salvar', _('Salvar'), css_class='float-right',
onclick='this.form.submit();this.disabled=true;'),
css_class='form-group row justify-content-between'
)
# Layout: Div(row) > Div(col) > FormActions
def replace_form_actions(fields):
for i, field in enumerate(fields):
if isinstance(field, FormActions):
fields[i] = btns
return True
if hasattr(field, 'fields'):
if replace_form_actions(field.fields):
return True
return False
replace_form_actions(form.helper.layout.fields)
return context
class UpdateView(MasterDetailCrud.UpdateView):

Loading…
Cancel
Save