From a50a717f8cb65396530b2829cb76278cabd4da37 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Fri, 4 Dec 2015 09:37:54 -0200 Subject: [PATCH 1/7] customize unique message for Vide add --- compilacao/forms.py | 21 ++++++++++++++------- compilacao/models.py | 3 ++- static/styles/compilacao.scss | 6 +++++- 3 files changed, 21 insertions(+), 9 deletions(-) diff --git a/compilacao/forms.py b/compilacao/forms.py index ff5d31c9f..9cb8617bc 100644 --- a/compilacao/forms.py +++ b/compilacao/forms.py @@ -1,6 +1,7 @@ from crispy_forms.helper import FormHelper from crispy_forms.layout import HTML, Button, Column, Div, Field, Layout, Row from django import forms +from django.core.exceptions import NON_FIELD_ERRORS from django.forms.models import ModelForm from django.utils.translation import ugettext_lazy as _ @@ -14,7 +15,7 @@ class UpLoadImportFileForm(forms.Form): required=True, label=_('Arquivo formato ODF para Importanção')) -error_messages = { +nota_error_messages = { 'required': _('Este campo é obrigatório'), 'invalid': _('URL inválida.') } @@ -37,11 +38,11 @@ class NotaForm(ModelForm): texto = forms.CharField( label='', widget=forms.Textarea, - error_messages=error_messages) + error_messages=nota_error_messages) url_externa = forms.URLField( label='', required=False, - error_messages=error_messages) + error_messages=nota_error_messages) publicidade = forms.ChoiceField( required=True, label=_('Publicidade'), @@ -60,7 +61,7 @@ class NotaForm(ModelForm): required=True, widget=forms.DateInput( format='%d/%m/%Y'), - error_messages=error_messages + error_messages=nota_error_messages ) efetividade = forms.DateField( label=_('Efetividade'), @@ -68,7 +69,7 @@ class NotaForm(ModelForm): required=True, widget=forms.DateInput( format='%d/%m/%Y'), - error_messages=error_messages) + error_messages=nota_error_messages) dispositivo = forms.ModelChoiceField(queryset=Dispositivo.objects.all(), widget=forms.HiddenInput()) pk = forms.IntegerField(widget=forms.HiddenInput(), @@ -137,12 +138,12 @@ class VideForm(ModelForm): texto = forms.CharField( label='', widget=forms.Textarea, - error_messages=error_messages, required=False) tipo = forms.ModelChoiceField( label=_('Tipo do Vide'), queryset=TipoVide.objects.all(), - required=True) + required=True, + error_messages=nota_error_messages) busca_dispositivo = forms.CharField( label=_('Buscar Dispositivo a Referenciar'), @@ -157,6 +158,12 @@ class VideForm(ModelForm): 'texto', 'tipo', 'pk'] + error_messages = { + NON_FIELD_ERRORS: { + 'unique_together': + "Ja existe um Vide deste tipo para o Dispositivo Referido ", + } + } def __init__(self, *args, **kwargs): diff --git a/compilacao/models.py b/compilacao/models.py index e6df58898..124d9af90 100644 --- a/compilacao/models.py +++ b/compilacao/models.py @@ -1,6 +1,7 @@ from datetime import datetime from django.contrib.auth.models import User +from django.core.exceptions import ValidationError from django.db import models from django.db.models import F, Q from django.db.models.aggregates import Max @@ -1048,7 +1049,7 @@ class Vide(TimestampedMixin): class Meta: verbose_name = _('Vide') verbose_name_plural = _('Vides') - unique_together = ['dispositivo_base', 'dispositivo_ref'] + unique_together = ['dispositivo_base', 'dispositivo_ref', 'tipo'] def __str__(self): return _('Vide %s') % self.texto diff --git a/static/styles/compilacao.scss b/static/styles/compilacao.scss index f51ab838a..3f5364bcb 100644 --- a/static/styles/compilacao.scss +++ b/static/styles/compilacao.scss @@ -447,7 +447,7 @@ a:link:after, a:visited:after { } .title_form { font-size: 2.5em; - padding: 0.5em 0.3em 0.2em; + padding: 0.5em 0.3em 0.3em; background: #e5e5e5; color: #777; margin-bottom: 0.4em; @@ -461,6 +461,9 @@ a:link:after, a:visited:after { border: 0px; outline:0px; } + .alert-box { + margin-bottom: 0; + } .row:first-of-type { margin-top: 1em; display: inline-block; @@ -1173,6 +1176,7 @@ a:link:after, a:visited:after { cursor: pointer; opacity: 0.7; transform: rotate(45deg); + z-index: 98; .icon-close{ background: #FFF; From bac63ce2e465377768cca1f8da73275f3ce70c97 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Fri, 4 Dec 2015 09:40:00 -0200 Subject: [PATCH 2/7] commit migration file of last update --- .../migrations/0030_auto_20151203_1514.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 compilacao/migrations/0030_auto_20151203_1514.py diff --git a/compilacao/migrations/0030_auto_20151203_1514.py b/compilacao/migrations/0030_auto_20151203_1514.py new file mode 100644 index 000000000..3bff2a458 --- /dev/null +++ b/compilacao/migrations/0030_auto_20151203_1514.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('compilacao', '0029_auto_20151201_1611'), + ] + + operations = [ + migrations.AlterUniqueTogether( + name='vide', + unique_together=set([('dispositivo_base', 'dispositivo_ref', 'tipo')]), + ), + ] From 4a088329f42edcde65af203e92535b37255626fc Mon Sep 17 00:00:00 2001 From: Eduardo Edson Batista Cordeiro Alves Date: Wed, 2 Dec 2015 12:10:23 -0200 Subject: [PATCH 3/7] Implement MesaDiretora --- parlamentares/urls.py | 6 +- parlamentares/views.py | 112 +++++++++++++++++++-- templates/base.html | 2 +- templates/mesa_diretora/mesa_diretora.html | 76 ++++++++++++++ 4 files changed, 186 insertions(+), 10 deletions(-) create mode 100644 templates/mesa_diretora/mesa_diretora.html diff --git a/parlamentares/urls.py b/parlamentares/urls.py index e15d58eb1..91f8a87f9 100644 --- a/parlamentares/urls.py +++ b/parlamentares/urls.py @@ -1,6 +1,5 @@ from django.conf.urls import include, url - -from parlamentares.views import (ParlamentaresCadastroView, +from parlamentares.views import (MesaDiretoraView, ParlamentaresCadastroView, ParlamentaresEditarView, ParlamentaresView, cargo_mesa_crud, coligacao_crud, legislatura_crud, nivel_instrucao_crud, @@ -33,4 +32,7 @@ urlpatterns = [ ParlamentaresCadastroView.as_view(), name='parlamentares_cadastro'), url(r'^parlamentares/(?P\d+)/(?P\d+)/editar$', ParlamentaresEditarView.as_view(), name='parlamentares_editar'), + + url(r'^mesa-diretora/$', + MesaDiretoraView.as_view(), name='mesa_diretora'), ] diff --git a/parlamentares/views.py b/parlamentares/views.py index 5ed3be20e..092c5b0db 100644 --- a/parlamentares/views.py +++ b/parlamentares/views.py @@ -1,5 +1,6 @@ from re import sub +import sapl from crispy_forms.helper import FormHelper from crispy_forms.layout import HTML, ButtonHolder, Fieldset, Layout, Submit from django import forms @@ -9,15 +10,13 @@ from django.utils.html import strip_tags from django.utils.safestring import mark_safe from django.utils.translation import ugettext_lazy as _ from django.views.generic.edit import FormMixin -from vanilla import GenericView - -import sapl from sapl.crud import build_crud +from vanilla import GenericView -from .models import (CargoMesa, Coligacao, Dependente, Filiacao, Legislatura, - Mandato, NivelInstrucao, Parlamentar, Partido, - SessaoLegislativa, SituacaoMilitar, TipoAfastamento, - TipoDependente) +from .models import (CargoMesa, Coligacao, ComposicaoMesa, Dependente, + Filiacao, Legislatura, Mandato, NivelInstrucao, + Parlamentar, Partido, SessaoLegislativa, SituacaoMilitar, + TipoAfastamento, TipoDependente) cargo_mesa_crud = build_crud( CargoMesa, 'cargo_mesa', [ @@ -376,3 +375,102 @@ class ParlamentaresEditarView(FormMixin, GenericView): else: return self.render_to_response( {'form': form, 'legislatura_id': pk}) + + +class MesaDiretoraForm(forms.Form): + pass + + +class MesaDiretoraView(FormMixin, GenericView): + template_name = "mesa_diretora/mesa_diretora.html" + + def get_success_url(self): + return reverse('mesa_diretora') + + def get(self, request, *args, **kwargs): + form = MesaDiretoraForm() + + mesa = SessaoLegislativa.objects.filter( + legislatura=Legislatura.objects.last()).first( + ).composicaomesa_set.all() + + cargos_ocupados = [m.cargo for m in mesa] + cargos = CargoMesa.objects.all() + cargos_vagos = list(set(cargos) - set(cargos_ocupados)) + + parlamentares = Legislatura.objects.last().mandato_set.all() + parlamentares_ocupados = [m.parlamentar for m in mesa] + parlamentares_vagos = list( + set( + [p.parlamentar for p in parlamentares]) - set( + parlamentares_ocupados)) + + return self.render_to_response( + {'form': form, + 'legislaturas': Legislatura.objects.all( + ).order_by('-data_inicio'), + 'legislatura_selecionada': Legislatura.objects.last(), + 'sessoes': SessaoLegislativa.objects.filter( + legislatura=Legislatura.objects.last()), + 'sessao_selecionada': SessaoLegislativa.objects.filter( + legislatura=Legislatura.objects.last()).first(), + 'composicao_mesa': mesa, + 'parlamentares': parlamentares_vagos, + 'cargos_vagos': cargos_vagos + }) + + def post(self, request, *args, **kwargs): + form = MesaDiretoraForm(request.POST) + + if 'Incluir' in request.POST: + composicao = ComposicaoMesa() + composicao.sessao_legislativa = SessaoLegislativa.objects.get( + id=form.data['sessao']) + composicao.parlamentar = Parlamentar.objects.get( + id=form.data['parlamentar']) + composicao.cargo = CargoMesa.objects.get( + id=form.data['cargo']) + composicao.save() + return self.form_valid(form) + elif 'Excluir' in request.POST: + if 'composicao_mesa' in request.POST: + ids = request.POST['composicao_mesa'].split(':') + ComposicaoMesa.objects.filter( + sessao_legislativa=form.data['sessao'], + parlamentar=ids[0], + cargo=ids[1] + ).delete() + return self.form_valid(form) + else: + mesa = SessaoLegislativa.objects.filter( + legislatura_id=int(form.data['legislatura'])).first( + ).composicaomesa_set.all() + + cargos_ocupados = [m.cargo for m in mesa] + cargos = CargoMesa.objects.all() + cargos_vagos = list(set(cargos) - set(cargos_ocupados)) + + parlamentares = Legislatura.objects.get( + id=int(form.data['legislatura'])).mandato_set.all() + parlamentares_ocupados = [m.parlamentar for m in mesa] + parlamentares_vagos = list( + set( + [p.parlamentar for p in parlamentares]) - set( + parlamentares_ocupados)) + + return self.render_to_response( + {'form': form, + 'legislaturas': Legislatura.objects.all( + ).order_by('-data_inicio'), + 'legislatura_selecionada': Legislatura.objects.get( + id=int(form.data['legislatura'])), + 'sessoes': SessaoLegislativa.objects.filter( + legislatura_id=int(form.data['legislatura'])), + 'sessao_selecionada': SessaoLegislativa.objects.filter( + id=int(form.data['sessao'])), + 'composicao_mesa': mesa, + 'parlamentares': parlamentares_vagos, + 'cargos_vagos': cargos_vagos + }) + + return self.form_valid(form) diff --git a/templates/base.html b/templates/base.html index 10ee92173..2068aa673 100644 --- a/templates/base.html +++ b/templates/base.html @@ -60,7 +60,7 @@