diff --git a/sapl/api/views.py b/sapl/api/views.py index 1cfdd1d44..2eedb9464 100644 --- a/sapl/api/views.py +++ b/sapl/api/views.py @@ -401,6 +401,11 @@ class _MateriaLegislativaViewSet: return Response(serializer_class.data) + @action(detail=True, methods=['GET']) + def anexadas(self, request, *args, **kwargs): + self.queryset = self.get_object().anexadas.all() + return self.list(request, *args, **kwargs) + @customize(TipoMateriaLegislativa) class _TipoMateriaLegislativaViewSet: diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py index 29e6f9d4d..f662c0fec 100644 --- a/sapl/materia/forms.py +++ b/sapl/materia/forms.py @@ -3,7 +3,6 @@ import logging import os from crispy_forms.bootstrap import Alert, InlineRadios -from sapl.crispy_layout_mixin import SaplFormHelper from crispy_forms.layout import (HTML, Button, Column, Div, Field, Fieldset, Layout, Row) from django import forms @@ -31,6 +30,7 @@ from sapl.compilacao.models import (STATUS_TA_IMMUTABLE_PUBLIC, STATUS_TA_PRIVATE) from sapl.crispy_layout_mixin import (SaplFormLayout, form_actions, to_column, to_row) +from sapl.crispy_layout_mixin import SaplFormHelper from sapl.materia.models import (AssuntoMateria, Autoria, MateriaAssunto, MateriaLegislativa, Orgao, RegimeTramitacao, TipoDocumento, TipoProposicao, StatusTramitacao, @@ -402,7 +402,17 @@ class RelatoriaForm(ModelForm): self.fields['composicao'].choices = [('', '---------')] + \ [(c.pk, c) for c in composicoes] - self.fields['parlamentar'].choices = [('', '---------')] + # UPDATE + if self.initial.get('composicao') and self.initial.get('parlamentar'): + parlamentares = [(p.parlamentar.id, p.parlamentar) for p in + Participacao.objects.filter(composicao__comissao_id=comissao_pk, + composicao_id=self.initial['composicao'])] + + self.fields['parlamentar'].choices = [ + ('', '---------')] + parlamentares + # INSERT + else: + self.fields['parlamentar'].choices = [('', '---------')] def clean(self): super().clean() @@ -424,6 +434,11 @@ class RelatoriaForm(ModelForm): else: cleaned_data['comissao'] = comissao + if cleaned_data['data_designacao_relator'] < cleaned_data['composicao'].periodo.data_inicio \ + or cleaned_data['data_designacao_relator'] > cleaned_data['composicao'].periodo.data_fim: + raise ValidationError( + _('Data de designação deve estar dentro do período da composição.')) + return cleaned_data @@ -452,9 +467,12 @@ class TramitacaoForm(ModelForm): super(TramitacaoForm, self).__init__(*args, **kwargs) self.fields['data_tramitacao'].initial = timezone.now().date() ust = UnidadeTramitacao.objects.select_related().all() - unidade_tramitacao_destino = [('', '---------')]+[(ut.pk, ut) for ut in ust if ut.comissao and ut.comissao.ativa] - unidade_tramitacao_destino.extend([(ut.pk, ut) for ut in ust if ut.orgao]) - unidade_tramitacao_destino.extend([(ut.pk, ut) for ut in ust if ut.parlamentar]) + unidade_tramitacao_destino = [('', '---------')] + [(ut.pk, ut) + for ut in ust if ut.comissao and ut.comissao.ativa] + unidade_tramitacao_destino.extend( + [(ut.pk, ut) for ut in ust if ut.orgao]) + unidade_tramitacao_destino.extend( + [(ut.pk, ut) for ut in ust if ut.parlamentar]) self.fields['unidade_tramitacao_destino'].choices = unidade_tramitacao_destino def clean(self): @@ -791,9 +809,11 @@ class AnexadaForm(ModelForm): self.logger.error("Matéria não pode ser anexada a si mesma.") raise ValidationError(_('Matéria não pode ser anexada a si mesma')) - is_anexada = Anexada.objects.filter(materia_principal=materia_principal, - materia_anexada=materia_anexada - ).exists() + is_anexada = Anexada.objects.filter( + materia_principal=materia_principal, + materia_anexada=materia_anexada + ).exclude(pk=self.instance.pk).exists() + if is_anexada: self.logger.error("Matéria já se encontra anexada.") raise ValidationError(_('Matéria já se encontra anexada')) @@ -1189,6 +1209,7 @@ class AcessorioEmLoteFilterSet(django_filters.FilterSet): Fieldset(_('Documentos Acessórios em Lote'), row1, row2, form_actions(label='Pesquisar'))) + class AnexadaEmLoteFilterSet(django_filters.FilterSet): class Meta(FilterOverridesMetaMixin): @@ -1590,8 +1611,8 @@ class ProposicaoForm(FileFieldCheckMixin, forms.ModelForm): if cd['numero_materia_futuro'] and \ 'tipo' in cd and \ MateriaLegislativa.objects.filter(tipo=cd['tipo'].tipo_conteudo_related, - ano=timezone.now().year, - numero=cd['numero_materia_futuro']): + ano=timezone.now().year, + numero=cd['numero_materia_futuro']): raise ValidationError(_("A matéria {} {}/{} já existe.".format(cd['tipo'].tipo_conteudo_related.descricao, cd['numero_materia_futuro'], timezone.now().year))) @@ -2010,14 +2031,13 @@ class ConfirmarProposicaoForm(ProposicaoForm): if numeracao is None: numero['numero__max'] = 0 - if cd['numero_materia_futuro'] and not MateriaLegislativa.objects.filter(tipo=tipo, ano=ano, numero=cd['numero_materia_futuro']): max_numero = cd['numero_materia_futuro'] else: - max_numero = numero['numero__max'] + 1 if numero['numero__max'] else 1 - + max_numero = numero['numero__max'] + \ + 1 if numero['numero__max'] else 1 # dados básicos materia = MateriaLegislativa() @@ -2508,7 +2528,9 @@ class MateriaPesquisaSimplesForm(forms.Form): raise ValidationError(_('Caso pesquise por data, os campos de Data Inicial e ' 'Data Final devem ser preenchidos obrigatoriamente')) elif data_inicial > data_final: - self.logger.error("Data Final ({}) menor que a Data Inicial ({}).".format(data_final, data_inicial)) - raise ValidationError(_('A Data Final não pode ser menor que a Data Inicial')) + self.logger.error("Data Final ({}) menor que a Data Inicial ({}).".format( + data_final, data_inicial)) + raise ValidationError( + _('A Data Final não pode ser menor que a Data Inicial')) return cleaned_data diff --git a/sapl/materia/views.py b/sapl/materia/views.py index e41328d17..d191a7568 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -33,7 +33,7 @@ import sapl from sapl.base.email_utils import do_envia_email_confirmacao from sapl.base.models import Autor, CasaLegislativa, AppConfig as BaseAppConfig from sapl.base.signals import tramitacao_signal -from sapl.comissoes.models import Comissao, Participacao +from sapl.comissoes.models import Comissao, Participacao, Composicao from sapl.compilacao.models import (STATUS_TA_IMMUTABLE_RESTRICT, STATUS_TA_PRIVATE) from sapl.compilacao.views import IntegracaoTaView @@ -1135,6 +1135,26 @@ class RelatoriaCrud(MasterDetailCrud): layout_key = None logger = logging.getLogger(__name__) + def get_initial(self): + relatoria = Relatoria.objects.get(id=self.kwargs['pk']) + parlamentar = relatoria.parlamentar + comissao = relatoria.comissao + composicoes = [p.composicao for p in + Participacao.objects.filter( + parlamentar=parlamentar, + composicao__comissao=comissao)] + data_designacao = relatoria.data_designacao_relator + composicao = '' + for c in composicoes: + data_inicial = c.periodo.data_inicio + data_fim = c.periodo.data_fim if c.periodo.data_fim else timezone.now().date() + if data_inicial <= data_designacao <= data_fim: + composicao = c.id + break + return {'comissao': relatoria.comissao.id, + 'parlamentar': relatoria.parlamentar.id, + 'composicao': composicao} + class TramitacaoCrud(MasterDetailCrud): model = Tramitacao