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 %} {% if p.parlamentar.fotografia %} - + {% else %} {% endif %} @@ -119,8 +119,8 @@ function altera_field(id_legislatura, id_sessao=null){ // Garante que a Sessão atual será a selecionada previamente e, no caso em que // o campo modificado seja o de Legislatura, que a Sessão seja a última daquela // legislatura - $("#id_sessao_legislativa").val(data['sessao_selecionada']) - + $("#id_sessao_legislativa").val(data['sessao_selecionada']) + }); } diff --git a/sapl/templates/sistema.html b/sapl/templates/sistema.html index e631d84a8..c8d31c179 100644 --- a/sapl/templates/sistema.html +++ b/sapl/templates/sistema.html @@ -39,12 +39,12 @@
-

Módulo Bancadas

+

Módulo Bancadas Parlamentares

-
Bancadas
-
Cargo de Bancada
-
Frente
-
Bloco
+
Bancadas Parlamentares
+
Cargo de Bancada Parlamentar
+
Frente Parlamentar
+
Bloco Parlamentar