diff --git a/sapl/base/forms.py b/sapl/base/forms.py index f24868ff6..f82bbe5f8 100644 --- a/sapl/base/forms.py +++ b/sapl/base/forms.py @@ -28,7 +28,7 @@ from sapl.crispy_layout_mixin import (SaplFormLayout, form_actions, to_column, from sapl.materia.models import ( MateriaLegislativa, UnidadeTramitacao, StatusTramitacao) from sapl.norma.models import (NormaJuridica, NormaEstatisticas) -from sapl.parlamentares.models import SessaoLegislativa +from sapl.parlamentares.models import SessaoLegislativa, Partido from sapl.sessao.models import SessaoPlenaria from sapl.settings import MAX_IMAGE_UPLOAD_SIZE from sapl.utils import (RANGE_ANOS, YES_NO_CHOICES, @@ -1322,3 +1322,16 @@ class AlterarSenhaForm(Form): "Nova senha não pode ser igual à senha anterior") return self.cleaned_data + +class PartidoForm(ModelForm): + + class Meta: + model = Partido + exclude = [] + + def __init__(self, *args, **kwargs): + + super(PartidoForm, self).__init__(*args, **kwargs) + + self.fields['nome'].widget.attrs['readonly'] = True + self.fields['sigla'].widget.attrs['readonly'] = True diff --git a/sapl/parlamentares/forms.py b/sapl/parlamentares/forms.py index a15a4e305..6f9f5faf0 100755 --- a/sapl/parlamentares/forms.py +++ b/sapl/parlamentares/forms.py @@ -18,11 +18,11 @@ from floppyforms.widgets import ClearableFileInput from image_cropping.widgets import CropWidget, ImageCropWidget from sapl.base.models import Autor, TipoAutor -from sapl.crispy_layout_mixin import form_actions, to_row +from sapl.crispy_layout_mixin import form_actions, to_row, SaplFormLayout from sapl.rules import SAPL_GROUP_VOTANTE from .models import (ComposicaoColigacao, Filiacao, Frente, Legislatura, - Mandato, Parlamentar, Votante) + Mandato, Parlamentar, Votante, Partido) class ImageThumbnailFileInput(ClearableFileInput): @@ -496,3 +496,43 @@ class VotanteForm(ModelForm): votante.user = u votante.save() return votante + + +class EditarNomePartidoForm(forms.Form): + sigla = forms.CharField(label="Sigla") + nome = forms.CharField(label="Novo Nome") + data_alteracao = forms.DateField(label="Data de alteração") + partido_pk = forms.CharField( + widget=forms.HiddenInput(), required=False) + + def __init__(self, *args, **kwargs): + super(EditarNomePartidoForm, self).__init__(*args, **kwargs) + + row1 = to_row([('sigla', 2)]) + row2 = to_row([('nome', 8)]) + row3 = to_row([('data_alteracao', 2)]) + row4 = to_row([('partido_pk', 2)]) + + self.helper = FormHelper() + self.helper.layout = SaplFormLayout( + Fieldset(_('Alteração do nome do partido'), + row1, row2, row3, row4)) + + + def clean(self): + super(EditarNomePartidoForm, self).clean() + + if not self.is_valid(): + return self.cleaned_data + obj = Partido.objects.get(id=self.cleaned_data['partido_pk']) + + if obj.sigla == self.cleaned_data['sigla']: + raise ValidationError("Sigla do partido igual à silga atual. Formulário inválido.") + + if obj.nome == self.cleaned_data['nome']: + raise ValidationError("Nome do partido igual ao nome atual. Formulário inválido.") + + if not self.cleaned_data['data_alteracao'] <= timezone.now().date(): + raise ValidationError("Data de alteração maior que data atual. Formulário inválido.") + + return self.cleaned_data diff --git a/sapl/parlamentares/urls.py b/sapl/parlamentares/urls.py index e383421c4..c28299d98 100644 --- a/sapl/parlamentares/urls.py +++ b/sapl/parlamentares/urls.py @@ -17,7 +17,8 @@ from sapl.parlamentares.views import (CargoMesaCrud, ColigacaoCrud, frente_atualiza_lista_parlamentares, insere_parlamentar_composicao, parlamentares_frente_selected, - remove_parlamentar_composicao) + remove_parlamentar_composicao, + EditaNomePartidoView) from .apps import AppConfig @@ -60,6 +61,8 @@ urlpatterns = [ url(r'^sistema/parlamentar/tipo-militar/', include(TipoMilitarCrud.get_urls())), url(r'^sistema/parlamentar/partido/', include(PartidoCrud.get_urls())), + url(r'^sistema/parlamentar/partido/(?P\d+)/altera-nome', + EditaNomePartidoView.as_view(), name='altera_nome_partido'), url(r'^sistema/mesa-diretora/sessao-legislativa/', include(SessaoLegislativaCrud.get_urls())), diff --git a/sapl/parlamentares/views.py b/sapl/parlamentares/views.py index aa636df79..c66920aac 100644 --- a/sapl/parlamentares/views.py +++ b/sapl/parlamentares/views.py @@ -3,6 +3,7 @@ import json import logging from django.contrib import messages +from django.contrib.auth.mixins import PermissionRequiredMixin from django.contrib.contenttypes.models import ContentType from django.core.exceptions import MultipleObjectsReturned, ObjectDoesNotExist from django.core.urlresolvers import reverse, reverse_lazy @@ -18,7 +19,7 @@ from django.views.decorators.clickjacking import xframe_options_exempt from django.views.generic import FormView from django.views.generic.edit import UpdateView -from sapl.base.forms import SessaoLegislativaForm +from sapl.base.forms import SessaoLegislativaForm, PartidoForm from sapl.base.models import Autor from sapl.comissoes.models import Participacao from sapl.crud.base import (RP_CHANGE, RP_DETAIL, RP_LIST, Crud, CrudAux, @@ -29,7 +30,8 @@ from sapl.parlamentares.apps import AppConfig from sapl.utils import parlamentares_ativos from .forms import (FiliacaoForm, FrenteForm, LegislaturaForm, MandatoForm, - ParlamentarCreateForm, ParlamentarForm, VotanteForm) + ParlamentarCreateForm, ParlamentarForm, VotanteForm, + EditarNomePartidoForm) from .models import (CargoMesa, Coligacao, ComposicaoColigacao, ComposicaoMesa, Dependente, Filiacao, Frente, Legislatura, Mandato, NivelInstrucao, Parlamentar, Partido, SessaoLegislativa, @@ -37,7 +39,7 @@ from .models import (CargoMesa, Coligacao, ComposicaoColigacao, ComposicaoMesa, CargoMesaCrud = CrudAux.build(CargoMesa, 'cargo_mesa') -PartidoCrud = CrudAux.build(Partido, 'partidos') +# PartidoCrud = CrudAux.build(Partido, 'partidos') TipoDependenteCrud = CrudAux.build(TipoDependente, 'tipo_dependente') NivelInstrucaoCrud = CrudAux.build(NivelInstrucao, 'nivel_instrucao') TipoAfastamentoCrud = CrudAux.build(TipoAfastamento, 'tipo_afastamento') @@ -46,7 +48,6 @@ TipoMilitarCrud = CrudAux.build(SituacaoMilitar, 'tipo_situa_militar') DependenteCrud = MasterDetailCrud.build( Dependente, 'parlamentar', 'dependente') - class SessaoLegislativaCrud(CrudAux): model = SessaoLegislativa @@ -57,6 +58,13 @@ class SessaoLegislativaCrud(CrudAux): form_class = SessaoLegislativaForm +class PartidoCrud(CrudAux): + model = Partido + + class UpdateView(CrudAux.UpdateView): + form_class = PartidoForm + + class VotanteView(MasterDetailCrud): model = Votante parent_field = 'parlamentar' @@ -754,6 +762,37 @@ class MesaDiretoraView(FormView): }) +class EditaNomePartidoView(PermissionRequiredMixin, FormView): + form_class = EditarNomePartidoForm + template_name = 'parlamentares/altera_nome_partido_form.html' + permission_required = ('parlamentares.change_partido',) + + def get_initial(self): + initial = super(EditaNomePartidoView, self).get_initial() + initial['partido_pk'] = self.kwargs['pk'] + return initial + + + def form_valid(self, form): + data = form.cleaned_data + obj = Partido.objects.get(id=self.kwargs['pk']) + observacao = "Este partido teve o nome alterado de " + obj.nome + \ + " (" + obj.sigla + ") para " + data['nome'] + " (" + data['sigla'] \ + + ") em " + data['data_alteracao'].strftime("%d/%m/%Y") + "." + obj.nome = data['nome'] + obj.sigla = data['sigla'] + obj.observacao += '\n\n' + observacao + obj.save() + + return HttpResponseRedirect(self.get_success_url()) + + def get_success_url(self): + url_reverse = reverse('sapl.parlamentares:partido_detail', + kwargs={'pk': self.kwargs['pk']}) + + return url_reverse + + def altera_field_mesa(request): """ Essa função lida com qualquer alteração nos campos diff --git a/sapl/sessao/forms.py b/sapl/sessao/forms.py index 68f6d3222..997eebb1f 100644 --- a/sapl/sessao/forms.py +++ b/sapl/sessao/forms.py @@ -991,3 +991,6 @@ class VotacaoEmBlocoFilterSet(MateriaLegislativaFilterSet): row4, row5, row6, row7, row8, row9, form_actions(label='Pesquisar')) ) + +class PartidoForm(forms.ModelForm): + pass diff --git a/sapl/templates/parlamentares/altera_nome_partido_form.html b/sapl/templates/parlamentares/altera_nome_partido_form.html new file mode 100644 index 000000000..da2c6116e --- /dev/null +++ b/sapl/templates/parlamentares/altera_nome_partido_form.html @@ -0,0 +1,7 @@ +{% extends 'crud/detail.html' %} +{% load i18n %} +{% load crispy_forms_tags %} + +{% block detail_content %} + {% crispy form %} +{% endblock detail_content %} diff --git a/sapl/templates/parlamentares/partido_detail.html b/sapl/templates/parlamentares/partido_detail.html new file mode 100644 index 000000000..681e1a1eb --- /dev/null +++ b/sapl/templates/parlamentares/partido_detail.html @@ -0,0 +1,13 @@ +{% extends 'crud/detail.html' %} +{% load i18n %} + +{% block actions %} + + {{ block.super }} + +
+ {% trans 'Alterar o Nome do Partido' %} +
+ + +{% endblock actions %}