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)