diff --git a/sapl/base/forms.py b/sapl/base/forms.py index 20008b73a..6556e615f 100644 --- a/sapl/base/forms.py +++ b/sapl/base/forms.py @@ -10,7 +10,6 @@ from django.contrib.auth.forms import (AuthenticationForm, PasswordResetForm, from django.contrib.auth.models import Group, User from django.core.exceptions import ValidationError from django.db import models, transaction -from django.db.models import Q from django.forms import Form, ModelForm from django.utils.translation import ugettext_lazy as _ from django.utils.translation import string_concat @@ -18,6 +17,7 @@ from django.utils.translation import string_concat from sapl.base.models import Autor, TipoAutor from sapl.crispy_layout_mixin import (SaplFormLayout, form_actions, to_column, to_row) +from sapl.comissoes.models import Reuniao from sapl.materia.models import (MateriaLegislativa, UnidadeTramitacao, StatusTramitacao) from sapl.parlamentares.models import SessaoLegislativa from sapl.sessao.models import SessaoPlenaria @@ -169,56 +169,8 @@ class SessaoLegislativaForm(ModelForm): if not self.is_valid(): return cleaned_data - flag_edit = True data_inicio = cleaned_data['data_inicio'] data_fim = cleaned_data['data_fim'] - legislatura = cleaned_data['legislatura'] - numero = cleaned_data['numero'] - data_inicio_leg = legislatura.data_inicio - data_fim_leg = legislatura.data_fim - pk = self.initial['id'] if self.initial else None - - # Querys para verificar se existem Sessões Legislativas no período selecionado no form - # Caso onde a data_inicio e data_fim são iguais a de alguma sessão já criada - primeiro_caso = Q(data_inicio=data_inicio, data_fim=data_fim) - # Caso onde a data_inicio está entre o início e o fim de uma Sessão já existente - segundo_caso = Q(data_inicio__lt=data_inicio, data_fim__range=(data_inicio, data_fim)) - # Caso onde a data_fim está entre o início e o fim de uma Sessão já existente - terceiro_caso = Q(data_inicio__range=(data_inicio, data_fim), data_fim__gt=data_fim) - sessoes_existentes = SessaoLegislativa.objects.filter(primeiro_caso|segundo_caso|terceiro_caso).\ - exclude(pk=pk) - - if sessoes_existentes: - raise ValidationError('Já existe registrado uma Sessão Legislativa que coincide com a data ' - 'inserida, favor verificar as Sessões existentes antes de criar uma ' - 'nova Sessão Legislativa') - - sessoes_legislativas = SessaoLegislativa.objects.filter(legislatura=legislatura).exclude(pk=pk) - - if sessoes_legislativas: - numeracoes = [n.numero for n in sessoes_legislativas] - numeracoes = sorted(numeracoes) - ult = max(numeracoes) - - else: - ult = SessaoLegislativa.objects.latest('data_fim') - flag_edit = ult.id != pk - ult = ult.numero - - if numero <= ult and flag_edit: - raise ValidationError('O número da Sessão Legislativa não pode ser menor ou igual ' - 'que o de Sessões Legislativas passadas') - - - if data_inicio < data_inicio_leg or \ - data_inicio > data_fim_leg: - raise ValidationError('A data de início da Sessão Legislativa deve estar compreendida ' - 'entre a data início e fim da Legislatura selecionada') - - if data_fim > data_fim_leg or \ - data_fim < data_inicio_leg: - raise ValidationError('A data de fim da Sessão Legislativa deve estar compreendida ' - 'entre a data início e fim da Legislatura selecionada') if data_inicio > data_fim: raise ValidationError('Data início não pode ser superior à data fim') @@ -231,23 +183,6 @@ class SessaoLegislativaForm(ModelForm): raise ValidationError('Data início de intervalo não pode ser ' 'superior à data fim de intervalo') - if data_inicio_intervalo: - if data_inicio_intervalo < data_inicio or \ - data_inicio_intervalo < data_inicio_leg or \ - data_inicio_intervalo > data_fim or \ - data_inicio_intervalo > data_inicio_leg: - raise ValidationError('A data de início do intervalo deve estar compreendida entre ' - 'as datas de início e fim tanto da Legislatura quanto da ' - 'própria Sessão Legislativa') - - if data_fim_intervalo: - if data_fim_intervalo > data_fim or \ - data_fim_intervalo > data_fim_leg or \ - data_fim_intervalo < data_inicio or \ - data_fim_intervalo < data_inicio_leg: - raise ValidationError('A data de fim do intervalo deve estar compreendida entre ' - 'as datas de início e fim tanto da Legislatura quanto da ' - 'própria Sessão Legislativa') return cleaned_data @@ -731,6 +666,38 @@ class RelatorioDataFimPrazoTramitacaoFilterSet(django_filters.FilterSet): ) +class RelatorioReuniaoFilterSet(django_filters.FilterSet): + + @property + def qs(self): + parent = super(RelatorioReuniaoFilterSet, self).qs + return parent.distinct().order_by('-data', 'comissao') + + class Meta: + model = Reuniao + fields = ['comissao', 'data', + 'nome','tema'] + + def __init__(self, *args, **kwargs): + super(RelatorioReuniaoFilterSet, self).__init__( + *args, **kwargs) + + row1 = to_row([('data', 12)]) + row2 = to_row( + [('comissao', 4), + ('nome', 4), + ('tema', 4)]) + + self.form.helper = FormHelper() + self.form.helper.form_method = 'GET' + self.form.helper.layout = Layout( + Fieldset(_('Reunião de Comissão'), + row1, row2, + form_actions(label='Pesquisar')) + ) + + + class RelatorioMateriasTramitacaoilterSet(django_filters.FilterSet): ano = django_filters.ChoiceFilter(required=True, @@ -816,8 +783,7 @@ class RelatorioMateriasPorAutorFilterSet(django_filters.FilterSet): @property def qs(self): parent = super(RelatorioMateriasPorAutorFilterSet, self).qs - return parent.distinct().filter(autoria__primeiro_autor=True)\ - .order_by('autoria__autor', '-autoria__primeiro_autor', 'tipo', '-ano', '-numero') + return parent.distinct().filter(autoria__primeiro_autor=True).order_by('autoria__autor', '-autoria__primeiro_autor', 'tipo', '-ano', '-numero') class Meta: model = MateriaLegislativa diff --git a/sapl/base/urls.py b/sapl/base/urls.py index b52d46ad6..84ff694fd 100644 --- a/sapl/base/urls.py +++ b/sapl/base/urls.py @@ -20,6 +20,7 @@ from .views import (AlterarSenha, AppConfigCrud, CasaLegislativaCrud, RelatorioHistoricoTramitacaoView, RelatorioMateriasPorAnoAutorTipoView, RelatorioMateriasPorAutorView, + RelatorioReuniaoView, RelatorioMateriasTramitacaoView, RelatorioPresencaSessaoView, SaplSearchView) @@ -104,6 +105,9 @@ urlpatterns = [ url(r'^sistema/relatorios/atas$', RelatorioAtasView.as_view(), name='atas'), + url(r'^sistema/relatorios/reuniao$', + RelatorioReuniaoView.as_view(), + name='reuniao'), url(r'^email/validate/(?P[0-9A-Za-z_\-]+)/' '(?P[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})$', diff --git a/sapl/base/views.py b/sapl/base/views.py index f124a3417..85683dd60 100644 --- a/sapl/base/views.py +++ b/sapl/base/views.py @@ -25,6 +25,7 @@ from sapl import settings from sapl.base.forms import AutorForm, AutorFormForAdmin, TipoAutorForm from sapl.base.models import Autor, TipoAutor from sapl.crud.base import CrudAux, make_pagination +from sapl.comissoes.models import Reuniao from sapl.materia.models import (Autoria, MateriaLegislativa, TipoMateriaLegislativa, StatusTramitacao, UnidadeTramitacao) from sapl.sessao.models import (PresencaOrdemDia, SessaoPlenaria, @@ -38,6 +39,7 @@ from .forms import (AlterarSenhaForm, CasaLegislativaForm, RelatorioHistoricoTramitacaoFilterSet, RelatorioMateriasPorAnoAutorTipoFilterSet, RelatorioMateriasPorAutorFilterSet, + RelatorioReuniaoFilterSet, RelatorioMateriasTramitacaoilterSet, RelatorioPresencaSessaoFilterSet, UsuarioCreateForm, UsuarioEditForm) @@ -436,6 +438,37 @@ class RelatorioDataFimPrazoTramitacaoView(FilterView): return context +class RelatorioReuniaoView(FilterView): + model = Reuniao + filterset_class = RelatorioReuniaoFilterSet + template_name = 'base/RelatorioReuniao_filter.html' + + def get_filterset_kwargs(self, filterset_class): + super(RelatorioReuniaoView, + self).get_filterset_kwargs(filterset_class) + + kwargs = {'data': self.request.GET or None} + return kwargs + + def get_context_data(self, **kwargs): + context = super(RelatorioReuniaoView, + self).get_context_data(**kwargs) + context['title'] = _('Reunião de Comissão') + if not self.filterset.form.is_valid(): + return context + qr = self.request.GET.copy() + context['filter_url'] = ('&' + qr.urlencode()) if len(qr) > 0 else '' + + context['show_results'] = show_results_filter_set(qr) + + if self.request.GET['comissao']: + tipo = self.request.GET['comissao'] + context['comissao'] = (str(Comissao.objects.get(id=comissao))) + else: + context['comissao'] = '' + + return context + class RelatorioMateriasTramitacaoView(FilterView): model = MateriaLegislativa diff --git a/sapl/templates/base/RelatorioReuniao_filter.html b/sapl/templates/base/RelatorioReuniao_filter.html new file mode 100644 index 000000000..40a6f4625 --- /dev/null +++ b/sapl/templates/base/RelatorioReuniao_filter.html @@ -0,0 +1,34 @@ +{% extends "crud/list.html" %} +{% load i18n %} +{% load crispy_forms_tags %} + +{% block base_content %} + {% if not show_results %} + {% crispy filter.form %} + {% endif %} + + {% if show_results %} + +



+ + + + + + + + + {% for reuniao in object_list %} + + + + + {% endfor %} + +
ComissaoNome
+ {{reuniao.comissao}} + {{reuniao.nome}}
+ {% endif %} +{% endblock base_content %} \ No newline at end of file diff --git a/sapl/templates/base/relatorios_list.html b/sapl/templates/base/relatorios_list.html index 1bd0f5eda..3808ca97e 100644 --- a/sapl/templates/base/relatorios_list.html +++ b/sapl/templates/base/relatorios_list.html @@ -40,6 +40,10 @@ Tramitações por fim de prazo Tramitações com fim de prazo no intervalo informado. + + Reunião de Comissão + Reunião de Comissão por data. +