diff --git a/sapl/comissoes/urls.py b/sapl/comissoes/urls.py index 72886f1f1..f22f32e1d 100644 --- a/sapl/comissoes/urls.py +++ b/sapl/comissoes/urls.py @@ -1,7 +1,7 @@ from django.conf.urls import include, url from sapl.comissoes.views import (CargoCrud, ComissaoCrud, ComposicaoCrud, DocumentoAcessorioCrud, MateriasTramitacaoListView, ParticipacaoCrud, - PeriodoComposicaoCrud, ReuniaoCrud, TipoComissaoCrud) + PeriodoComposicaoCrud, ReuniaoCrud, TipoComissaoCrud, get_participacoes_comissao) from .apps import AppConfig @@ -21,4 +21,5 @@ urlpatterns = [ url(r'^sistema/comissao/periodo-composicao/', include(PeriodoComposicaoCrud.get_urls())), url(r'^sistema/comissao/tipo/', include(TipoComissaoCrud.get_urls())), + url(r'^sistema/comissao/recupera-participacoes', get_participacoes_comissao), ] diff --git a/sapl/comissoes/views.py b/sapl/comissoes/views.py index d6d129b11..7b8a6fd1d 100644 --- a/sapl/comissoes/views.py +++ b/sapl/comissoes/views.py @@ -2,7 +2,7 @@ import logging from django.core.urlresolvers import reverse from django.db.models import F -from django.http.response import HttpResponseRedirect +from django.http.response import HttpResponseRedirect, JsonResponse from django.views.decorators.clickjacking import xframe_options_exempt from django.views.generic import ListView from django.views.generic.base import RedirectView @@ -108,7 +108,7 @@ class ComposicaoCrud(MasterDetailCrud): paginate_by = None def take_composicao_pk(self): - + username = self.request.user.username try: self.logger.debug('user=' + username + '. Tentando obter pk da composição.') @@ -278,3 +278,15 @@ class DocumentoAcessorioCrud(MasterDetailCrud): return HttpResponseRedirect( reverse('sapl.comissoes:reuniao_detail', kwargs={'pk': obj.reuniao.pk})) + + +def get_participacoes_comissao(request): + parlamentares = [] + + composicao_id = request.GET.get('composicao_id') + if composicao_id: + parlamentares = [{'nome': p.parlamentar.nome_parlamentar, 'id': p.parlamentar.id} for p in + Participacao.objects.filter(composicao_id=composicao_id).order_by( + 'parlamentar__nome_parlamentar')] + + return JsonResponse(parlamentares, safe=False) diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py index cf200447e..673dfd024 100644 --- a/sapl/materia/forms.py +++ b/sapl/materia/forms.py @@ -26,7 +26,7 @@ import django_filters import sapl from sapl.base.models import AppConfig, Autor, TipoAutor -from sapl.comissoes.models import Comissao, Participacao +from sapl.comissoes.models import Comissao, Participacao, Composicao from sapl.compilacao.models import (STATUS_TA_IMMUTABLE_PUBLIC, STATUS_TA_PRIVATE) from sapl.crispy_layout_mixin import (SaplFormLayout, form_actions, to_column, @@ -37,7 +37,7 @@ from sapl.materia.models import (AssuntoMateria, Autoria, MateriaAssunto, UnidadeTramitacao) from sapl.norma.models import (LegislacaoCitada, NormaJuridica, TipoNormaJuridica) -from sapl.parlamentares.models import Legislatura, Partido +from sapl.parlamentares.models import Legislatura, Partido, Parlamentar from sapl.protocoloadm.models import Protocolo, DocumentoAdministrativo from sapl.settings import MAX_DOC_UPLOAD_SIZE from sapl.utils import (YES_NO_CHOICES, SEPARADOR_HASH_PROPOSICAO, @@ -345,7 +345,7 @@ class AcompanhamentoMateriaForm(ModelForm): self.helper = SaplFormHelper() self.helper.layout = Layout( Fieldset( - _('Acompanhamento de Matéria por e-mail'), + _('Acompanhamento de Matéria por e-mail'), row1, form_actions(label='Cadastrar') ) @@ -362,34 +362,63 @@ class DocumentoAcessorioForm(FileFieldCheckMixin, ModelForm): class RelatoriaForm(ModelForm): - logger = logging.getLogger(__name__) + composicao = forms.ModelChoiceField( + required=True, + empty_label='---------', + queryset=Composicao.objects.all(), + label=_('Composição') + ) + class Meta: model = Relatoria - fields = ['data_designacao_relator', 'comissao', 'parlamentar', - 'data_destituicao_relator', 'tipo_fim_relatoria'] + fields = [ + 'comissao', + 'data_designacao_relator', + 'data_destituicao_relator', + 'tipo_fim_relatoria', + 'composicao', + 'parlamentar' + ] widgets = {'comissao': forms.Select(attrs={'disabled': 'disabled'})} def __init__(self, *args, **kwargs): + row1 = to_row([('comissao', 12)]) + row2 = to_row([('data_designacao_relator', 4), + ('data_destituicao_relator', 4), + ('tipo_fim_relatoria', 4)]) + row3 = to_row([('composicao', 4), + ('parlamentar', 8)]) + + self.helper = SaplFormHelper() + self.helper.layout = SaplFormLayout( + Fieldset(_('Relatoria'), row1, row2, row3)) + super().__init__(*args, **kwargs) + comissao_pk = kwargs['initial']['comissao'] + composicoes = Composicao.objects.filter(comissao_id=comissao_pk) + self.fields['composicao'].choices = [('', '---------')] + \ + [(c.pk, c) for c in composicoes] - def clean(self): - super(RelatoriaForm, self).clean() + self.fields['parlamentar'].choices = [('', '---------')] - if not self.is_valid(): - return self.cleaned_data + def clean(self): + super().clean() cleaned_data = self.cleaned_data + if not self.is_valid(): + return cleaned_data + try: self.logger.debug("Tentando obter objeto Comissao.") comissao = Comissao.objects.get(id=self.initial['comissao']) except ObjectDoesNotExist as e: - self.logger.error("Objeto Comissao não encontrado com id={} " - ".A localização atual deve ser uma comissão. " - .format(self.initial['comissao']) + str(e)) + self.logger.error( + "Objeto Comissao não encontrado com id={}. A localização atual deve ser uma comissão. ".format( + self.initial['comissao']) + str(e)) msg = _('A localização atual deve ser uma comissão.') raise ValidationError(msg) else: @@ -1537,7 +1566,7 @@ class ProposicaoForm(FileFieldCheckMixin, forms.ModelForm): tm, am, nm = (cd.get('tipo_materia', ''), cd.get('ano_materia', ''), cd.get('numero_materia', '')) - + if cd['numero_materia_futuro'] and \ 'tipo' in cd and \ MateriaLegislativa.objects.filter(tipo=cd['tipo'].tipo_conteudo_related, @@ -1755,7 +1784,7 @@ class ConfirmarProposicaoForm(ProposicaoForm): self._meta.fields.remove('regime_tramitacao') # esta chamada isola o __init__ de ProposicaoForm - super(ProposicaoForm, self).__init__(*args, **kwargs) + super(ProposicaoForm, self).__init__(*args, **kwargs) fields = [ Fieldset( @@ -1831,7 +1860,7 @@ class ConfirmarProposicaoForm(ProposicaoForm): self.fields['tipo_readonly'].initial = self.instance.tipo.descricao self.fields['autor_readonly'].initial = str(self.instance.autor) if self.instance.numero_materia_futuro: - self.fields['numero_materia_futuro'].initial = self.instance.numero_materia_futuro + self.fields['numero_materia_futuro'].initial = self.instance.numero_materia_futuro if self.instance.materia_de_vinculo: self.fields[ diff --git a/sapl/materia/tests/test_materia_form.py b/sapl/materia/tests/test_materia_form.py index b67ef2733..e29d89815 100644 --- a/sapl/materia/tests/test_materia_form.py +++ b/sapl/materia/tests/test_materia_form.py @@ -2,6 +2,7 @@ import pytest from django.utils.translation import ugettext as _ from model_mommy import mommy +from sapl.comissoes.models import Comissao, TipoComissao from sapl.materia import forms from sapl.materia.models import MateriaLegislativa, TipoMateriaLegislativa @@ -172,15 +173,23 @@ def test_valida_campos_obrigatorios_devolver_proposicao_form(): @pytest.mark.django_db(transaction=False) def test_valida_campos_obrigatorios_relatoria_form(): - form = forms.RelatoriaForm(data={}) + tipo_comissao = mommy.make(TipoComissao) + comissao = mommy.make(Comissao, + tipo=tipo_comissao, + nome='Comissao Teste', + sigla='T', + data_criacao='2016-03-21') + form = forms.RelatoriaForm(initial={'comissao':comissao}, data={}) assert not form.is_valid() errors = form.errors + assert errors['parlamentar'] == [_('Este campo é obrigatório.')] assert errors['data_designacao_relator'] == [_('Este campo é obrigatório.')] + assert errors['composicao'] == [_('Este campo é obrigatório.')] - assert len(errors) == 2 + assert len(errors) == 3 @pytest.mark.django_db(transaction=False) diff --git a/sapl/materia/views.py b/sapl/materia/views.py index a2366c8d9..73dcb3072 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -1111,55 +1111,13 @@ class RelatoriaCrud(MasterDetailCrud): class CreateView(MasterDetailCrud.CreateView): form_class = RelatoriaForm + layout_key = None logger = logging.getLogger(__name__) - def get_context_data(self, **kwargs): - context = super().get_context_data(**kwargs) - username = self.request.user.username - - try: - self.logger.debug("user=" + username + ". Tentando obter objeto Comissao de pk={}.".format( - context['form'].initial['comissao'])) - comissao = Comissao.objects.get( - pk=context['form'].initial['comissao']) - except: - self.logger.error("user=" + username + ". Objeto Comissão de pk={} não encontrado.".format( - context['form'].initial['comissao'])) - pass - - else: - self.logger.info("user=" + username + ". Objeto Comissao de pk={} obtido com sucesso.".format( - context['form'].initial['comissao'])) - - materia = MateriaLegislativa.objects.get( - pk=self.kwargs.get('pk')) - data_materia = materia.data_apresentacao - - comissao = Comissao.objects.get( - pk=context['form'].initial['comissao']) - composicao = comissao.composicao_set.filter( - Q(periodo__data_fim__isnull=False, - periodo__data_inicio__lte=data_materia, - periodo__data_fim__gte=data_materia) | - Q(periodo__data_fim__isnull=True, - periodo__data_inicio__lte=data_materia) - ) - - participacoes = Participacao.objects.select_related().filter(composicao=composicao) - - parlamentares = [('', '---------')] + [ - (participacao.parlamentar.id, participacao.parlamentar.nome_parlamentar) for participacao in - participacoes if participacao.titular] - - context['form'].fields['parlamentar'].choices = parlamentares - - return context - def get_initial(self): materia = MateriaLegislativa.objects.get(id=self.kwargs['pk']) - loc_atual = Tramitacao.objects.filter( - materia=materia).last() + loc_atual = Tramitacao.objects.filter(materia=materia).last() if loc_atual is None: localizacao = 0 @@ -1174,47 +1132,9 @@ class RelatoriaCrud(MasterDetailCrud): class UpdateView(MasterDetailCrud.UpdateView): form_class = RelatoriaForm - + layout_key = None logger = logging.getLogger(__name__) - def get_context_data(self, **kwargs): - - context = super().get_context_data(**kwargs) - username = self.request.user.username - - try: - self.logger.debug("user=" + username + ". Tentando obter objeto Comissao de pk={}.".format( - context['form'].initial['comissao'])) - comissao = Comissao.objects.get( - pk=context['form'].initial['comissao']) - except ObjectDoesNotExist: - self.logger.error("user=" + username + ". Objeto Comissão de pk={} não encontrado.".format( - context['form'].initial['comissao'])) - pass - else: - self.logger.info("user=" + username + ". Objeto Comissao de pk={} obtido com sucesso.".format( - context['form'].initial['comissao'])) - - relatoria = Relatoria.objects.select_related( - 'materia').get(pk=self.kwargs.get('pk')) - ano_materia = relatoria.materia.ano - - comissao = Comissao.objects.get( - pk=context['form'].initial['comissao']) - composicoes = comissao.composicao_set.all() - composicao = comissao.composicao_set.filter( - periodo__data_inicio__year=ano_materia) - - participacoes = Participacao.objects.select_related().filter(composicao=composicao) - - parlamentares = [('', '---------')] + [ - (participacao.parlamentar.id, participacao.parlamentar.nome_parlamentar) for participacao in - participacoes if participacao.titular] - - context['form'].fields['parlamentar'].choices = parlamentares - - return context - class TramitacaoCrud(MasterDetailCrud): model = Tramitacao diff --git a/sapl/templates/materia/relatoria_form.html b/sapl/templates/materia/relatoria_form.html index 5dc3ca9c9..02f9a904a 100644 --- a/sapl/templates/materia/relatoria_form.html +++ b/sapl/templates/materia/relatoria_form.html @@ -16,5 +16,24 @@ {% block extra_js %} {% endblock extra_js %}