From 2dc0268201e38c73e63f78e31112d1546586063c Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Wed, 23 Sep 2015 13:39:22 -0300 Subject: [PATCH] Add Expediente Materia CRUD --- sessao/urls.py | 20 +- sessao/views.py | 194 ++++++++++++++++++ .../sessao/expediente_ordemdia_list.html | 38 ++++ templates/sessao/sessaoplenaria_detail.html | 3 +- 4 files changed, 248 insertions(+), 7 deletions(-) create mode 100644 templates/sessao/expediente_ordemdia_list.html diff --git a/sessao/urls.py b/sessao/urls.py index 8e86b5802..3f1ec2ddb 100644 --- a/sessao/urls.py +++ b/sessao/urls.py @@ -1,12 +1,14 @@ from django.conf.urls import include, url -from sessao.views import (EditMateriaOrdemDiaView, ExpedienteView, +from sessao.views import (EditExpedienteOrdemDiaView, EditMateriaOrdemDiaView, + ExpedienteOrdemDiaView, ExpedienteView, ExplicacaoDelete, ExplicacaoEdit, ExplicacaoView, - ListMateriaOrdemDiaView, MateriaOrdemDiaView, - MesaView, OradorExpedienteDelete, - OradorExpedienteEdit, OradorExpedienteView, - PainelView, PresencaOrdemDiaView, PresencaView, - ResumoView, sessao_crud, tipo_expediente_crud, + ListExpedienteOrdemDiaView, ListMateriaOrdemDiaView, + MateriaOrdemDiaView, MesaView, + OradorExpedienteDelete, OradorExpedienteEdit, + OradorExpedienteView, PainelView, + PresencaOrdemDiaView, PresencaView, ResumoView, + sessao_crud, tipo_expediente_crud, tipo_resultado_votacao_crud, tipo_sessao_crud) urlpatterns_sessao = sessao_crud.urlpatterns + [ @@ -32,6 +34,12 @@ urlpatterns_sessao = sessao_crud.urlpatterns + [ EditMateriaOrdemDiaView.as_view(), name='materiaordemdia_edit'), url(r'^(?P\d+)/materiaordemdia/create$', MateriaOrdemDiaView.as_view(), name='materiaordemdia_create'), + url(r'^(?P\d+)/expedienteordemdia/list$', + ListExpedienteOrdemDiaView.as_view(), name='expedienteordemdia_list'), + url(r'^(?P\d+)/expedienteordemdia/edit/(?P\d+)$', + EditExpedienteOrdemDiaView.as_view(), name='expedienteordemdia_edit'), + url(r'^(?P\d+)/expedienteordemdia/create$', + ExpedienteOrdemDiaView.as_view(), name='expedienteordemdia_create'), url(r'^(?P\d+)/resumo$', ResumoView.as_view(), name='resumo'), url(r'^(?P\d+)/explicacao$', diff --git a/sessao/views.py b/sessao/views.py index 5018e39ff..657a75b09 100644 --- a/sessao/views.py +++ b/sessao/views.py @@ -260,6 +260,51 @@ class ListMateriaOrdemDiaView(sessao_crud.CrudDetailView): return self.render_to_response(context) +class ListExpedienteOrdemDiaView(sessao_crud.CrudDetailView): + template_name = 'sessao/expediente_ordemdia_list.html' + + def get(self, request, *args, **kwargs): + self.object = self.get_object() + context = self.get_context_data(object=self.object) + + pk = self.kwargs['pk'] + ordem = ExpedienteMateria.objects.filter(sessao_plenaria_id=pk) + + materias_ordem = [] + for o in ordem: + ementa = o.observacao + titulo = o.materia + numero = o.numero_ordem + + print(ementa) + + autoria = Autoria.objects.filter(materia_id=o.materia_id) + if len(autoria) > 1: + autor = 'Autores: ' + else: + autor = 'Autor: ' + + for a in autoria: + autor += str(a.autor) + autor += ' ' + + mat = {'pk': pk, + 'oid': o.materia_id, + 'ementa': ementa, + 'titulo': titulo, + 'numero': numero, + 'resultado': o.resultado, + 'autor': autor, + } + materias_ordem.append(mat) + + sorted(materias_ordem, key=lambda x: x['numero']) + + context.update({'materias_ordem': materias_ordem}) + + return self.render_to_response(context) + + class MateriaOrdemDiaForm(forms.Form): data_sessao = forms.CharField(required=True) numero_ordem = forms.IntegerField(required=True) @@ -416,6 +461,155 @@ class EditMateriaOrdemDiaView(FormMixin, sessao_crud.CrudDetailView): return reverse('sessaoplenaria:materiaordemdia_list', kwargs={'pk': pk}) + +class ExpedienteOrdemDiaView(FormMixin, sessao_crud.CrudDetailView): + template_name = 'sessao/materia_ordemdia.html' + form_class = MateriaOrdemDiaForm + + def get_success_url(self): + pk = self.kwargs['pk'] + return reverse('sessaoplenaria:expedienteordemdia_list', + kwargs={'pk': pk}) + + def get(self, request, *args, **kwargs): + self.object = self.get_object() + context = self.get_context_data(object=self.object) + + now = datetime.now() + + tipo_materia = TipoMateriaLegislativa.objects.all() + data_sessao = now + tipo_sessao = TipoSessaoPlenaria.objects.all() + tipo_votacao = ExpedienteMateria.TIPO_VOTACAO_CHOICES + ano_materia = now.year + + context.update({'data_sessao': data_sessao, + 'tipo_sessao': tipo_sessao, + 'tipo_materia': tipo_materia, + 'tipo_votacao': tipo_votacao, + 'ano_materia': ano_materia, + 'error_message': '', }) + return self.render_to_response(context) + + def post(self, request, *args, **kwargs): + + self.object = self.get_object() + context = self.get_context_data(object=self.object) + form = MateriaOrdemDiaForm(request.POST) + + if form.is_valid(): + try: + materia = MateriaLegislativa.objects.get( + numero=request.POST['numero_materia'], + tipo_id=request.POST['tipo_materia'], + ano=request.POST['ano_materia']) + except ObjectDoesNotExist: + context.update( + {'error_message': "Matéria inexistente!"}) + return self.form_invalid(form) + + # TODO: barrar matérias não existentes + # TODO: barrar criação de ordemdia para materias já incluídas + + ordemdia = ExpedienteMateria() + ordemdia.sessao_plenaria_id = self.object.id + ordemdia.materia_id = materia.id + ordemdia.numero_ordem = request.POST['numero_ordem'] + ordemdia.data_ordem = datetime.now() + ordemdia.observacao = sub(' ', ' ', + strip_tags(request.POST['observacao'])) + ordemdia.tipo_votacao = request.POST['tipo_votacao'] + ordemdia.save() + + return self.form_valid(form) + else: + context.update( + {'error_message': "Não foi possível salvar formulário!"}) + return self.form_invalid(form) + + +class EditExpedienteOrdemDiaView(FormMixin, sessao_crud.CrudDetailView): + template_name = 'sessao/materia_ordemdia_edit.html' + form_class = MateriaOrdemDiaForm + + def get(self, request, *args, **kwargs): + self.object = self.get_object() + context = self.get_context_data(object=self.object) + + pk = kwargs['pk'] + oid = kwargs['oid'] + ordem = ExpedienteMateria.objects.get( + sessao_plenaria_id=pk, materia_id=oid) + + materia = MateriaLegislativa.objects.get( + id=ordem.materia_id) + + data_ordem = ordem.data_ordem + tipo_votacao = ExpedienteMateria.TIPO_VOTACAO_CHOICES + tipo_sessao = TipoSessaoPlenaria.objects.all() + tipo_materia = TipoMateriaLegislativa.objects.all() + + context.update({'data_sessao': data_ordem, + 'tipo_sessao': tipo_sessao, + 'tipo_sessao_selected': self.object.tipo, + 'tipo_materia': tipo_materia, + 'tipo_materia_selected': materia.tipo, + 'tipo_votacao': tipo_votacao, + 'tipo_votacao_selected': ordem.tipo_votacao, + 'ano_materia': materia.ano, + 'numero_ordem': ordem.numero_ordem, + 'numero_materia': materia.numero, + 'ordem_id': oid, + 'oid': '', + 'observacao': sub( + ' ', ' ', strip_tags(ordem.observacao)), + 'error_message': '', }) + return self.render_to_response(context) + + def post(self, request, *args, **kwargs): + + self.object = self.get_object() + context = self.get_context_data(object=self.object) + form = MateriaOrdemDiaForm(request.POST) + + pk = kwargs['pk'] + oid = kwargs['oid'] + ordemdia = ExpedienteMateria.objects.get( + sessao_plenaria_id=pk, materia_id=oid) + + if 'update-ordemdia' in request.POST: + if form.is_valid(): + try: + materia = MateriaLegislativa.objects.get( + numero=request.POST['numero_materia'], + tipo_id=request.POST['tipo_materia'], + ano=request.POST['ano_materia']) + except ObjectDoesNotExist: + context.update( + {'error_message': "Matéria inexistente!"}) + return self.form_invalid(form) + + ordemdia.materia_id = materia.id + ordemdia.numero_ordem = request.POST['numero_ordem'] + ordemdia.tipo_votacao = request.POST['tipo_votacao'] + obs = strip_tags(request.POST['observacao']) + ordemdia.observacao = sub(' ', ' ', obs) + ordemdia.save() + return self.form_valid(form) + else: + context.update( + {'error_message': "Não foi possível salvar formulário!"}) + return self.form_invalid(form) + elif 'delete-ordemdia' in request.POST: + ordemdia.delete() + return self.form_valid(form) + + def get_success_url(self): + pk = self.kwargs['pk'] + return reverse('sessaoplenaria:expedienteordemdia_list', + kwargs={'pk': pk}) + + class OradorForm(forms.Form): numero_ordem = forms.IntegerField(required=True) parlamentar = forms.CharField(required=False, max_length=20) diff --git a/templates/sessao/expediente_ordemdia_list.html b/templates/sessao/expediente_ordemdia_list.html new file mode 100644 index 000000000..1afd6a7b4 --- /dev/null +++ b/templates/sessao/expediente_ordemdia_list.html @@ -0,0 +1,38 @@ +{% extends "sessao/sessaoplenaria_detail.html" %} +{% load i18n %} + +{% block detail_content %} + +Matérias do Expediente + +
    +
  • Matéria
  • +
  • Ementa
  • +
  • Resultado da Votação
  • +
+
    + {% for m in materias_ordem %} +
  • + {{m.numero}} - {{m.titulo}} +   +
    + {{m.autor}} +
  • +
  • {{m.ementa|safe}}
  • +
  • {% if m.resultado %}{{m.resultado}}{% endif %}
  • + {% endfor %} +
+ +
+ + {% trans 'Adicionar Matérias' %} + + + + + +{% endblock detail_content %} \ No newline at end of file diff --git a/templates/sessao/sessaoplenaria_detail.html b/templates/sessao/sessaoplenaria_detail.html index 3ffd8460d..4a5de49f3 100644 --- a/templates/sessao/sessaoplenaria_detail.html +++ b/templates/sessao/sessaoplenaria_detail.html @@ -10,7 +10,8 @@
{% trans 'Oradores do Expediente' %}
{% trans 'Mesa' %}
{% trans 'Explicações Pessoais' %}
-
{% trans 'Matérias' %}
+
{% trans 'Matérias Ordem do Dia' %}
+
{% trans 'Matérias Expediente' %}
{% trans 'Painel Eletrônico' %}
{% trans 'Resumo' %}