diff --git a/sapl/parlamentares/forms.py b/sapl/parlamentares/forms.py index bdb8c4d00..d36b3ff73 100644 --- a/sapl/parlamentares/forms.py +++ b/sapl/parlamentares/forms.py @@ -54,7 +54,8 @@ class MandatoForm(ModelForm): class Meta: model = Mandato fields = ['legislatura', 'coligacao', 'votos_recebidos', - 'data_fim_mandato', 'data_expedicao_diploma', 'titular', + 'data_inicio_mandato', 'data_fim_mandato', + 'data_expedicao_diploma', 'titular', 'tipo_afastamento', 'observacao', 'parlamentar'] widgets = {'parlamentar': forms.HiddenInput()} diff --git a/sapl/parlamentares/migrations/0003_auto_20170707_1656.py b/sapl/parlamentares/migrations/0003_auto_20170707_1656.py new file mode 100644 index 000000000..e6212354d --- /dev/null +++ b/sapl/parlamentares/migrations/0003_auto_20170707_1656.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2017-07-07 16:56 +from __future__ import unicode_literals + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('parlamentares', '0002_auto_20170504_1751'), + ] + + operations = [ + migrations.AddField( + model_name='mandato', + name='data_inicio_mandato', + field=models.DateField(default=datetime.datetime(2017, 7, 7, 16, 56, 58, 525896), verbose_name='Início do Mandato'), + preserve_default=False, + ), + migrations.AlterField( + model_name='mandato', + name='data_fim_mandato', + field=models.DateField(blank=True, null=True, verbose_name='Fim do Mandato'), + ), + ] diff --git a/sapl/parlamentares/migrations/0004_auto_20170711_1305.py b/sapl/parlamentares/migrations/0004_auto_20170711_1305.py new file mode 100644 index 000000000..9ef1faef6 --- /dev/null +++ b/sapl/parlamentares/migrations/0004_auto_20170711_1305.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2017-07-11 13:05 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('parlamentares', '0003_auto_20170707_1656'), + ] + + operations = [ + migrations.AlterField( + model_name='mandato', + name='data_inicio_mandato', + field=models.DateField(blank=True, null=True, verbose_name='Início do Mandato'), + ), + ] diff --git a/sapl/parlamentares/models.py b/sapl/parlamentares/models.py index d81412a4c..5039be89e 100644 --- a/sapl/parlamentares/models.py +++ b/sapl/parlamentares/models.py @@ -449,7 +449,12 @@ class Mandato(models.Model): on_delete=models.PROTECT, verbose_name=_('Coligação')) # TODO what is this field?????? tipo_causa_fim_mandato = models.PositiveIntegerField(blank=True, null=True) - data_fim_mandato = models.DateField(verbose_name=_('Fim do Mandato')) + data_inicio_mandato = models.DateField(verbose_name=_('Início do Mandato'), + blank=True, + null=True) + data_fim_mandato = models.DateField(verbose_name=_('Fim do Mandato'), + blank=True, + null=True) votos_recebidos = models.PositiveIntegerField( blank=True, null=True, verbose_name=_('Votos Recebidos (Mandato)')) data_expedicao_diploma = models.DateField( diff --git a/sapl/parlamentares/tests/test_parlamentares.py b/sapl/parlamentares/tests/test_parlamentares.py index b71816d5b..f210a4551 100644 --- a/sapl/parlamentares/tests/test_parlamentares.py +++ b/sapl/parlamentares/tests/test_parlamentares.py @@ -147,7 +147,5 @@ def test_form_errors_mandato(admin_client): assert (response.context_data['form'].errors['legislatura'] == ['Este campo é obrigatório.']) - assert (response.context_data['form'].errors['data_fim_mandato'] == - ['Este campo é obrigatório.']) assert (response.context_data['form'].errors['data_expedicao_diploma'] == ['Este campo é obrigatório.']) diff --git a/sapl/parlamentares/urls.py b/sapl/parlamentares/urls.py index 68ddcc16b..7b0f8f031 100644 --- a/sapl/parlamentares/urls.py +++ b/sapl/parlamentares/urls.py @@ -15,7 +15,9 @@ from sapl.parlamentares.views import (CargoMesaCrud, ColigacaoCrud, TipoMilitarCrud, VotanteView, altera_field_mesa, altera_field_mesa_public_view, + frente_atualiza_lista_parlamentares, insere_parlamentar_composicao, + parlamentares_frente_selected, remove_parlamentar_composicao) from .apps import AppConfig @@ -38,8 +40,16 @@ urlpatterns = [ url(r'^sistema/coligacao/', include(ColigacaoCrud.get_urls() + ComposicaoColigacaoCrud.get_urls())), + url(r'^sistema/frente/', include(FrenteCrud.get_urls())), + url(r'^sistema/frente/atualiza-lista-parlamentares', + frente_atualiza_lista_parlamentares, + name='atualiza_lista_parlamentares'), + url(r'^sistema/frente/parlamentares-frente-selected', + parlamentares_frente_selected, + name='parlamentares_frente_selected'), + url(r'^sistema/parlamentar/legislatura/', include(LegislaturaCrud.get_urls())), url(r'^sistema/parlamentar/tipo-dependente/', diff --git a/sapl/parlamentares/views.py b/sapl/parlamentares/views.py index 77ad62cf7..309c8b3cd 100644 --- a/sapl/parlamentares/views.py +++ b/sapl/parlamentares/views.py @@ -30,6 +30,10 @@ from sapl.materia.models import Autoria 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') SessaoLegislativaCrud = CrudAux.build(SessaoLegislativa, 'sessao_legislativa') @@ -38,9 +42,6 @@ NivelInstrucaoCrud = CrudAux.build(NivelInstrucao, 'nivel_instrucao') TipoAfastamentoCrud = CrudAux.build(TipoAfastamento, 'tipo_afastamento') TipoMilitarCrud = CrudAux.build(SituacaoMilitar, 'tipo_situa_militar') -FrenteCrud = CrudAux.build(Frente, 'tipo_situa_militar', list_field_names=[ - 'nome', 'data_criacao', 'parlamentares']) - DependenteCrud = MasterDetailCrud.build( Dependente, 'parlamentar', 'dependente') @@ -211,6 +212,109 @@ class ColigacaoCrud(CrudAux): subnav_template_name = 'parlamentares/subnav_coligacao.yaml' +def json_date_convert(date): + ''' + :param date: recebe a data de uma chamada ajax no formato de + string "dd/mm/yyyy" + :return: + ''' + dia, mes, ano = date.split('/') + return datetime.date(day=int(dia), + month=int(mes), + year=int(ano)) + + +def parlamentares_ativos(data_inicio, data_fim=None): + ''' + :param data_inicio: define a data de inicial do período desejado + :param data_fim: define a data final do período desejado + :return: queryset dos parlamentares ativos naquele período + ''' + mandatos_ativos = Mandato.objects.filter(Q( + data_inicio_mandato__lte=data_inicio, + data_fim_mandato__isnull=True) | Q( + data_inicio_mandato__lte=data_inicio, + data_fim_mandato__gte=data_inicio)) + if data_fim: + mandatos_ativos = mandatos_ativos | Mandato.objects.filter( + data_inicio_mandato__gte=data_inicio, + data_inicio_mandato__lte=data_fim) + else: + mandatos_ativos = mandatos_ativos | Mandato.objects.filter( + data_inicio_mandato__gte=data_inicio) + + parlamentares_id = mandatos_ativos.values_list( + 'parlamentar_id', + flat=True).distinct('parlamentar_id') + + return Parlamentar.objects.filter(id__in=parlamentares_id) + + +def frente_atualiza_lista_parlamentares(request): + ''' + :param request: recebe os parâmetros do GET da chamada Ajax + :return: retorna a lista atualizada dos parlamentares + ''' + ativos = json.loads(request.GET['ativos']) + + parlamentares = Parlamentar.objects.all() + + if ativos: + if 'data_criacao' in request.GET and request.GET['data_criacao']: + data_criacao = json_date_convert(request.GET['data_criacao']) + + if 'data_extincao' in request.GET and request.GET['data_extincao']: + data_extincao = json_date_convert(request.GET['data_extincao']) + parlamentares = parlamentares_ativos(data_criacao, + data_extincao) + else: + parlamentares = parlamentares_ativos(data_criacao) + + parlamentares_list = [(p.id, p.__str__()) for p in parlamentares] + + return JsonResponse({'parlamentares_list': parlamentares_list}) + + +def parlamentares_frente_selected(request): + ''' + :return: Lista com o id dos parlamentares em uma frente + ''' + try: + frente = Frente.objects.get(id=int(request.GET['frente_id'])) + except ObjectDoesNotExist: + lista_parlamentar_id = [] + else: + lista_parlamentar_id = frente.parlamentares.all().values_list( + 'id', flat=True) + return JsonResponse({'id_list': list(lista_parlamentar_id)}) + + +class FrenteCrud(CrudAux): + model = Frente + help_path = 'tabelas_auxiliares#tipo_situa_militar' + list_field_names = ['nome', 'data_criacao', 'parlamentares'] + + class CreateView(CrudAux.CreateView): + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + + # Update view é um indicador para o javascript + # de que esta não é uma tela de edição de frente + context['update_view'] = 0 + + return context + + class UpdateView(CrudAux.UpdateView): + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + + # Update view é um indicador para o javascript + # de que esta não é uma tela de edição de frente + context['update_view'] = 1 + + return context + + class MandatoCrud(MasterDetailCrud): model = Mandato parent_field = 'parlamentar' diff --git a/sapl/templates/parlamentares/frente_form.html b/sapl/templates/parlamentares/frente_form.html new file mode 100644 index 000000000..5d9ae8fc1 --- /dev/null +++ b/sapl/templates/parlamentares/frente_form.html @@ -0,0 +1,128 @@ +{% extends "crud/form.html" %} +{% load i18n %} +{% load crispy_forms_tags %} +{% load common_tags %} + +{% block base_content %} +
+ {% csrf_token %} + +
+
+ {{ form.nome|as_crispy_field }} +
+
+ +
+
+ {{ form.data_criacao|as_crispy_field }} +
+
+ {{ form.data_extincao|as_crispy_field }} +
+
+ + + +
+
+ {{ form.descricao|as_crispy_field }} +
+
+ +
+ +
+ +{% endblock base_content %} + +{% block extra_js %} + +{% endblock %} diff --git a/sapl/templates/parlamentares/layouts.yaml b/sapl/templates/parlamentares/layouts.yaml index c839c1b53..57a3b86ba 100644 --- a/sapl/templates/parlamentares/layouts.yaml +++ b/sapl/templates/parlamentares/layouts.yaml @@ -71,7 +71,8 @@ Filiacao: Mandato: {% trans 'Mandato' %}: - legislatura coligacao votos_recebidos - - data_fim_mandato data_expedicao_diploma titular + - data_inicio_mandato data_fim_mandato + - data_expedicao_diploma titular - tipo_afastamento - observacao diff --git a/scripts/set_inicio_mandato.py b/scripts/set_inicio_mandato.py new file mode 100644 index 000000000..37dfcfc0c --- /dev/null +++ b/scripts/set_inicio_mandato.py @@ -0,0 +1,10 @@ +from sapl.parlamentares.models import Mandato + + +def popula_campo_data_inicio(): + for m in Mandato.objects.all(): + m.data_inicio_mandato = m.legislatura.data_inicio + m.save() + +if __name__ == '__main__': + popula_campo_data_inicio() \ No newline at end of file