diff --git a/create_admin.py b/create_admin.py index 7fe03a65c..09ca17798 100644 --- a/create_admin.py +++ b/create_admin.py @@ -1,11 +1,12 @@ -import sys import os +import sys + import django +from django.contrib.auth.models import User os.environ.setdefault("DJANGO_SETTINGS_MODULE", "sapl.settings") django.setup() -from django.contrib.auth.models import User def create_superuser(): username = "admin" diff --git a/genkey.py b/genkey.py index 85f399c54..248a67e8f 100644 --- a/genkey.py +++ b/genkey.py @@ -1,5 +1,6 @@ import random + def generate_secret(): return ''.join([random.SystemRandom().choice('abcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*(-_=+)') for i in range(50)]) diff --git a/sapl/api/forms.py b/sapl/api/forms.py index afa9190f4..41e40eacf 100644 --- a/sapl/api/forms.py +++ b/sapl/api/forms.py @@ -1,6 +1,6 @@ from django.db.models import Q -from django.forms.fields import MultiValueField, CharField -from django.forms.widgets import TextInput, MultiWidget +from django.forms.fields import CharField, MultiValueField +from django.forms.widgets import MultiWidget, TextInput from django_filters.filters import MethodFilter, ModelChoiceFilter from rest_framework.compat import django_filters from rest_framework.filters import FilterSet diff --git a/sapl/api/serializers.py b/sapl/api/serializers.py index e6adaf21a..4590e0186 100644 --- a/sapl/api/serializers.py +++ b/sapl/api/serializers.py @@ -2,7 +2,7 @@ from rest_framework import serializers from sapl.base.models import Autor, CasaLegislativa from sapl.materia.models import MateriaLegislativa -from sapl.sessao.models import SessaoPlenaria, OrdemDia +from sapl.sessao.models import OrdemDia, SessaoPlenaria class ChoiceSerializer(serializers.Serializer): diff --git a/sapl/api/views.py b/sapl/api/views.py index eb1364bf7..1cb669599 100644 --- a/sapl/api/views.py +++ b/sapl/api/views.py @@ -5,9 +5,8 @@ from django.utils.translation import ugettext_lazy as _ from rest_framework.filters import DjangoFilterBackend from rest_framework.generics import ListAPIView from rest_framework.mixins import ListModelMixin, RetrieveModelMixin -from rest_framework.permissions import (IsAuthenticated, - IsAuthenticatedOrReadOnly, - AllowAny) +from rest_framework.permissions import (AllowAny, IsAuthenticated, + IsAuthenticatedOrReadOnly) from rest_framework.viewsets import GenericViewSet, ModelViewSet from sapl.api.forms import AutorChoiceFilterSet, AutorSearchForFieldFilterSet diff --git a/sapl/base/search_indexes.py b/sapl/base/search_indexes.py index 394d92e41..1ac607001 100644 --- a/sapl/base/search_indexes.py +++ b/sapl/base/search_indexes.py @@ -4,13 +4,12 @@ import os.path import textract from django.template import Context, loader from haystack import indexes +from textract.exceptions import ExtensionNotSupported from sapl.materia.models import DocumentoAcessorio, MateriaLegislativa from sapl.norma.models import NormaJuridica - -from textract.exceptions import ExtensionNotSupported - from sapl.settings import BASE_DIR + logger = logging.getLogger(BASE_DIR.name) class DocumentoAcessorioIndex(indexes.SearchIndex, indexes.Indexable): diff --git a/sapl/legacy/migracao_documentos.py b/sapl/legacy/migracao_documentos.py index 8ac380b5f..bd770a06e 100644 --- a/sapl/legacy/migracao_documentos.py +++ b/sapl/legacy/migracao_documentos.py @@ -3,20 +3,19 @@ import os import re import magic - from django.db.models.signals import post_delete, post_save + from sapl.base.models import CasaLegislativa from sapl.materia.models import (DocumentoAcessorio, MateriaLegislativa, Proposicao) from sapl.norma.models import NormaJuridica from sapl.parlamentares.models import Parlamentar -from sapl.protocoloadm.models import DocumentoAdministrativo -from sapl.protocoloadm.models import DocumentoAcessorioAdministrativo +from sapl.protocoloadm.models import (DocumentoAcessorioAdministrativo, + DocumentoAdministrativo) from sapl.sessao.models import SessaoPlenaria from sapl.settings import MEDIA_ROOT from sapl.utils import delete_texto, save_texto - # MIGRAÇÃO DE DOCUMENTOS ################################################### EXTENSOES = { 'application/msword': '.doc', diff --git a/sapl/legacy/migration.py b/sapl/legacy/migration.py index 26003b4fc..af11730b9 100644 --- a/sapl/legacy/migration.py +++ b/sapl/legacy/migration.py @@ -599,6 +599,7 @@ def adjust_ordemdia_antes_salvar(new, old): if not old.tip_votacao: new.tipo_votacao = 1 + if old.num_ordem is None: new.numero_ordem = 999999999 diff --git a/sapl/materia/signals.py b/sapl/materia/signals.py index 9f08b104c..7314d7504 100644 --- a/sapl/materia/signals.py +++ b/sapl/materia/signals.py @@ -1,8 +1,8 @@ from django.db.models.signals import post_delete, post_save -from sapl.utils import save_texto, delete_texto -from .models import DocumentoAcessorio, MateriaLegislativa +from sapl.utils import delete_texto, save_texto +from .models import DocumentoAcessorio, MateriaLegislativa post_save.connect(save_texto, sender=MateriaLegislativa) post_save.connect(save_texto, sender=DocumentoAcessorio) diff --git a/sapl/materia/views.py b/sapl/materia/views.py index 85afc40c0..a130aee1e 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -7,7 +7,7 @@ from crispy_forms.layout import HTML from django.contrib import messages from django.contrib.auth.decorators import permission_required from django.contrib.auth.mixins import PermissionRequiredMixin -from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned +from django.core.exceptions import MultipleObjectsReturned, ObjectDoesNotExist from django.core.mail import send_mail from django.core.urlresolvers import reverse from django.http import HttpResponse, JsonResponse diff --git a/sapl/norma/signals.py b/sapl/norma/signals.py index 3089e563e..c01ac927d 100644 --- a/sapl/norma/signals.py +++ b/sapl/norma/signals.py @@ -1,8 +1,8 @@ from django.db.models.signals import post_delete, post_save -from sapl.utils import save_texto, delete_texto -from .models import NormaJuridica +from sapl.utils import delete_texto, save_texto +from .models import NormaJuridica post_save.connect(save_texto, sender=NormaJuridica) post_delete.connect(delete_texto, sender=NormaJuridica) diff --git a/sapl/painel/views.py b/sapl/painel/views.py index 30fce8ce6..df30ada41 100644 --- a/sapl/painel/views.py +++ b/sapl/painel/views.py @@ -14,8 +14,7 @@ from sapl.painel.models import Painel from sapl.parlamentares.models import Filiacao, Votante from sapl.sessao.models import (ExpedienteMateria, OrdemDia, PresencaOrdemDia, RegistroVotacao, SessaoPlenaria, - SessaoPlenariaPresenca, VotoNominal, - VotoParlamentar) + SessaoPlenariaPresenca, VotoParlamentar) from sapl.utils import get_client_ip from .models import Cronometro @@ -38,7 +37,11 @@ def votante_view(request, pk): context = {'head_title': str(_('Votação Individual')), 'sessao_id': pk} # Pega sessão - sessao = SessaoPlenaria.objects.get(pk=pk) + try: + sessao = SessaoPlenaria.objects.get(pk=pk) + except ObjectDoesNotExist: + raise Http404() + context.update({'sessao': sessao, 'data': sessao.data_inicio, 'hora': sessao.hora_inicio}) @@ -98,35 +101,60 @@ def votante_view(request, pk): 'Nenhuma matéria com votação nominal aberta.'}) # Recupera o voto do parlamentar logado - try: - voto = VotoNominal.objects.get( - sessao=sessao, - parlamentar=parlamentar, - materia=materia) - except ObjectDoesNotExist: - context.update({'voto_parlamentar': 'Voto não computado.'}) - else: - context.update({'voto_parlamentar': voto.voto}) + voto = [] + if ordem_dia: + voto = VotoParlamentar.objects.filter( + ordem=ordem_dia) + elif expediente: + voto = VotoParlamentar.objects.filter( + expediente=expediente) - # Salva o voto - if request.method == 'POST': + if voto: try: - voto = VotoNominal.objects.get( - sessao=sessao, - parlamentar=parlamentar, - materia=materia) + voto = voto.get(parlamentar=parlamentar) except ObjectDoesNotExist: - voto = VotoNominal.objects.create( - sessao=sessao, - parlamentar=parlamentar, - materia=materia, - voto=request.POST['voto'], - ip=get_client_ip(request), - user=request.user) + context.update({'voto_parlamentar': 'Voto não computado.'}) else: - voto.voto = request.POST['voto'] - voto.ip = get_client_ip(request) - voto.save() + context.update({'voto_parlamentar': voto.voto}) + + # Salva o voto + if request.method == 'POST': + if ordem_dia: + try: + voto = VotoParlamentar.objects.get( + parlamentar=parlamentar, + ordem=ordem_dia) + except ObjectDoesNotExist: + voto = VotoParlamentar.objects.create( + parlamentar=parlamentar, + voto=request.POST['voto'], + user=request.user, + ip=get_client_ip(request), + ordem=ordem_dia) + else: + voto.voto = request.POST['voto'] + voto.ip = get_client_ip(request) + voto.user = request.user + voto.save() + + elif expediente: + try: + voto = VotoParlamentar.objects.get( + parlamentar=parlamentar, + expediente=expediente) + except ObjectDoesNotExist: + voto = VotoParlamentar.objects.create( + parlamentar=parlamentar, + voto=request.POST['voto'], + user=request.user, + ip=get_client_ip(request), + expediente=expediente) + else: + voto.voto = request.POST['voto'] + voto.ip = get_client_ip(request) + voto.user = request.user + voto.save() + return HttpResponseRedirect( reverse('sapl.painel:voto_individual', kwargs={'pk': pk})) diff --git a/sapl/parlamentares/models.py b/sapl/parlamentares/models.py index 2f1284fbf..965761e34 100644 --- a/sapl/parlamentares/models.py +++ b/sapl/parlamentares/models.py @@ -1,9 +1,9 @@ from datetime import datetime +import reversion from django.db import models from django.utils.translation import ugettext_lazy as _ from model_utils import Choices -import reversion from sapl.base.models import Autor from sapl.utils import (INDICADOR_AFASTAMENTO, UF, YES_NO_CHOICES, diff --git a/sapl/parlamentares/urls.py b/sapl/parlamentares/urls.py index 0d8d406da..870090ad4 100644 --- a/sapl/parlamentares/urls.py +++ b/sapl/parlamentares/urls.py @@ -1,22 +1,21 @@ from django.conf.urls import include, url -from sapl.parlamentares.views import (altera_field_mesa, - altera_field_mesa_public_view, - CargoMesaCrud, ColigacaoCrud, +from sapl.parlamentares.views import (CargoMesaCrud, ColigacaoCrud, ComposicaoColigacaoCrud, DependenteCrud, FiliacaoCrud, FrenteCrud, FrenteList, - LegislaturaCrud, - insere_parlamentar_composicao, - MandatoCrud, + LegislaturaCrud, MandatoCrud, MesaDiretoraView, NivelInstrucaoCrud, ParlamentarCrud, ParticipacaoParlamentarCrud, PartidoCrud, ProposicaoParlamentarCrud, RelatoriaParlamentarCrud, - remove_parlamentar_composicao, SessaoLegislativaCrud, TipoAfastamentoCrud, TipoDependenteCrud, - TipoMilitarCrud, VotanteView) + TipoMilitarCrud, VotanteView, + altera_field_mesa, + altera_field_mesa_public_view, + insere_parlamentar_composicao, + remove_parlamentar_composicao) from .apps import AppConfig diff --git a/sapl/parlamentares/views.py b/sapl/parlamentares/views.py index adbe6117e..4ecfe0b83 100644 --- a/sapl/parlamentares/views.py +++ b/sapl/parlamentares/views.py @@ -1,5 +1,5 @@ from django.contrib import messages -from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned +from django.core.exceptions import MultipleObjectsReturned, ObjectDoesNotExist from django.core.urlresolvers import reverse, reverse_lazy from django.db.models import F, Q from django.http import JsonResponse diff --git a/sapl/relatorios/views.py b/sapl/relatorios/views.py index 0960dbfa0..0882d90a0 100644 --- a/sapl/relatorios/views.py +++ b/sapl/relatorios/views.py @@ -1,7 +1,6 @@ -from datetime import datetime - -import re import html +import re +from datetime import datetime from django.core.exceptions import ObjectDoesNotExist from django.http import Http404, HttpResponse diff --git a/sapl/rules/map_rules.py b/sapl/rules/map_rules.py index 01493818f..34d7372f6 100644 --- a/sapl/rules/map_rules.py +++ b/sapl/rules/map_rules.py @@ -152,8 +152,6 @@ rules_group_sessao = { (sessao.PresencaOrdemDia, __base__), (sessao.RegistroVotacao, __base__), (sessao.VotoParlamentar, __base__), - - (sessao.VotoNominal, __base__), ] } diff --git a/sapl/rules/tests/test_rules.py b/sapl/rules/tests/test_rules.py index 6fc7eb3fe..099ca8bf7 100644 --- a/sapl/rules/tests/test_rules.py +++ b/sapl/rules/tests/test_rules.py @@ -6,8 +6,8 @@ from django.contrib.contenttypes.models import ContentType from django.utils import six from django.utils.translation import ugettext_lazy as _ -from sapl.base.models import (CasaLegislativa, ProblemaMigracao, Argumento, - Constraint) +from sapl.base.models import (Argumento, CasaLegislativa, Constraint, + ProblemaMigracao) from sapl.compilacao.models import (PerfilEstruturalTextoArticulado, TipoDispositivo, TipoDispositivoRelationship) diff --git a/sapl/sessao/forms.py b/sapl/sessao/forms.py index 9c2f879bf..ac355a735 100644 --- a/sapl/sessao/forms.py +++ b/sapl/sessao/forms.py @@ -35,6 +35,7 @@ def recupera_anos(): def ANO_CHOICES(): return [('', '---------')] + recupera_anos() + MES_CHOICES = [('', '---------')] + RANGE_MESES DIA_CHOICES = [('', '---------')] + RANGE_DIAS_MES @@ -151,14 +152,12 @@ class OrdemDiaForm(ExpedienteMateriaForm): def clean_data_ordem(self): return self.instance.sessao_plenaria.data_inicio - def clean_numero_ordem(self): sessao = self.instance.sessao_plenaria numero_ordem_exists = OrdemDia.objects.filter( - sessao_plenaria=sessao, - numero_ordem=self.cleaned_data[ - 'numero_ordem']).exists() + sessao_plenaria=sessao, + numero_ordem=self.cleaned_data['numero_ordem']).exists() if numero_ordem_exists: msg = _('Esse número de ordem já existe.') @@ -166,7 +165,6 @@ class OrdemDiaForm(ExpedienteMateriaForm): return self.cleaned_data['numero_ordem'] - def clean(self): cleaned_data = self.cleaned_data sessao = self.instance.sessao_plenaria diff --git a/sapl/sessao/migrations/0004_votonominal_registro_votacao.py b/sapl/sessao/migrations/0004_votonominal_registro_votacao.py new file mode 100644 index 000000000..d3267d34f --- /dev/null +++ b/sapl/sessao/migrations/0004_votonominal_registro_votacao.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2017-06-01 11:06 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('sessao', '0003_resumoordenacao'), + ] + + operations = [ + migrations.AddField( + model_name='votonominal', + name='registro_votacao', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='sessao.RegistroVotacao'), + ), + ] diff --git a/sapl/sessao/migrations/0005_auto_20170601_1246.py b/sapl/sessao/migrations/0005_auto_20170601_1246.py new file mode 100644 index 000000000..842f99319 --- /dev/null +++ b/sapl/sessao/migrations/0005_auto_20170601_1246.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2017-06-01 12:46 +from __future__ import unicode_literals + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +from datetime import datetime + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('sessao', '0004_votonominal_registro_votacao'), + ] + + operations = [ + migrations.RemoveField( + model_name='votonominal', + name='registro_votacao', + ), + migrations.AddField( + model_name='votoparlamentar', + name='data_hora', + field=models.DateTimeField(auto_now_add=True, blank=True, null=True, verbose_name='Data/Hora'), + preserve_default=False, + ), + migrations.AddField( + model_name='votoparlamentar', + name='ip', + field=models.CharField(blank=True, max_length=30, null=True, verbose_name='IP'), + ), + migrations.AddField( + model_name='votoparlamentar', + name='user', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/sapl/sessao/migrations/0006_auto_20170601_1257.py b/sapl/sessao/migrations/0006_auto_20170601_1257.py new file mode 100644 index 000000000..6d43c17d0 --- /dev/null +++ b/sapl/sessao/migrations/0006_auto_20170601_1257.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2017-06-01 12:57 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('sessao', '0005_auto_20170601_1246'), + ] + + operations = [ + migrations.AddField( + model_name='votonominal', + name='votacao', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='sessao.RegistroVotacao'), + ), + migrations.AlterField( + model_name='votoparlamentar', + name='votacao', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='sessao.RegistroVotacao'), + ), + ] diff --git a/sapl/sessao/migrations/0007_auto_20170606_1238.py b/sapl/sessao/migrations/0007_auto_20170606_1238.py new file mode 100644 index 000000000..33cc2be35 --- /dev/null +++ b/sapl/sessao/migrations/0007_auto_20170606_1238.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2017-06-06 12:38 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('sessao', '0006_auto_20170601_1257'), + ] + + operations = [ + migrations.AddField( + model_name='votoparlamentar', + name='expediente', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='sessao.ExpedienteMateria'), + ), + migrations.AddField( + model_name='votoparlamentar', + name='ordem', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='sessao.OrdemDia'), + ), + ] diff --git a/sapl/sessao/migrations/0008_auto_20170607_1220.py b/sapl/sessao/migrations/0008_auto_20170607_1220.py new file mode 100644 index 000000000..d07ac2e26 --- /dev/null +++ b/sapl/sessao/migrations/0008_auto_20170607_1220.py @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2017-06-07 12:20 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('sessao', '0007_auto_20170606_1238'), + ] + + operations = [ + migrations.RemoveField( + model_name='votonominal', + name='materia', + ), + migrations.RemoveField( + model_name='votonominal', + name='parlamentar', + ), + migrations.RemoveField( + model_name='votonominal', + name='sessao', + ), + migrations.RemoveField( + model_name='votonominal', + name='user', + ), + migrations.RemoveField( + model_name='votonominal', + name='votacao', + ), + migrations.DeleteModel( + name='VotoNominal', + ), + ] diff --git a/sapl/sessao/models.py b/sapl/sessao/models.py index f79eee6b1..5cd6c6501 100644 --- a/sapl/sessao/models.py +++ b/sapl/sessao/models.py @@ -86,7 +86,8 @@ def get_sessao_media_path(instance, subpath, filename): def pauta_upload_path(instance, filename): - return texto_upload_path(instance, filename, subpath='pauta', pk_first=True) + return texto_upload_path( + instance, filename, subpath='pauta', pk_first=True) # return get_sessao_media_path(instance, 'pauta', filename) @@ -96,7 +97,8 @@ def ata_upload_path(instance, filename): def anexo_upload_path(instance, filename): - return texto_upload_path(instance, filename, subpath='anexo', pk_first=True) + return texto_upload_path( + instance, filename, subpath='anexo', pk_first=True) # return get_sessao_media_path(instance, 'anexo', filename) @@ -412,11 +414,39 @@ class RegistroVotacao(models.Model): @reversion.register() class VotoParlamentar(models.Model): # RegistroVotacaoParlamentar - votacao = models.ForeignKey(RegistroVotacao, on_delete=models.PROTECT) + ''' + As colunas ordem e expediente são redundantes, levando em consideração + que RegistroVotacao já possui ordem/expediente. Entretanto, para + viabilizar a votação interativa, uma vez que ela é feita antes de haver + um RegistroVotacao, é preciso identificar o voto por ordem/expediente. + ''' + votacao = models.ForeignKey(RegistroVotacao, + blank=True, + null=True) parlamentar = models.ForeignKey(Parlamentar, on_delete=models.PROTECT) - # XXX change to restricted choices voto = models.CharField(max_length=10) + user = models.ForeignKey(get_settings_auth_user_model(), + on_delete=models.PROTECT, + null=True, + blank=True) + ip = models.CharField(verbose_name=_('IP'), + max_length=30, + blank=True, + default='') + data_hora = models.DateTimeField( + verbose_name=_('Data/Hora'), + auto_now_add=True, + blank=True, + null=True) + + ordem = models.ForeignKey(OrdemDia, + blank=True, + null=True) + expediente = models.ForeignKey(ExpedienteMateria, + blank=True, + null=True) + class Meta: verbose_name = _('Registro de Votação de Parlamentar') verbose_name_plural = _('Registros de Votações de Parlamentares') @@ -426,28 +456,6 @@ class VotoParlamentar(models.Model): # RegistroVotacaoParlamentar 'votacao': self.votacao, 'parlamentar': self.parlamentar} -@reversion.register() -class VotoNominal(models.Model): - parlamentar = models.ForeignKey(Parlamentar, on_delete=models.PROTECT) - voto = models.CharField(verbose_name=_('Voto'), max_length=10) - - sessao = models.ForeignKey(SessaoPlenaria, on_delete=models.PROTECT) - materia = models.ForeignKey(MateriaLegislativa, on_delete=models.PROTECT) - - user = models.ForeignKey(get_settings_auth_user_model(), - on_delete=models.PROTECT) - ip = models.CharField(verbose_name=_('IP'), max_length=30) - data_hora = models.DateTimeField( - verbose_name=_('Data/Hora'), auto_now_add=True) - - class Meta: - verbose_name = _('Registro do Voto do Parlamentar') - verbose_name_plural = _('Registros dos Votos dos Parlamentares') - - def __str__(self): - return '%s - %s' % (self.parlamentar.nome_parlamentar, self.voto) - - @reversion.register() class SessaoPlenariaPresenca(models.Model): sessao_plenaria = models.ForeignKey(SessaoPlenaria, diff --git a/sapl/sessao/serializers.py b/sapl/sessao/serializers.py index 6d6f4cd9b..c38509f93 100644 --- a/sapl/sessao/serializers.py +++ b/sapl/sessao/serializers.py @@ -2,6 +2,7 @@ from rest_framework import serializers from .models import SessaoPlenaria + class SessaoPlenariaSerializer(serializers.Serializer): class Meta: model = SessaoPlenaria diff --git a/sapl/sessao/urls.py b/sapl/sessao/urls.py index 4f6e5c887..a28d5eb38 100644 --- a/sapl/sessao/urls.py +++ b/sapl/sessao/urls.py @@ -1,8 +1,8 @@ from django.conf.urls import include, url from sapl.sessao.views import (AdicionarVariasMateriasExpediente, - AdicionarVariasMateriasOrdemDia, - BancadaCrud, BlocoCrud, CargoBancadaCrud, + AdicionarVariasMateriasOrdemDia, BancadaCrud, + BlocoCrud, CargoBancadaCrud, ExpedienteMateriaCrud, ExpedienteView, MateriaOrdemDiaCrud, MesaView, OradorCrud, OradorExpedienteCrud, PainelView, @@ -11,18 +11,17 @@ from sapl.sessao.views import (AdicionarVariasMateriasExpediente, PesquisarPautaSessaoView, PesquisarSessaoPlenariaView, PresencaOrdemDiaView, PresencaView, - ResumoOrdenacaoView, ResumoView, - SessaoCrud, TipoExpedienteCrud, - TipoResultadoVotacaoCrud, TipoSessaoCrud, - VotacaoEditView, VotacaoExpedienteEditView, + ResumoOrdenacaoView, ResumoView, SessaoCrud, + TipoExpedienteCrud, TipoResultadoVotacaoCrud, + TipoSessaoCrud, VotacaoEditView, + VotacaoExpedienteEditView, VotacaoExpedienteView, VotacaoNominalEditView, - VotacaoNominalExpedienteEditView, VotacaoNominalExpedienteDetailView, + VotacaoNominalExpedienteEditView, VotacaoNominalExpedienteView, VotacaoNominalView, VotacaoView, abrir_votacao_expediente_view, - abrir_votacao_ordem_view, - atualizar_mesa, + abrir_votacao_ordem_view, atualizar_mesa, insere_parlamentar_composicao, mudar_ordem_materia_sessao, recuperar_materia, recuperar_numero_sessao, diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index 1672d9ea5..a761dfbf6 100644 --- a/sapl/sessao/views.py +++ b/sapl/sessao/views.py @@ -8,7 +8,7 @@ from django.core.exceptions import MultipleObjectsReturned, ObjectDoesNotExist from django.core.urlresolvers import reverse from django.forms.utils import ErrorList from django.http import JsonResponse -from django.http.response import HttpResponseRedirect +from django.http.response import Http404, HttpResponseRedirect from django.utils.datastructures import MultiValueDictKeyError from django.utils.decorators import method_decorator from django.utils.html import strip_tags @@ -37,15 +37,14 @@ from sapl.sessao.forms import ExpedienteMateriaForm, OrdemDiaForm from .forms import (AdicionarVariasMateriasFilterSet, ExpedienteForm, ListMateriaForm, MesaForm, OradorExpedienteForm, OradorForm, PautaSessaoFilterSet, PresencaForm, - ResumoOrdenacaoForm, - SessaoPlenariaFilterSet, VotacaoEditForm, VotacaoForm, - VotacaoNominalForm) + ResumoOrdenacaoForm, SessaoPlenariaFilterSet, + VotacaoEditForm, VotacaoForm, VotacaoNominalForm) from .models import (Bancada, Bloco, CargoBancada, CargoMesa, ExpedienteMateria, ExpedienteSessao, IntegranteMesa, MateriaLegislativa, Orador, OradorExpediente, OrdemDia, PresencaOrdemDia, RegistroVotacao, ResumoOrdenacao, SessaoPlenaria, SessaoPlenariaPresenca, TipoExpediente, - TipoResultadoVotacao, TipoSessaoPlenaria, VotoNominal, + TipoResultadoVotacao, TipoSessaoPlenaria, VotoParlamentar) TipoSessaoCrud = CrudAux.build(TipoSessaoPlenaria, 'tipo_sessao_plenaria') @@ -190,20 +189,20 @@ class MateriaOrdemDiaCrud(MasterDetailCrud): url = reverse('sapl.sessao:votacaosimbolica', kwargs={ 'pk': obj.sessao_plenaria_id, - 'oid': obj.materia_id, - 'mid': obj.pk}) + 'oid': obj.pk, + 'mid': obj.materia_id}) elif obj.tipo_votacao == 2: url = reverse('sapl.sessao:votacaonominal', kwargs={ 'pk': obj.sessao_plenaria_id, - 'oid': obj.materia_id, - 'mid': obj.pk}) + 'oid': obj.pk, + 'mid': obj.materia_id}) elif obj.tipo_votacao == 3: url = reverse('sapl.sessao:votacaosecreta', kwargs={ 'pk': obj.sessao_plenaria_id, - 'oid': obj.materia_id, - 'mid': obj.pk}) + 'oid': obj.pk, + 'mid': obj.materia_id}) if self.request.user.has_module_perms(AppConfig.label): btn_registrar = ''' %s
%s' % - (url, - resultado_descricao, - resultado_observacao)) + (url, + resultado_descricao, + resultado_observacao)) else: obj.resultado = ('%s
%s' % - (resultado_descricao, - resultado_observacao)) + (resultado_descricao, + resultado_observacao)) return [self._as_row(obj) for obj in object_list] @@ -310,20 +309,20 @@ class ExpedienteMateriaCrud(MasterDetailCrud): url = reverse('sapl.sessao:votacaosimbolicaexp', kwargs={ 'pk': obj.sessao_plenaria_id, - 'oid': obj.materia_id, - 'mid': obj.pk}) + 'oid': obj.pk, + 'mid': obj.materia_id}) elif obj.tipo_votacao == 2: url = reverse('sapl.sessao:votacaonominalexp', kwargs={ 'pk': obj.sessao_plenaria_id, - 'oid': obj.materia_id, - 'mid': obj.pk}) + 'oid': obj.pk, + 'mid': obj.materia_id}) elif obj.tipo_votacao == 3: url = reverse('sapl.sessao:votacaosecretaexp', kwargs={ 'pk': obj.sessao_plenaria_id, - 'oid': obj.materia_id, - 'mid': obj.pk}) + 'oid': obj.pk, + 'mid': obj.materia_id}) if self.request.user.has_module_perms(AppConfig.label): btn_registrar = ''' @@ -355,39 +354,40 @@ class ExpedienteMateriaCrud(MasterDetailCrud): 'sapl.sessao:votacaosimbolicaexpedit', kwargs={ 'pk': obj.sessao_plenaria_id, - 'oid': obj.materia_id, - 'mid': obj.pk}) + 'oid': obj.pk, + 'mid': obj.materia_id}) elif obj.tipo_votacao == 2: url = reverse('sapl.sessao:votacaonominalexpedit', kwargs={ 'pk': obj.sessao_plenaria_id, - 'oid': obj.materia_id, - 'mid': obj.pk}) + 'oid': obj.pk, + 'mid': obj.materia_id}) elif obj.tipo_votacao == 3: url = reverse('sapl.sessao:votacaosecretaexpedit', kwargs={ 'pk': obj.sessao_plenaria_id, - 'oid': obj.materia_id, - 'mid': obj.pk}) + 'oid': obj.pk, + 'mid': obj.materia_id}) obj.resultado = ('%s
%s' % - (url, - resultado_descricao, - resultado_observacao)) + (url, + resultado_descricao, + resultado_observacao)) else: if obj.tipo_votacao == 2: - url = reverse('sapl.sessao:votacaonominalexpdetail', - kwargs={ - 'pk': obj.sessao_plenaria_id, - 'oid': obj.materia_id, - 'mid': obj.pk}) + url = reverse( + 'sapl.sessao:votacaonominalexpdetail', + kwargs={ + 'pk': obj.sessao_plenaria_id, + 'oid': obj.pk, + 'mid': obj.materia_id}) obj.resultado = ('%s
%s' % - (url, - resultado_descricao, - resultado_observacao)) + (url, + resultado_descricao, + resultado_observacao)) else: obj.resultado = ('%s
%s' % - (resultado_descricao, - resultado_observacao)) + (resultado_descricao, + resultado_observacao)) return [self._as_row(obj) for obj in object_list] class CreateView(MasterDetailCrud.CreateView): @@ -761,8 +761,8 @@ class ListMateriaOrdemDiaView(FormMixin, DetailView): autor = [str(a.autor) for a in autoria] mat = {'pk': pk, - 'oid': o.materia_id, - 'ordem_id': o.id, + 'oid': o.id, + 'ordem_id': o.materia_id, 'ementa': ementa, 'titulo': titulo, 'numero': numero, @@ -821,8 +821,8 @@ class ListMateriaOrdemDiaView(FormMixin, DetailView): autor = [str(a.autor) for a in autoria] mat = {'pk': pk, - 'oid': o.materia_id, - 'ordem_id': o.id, + 'oid': o.id, + 'ordem_id': o.materia_id, 'ementa': ementa, 'titulo': titulo, 'numero': numero, @@ -1388,8 +1388,8 @@ class VotacaoEditView(SessaoPermissionMixin): self.object = self.get_object() form = VotacaoEditForm(request.POST) - materia_id = kwargs['oid'] - ordem_id = kwargs['mid'] + materia_id = kwargs['mid'] + ordem_id = kwargs['oid'] if(int(request.POST['anular_votacao']) == 1): RegistroVotacao.objects.filter( @@ -1417,8 +1417,8 @@ class VotacaoEditView(SessaoPermissionMixin): else: titulo = _("Não definida") - materia_id = kwargs['oid'] - ordem_id = kwargs['mid'] + materia_id = kwargs['mid'] + ordem_id = kwargs['oid'] ordem = OrdemDia.objects.get(id=ordem_id) @@ -1471,7 +1471,7 @@ class VotacaoView(SessaoPermissionMixin): else: titulo = _("Não definida") - ordem_id = kwargs['mid'] + ordem_id = kwargs['oid'] ordem = OrdemDia.objects.get(id=ordem_id) qtde_presentes = PresencaOrdemDia.objects.filter( sessao_plenaria_id=self.object.id).count() @@ -1497,7 +1497,7 @@ class VotacaoView(SessaoPermissionMixin): else: titulo = _("Não definida") - ordem_id = kwargs['mid'] + ordem_id = kwargs['oid'] ordem = OrdemDia.objects.get(id=ordem_id) qtde_presentes = PresencaOrdemDia.objects.filter( sessao_plenaria_id=self.object.id).count() @@ -1515,8 +1515,8 @@ class VotacaoView(SessaoPermissionMixin): return self.form_valid(form) if form.is_valid(): - materia_id = kwargs['oid'] - ordem_id = kwargs['mid'] + materia_id = kwargs['mid'] + ordem_id = kwargs['oid'] qtde_presentes = PresencaOrdemDia.objects.filter( sessao_plenaria_id=self.object.id).count() @@ -1568,20 +1568,80 @@ class VotacaoView(SessaoPermissionMixin): kwargs={'pk': pk}) -class VotacaoNominalView(SessaoPermissionMixin): +def fechar_votacao_materia(materia): + if type(materia) == OrdemDia: + registro_votacao = RegistroVotacao.objects.filter(ordem=materia) + voto_parlamentar = VotoParlamentar.objects.filter(ordem=materia) + + elif type(materia) == ExpedienteMateria: + registro_votacao = RegistroVotacao.objects.filter( + expediente=materia) + voto_parlamentar = VotoParlamentar.objects.filter(expediente=materia) + + for v in voto_parlamentar: + v.delete() + + for r in registro_votacao: + r.delete() + + if materia.resultado: + materia.resultado = '' + materia.votacao_aberta = False + materia.save() + + +class VotacaoNominalAbstract(SessaoPermissionMixin): template_name = 'sessao/votacao/nominal.html' + ordem = None + expediente = None def get(self, request, *args, **kwargs): - ordem_id = kwargs['mid'] - ordem = OrdemDia.objects.get(id=ordem_id) - total = PresencaOrdemDia.objects.filter( - sessao_plenaria_id=ordem.sessao_plenaria_id).count() + if self.ordem: + ordem_id = kwargs['oid'] + if RegistroVotacao.objects.filter(ordem_id=ordem_id).exists(): + msg = _('Esta matéria já foi votada!') + messages.add_message(request, messages.ERROR, msg) + return HttpResponseRedirect(reverse( + 'sapl.sessao:ordemdia_list', kwargs={'pk': kwargs['pk']})) + + try: + ordem = OrdemDia.objects.get(id=ordem_id) + except ObjectDoesNotExist: + raise Http404() - materia = {'materia': ordem.materia, + presentes = PresencaOrdemDia.objects.filter( + sessao_plenaria_id=ordem.sessao_plenaria_id) + total = presentes.count() + + materia_votacao = ordem + + elif self.expediente: + expediente_id = kwargs['oid'] + if (RegistroVotacao.objects.filter( + expediente_id=expediente_id).exists()): + msg = _('Esta matéria já foi votada!') + messages.add_message(request, messages.ERROR, msg) + return HttpResponseRedirect(reverse( + 'sapl.sessao:expedientemateria_list', + kwargs={'pk': kwargs['pk']})) + + try: + expediente = ExpedienteMateria.objects.get(id=expediente_id) + except ObjectDoesNotExist: + raise Http404() + + presentes = SessaoPlenariaPresenca.objects.filter( + sessao_plenaria_id=expediente.sessao_plenaria_id) + total = presentes.count() + + materia_votacao = expediente + + materia = {'materia': materia_votacao.materia, 'ementa': sub( - ' ', ' ', strip_tags(ordem.observacao))} + ' ', ' ', strip_tags( + materia_votacao.observacao))} context = {'materia': materia, 'object': self.get_object(), - 'parlamentares': self.get_parlamentares(ordem.materia), + 'parlamentares': self.get_parlamentares(presentes), 'tipos': self.get_tipos_votacao(), 'total': total} @@ -1590,35 +1650,31 @@ class VotacaoNominalView(SessaoPermissionMixin): def post(self, request, *args, **kwargs): self.object = self.get_object() - ordem_id = kwargs['mid'] - ordem = OrdemDia.objects.get(id=ordem_id) + if self.ordem: + ordem_id = kwargs['oid'] + try: + ordem = OrdemDia.objects.get(id=ordem_id) + except ObjectDoesNotExist: + raise Http404() + + materia_votacao = ordem + + elif self.expediente: + expediente_id = kwargs['oid'] + try: + expediente = ExpedienteMateria.objects.get(id=expediente_id) + except ObjectDoesNotExist: + raise Http404() + + materia_votacao = expediente form = VotacaoNominalForm(request.POST) if 'cancelar-votacao' in request.POST: - sessao = self.object - materia = ordem.materia - presentes = PresencaOrdemDia.objects.filter( - sessao_plenaria_id=expediente.sessao_plenaria_id) - for p in presentes: - try: - voto = VotoNominal.objects.get( - parlamentar=p.parlamentar, - sessao=self.object.pk, - materia=materia) - except ObjectDoesNotExist: - pass - else: - voto.delete() - - ordem.votacao_aberta = False - ordem.save() + fechar_votacao_materia(materia_votacao) return self.form_valid(form) if form.is_valid(): - materia_id = kwargs['oid'] - ordem_id = kwargs['mid'] - votos_sim = 0 votos_nao = 0 abstencoes = 0 @@ -1638,22 +1694,35 @@ class VotacaoNominalView(SessaoPermissionMixin): elif(voto == 'Não Votou'): nao_votou += 1 - try: - votacao = RegistroVotacao.objects.get( - materia_id=materia_id, + # Caso todas as opções sejam 'Não votou', fecha a votação + if nao_votou == len(request.POST.getlist('voto_parlamentar')): + fechar_votacao_materia(materia_votacao) + return self.form_valid(form) + + if self.ordem: + votacao = RegistroVotacao.objects.filter( ordem_id=ordem_id) - except ObjectDoesNotExist: - pass - else: - votacao.delete() + elif self.expediente: + votacao = RegistroVotacao.objects.filter( + expediente_id=expediente_id) + + # Remove todas as votação desta matéria, caso existam + for v in votacao: + v.delete() votacao = RegistroVotacao() votacao.numero_votos_sim = votos_sim votacao.numero_votos_nao = votos_nao votacao.numero_abstencoes = abstencoes votacao.observacao = request.POST['observacao'] - votacao.materia_id = materia_id - votacao.ordem_id = ordem_id + + if self.ordem: + votacao.materia_id = ordem.materia.id + votacao.ordem_id = ordem_id + elif self.expediente: + votacao.materia_id = expediente.materia.id + votacao.expediente_id = expediente_id + votacao.tipo_resultado_votacao_id = int( request.POST['resultado_votacao']) votacao.save() @@ -1663,40 +1732,48 @@ class VotacaoNominalView(SessaoPermissionMixin): voto = v[0] parlamentar_id = v[1] - voto_parlamentar = VotoParlamentar() + if self.ordem: + voto_parlamentar = VotoParlamentar.objects.get_or_create( + parlamentar_id=parlamentar_id, + ordem=ordem)[0] + elif self.expediente: + voto_parlamentar = VotoParlamentar.objects.get_or_create( + parlamentar_id=parlamentar_id, + expediente=expediente)[0] + voto_parlamentar.voto = voto voto_parlamentar.parlamentar_id = parlamentar_id voto_parlamentar.votacao_id = votacao.id voto_parlamentar.save() - ordem = OrdemDia.objects.get( - sessao_plenaria_id=self.object.id, - materia_id=materia_id) resultado = TipoResultadoVotacao.objects.get( id=request.POST['resultado_votacao']) - ordem.resultado = resultado.nome - ordem.votacao_aberta = False - ordem.save() + + materia_votacao.resultado = resultado.nome + materia_votacao.votacao_aberta = False + materia_votacao.save() return self.form_valid(form) else: return self.form_invalid(form) - def get_parlamentares(self, materia): + def get_parlamentares(self, presencas): self.object = self.get_object() - presencas = PresencaOrdemDia.objects.filter( - sessao_plenaria_id=self.object.id - ) presentes = [p.parlamentar for p in presencas] + if self.ordem: + voto_parlamentar = VotoParlamentar.objects.filter( + ordem=self.kwargs['oid']) + elif self.expediente: + voto_parlamentar = VotoParlamentar.objects.filter( + expediente=self.kwargs['oid']) + for parlamentar in Parlamentar.objects.filter(ativo=True): if parlamentar in presentes: try: - voto = VotoNominal.objects.get( - parlamentar=parlamentar, - sessao=self.object.pk, - materia=materia) + voto = voto_parlamentar.get( + parlamentar=parlamentar) except ObjectDoesNotExist: yield [parlamentar, None] else: @@ -1708,256 +1785,47 @@ class VotacaoNominalView(SessaoPermissionMixin): def get_success_url(self): pk = self.kwargs['pk'] - return reverse('sapl.sessao:ordemdia_list', - kwargs={'pk': pk}) + if self.ordem: + return reverse('sapl.sessao:ordemdia_list', + kwargs={'pk': pk}) + elif self.expediente: + return reverse('sapl.sessao:expedientemateria_list', + kwargs={'pk': pk}) -class VotacaoNominalEditView(SessaoPermissionMixin): + +class VotacaoNominalEditAbstract(SessaoPermissionMixin): template_name = 'sessao/votacao/nominal_edit.html' def get(self, request, *args, **kwargs): context = {} - materia_id = kwargs['oid'] - ordem_id = kwargs['mid'] - - votacao = RegistroVotacao.objects.get( - materia_id=materia_id, - ordem_id=ordem_id) - ordem = OrdemDia.objects.get(id=ordem_id) - votos = VotoParlamentar.objects.filter(votacao_id=votacao.id) - - list_votos = [] - for v in votos: - parlamentar = Parlamentar.objects.get(id=v.parlamentar_id) - list_votos.append({'parlamentar': parlamentar, 'voto': v.voto}) - - context.update({'votos': list_votos}) - - materia = {'materia': ordem.materia, - 'ementa': sub( - ' ', ' ', strip_tags(ordem.observacao))} - context.update({'materia': materia}) - - votacao_existente = {'observacao': sub( - ' ', ' ', strip_tags(votacao.observacao)), - 'resultado': votacao.tipo_resultado_votacao.nome, - 'tipo_resultado': - votacao.tipo_resultado_votacao_id} - context.update({'votacao': votacao_existente, - 'tipos': self.get_tipos_votacao()}) - - return self.render_to_response(context) - - def post(self, request, *args, **kwargs): - self.object = self.get_object() - form = VotacaoEditForm(request.POST) - - materia_id = kwargs['oid'] - ordem_id = kwargs['mid'] + if self.ordem: + ordem_id = kwargs['oid'] - sessao = self.object - ordem = ExpedienteMateria.objects.get(id=ordem_id) - presentes = PresencaOrdemDia.objects.filter( - sessao_plenaria_id=ordem.sessao_plenaria_id) - for p in presentes: try: - voto = VotoNominal.objects.get( - parlamentar=p.parlamentar, - sessao=self.object.pk, - materia=materia_id) + ordem = OrdemDia.objects.get(id=ordem_id) + votacao = RegistroVotacao.objects.get( + ordem_id=ordem_id) except ObjectDoesNotExist: - pass - else: - voto.delete() - - if(int(request.POST['anular_votacao']) == 1): - registro = RegistroVotacao.objects.get( - materia_id=materia_id, - ordem_id=ordem_id) - - ordem = OrdemDia.objects.get( - sessao_plenaria_id=self.object.id, - materia_id=materia_id) - ordem.resultado = '' - ordem.votacao_aberta = False - ordem.save() - - try: - votacao = VotoParlamentar.objects.filter( - votacao_id=registro.id) - for v in votacao: - v.delete() - except: - pass + raise Http404() - return self.form_valid(form) - - def get_tipos_votacao(self): - for tipo in TipoResultadoVotacao.objects.all(): - yield tipo - - def get_success_url(self): - pk = self.kwargs['pk'] - return reverse('sapl.sessao:ordemdia_list', - kwargs={'pk': pk}) - - -class VotacaoNominalExpedienteView(SessaoPermissionMixin): - template_name = 'sessao/votacao/nominal.html' - - def get(self, request, *args, **kwargs): - expediente_id = kwargs['mid'] - expediente = ExpedienteMateria.objects.get(id=expediente_id) - total = SessaoPlenariaPresenca.objects.filter( - sessao_plenaria_id=expediente.sessao_plenaria_id).count() - - materia = {'materia': expediente.materia, - 'ementa': sub( - ' ', ' ', strip_tags(expediente.observacao))} - context = {'materia': materia, 'object': self.get_object(), - 'parlamentares': self.get_parlamentares(expediente.materia), - 'tipos': self.get_tipos_votacao(), - 'total': total} - - return self.render_to_response(context) - - def post(self, request, *args, **kwargs): - self.object = self.get_object() - - expediente_id = kwargs['mid'] - expediente = ExpedienteMateria.objects.get(id=expediente_id) - - form = VotacaoNominalForm(request.POST) - - if 'cancelar-votacao' in request.POST: - sessao = self.object - expediente_id = kwargs['mid'] - expediente = ExpedienteMateria.objects.get(id=expediente_id) - materia = expediente.materia - presentes = SessaoPlenariaPresenca.objects.filter( - sessao_plenaria_id=expediente.sessao_plenaria_id) - for p in presentes: - try: - voto = VotoNominal.objects.get( - parlamentar=p.parlamentar, - sessao=self.object.pk, - materia=materia) - except ObjectDoesNotExist: - pass - else: - voto.delete() - - expediente.votacao_aberta = False - expediente.save() - return self.form_valid(form) - - if form.is_valid(): - materia_id = kwargs['oid'] - expediente_id = kwargs['mid'] - - votos_sim = 0 - votos_nao = 0 - abstencoes = 0 - nao_votou = 0 - - for votos in request.POST.getlist('voto_parlamentar'): - v = votos.split(':') - voto = v[0] - parlamentar_id = v[1] + materia = ordem.materia + observacao = ordem.observacao - if(voto == 'Sim'): - votos_sim += 1 - elif(voto == 'Não'): - votos_nao += 1 - elif(voto == 'Abstenção'): - abstencoes += 1 - elif(voto == 'Não Votou'): - nao_votou += 1 + elif self.expediente: + expediente_id = kwargs['oid'] try: - votacao = RegistroVotacao() - votacao.numero_votos_sim = votos_sim - votacao.numero_votos_nao = votos_nao - votacao.numero_abstencoes = abstencoes - votacao.observacao = request.POST['observacao'] - votacao.materia_id = materia_id - votacao.expediente = expediente - votacao.tipo_resultado_votacao_id = int( - request.POST['resultado_votacao']) - votacao.save() - except: - return self.form_invalid(form) - else: + expediente = ExpedienteMateria.objects.get(id=expediente_id) votacao = RegistroVotacao.objects.get( - materia_id=materia_id, - expediente_id=expediente) - - for votos in request.POST.getlist('voto_parlamentar'): - v = votos.split(':') - voto = v[0] - parlamentar_id = v[1] - - voto_parlamentar = VotoParlamentar() - voto_parlamentar.voto = voto - voto_parlamentar.parlamentar_id = parlamentar_id - voto_parlamentar.votacao_id = votacao.id - voto_parlamentar.save() - - expediente = ExpedienteMateria.objects.get( - sessao_plenaria_id=self.object.id, - materia_id=materia_id) - resultado = TipoResultadoVotacao.objects.get( - id=request.POST['resultado_votacao']) - expediente.resultado = resultado.nome - expediente.votacao_aberta = False - expediente.save() - - return self.form_valid(form) - else: - return self.form_invalid(form) - - def get_parlamentares(self, materia): - self.object = self.get_object() - presencas = SessaoPlenariaPresenca.objects.filter( - sessao_plenaria_id=self.object.id - ) - presentes = [p.parlamentar for p in presencas] - - for parlamentar in Parlamentar.objects.filter(ativo=True): - if parlamentar in presentes: - try: - voto = VotoNominal.objects.get( - parlamentar=parlamentar, - sessao=self.object.pk, - materia=materia) - except ObjectDoesNotExist: - yield [parlamentar, None] - else: - yield [parlamentar, voto.voto] - - def get_tipos_votacao(self): - for tipo in TipoResultadoVotacao.objects.all(): - yield tipo - - def get_success_url(self): - pk = self.kwargs['pk'] - return reverse('sapl.sessao:expedientemateria_list', - kwargs={'pk': pk}) - - -class VotacaoNominalExpedienteEditView(SessaoPermissionMixin): - template_name = 'sessao/votacao/nominal_edit.html' + expediente_id=expediente_id) + except ObjectDoesNotExist: + raise Http404() - def get(self, request, *args, **kwargs): - context = {} - materia_id = kwargs['oid'] - expediente_id = kwargs['mid'] + materia = expediente.materia + observacao = expediente.observacao - votacao = RegistroVotacao.objects.get( - materia_id=materia_id, - expediente_id=expediente_id) - expediente = ExpedienteMateria.objects.get(id=expediente_id) votos = VotoParlamentar.objects.filter(votacao_id=votacao.id) list_votos = [] @@ -1967,9 +1835,9 @@ class VotacaoNominalExpedienteEditView(SessaoPermissionMixin): context.update({'votos': list_votos}) - materia = {'materia': expediente.materia, + materia = {'materia': materia, 'ementa': sub( - ' ', ' ', strip_tags(expediente.observacao))} + ' ', ' ', strip_tags(observacao))} context.update({'materia': materia}) votacao_existente = {'observacao': sub( @@ -1986,45 +1854,25 @@ class VotacaoNominalExpedienteEditView(SessaoPermissionMixin): self.object = self.get_object() form = VotacaoEditForm(request.POST) - materia_id = kwargs['oid'] - expediente_id = kwargs['mid'] + if self.ordem: + ordem_id = kwargs['oid'] - sessao = self.object - expediente = ExpedienteMateria.objects.get(id=expediente_id) - presentes = SessaoPlenariaPresenca.objects.filter( - sessao_plenaria_id=expediente.sessao_plenaria_id) - for p in presentes: try: - voto = VotoNominal.objects.get( - parlamentar=p.parlamentar, - sessao=self.object.pk, - materia=materia_id) + materia_votacao = OrdemDia.objects.get(id=ordem_id) except ObjectDoesNotExist: - pass - else: - voto.delete() - - if(int(request.POST['anular_votacao']) == 1): - registro = RegistroVotacao.objects.get( - materia_id=materia_id, - expediente_id=expediente_id) + raise Http404() - expediente = ExpedienteMateria.objects.get( - sessao_plenaria_id=self.object.id, - materia_id=materia_id) - expediente.resultado = '' - expediente.votacao_aberta = False - expediente.save() + elif self.expediente: + expediente_id = kwargs['oid'] try: - votacao = VotoParlamentar.objects.filter( - votacao_id=registro.id) - for v in votacao: - v.delete() - except: - pass + materia_votacao = ExpedienteMateria.objects.get( + id=expediente_id) + except ObjectDoesNotExist: + raise Http404() - registro.delete() + if(int(request.POST['anular_votacao']) == 1): + fechar_votacao_materia(materia_votacao) return self.form_valid(form) @@ -2034,16 +1882,42 @@ class VotacaoNominalExpedienteEditView(SessaoPermissionMixin): def get_success_url(self): pk = self.kwargs['pk'] - return reverse('sapl.sessao:expedientemateria_list', - kwargs={'pk': pk}) + + if self.ordem: + return reverse('sapl.sessao:ordemdia_list', + kwargs={'pk': pk}) + elif self.expediente: + return reverse('sapl.sessao:expedientemateria_list', + kwargs={'pk': pk}) + + +class VotacaoNominalView(VotacaoNominalAbstract): + ordem = True + expediente = False + + +class VotacaoNominalExpedienteView(VotacaoNominalAbstract): + expediente = True + ordem = False + + +class VotacaoNominalEditView(VotacaoNominalEditAbstract): + ordem = True + expediente = False + + +class VotacaoNominalExpedienteEditView(VotacaoNominalEditAbstract): + expediente = True + ordem = False + class VotacaoNominalExpedienteDetailView(DetailView): template_name = 'sessao/votacao/nominal_detail.html' def get(self, request, *args, **kwargs): context = {} - materia_id = kwargs['oid'] - expediente_id = kwargs['mid'] + materia_id = kwargs['mid'] + expediente_id = kwargs['oid'] votacao = RegistroVotacao.objects.get( materia_id=materia_id, @@ -2105,7 +1979,7 @@ class VotacaoExpedienteView(SessaoPermissionMixin): else: titulo = _("Não definida") - expediente_id = kwargs['mid'] + expediente_id = kwargs['oid'] expediente = ExpedienteMateria.objects.get(id=expediente_id) qtde_presentes = SessaoPlenariaPresenca.objects.filter( sessao_plenaria_id=self.object.id).count() @@ -2132,7 +2006,7 @@ class VotacaoExpedienteView(SessaoPermissionMixin): else: titulo = _("Não definida") - expediente_id = kwargs['mid'] + expediente_id = kwargs['oid'] expediente = ExpedienteMateria.objects.get(id=expediente_id) qtde_presentes = SessaoPlenariaPresenca.objects.filter( sessao_plenaria_id=self.object.id).count() @@ -2151,8 +2025,8 @@ class VotacaoExpedienteView(SessaoPermissionMixin): return self.form_valid(form) if form.is_valid(): - materia_id = kwargs['oid'] - expediente_id = kwargs['mid'] + materia_id = kwargs['mid'] + expediente_id = kwargs['oid'] qtde_presentes = SessaoPlenariaPresenca.objects.filter( sessao_plenaria_id=self.object.id).count() @@ -2235,8 +2109,8 @@ class VotacaoExpedienteEditView(SessaoPermissionMixin): else: titulo = _("Não definida") - materia_id = kwargs['oid'] - expediente_id = kwargs['mid'] + materia_id = kwargs['mid'] + expediente_id = kwargs['oid'] expediente = ExpedienteMateria.objects.get(id=expediente_id) @@ -2267,8 +2141,8 @@ class VotacaoExpedienteEditView(SessaoPermissionMixin): self.object = self.get_object() form = VotacaoEditForm(request.POST) - materia_id = kwargs['oid'] - expediente_id = kwargs['mid'] + materia_id = kwargs['mid'] + expediente_id = kwargs['oid'] if(int(request.POST['anular_votacao']) == 1): try: diff --git a/sapl/utils.py b/sapl/utils.py index 50b7faffc..e4b3fc074 100644 --- a/sapl/utils.py +++ b/sapl/utils.py @@ -1,13 +1,15 @@ +import hashlib +import logging +import os +import re from datetime import date from functools import wraps from subprocess import PIPE, call from threading import Thread from unicodedata import normalize as unicodedata_normalize -import hashlib -import logging -import os -import re +import django_filters +import magic from crispy_forms.helper import FormHelper from crispy_forms.layout import HTML, Button from django import forms @@ -20,13 +22,10 @@ from django.core.exceptions import ValidationError from django.utils.translation import ugettext_lazy as _ from floppyforms import ClearableFileInput from reversion.admin import VersionAdmin -import django_filters -import magic from sapl.crispy_layout_mixin import SaplFormLayout, form_actions, to_row from sapl.settings import BASE_DIR, PROJECT_DIR - sapl_logger = logging.getLogger(BASE_DIR.name)