Browse Source

impl edição de votante e autor para usuário

pull/3371/head
Leandro Roberto 5 years ago
parent
commit
4b749d786d
  1. 173
      sapl/base/forms.py
  2. 2
      sapl/templates/base/layouts.yaml

173
sapl/base/forms.py

@ -15,8 +15,10 @@ from django.db import models, transaction
from django.db.models import Q from django.db.models import Q
from django.forms import Form, ModelForm from django.forms import Form, ModelForm
from django.utils import timezone from django.utils import timezone
from django.utils.safestring import mark_safe
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
import django_filters import django_filters
from hamcrest.core.core.isnone import none
from sapl.audiencia.models import AudienciaPublica from sapl.audiencia.models import AudienciaPublica
from sapl.base.models import Autor, TipoAutor, OperadorAutor from sapl.base.models import Autor, TipoAutor, OperadorAutor
@ -28,8 +30,10 @@ from sapl.materia.models import (DocumentoAcessorio, MateriaEmTramitacao,
MateriaLegislativa, UnidadeTramitacao, MateriaLegislativa, UnidadeTramitacao,
StatusTramitacao) StatusTramitacao)
from sapl.norma.models import NormaJuridica from sapl.norma.models import NormaJuridica
from sapl.parlamentares.models import Partido, SessaoLegislativa from sapl.parlamentares.models import Partido, SessaoLegislativa,\
Parlamentar, Votante
from sapl.protocoloadm.models import DocumentoAdministrativo from sapl.protocoloadm.models import DocumentoAdministrativo
from sapl.rules import SAPL_GROUP_AUTOR, SAPL_GROUP_VOTANTE
from sapl.sessao.models import SessaoPlenaria from sapl.sessao.models import SessaoPlenaria
from sapl.settings import MAX_IMAGE_UPLOAD_SIZE from sapl.settings import MAX_IMAGE_UPLOAD_SIZE
from sapl.utils import (autor_label, autor_modal, ChoiceWithoutValidationField, from sapl.utils import (autor_label, autor_modal, ChoiceWithoutValidationField,
@ -38,7 +42,7 @@ from sapl.utils import (autor_label, autor_modal, ChoiceWithoutValidationField,
AnoNumeroOrderingFilter, ImageThumbnailFileInput, AnoNumeroOrderingFilter, ImageThumbnailFileInput,
models_with_gr_for_model, qs_override_django_filter, models_with_gr_for_model, qs_override_django_filter,
RangeWidgetOverride, RANGE_ANOS, YES_NO_CHOICES, RangeWidgetOverride, RANGE_ANOS, YES_NO_CHOICES,
GoogleRecapthaMixin) GoogleRecapthaMixin, parlamentares_ativos)
from .models import AppConfig, CasaLegislativa from .models import AppConfig, CasaLegislativa
@ -86,6 +90,18 @@ class UserAdminForm(ModelForm):
max_length=40, max_length=40,
widget=forms.TextInput(attrs={'readonly': 'readonly'})) widget=forms.TextInput(attrs={'readonly': 'readonly'}))
parlamentar = forms.ModelChoiceField(
label=_('Este usuário é um Parlamentar Votante?'),
queryset=Parlamentar.objects.all(),
required=False,
help_text='Se o usuário que está sendo cadastrado (ou em edição) é um usuário para que um parlamentar possa votar, você pode selecionar o parlamentar nas opções acima.')
autor = forms.ModelChoiceField(
label=_('Este usuário registrará proposições para um Autor?'),
queryset=Autor.objects.all(),
required=False,
help_text='Se o usuário que está sendo cadastrado (ou em edição) é um usuário para cadastro de proposições, você pode selecionar para que autor ele registrará proposições.')
class Meta: class Meta:
model = get_user_model() model = get_user_model()
fields = [ fields = [
@ -98,8 +114,11 @@ class UserAdminForm(ModelForm):
'new_password1', 'new_password1',
'new_password2', 'new_password2',
'groups',
'parlamentar',
'autor',
'groups',
'user_permissions', 'user_permissions',
] ]
@ -112,15 +131,18 @@ class UserAdminForm(ModelForm):
self.granular = kwargs.pop('granular', None) self.granular = kwargs.pop('granular', None)
self.instance = kwargs.get('instance', None) self.instance = kwargs.get('instance', None)
row_pwd = to_row( row_pwd = [
[ ('username', 4),
('username', 4), ('email', 6),
('email', 6), ('is_active', 2),
('is_active', 2), ('first_name', 6),
('first_name', 6), ('last_name', 6),
('last_name', 6), ('new_password1', 3 if self.instance and self.instance.pk else 6),
('new_password1', 3 if self.instance and self.instance.pk else 6), ('new_password2', 3 if self.instance and self.instance.pk else 6),
('new_password2', 3 if self.instance and self.instance.pk else 6), ]
if self.instance and self.instance.pk:
row_pwd += [
( (
FieldWithButtons( FieldWithButtons(
'token', 'token',
@ -130,13 +152,18 @@ class UserAdminForm(ModelForm):
css_class="btn-outline-primary"), css_class="btn-outline-primary"),
css_class='' if self.instance and self.instance.pk else 'd-none'), css_class='' if self.instance and self.instance.pk else 'd-none'),
6 6
), )
]
('groups', 12), row_pwd += [
] + ([('user_permissions', 12)] if not self.granular is None else []) ('parlamentar', 6),
('autor', 6),
('groups', 12),
) ] + ([('user_permissions', 12)] if not self.granular is None else [])
row_pwd = to_row(row_pwd)
self.helper = SaplFormHelper() self.helper = SaplFormHelper()
self.helper.layout = SaplFormLayout(row_pwd) self.helper.layout = SaplFormLayout(row_pwd)
@ -144,19 +171,33 @@ class UserAdminForm(ModelForm):
self.fields['groups'].widget = forms.CheckboxSelectMultiple() self.fields['groups'].widget = forms.CheckboxSelectMultiple()
self.fields['parlamentar'].choices = [('', '---------')] + [
(p.id, p) for p in parlamentares_ativos(timezone.now())
]
if not self.instance.pk: if not self.instance.pk:
self.fields['groups'].choices = [ self.fields['groups'].choices = [
(g.id, g) for g in Group.objects.exclude(name__in=['Autor', 'Votante']).order_by('name') (g.id, g) for g in Group.objects.exclude(
name__in=['Autor', 'Votante']
).order_by('name')
] ]
else: else:
operadorautor = self.instance.operadorautor_set.first()
votante = self.instance.votante_set.first()
self.fields['token'].initial = self.instance.auth_token.key self.fields['token'].initial = self.instance.auth_token.key
self.fields['autor'].initial = operadorautor.autor if operadorautor else None
self.fields['parlamentar'].initial = votante.parlamentar if votante else None
self.fields['groups'].choices = [ self.fields['groups'].choices = [
(g.id, g) for g in self.instance.groups.exclude(name__in=['Autor', 'Votante']).order_by('name') (g.id, g) for g in self.instance.groups.exclude(
name__in=['Autor', 'Votante']
).order_by('name')
] + [ ] + [
(g.id, g) for g in Group.objects.exclude( (g.id, g) for g in Group.objects.exclude(
user=self.instance).exclude(name__in=['Autor', 'Votante']).order_by('name') user=self.instance).exclude(
name__in=['Autor', 'Votante']
).order_by('name')
] ]
self.fields[ self.fields[
@ -179,35 +220,61 @@ class UserAdminForm(ModelForm):
'codename') 'codename')
] ]
# self.fields['user_permissions'].queryset = self.fields[
# 'user_permissions'].queryset.all().order_by('name')
def save(self, commit=True): def save(self, commit=True):
if self.cleaned_data['new_password1']: if self.cleaned_data['new_password1']:
self.instance.set_password(self.cleaned_data['new_password1']) self.instance.set_password(self.cleaned_data['new_password1'])
votante = None
permissions = None permissions = None
votante = None
operadorautor = None
if self.instance.id: if self.instance.id:
inst_old = get_user_model().objects.get(pk=self.instance.pk) inst_old = get_user_model().objects.get(pk=self.instance.pk)
votante = inst_old.groups.filter(name='Votante').first()
autor = inst_old.groups.filter(name='Autor').first()
if self.granular is None: if self.granular is None:
permissions = list(inst_old.user_permissions.all()) permissions = list(inst_old.user_permissions.all())
inst_new = super().save(commit) votante = inst_old.votante_set.first()
operadorautor = inst_old.operadorautor_set.first()
if votante: inst = super().save(commit)
inst_new.groups.add(votante)
if autor:
inst_new.groups.add(autor)
if permissions: if permissions:
inst_new.user_permissions.add(*permissions) inst.user_permissions.add(*permissions)
g_autor = Group.objects.get(name=SAPL_GROUP_AUTOR)
g_votante = Group.objects.get(name=SAPL_GROUP_VOTANTE)
return inst_new if not self.cleaned_data['autor']:
inst.groups.remove(g_autor)
if operadorautor:
operadorautor.delete()
else:
inst.groups.add(g_autor)
if operadorautor:
if operadorautor.autor != self.cleaned_data['autor']:
operadorautor.autor = self.cleaned_data['autor']
operadorautor.save()
else:
operadorautor = OperadorAutor()
operadorautor.user = inst
operadorautor.autor = self.cleaned_data['autor']
operadorautor.save()
if not self.cleaned_data['parlamentar']:
inst.groups.remove(g_votante)
if votante:
votante.delete()
else:
inst.groups.add(g_votante)
if votante:
if votante.parlamentar != self.cleaned_data['parlamentar']:
votante.parlamentar = self.cleaned_data['parlamentar']
votante.save()
else:
votante = Votante()
votante.user = inst
votante.parlamentar = self.cleaned_data['parlamentar']
votante.save()
return inst
def clean(self): def clean(self):
data = super().clean() data = super().clean()
@ -227,6 +294,29 @@ class UserAdminForm(ModelForm):
password_validation.validate_password( password_validation.validate_password(
new_password2, self.instance) new_password2, self.instance)
parlamentar = data.get('parlamentar', None)
if parlamentar and parlamentar.votante_set.exists() and \
parlamentar.votante_set.first().user != self.instance:
raise forms.ValidationError(
mark_safe(
'O Parlamentar <strong>{}</strong> '
'já está associado a outro usuário: <strong>{}</strong>.<br>'
'Para realizar nova associação, você precisa '
'primeiro cancelar esta já existente.'.format(
parlamentar,
parlamentar.votante_set.first().user
))
)
autor = data.get('autor', None)
if parlamentar and autor:
if autor.autor_related != parlamentar:
raise forms.ValidationError(
'Um usuário não deve ser Votante de um parlamentar, e operador de um Autor que possui um parlamentar diferente, ou mesmo outro tipo de Autor.'
)
"""
if 'email' in data and data['email']: if 'email' in data and data['email']:
duplicidade = get_user_model().objects.filter(email=data['email']) duplicidade = get_user_model().objects.filter(email=data['email'])
if self.instance.id: if self.instance.id:
@ -237,7 +327,7 @@ class UserAdminForm(ModelForm):
"Email já cadastrado para: {}".format( "Email já cadastrado para: {}".format(
', '.join(map(lambda x: str(x), duplicidade.all())), ', '.join(map(lambda x: str(x), duplicidade.all())),
) )
) )"""
return data return data
@ -423,15 +513,6 @@ class TipoAutorForm(ModelForm):
'por ser equivalente a um tipo já existente')) 'por ser equivalente a um tipo já existente'))
class UserCheckboxSelectMultiple(forms.CheckboxSelectMultiple):
#template_name = 'base/checkbox_select.html'
#option_template_name = 'base/radio_option.html'
def render(self, name, value, attrs=None, renderer=None):
super().render(name, value, attrs, renderer)
class AutorForm(ModelForm): class AutorForm(ModelForm):
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -466,7 +547,7 @@ class AutorForm(ModelForm):
operadores = forms.ModelMultipleChoiceField( operadores = forms.ModelMultipleChoiceField(
queryset=get_user_model().objects.all(), queryset=get_user_model().objects.all(),
widget=UserCheckboxSelectMultiple(), widget=forms.CheckboxSelectMultiple(),
label=_('Usuários do SAPL ligados ao autor acima selecionado'), label=_('Usuários do SAPL ligados ao autor acima selecionado'),
required=False, required=False,
) )

2
sapl/templates/base/layouts.yaml

@ -13,7 +13,7 @@ CasaLegislativa:
UserDetail: UserDetail:
{% trans 'Usuário' %}: {% trans 'Usuário' %}:
- usuario username:3 is_active:2 - usuario username:3 is_active:2
- auth_token - auth_token votante_set__parlamentar|m2m_urlize_for_detail operadorautor_set__autor|m2m_urlize_for_detail
- groups - groups
- user_permissions - user_permissions

Loading…
Cancel
Save