Browse Source

Refatora forms de acomp via email e recup de senha

Implementa mixin de registro de email para encaminhamento de emails com
google recaptcha.
pull/3337/head
Leandro Roberto 5 years ago
parent
commit
dc2de9fc01
  1. 24
      sapl/base/forms.py
  2. 18
      sapl/materia/forms.py
  3. 18
      sapl/protocoloadm/forms.py
  4. 4
      sapl/templates/base/recuperar_senha_email_form.html
  5. 8
      sapl/templates/materia/acompanhamento_materia.html
  6. 8
      sapl/templates/protocoloadm/acompanhamento_documento.html
  7. 71
      sapl/utils.py

24
sapl/base/forms.py

@ -36,7 +36,8 @@ from sapl.utils import (autor_label, autor_modal, ChoiceWithoutValidationField,
FilterOverridesMetaMixin, FileFieldCheckMixin,
AnoNumeroOrderingFilter, ImageThumbnailFileInput,
models_with_gr_for_model, qs_override_django_filter,
RangeWidgetOverride, RANGE_ANOS, YES_NO_CHOICES)
RangeWidgetOverride, RANGE_ANOS, YES_NO_CHOICES,
GoogleRecapthaMixin)
from .models import AppConfig, CasaLegislativa
@ -1621,29 +1622,22 @@ class ConfiguracoesAppForm(ModelForm):
return cleaned_data
class RecuperarSenhaForm(PasswordResetForm):
class RecuperarSenhaForm(GoogleRecapthaMixin, PasswordResetForm):
logger = logging.getLogger(__name__)
def __init__(self, *args, **kwargs):
row1 = to_row(
[('email', 12)])
self.helper = SaplFormHelper()
self.helper.layout = Layout(
Fieldset(_('Insira o e-mail cadastrado com a sua conta'),
row1,
form_actions(label='Enviar'))
)
super(RecuperarSenhaForm, self).__init__(*args, **kwargs)
kwargs['title_label'] = _('Insira o e-mail cadastrado com a sua conta')
kwargs['action_label'] = _('Enviar')
super().__init__(*args, **kwargs)
def clean(self):
super(RecuperarSenhaForm, self).clean()
if not self.is_valid():
return self.cleaned_data
super(RecuperarSenhaForm, self).clean()
email_existente = User.objects.filter(
email_existente = get_user_model().objects.filter(
email=self.data['email']).exists()
if not email_existente:

18
sapl/materia/forms.py

@ -42,7 +42,8 @@ from sapl.utils import (autor_label, autor_modal,
lista_anexados, MateriaPesquisaOrderingFilter,
models_with_gr_for_model, qs_override_django_filter,
SEPARADOR_HASH_PROPOSICAO,
validar_arquivo, YES_NO_CHOICES)
validar_arquivo, YES_NO_CHOICES,
GoogleRecapthaMixin)
from .models import (AcompanhamentoMateria, Anexada, Autoria,
DespachoInicial, DocumentoAcessorio, Numeracao,
@ -314,7 +315,7 @@ class UnidadeTramitacaoForm(ModelForm):
return unidade
class AcompanhamentoMateriaForm(ModelForm):
class AcompanhamentoMateriaForm(GoogleRecapthaMixin, ModelForm):
class Meta:
model = AcompanhamentoMateria
@ -322,17 +323,10 @@ class AcompanhamentoMateriaForm(ModelForm):
def __init__(self, *args, **kwargs):
row1 = to_row([('email', 12)])
kwargs['title_label'] = _('Acompanhamento de Matéria por e-mail')
kwargs['action_label'] = _('Cadastrar')
self.helper = SaplFormHelper()
self.helper.layout = Layout(
Fieldset(
_('Acompanhamento de Matéria por e-mail'),
row1,
form_actions(label='Cadastrar')
)
)
super(AcompanhamentoMateriaForm, self).__init__(*args, **kwargs)
super().__init__(*args, **kwargs)
class DocumentoAcessorioForm(FileFieldCheckMixin, ModelForm):

18
sapl/protocoloadm/forms.py

@ -26,7 +26,8 @@ from sapl.utils import (AnoNumeroOrderingFilter, autor_label, autor_modal,
choice_anos_com_protocolo, choice_force_optional,
FileFieldCheckMixin, FilterOverridesMetaMixin,
lista_anexados, RANGE_ANOS,
validar_arquivo, YES_NO_CHOICES)
validar_arquivo, YES_NO_CHOICES,
GoogleRecapthaMixin)
from .models import (Anexado, AcompanhamentoDocumento,
DocumentoAcessorioAdministrativo,
@ -47,7 +48,7 @@ NATUREZA_PROCESSO = [('0', 'Administrativo'),
EM_TRAMITACAO = [(0, 'Sim'), (1, 'Não')]
class AcompanhamentoDocumentoForm(ModelForm):
class AcompanhamentoDocumentoForm(GoogleRecapthaMixin, ModelForm):
class Meta:
model = AcompanhamentoDocumento
@ -55,17 +56,10 @@ class AcompanhamentoDocumentoForm(ModelForm):
def __init__(self, *args, **kwargs):
row1 = to_row([('email', 12)])
kwargs['title_label'] = _('Acompanhamento de Documento por e-mail')
kwargs['action_label'] = _('Cadastrar')
self.helper = SaplFormHelper()
self.helper.layout = Layout(
Fieldset(
_('Acompanhamento de Documento por e-mail'),
row1,
form_actions(label='Cadastrar')
)
)
super(AcompanhamentoDocumentoForm, self).__init__(*args, **kwargs)
super().__init__(*args, **kwargs)
class ProtocoloFilterSet(django_filters.FilterSet):

4
sapl/templates/base/recuperar_senha_email_form.html

@ -1 +1,5 @@
{% extends "crud/form.html" %}
{% block head_content %}{{block.super}}
<script src='https://www.google.com/recaptcha/api.js'></script>
{% endblock %}

8
sapl/templates/materia/acompanhamento_materia.html

@ -1,7 +1,13 @@
{% extends "crud/detail.html" %}
{% load i18n %}
{% load crispy_forms_tags %}
{% block actions %} {% endblock %}
{% block head_content %}{{block.super}}
<script src='https://www.google.com/recaptcha/api.js'></script>
{% endblock %}
{% block actions %}{% endblock %}
{% block detail_content %}
<h1>Acompanhamento de Matéria</h1>

8
sapl/templates/protocoloadm/acompanhamento_documento.html

@ -1,7 +1,13 @@
{% extends "crud/detail.html" %}
{% load i18n %}
{% load crispy_forms_tags %}
{% block actions %} {% endblock %}
{% block head_content %}{{block.super}}
<script src='https://www.google.com/recaptcha/api.js'></script>
{% endblock %}
{% block actions %}{% endblock %}
{% block detail_content %}
<h1>Acompanhamento de Documento</h1>

71
sapl/utils.py

@ -10,7 +10,8 @@ import tempfile
from unicodedata import normalize as unicodedata_normalize
import unicodedata
from crispy_forms.layout import Button, HTML
from crispy_forms.helper import FormHelper
from crispy_forms.layout import Button, HTML, Fieldset, Div
from django import forms
from django.apps import apps
from django.conf import settings
@ -1071,3 +1072,71 @@ class OverwriteStorage(FileSystemStorage):
def get_tempfile_dir():
return '/tmp' if platform.system() == 'Darwin' else tempfile.gettempdir()
class GoogleRecapthaMixin:
def __init__(self, *args, **kwargs):
title_label = kwargs.pop('title_label')
action_label = kwargs.pop('action_label')
row1 = to_row(
[
(Div(
css_class="g-recaptcha float-right", # if not settings.DEBUG else '',
data_sitekey=settings.GOOGLE_RECAPTCHA_SITE_KEY
), 5),
('email', 7),
]
)
self.helper = FormHelper()
self.helper.layout = SaplFormLayout(
Fieldset(
title_label,
row1
),
actions=form_actions(label=action_label)
)
super().__init__(*args, **kwargs)
def clean(self):
super().clean()
cd = self.cleaned_data
recaptcha = self.data.get('g-recaptcha-response', '')
if not recaptcha:
raise ValidationError(
_('Verificação do reCAPTCHA não efetuada.'))
import urllib3
import json
#encoded_data = json.dumps(fields).encode('utf-8')
url = ('https://www.google.com/recaptcha/api/siteverify?'
'secret=%s'
'&response=%s' % (settings.GOOGLE_RECAPTCHA_SECRET_KEY,
recaptcha))
http = urllib3.PoolManager()
try:
r = http.request('POST', url)
data = r.data.decode('utf-8')
jdata = json.loads(data)
except Exception as e:
raise ValidationError(
_('Ocorreu um erro na validação do reCAPTCHA.'))
if jdata['success']:
return cd
else:
raise ValidationError(
_('Ocorreu um erro na validação do reCAPTCHA.'))
return cd

Loading…
Cancel
Save