diff --git a/docker-compose.yml b/docker-compose.yml
index ca771995a..df4e37f2e 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -10,7 +10,7 @@ sapldb:
ports:
- "5532:5432"
sapl:
- image: interlegis/sapl:3.1.18-BETA
+ image: interlegis/sapl:3.1.19-BETA
volumes:
- sapl_data:/var/interlegis/sapl/data
- sapl_media:/var/interlegis/sapl/media
diff --git a/sapl/base/migrations/0008_auto_20170814_1409.py b/sapl/base/migrations/0008_auto_20170814_1409.py
new file mode 100644
index 000000000..deb735055
--- /dev/null
+++ b/sapl/base/migrations/0008_auto_20170814_1409.py
@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.9.13 on 2017-08-14 14:09
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('base', '0007_auto_20170808_0850'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='appconfig',
+ name='sequencia_numeracao',
+ field=models.CharField(choices=[('A', 'Sequencial por ano'), ('L', 'Sequencial por legislatura'), ('U', 'Sequencial único')], default='A', max_length=1, verbose_name='Sequência de numeração'),
+ ),
+ ]
diff --git a/sapl/crud/base.py b/sapl/crud/base.py
index a00336fc7..70ea1c859 100644
--- a/sapl/crud/base.py
+++ b/sapl/crud/base.py
@@ -17,8 +17,8 @@ from django.http.response import Http404
from django.shortcuts import redirect
from django.utils.decorators import classonlymethod
from django.utils.encoding import force_text
-from django.utils.translation import ugettext_lazy as _
from django.utils.translation import string_concat
+from django.utils.translation import ugettext_lazy as _
from django.views.generic import (CreateView, DeleteView, DetailView, ListView,
UpdateView)
from django.views.generic.base import ContextMixin
@@ -30,6 +30,7 @@ from sapl.rules.map_rules import (RP_ADD, RP_CHANGE, RP_DELETE, RP_DETAIL,
from sapl.settings import BASE_DIR
from sapl.utils import normalize
+
logger = logging.getLogger(BASE_DIR.name)
ACTION_LIST, ACTION_CREATE, ACTION_DETAIL, ACTION_UPDATE, ACTION_DELETE = \
@@ -955,7 +956,8 @@ class CrudAux(Crud):
Se o valor de subnav_template_name é nulo faz o filter subnav
não abrir o padrão e nem um outro arquivo.
"""
- context['subnav_template_name'] = self.subnav_template_name
+ if 'subnav_template_name' not in context:
+ context['subnav_template_name'] = self.subnav_template_name
return context
@classonlymethod
diff --git a/sapl/parlamentares/migrations/0005_auto_20170814_1615.py b/sapl/parlamentares/migrations/0005_auto_20170814_1615.py
new file mode 100644
index 000000000..e71dd1fd8
--- /dev/null
+++ b/sapl/parlamentares/migrations/0005_auto_20170814_1615.py
@@ -0,0 +1,19 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.9.11 on 2017-08-14 16:15
+from __future__ import unicode_literals
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('parlamentares', '0004_auto_20170711_1305'),
+ ]
+
+ operations = [
+ migrations.AlterModelOptions(
+ name='frente',
+ options={'verbose_name': 'Frente Parlamentar', 'verbose_name_plural': 'Frentes Parlamentares'},
+ ),
+ ]
diff --git a/sapl/parlamentares/models.py b/sapl/parlamentares/models.py
index 5039be89e..34aa8b3e8 100644
--- a/sapl/parlamentares/models.py
+++ b/sapl/parlamentares/models.py
@@ -554,8 +554,8 @@ class Frente(models.Model):
))
class Meta:
- verbose_name = _('Frente')
- verbose_name_plural = _('Frentes')
+ verbose_name = _('Frente Parlamentar')
+ verbose_name_plural = _('Frentes Parlamentares')
def get_parlamentares(self):
return Parlamentar.objects.filter(ativo=True)
diff --git a/sapl/parlamentares/views.py b/sapl/parlamentares/views.py
index d4affb7ff..9af917370 100644
--- a/sapl/parlamentares/views.py
+++ b/sapl/parlamentares/views.py
@@ -1,7 +1,12 @@
+import datetime
+import json
+
from django.contrib import messages
+from django.contrib.contenttypes.models import ContentType
from django.core.exceptions import MultipleObjectsReturned, ObjectDoesNotExist
from django.core.urlresolvers import reverse, reverse_lazy
from django.db.models import F, Q
+from django.db.models.aggregates import Count
from django.http import JsonResponse
from django.http.response import HttpResponseRedirect
from django.templatetags.static import static
@@ -9,13 +14,17 @@ from django.utils.datastructures import MultiValueDictKeyError
from django.utils.translation import ugettext_lazy as _
from django.views.decorators.clickjacking import xframe_options_exempt
from django.views.generic import FormView
+from django.views.generic.edit import UpdateView
+from sapl.base.models import Autor
from sapl.comissoes.models import Participacao
from sapl.crud.base import (RP_CHANGE, RP_DETAIL, RP_LIST, Crud, CrudAux,
CrudBaseForListAndDetailExternalAppView,
MasterDetailCrud)
+from sapl.materia.models import Autoria
from sapl.materia.models import Proposicao, Relatoria
from sapl.parlamentares.apps import AppConfig
+from sapl.utils import parlamentares_ativos
from .forms import (FiliacaoForm, LegislaturaCreateForm, LegislaturaUpdateForm,
MandatoForm, ParlamentarCreateForm, ParlamentarForm,
@@ -25,15 +34,6 @@ from .models import (CargoMesa, Coligacao, ComposicaoColigacao, ComposicaoMesa,
NivelInstrucao, Parlamentar, Partido, SessaoLegislativa,
SituacaoMilitar, TipoAfastamento, TipoDependente, Votante)
-from sapl.base.models import Autor
-from sapl.materia.models import Autoria
-from sapl.utils import parlamentares_ativos
-from django.contrib.contenttypes.models import ContentType
-from django.db.models.aggregates import Count
-
-import datetime
-import json
-
CargoMesaCrud = CrudAux.build(CargoMesa, 'cargo_mesa')
PartidoCrud = CrudAux.build(Partido, 'partidos')
@@ -190,7 +190,8 @@ class ColigacaoCrud(CrudAux):
ordering = ('-numero_votos', 'nome')
def get_context_data(self, **kwargs):
- context = super(ColigacaoCrud.ListView, self).get_context_data(kwargs=kwargs)
+ context = super(ColigacaoCrud.ListView, self).get_context_data(
+ kwargs=kwargs)
rows = context['rows']
coluna_votos_recebidos = 2
for row in rows:
@@ -202,15 +203,25 @@ class ColigacaoCrud(CrudAux):
class DetailView(CrudAux.DetailView):
def get_context_data(self, **kwargs):
- context = super(ColigacaoCrud.DetailView, self).get_context_data(kwargs=kwargs)
+ context = super().get_context_data(kwargs=kwargs)
coligacao = context['coligacao']
if not coligacao.numero_votos:
coligacao.numero_votos = '0'
+ context['subnav_template_name'] = \
+ 'parlamentares/subnav_coligacao.yaml'
+
return context
- class BaseMixin(CrudAux.BaseMixin):
- subnav_template_name = 'parlamentares/subnav_coligacao.yaml'
+ class UpdateView(CrudAux.UpdateView):
+
+ def get_context_data(self, **kwargs):
+ context = super(UpdateView, self).get_context_data(kwargs=kwargs)
+
+ context['subnav_template_name'] = \
+ 'parlamentares/subnav_coligacao.yaml'
+
+ return context
def json_date_convert(date):
@@ -270,6 +281,7 @@ class FrenteCrud(CrudAux):
list_field_names = ['nome', 'data_criacao', 'parlamentares']
class CreateView(CrudAux.CreateView):
+
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
@@ -280,6 +292,7 @@ class FrenteCrud(CrudAux):
return context
class UpdateView(CrudAux.UpdateView):
+
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
@@ -318,7 +331,6 @@ class MandatoCrud(MasterDetailCrud):
return context
-
class CreateView(MasterDetailCrud.CreateView):
form_class = MandatoForm
@@ -363,6 +375,7 @@ class LegislaturaCrud(CrudAux):
form_class = LegislaturaUpdateForm
class DetailView(CrudAux.DetailView):
+
def has_permission(self):
return True
@@ -371,6 +384,7 @@ class LegislaturaCrud(CrudAux):
return super().get(request, *args, **kwargs)
class ListView(CrudAux.ListView):
+
def has_permission(self):
return True
@@ -596,7 +610,7 @@ class ParlamentarMateriasView(FormView):
'materia__tipo__sigla',
'materia__tipo__descricao').annotate(
total=Count('materia__tipo__pk')).order_by(
- '-materia__ano', 'materia__tipo')
+ '-materia__ano', 'materia__tipo')
autor_list = self.get_autoria(autoria)
coautor_list = self.get_autoria(coautoria)
@@ -798,24 +812,24 @@ def remove_parlamentar_composicao(request):
'%s.delete_%s' % (
AppConfig.label, ComposicaoMesa._meta.model_name)):
- if 'composicao_mesa' in request.POST:
- try:
- composicao = ComposicaoMesa.objects.get(
- id=request.POST['composicao_mesa'])
- except ObjectDoesNotExist:
- return JsonResponse(
- {'msg': (
- 'Composição da Mesa não pôde ser removida!', 0)})
-
- composicao.delete()
-
- return JsonResponse(
- {'msg': (
- 'Parlamentar excluido com sucesso!', 1)})
- else:
+ if 'composicao_mesa' in request.POST:
+ try:
+ composicao = ComposicaoMesa.objects.get(
+ id=request.POST['composicao_mesa'])
+ except ObjectDoesNotExist:
return JsonResponse(
{'msg': (
- 'Selecione algum parlamentar para ser excluido!', 0)})
+ 'Composição da Mesa não pôde ser removida!', 0)})
+
+ composicao.delete()
+
+ return JsonResponse(
+ {'msg': (
+ 'Parlamentar excluido com sucesso!', 1)})
+ else:
+ return JsonResponse(
+ {'msg': (
+ 'Selecione algum parlamentar para ser excluido!', 0)})
def partido_parlamentar_sessao_legislativa(sessao, parlamentar):
diff --git a/sapl/sessao/forms.py b/sapl/sessao/forms.py
index 91881b32c..c617364bc 100644
--- a/sapl/sessao/forms.py
+++ b/sapl/sessao/forms.py
@@ -51,6 +51,38 @@ ORDENACAO_RESUMO = [('cont_mult', 'Conteúdo Multimídia'),
('oradores_exped', 'Oradores do Expediente'),
('oradores_expli', 'Oradores das Explicações Pessoais')]
+class SessaoPlenariaForm(ModelForm):
+
+ class Meta:
+ model = SessaoPlenaria
+ exclude = ['cod_andamento_sessao']
+
+ def clean(self):
+ super(SessaoPlenariaForm, self).clean()
+
+ instance = self.instance
+
+ num = self.cleaned_data['numero']
+ sl = self.cleaned_data['sessao_legislativa']
+ leg = self.cleaned_data['legislatura']
+
+ sessoes = SessaoPlenaria.objects.filter(numero=num,
+ sessao_legislativa=sl,
+ legislatura=leg).\
+ values_list('id', flat=True)
+
+ qtd_sessoes = len(sessoes)
+
+ error = ValidationError('Número de Sessão Plenária Existente')
+
+ if qtd_sessoes > 0:
+ if instance.pk: # update
+ if not instance.pk in sessoes or qtd_sessoes > 1:
+ raise error
+ else: # create
+ raise error
+
+ return self.cleaned_data
class BancadaForm(ModelForm):
diff --git a/sapl/sessao/migrations/0011_auto_20170814_1409.py b/sapl/sessao/migrations/0011_auto_20170814_1409.py
new file mode 100644
index 000000000..316cd7a1a
--- /dev/null
+++ b/sapl/sessao/migrations/0011_auto_20170814_1409.py
@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.9.13 on 2017-08-14 14:09
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('sessao', '0010_auto_20170810_1033'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='bloco',
+ name='partidos',
+ field=models.ManyToManyField(blank=True, to='parlamentares.Partido', verbose_name='Partidos'),
+ ),
+ ]
diff --git a/sapl/sessao/migrations/0012_auto_20170814_1615.py b/sapl/sessao/migrations/0012_auto_20170814_1615.py
new file mode 100644
index 000000000..7060ad9db
--- /dev/null
+++ b/sapl/sessao/migrations/0012_auto_20170814_1615.py
@@ -0,0 +1,23 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.9.11 on 2017-08-14 16:15
+from __future__ import unicode_literals
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('sessao', '0011_auto_20170814_1409'),
+ ]
+
+ operations = [
+ migrations.AlterModelOptions(
+ name='bancada',
+ options={'ordering': ('-legislatura__numero',), 'verbose_name': 'Bancada Parlamentar', 'verbose_name_plural': 'Bancadas Parlamentares'},
+ ),
+ migrations.AlterModelOptions(
+ name='bloco',
+ options={'verbose_name': 'Bloco Parlamentar', 'verbose_name_plural': 'Blocos Parlamentares'},
+ ),
+ ]
diff --git a/sapl/sessao/models.py b/sapl/sessao/models.py
index d746ac1e8..89e986341 100644
--- a/sapl/sessao/models.py
+++ b/sapl/sessao/models.py
@@ -59,8 +59,8 @@ class Bancada(models.Model):
))
class Meta:
- verbose_name = _('Bancada')
- verbose_name_plural = _('Bancadas')
+ verbose_name = _('Bancada Parlamentar')
+ verbose_name_plural = _('Bancadas Parlamentares')
ordering = ('-legislatura__numero', )
def __str__(self):
@@ -507,8 +507,8 @@ class Bloco(models.Model):
))
class Meta:
- verbose_name = _('Bloco')
- verbose_name_plural = _('Blocos')
+ verbose_name = _('Bloco Parlamentar')
+ verbose_name_plural = _('Blocos Parlamentares')
def __str__(self):
return self.nome
diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py
index f72f803e1..fb44472c9 100644
--- a/sapl/sessao/views.py
+++ b/sapl/sessao/views.py
@@ -37,7 +37,7 @@ from sapl.sessao.forms import ExpedienteMateriaForm, OrdemDiaForm
from .forms import (AdicionarVariasMateriasFilterSet, ExpedienteForm,
ListMateriaForm, MesaForm, OradorExpedienteForm,
OradorForm, PautaSessaoFilterSet, PresencaForm,
- ResumoOrdenacaoForm, SessaoPlenariaFilterSet,
+ ResumoOrdenacaoForm, SessaoPlenariaFilterSet, SessaoPlenariaForm,
VotacaoEditForm, VotacaoForm, VotacaoNominalForm)
from .models import (Bancada, Bloco, CargoBancada, CargoMesa,
ExpedienteMateria, ExpedienteSessao, IntegranteMesa,
@@ -542,11 +542,15 @@ class SessaoCrud(Crud):
class UpdateView(Crud.UpdateView):
+ form_class = SessaoPlenariaForm
+
def get_initial(self):
return {'sessao_legislativa': self.object.sessao_legislativa}
class CreateView(Crud.CreateView):
+ form_class = SessaoPlenariaForm
+
@property
def cancel_url(self):
return self.search_url
diff --git a/sapl/templates/base.html b/sapl/templates/base.html
index 7c0a72ca2..554f08756 100644
--- a/sapl/templates/base.html
+++ b/sapl/templates/base.html
@@ -202,7 +202,7 @@
CEP: {{ cep }} | Telefone: {{ telefone }}
{% trans 'Site da Câmara' %} |
- {% trans 'Fale Conosco' %}
+ {% trans 'Fale Conosco' %}
{% else %}
diff --git a/sapl/templates/parlamentares/public_composicaomesa_form.html b/sapl/templates/parlamentares/public_composicaomesa_form.html
index d9150da59..5017a0ef1 100644
--- a/sapl/templates/parlamentares/public_composicaomesa_form.html
+++ b/sapl/templates/parlamentares/public_composicaomesa_form.html
@@ -46,7 +46,7 @@
{% for p in composicao_mesa %}