diff --git a/sapl/sessao/forms.py b/sapl/sessao/forms.py index f7308f62e..d21fd0d17 100644 --- a/sapl/sessao/forms.py +++ b/sapl/sessao/forms.py @@ -20,8 +20,8 @@ from sapl.utils import (RANGE_DIAS_MES, RANGE_MESES, MateriaPesquisaOrderingFilter, autor_label, autor_modal, timezone) -from .models import (Bancada, Bloco, ExpedienteMateria, Orador, - OradorExpediente, OrdemDia, SessaoPlenaria, +from .models import (Bancada, Bloco, ExpedienteMateria, JustificativaAusencia, + Orador,OradorExpediente, OrdemDia, SessaoPlenaria, SessaoPlenariaPresenca, TipoResultadoVotacao) @@ -676,3 +676,11 @@ class ResumoOrdenacaoForm(forms.Form): raise ValidationError(_( 'Não é possível ter campos repetidos')) return self.cleaned_data + + + +class JustificativaAusenciaForm(forms.Form): + def clean(self): + cleaned_data = super(JustificativaAusenciaForm, self).clean() + if not self.is_valid(): + return cleaned_data \ No newline at end of file diff --git a/sapl/sessao/models.py b/sapl/sessao/models.py index 68609dd40..ea9608ac3 100644 --- a/sapl/sessao/models.py +++ b/sapl/sessao/models.py @@ -582,6 +582,10 @@ class TipoJustificativa(models.Model): @reversion.register() class JustificativaAusencia(models.Model): + TIPO_AUSENCIA_CHOICES = Choices( + (1, 'sessao', 'Sessão'), + (2, 'materia', 'Matéria'), + ) parlamentar = models.ForeignKey(Parlamentar, on_delete=models.PROTECT) sessao_plenaria = models.ForeignKey(SessaoPlenaria, on_delete=models.CASCADE) @@ -591,4 +595,8 @@ class JustificativaAusencia(models.Model): hora = models.CharField( max_length=5, verbose_name=_('Horário (hh:mm)')) observacao = models.CharField( - max_length=150, blank=True, verbose_name=_('Observação')) \ No newline at end of file + max_length=150, blank=True, verbose_name=_('Observação')) + ausencia = models.PositiveIntegerField( + verbose_name=_('Ausente em'), choices=TIPO_AUSENCIA_CHOICES, default=1) + + diff --git a/sapl/sessao/urls.py b/sapl/sessao/urls.py index 5e977691b..6cf98cbef 100644 --- a/sapl/sessao/urls.py +++ b/sapl/sessao/urls.py @@ -4,8 +4,8 @@ from sapl.sessao.views import (AdicionarVariasMateriasExpediente, AdicionarVariasMateriasOrdemDia, BancadaCrud, BlocoCrud, CargoBancadaCrud, ExpedienteMateriaCrud, ExpedienteView, - MateriaOrdemDiaCrud, MesaView, OradorCrud, - OradorExpedienteCrud, PainelView, + JustificativaAusenciaCrud, MateriaOrdemDiaCrud, MesaView, + OradorCrud, OradorExpedienteCrud, PainelView, PautaSessaoDetailView, PautaSessaoView, PesquisarPautaSessaoView, PesquisarSessaoPlenariaView, @@ -152,8 +152,10 @@ urlpatterns = [ url(r'^sessao/(?P\d+)/votacao-simbolica-transparencia/(?P\d+)/(?P\d+)$', VotacaoSimbolicaTransparenciaDetailView.as_view(), name='votacao_simbolica_transparencia'), - url(r'^sessao/mudar-ordem-materia-sessao/', mudar_ordem_materia_sessao, name='mudar_ordem_materia_sessao'), + # Justificativa Ausencia + url(r'^sessao/(?P\d+)/justificativa/', + include(JustificativaAusenciaCrud.get_urls())), ] diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index 5c2c83ab2..f6dc812bf 100644 --- a/sapl/sessao/views.py +++ b/sapl/sessao/views.py @@ -37,14 +37,14 @@ from sapl.sessao.forms import ExpedienteMateriaForm, OrdemDiaForm from sapl.utils import show_results_filter_set, remover_acentos from .forms import (AdicionarVariasMateriasFilterSet, BancadaForm, BlocoForm, - ExpedienteForm, ListMateriaForm, MesaForm, + JustificativaAusenciaForm, ExpedienteForm, ListMateriaForm, MesaForm, OradorExpedienteForm, OradorForm, PautaSessaoFilterSet, PresencaForm, ResumoOrdenacaoForm, SessaoPlenariaFilterSet, SessaoPlenariaForm, VotacaoEditForm, VotacaoForm, VotacaoNominalForm) from .models import (Bancada, Bloco, CargoBancada, CargoMesa, - ExpedienteMateria, ExpedienteSessao, IntegranteMesa, - MateriaLegislativa, Orador, OradorExpediente, OrdemDia, + ExpedienteMateria, ExpedienteSessao, JustificativaAusencia, + IntegranteMesa, MateriaLegislativa, Orador, OradorExpediente, OrdemDia, PresencaOrdemDia, RegistroVotacao, ResumoOrdenacao, SessaoPlenaria, SessaoPlenariaPresenca, TipoExpediente, TipoJustificativa, TipoResultadoVotacao, TipoSessaoPlenaria, @@ -141,7 +141,7 @@ def abrir_votacao(request, pk, spk): presenca_model = SessaoPlenariaPresenca redirect_url = 'expedientemateria_list' if not model: - raise Http404 + raise Http404() if (verifica_presenca(request, presenca_model, spk) and verifica_votacoes_abertas(request) and @@ -2898,3 +2898,55 @@ def mudar_ordem_materia_sessao(request): materia_1.save() return + + +class JustificativaAusenciaCrud(Crud): + model = JustificativaAusencia + public = [RP_LIST, RP_DETAIL, ] + + class BaseMixin(Crud.BaseMixin): + list_field_names = ['sessao_plenaria', 'tipo_ausencia', 'hora', + 'data'] + ordering = 'sessao_plenaria', 'tipo_ausencia', 'data' + + class ListView(Crud.ListView): + paginate_by = 10 + + class CreateView(Crud.CreateView): + form_class = JustificativaAusenciaForm + + def get_success_url(self): + pk = self.sessao_plenaria.id + return reverse('sapl.sessao:justificativaausencia_list', kwargs={'pk': pk}) + + def get_initial(self): + if self.sessao_plenaria.finalizada is None or \ + not self.sessao_plenaria.finalizada: + msg = _('A Sessão deve estar finalizada para registrar as ausências.') + messages.add_message(self.request, messages.ERROR, msg) + else: + return {} + + def form_valid(self, form): + return super(Crud.CreateView, self).form_valid(form) + + class UpdateView(Crud.UpdateView): + form_class = JustificativaAusenciaForm + + def get_initial(self): + if self.sessao_plenaria.finalizada is None or \ + not self.sessao_plenaria.finalizada: + msg = _('A Sessão deve estar finalizada para editar as ausências.') + messages.add_message(self.request, messages.ERROR, msg) + else: + return {'sessao_plenaria': self.sessao_plenaria} + + class DeleteView(Crud.DeleteView): + pass + + class DetailView(Crud.DetailView): + + layout_key = 'JustificativaAusenciaDetail' + + def get(self, request, *args, **kwargs): + return super().get(request, *args, **kwargs) \ No newline at end of file diff --git a/sapl/templates/sessao/subnav.yaml b/sapl/templates/sessao/subnav.yaml index 236d57c4c..1bae7030f 100644 --- a/sapl/templates/sessao/subnav.yaml +++ b/sapl/templates/sessao/subnav.yaml @@ -8,6 +8,8 @@ url: mesa - title: {% trans 'Presença' %} url: presenca + - title: {% trans 'Ausência' %} + url: justificativaausencia_list - title: {% trans 'Explicações Pessoais' %} url: orador_list