import os from re import sub from crispy_forms.helper import FormHelper from crispy_forms.layout import HTML, ButtonHolder, Fieldset, Layout, Submit from django import forms from django.contrib import messages from django.core.urlresolvers import reverse from django.forms import ModelForm 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 .models import (CargoMesa, Coligacao, ComposicaoMesa, Dependente, Filiacao, Legislatura, Mandato, NivelInstrucao, Parlamentar, Partido, SessaoLegislativa, SituacaoMilitar, TipoAfastamento, TipoDependente) cargo_mesa_crud = build_crud( CargoMesa, 'cargo_mesa', [ [_('Cargo na Mesa'), [('descricao', 10), ('unico', 2)]], ]) legislatura_crud = build_crud( Legislatura, 'tabelas_auxiliares#legislatura', [ [_('Legislatura'), [('data_inicio', 4), ('data_fim', 4), ('data_eleicao', 4)]], ]) coligacao_crud = build_crud( Coligacao, 'coligacao', [ [_('Coligação'), [('nome', 5), ('legislatura', 5), ('numero_votos', 2)]], ]) partido_crud = build_crud( Partido, 'partidos', [ [_('Partido Político'), [('nome', 6), ('sigla', 2), ('data_criacao', 2), ('data_extincao', 2)]], ]) dependente_crud = build_crud( Dependente, '', [ [_('Dependentes'), [('nome', 12)], [('tipo', 4), ('sexo', 4), ('data_nascimento', 4)], [('cpf', 4), ('rg', 4), ('titulo_eleitor', 4)]], ]) sessao_legislativa_crud = build_crud( SessaoLegislativa, 'sessao_legislativa', [ [_('Sessão Legislativa'), [('numero', 4), ('tipo', 4), ('legislatura', 4), ('data_inicio', 6), ('data_fim', 6), ('data_inicio_intervalo', 6), ('data_fim_intervalo', 6)]], ]) parlamentar_crud = build_crud( Parlamentar, '', [ [_('Cadastro do Parlamentar'), [('nome_parlamentar', 8), ('ativo', 4)], [('nome_completo', 12)], [('nivel_instrucao', 4), ('sexo', 4), ('data_nascimento', 4)], [('cpf', 4), ('rg', 4), ('titulo_eleitor', 4)], [('situacao_militar', 6), ('profissao', 6)], [('endereco_web', 12)], [('email', 12)], [('numero_gab_parlamentar', 4), ('telefone', 4), ('fax', 4)], [('endereco_residencia', 6), ('cep_residencia', 6)], [('municipio_residencia', 12)], [('telefone_residencia', 6), ('fax_residencia', 6)], [('locais_atuacao', 12)], [('fotografia', 12)], [('biografia', 12)]], ]) filiacao_crud = build_crud( Filiacao, '', [ [_('Filiações Partidárias '), [('partido', 4), ('data', 4), ('data_desfiliacao', 4)]], ]) mandato_crud = build_crud( Mandato, '', [ [_('Mandato'), [('legislatura', 4), ('coligacao', 4), ('votos_recebidos', 4)], [('ind_titular_FIXME', 3), ('dat_inicio_mandato_FIXME', 3), ('data_fim_mandato', 3), ('data_expedicao_diploma', 3)], [('observacao', 12)]], ]) tipo_dependente_crud = build_crud( TipoDependente, 'tipo_dependente', [ [_('Tipo de Dependente'), [('descricao', 12)]], ]) nivel_instrucao_crud = build_crud( NivelInstrucao, 'nivel_instrucao', [ [_('Nível Instrução'), [('descricao', 12)]], ]) tipo_afastamento_crud = build_crud( TipoAfastamento, 'tipo_afastamento', [ [_('Tipo de Afastamento'), [('descricao', 5), ('dispositivo', 5), ('afastamento', 2)]], ]) tipo_militar_crud = build_crud( SituacaoMilitar, 'tipo_situa_militar', [ [_('Tipo Situação Militar'), [('descricao', 12)]], ]) class ParlamentaresListForm(forms.Form): periodo = forms.CharField() class ParlamentaresView(GenericView): template_name = "parlamentares/parlamentares_list.html" def get(self, request, *args, **kwargs): form = ParlamentaresListForm() # import ipdb; ipdb.set_trace() if not Legislatura.objects.all(): mensagem = "Cadastre alguma Legislatura antes\ de cadastrar algum Parlamentar" messages.add_message(request, messages.INFO, mensagem) return self.render_to_response( {'legislaturas': [], 'legislatura_id': 0, 'form': form, }) legislaturas = Legislatura.objects.all().order_by( '-data_inicio', '-data_fim') mandatos = Mandato.objects.filter( legislatura_id=legislaturas.first().id) parlamentares = [] dict_parlamentar = {} for m in mandatos: if m.parlamentar.filiacao_set.last(): partido = m.parlamentar.filiacao_set.last().partido.sigla else: partido = 'Sem Registro' dict_parlamentar = { 'id': m.parlamentar.id, 'nome': m.parlamentar.nome_parlamentar, 'partido': partido, 'ativo': m.parlamentar.ativo} parlamentares.append(dict_parlamentar) return self.render_to_response( {'legislaturas': legislaturas, 'legislatura_id': legislaturas.first().id, 'form': form, 'parlamentares': parlamentares}) def post(self, request, *args, **kwargs): form = ParlamentaresListForm(request.POST) mandatos = Mandato.objects.filter( legislatura_id=int(form.data['periodo'])) parlamentares = [] dict_parlamentar = {} for m in mandatos: if m.parlamentar.filiacao_set.last(): partido = m.parlamentar.filiacao_set.last().partido.sigla else: partido = 'Sem Registro' dict_parlamentar = { 'id': m.parlamentar.id, 'nome': m.parlamentar.nome_parlamentar, 'partido': partido, 'ativo': m.parlamentar.ativo} parlamentares.append(dict_parlamentar) return self.render_to_response( {'legislaturas': Legislatura.objects.all().order_by( '-data_inicio', '-data_fim'), 'legislatura_id': int(form.data['periodo']), 'form': form, 'parlamentares': parlamentares}) class HorizontalRadioRenderer(forms.RadioSelect.renderer): def render(self): return mark_safe(u' '.join([u'%s ' % w for w in self])) class ParlamentaresForm (ModelForm): ativo = forms.TypedChoiceField( coerce=lambda x: x == 'True', choices=((True, 'Sim'), (False, 'Não')), widget=forms.RadioSelect( renderer=HorizontalRadioRenderer ) ) cpf = forms.CharField(label='C.P.F', required=False, widget=forms.TextInput( attrs={'class': 'cpf'})) rg = forms.CharField(label='R.G.', required=False, widget=forms.TextInput( attrs={'class': 'rg'})) titulo_eleitor = forms.CharField(label='Título de Eleitor', required=False, widget=forms.TextInput( attrs={'class': 'titulo_eleitor'})) telefone = forms.CharField(label='Telefone', required=False, widget=forms.TextInput( attrs={'class': 'telefone'})) fax = forms.CharField(label='Fax', required=False, widget=forms.TextInput( attrs={'class': 'telefone'})) cep_residencia = forms.CharField(label='CEP', required=False, widget=forms.TextInput( attrs={'class': 'cep'})) telefone_residencia = forms.CharField(label='Telefone', required=False, widget=forms.TextInput( attrs={'class': 'telefone'})) fax_residencia = forms.CharField(label='Fax', required=False, widget=forms.TextInput( attrs={'class': 'telefone'})) fotografia = forms.ImageField(label='Fotografia', required=False, widget=forms.FileInput ) class Meta: model = Parlamentar fields = ['nome_parlamentar', 'ativo', 'nome_completo', 'nivel_instrucao', 'sexo', 'cpf', 'rg', 'titulo_eleitor', 'data_nascimento', 'situacao_militar', 'profissao', 'endereco_web', 'email', 'numero_gab_parlamentar', 'telefone', 'fax', 'endereco_residencia', 'cep_residencia', 'municipio_residencia', 'telefone_residencia', 'fax_residencia', 'locais_atuacao', 'fotografia', 'biografia'] def __init__(self, *args, **kwargs): row1 = sapl.layout.to_row( [('nome_parlamentar', 8), ('ativo', 4)]) row2 = sapl.layout.to_row( [('nome_completo', 12)]) row3 = sapl.layout.to_row( [('nivel_instrucao', 4), ('sexo', 4), ('data_nascimento', 4)]) row4 = sapl.layout.to_row( [('cpf', 4), ('rg', 4), ('titulo_eleitor', 4)]) row5 = sapl.layout.to_row( [('situacao_militar', 6), ('profissao', 6)]) row6 = sapl.layout.to_row( [('endereco_web', 12)]) row7 = sapl.layout.to_row( [('email', 12)]) row8 = sapl.layout.to_row( [('numero_gab_parlamentar', 4), ('telefone', 4), ('fax', 4)]) row9 = sapl.layout.to_row( [('endereco_residencia', 6), ('cep_residencia', 6)]) row10 = sapl.layout.to_row( [('municipio_residencia', 12)]) row11 = sapl.layout.to_row( [('telefone_residencia', 6), ('fax_residencia', 6)]) row12 = sapl.layout.to_row( [('locais_atuacao', 12)]) row13 = sapl.layout.to_row( [('fotografia', 12)]) row14 = sapl.layout.to_row( [('biografia', 12)]) self.helper = FormHelper() self.helper.layout = Layout( Fieldset('Cadastro do Parlamentar', row1, row2, row3, row4, row5, row6, row7, row8, row9, row10, row11, row12, row13, HTML("""{% if form.fotografia.value %}

{% endif %}""", ), row14, ButtonHolder( Submit('submit', 'Salvar', css_class='button primary'), )) ) super(ParlamentaresForm, self).__init__( *args, **kwargs) class ParlamentaresEditForm(ParlamentaresForm): def __init__(self, *args, **kwargs): super(ParlamentaresEditForm, self).__init__( *args, **kwargs) self.helper.layout[0][-1:] = ButtonHolder( Submit('salvar', 'Salvar', css_class='button primary'), HTML(' '), Submit('excluir', 'Excluir', css_class='button primary'),) class ParlamentaresCadastroView(FormMixin, GenericView): template_name = "parlamentares/parlamentares_cadastro.html" def get_success_url(self): return reverse('parlamentares') def get(self, request, *args, **kwargs): form = ParlamentaresForm() pk = kwargs['pk'] return self.render_to_response({'form': form, 'legislatura_id': pk}) def post(self, request, *args, **kwargs): form = ParlamentaresForm(request.POST) pk = kwargs['pk'] if form.is_valid(): parlamentar = form.save(commit=False) if 'fotografia' in request.FILES: parlamentar.fotografia = request.FILES['fotografia'] parlamentar.biografia = sub(' ', ' ', strip_tags(form.data['biografia'])) parlamentar.save() mandato = Mandato() mandato.parlamentar = parlamentar mandato.legislatura = Legislatura.objects.get(id=pk) mandato.save() return self.form_valid(form) else: return self.render_to_response( {'form': form, 'legislatura_id': pk}) class ParlamentaresEditarView(FormMixin, GenericView): template_name = "parlamentares/parlamentares_cadastro.html" def get_success_url(self): return reverse('parlamentares') def get(self, request, *args, **kwargs): pk = kwargs['pk'] pid = kwargs['pid'] parlamentar = Parlamentar.objects.get(id=pid) form = ParlamentaresEditForm(instance=parlamentar) return self.render_to_response( {'form': form, 'legislatura_id': pk, 'parlamentar': parlamentar}) def post(self, request, *args, **kwargs): pk = kwargs['pk'] pid = kwargs['pid'] parlamentar = Parlamentar.objects.get(id=pid) form = ParlamentaresEditForm(request.POST, instance=parlamentar) if form.is_valid(): if 'salvar' in request.POST: parlamentar = form.save(commit=False) if 'fotografia' in request.FILES: parlamentar.fotografia = request.FILES['fotografia'] parlamentar.biografia = sub(' ', ' ', strip_tags(form.data['biografia'])) parlamentar.save() elif 'excluir' in request.POST: Mandato.objects.get(parlamentar=parlamentar).delete() parlamentar.delete() elif "remover" in request.POST: try: os.unlink(parlamentar.fotografia.path) except OSError: pass # Should log this error!!!!! parlamentar = form.save(commit=False) parlamentar.fotografia = None parlamentar.save() return self.form_valid(form) else: return self.render_to_response( {'form': form, 'legislatura_id': pk}) class DependenteForm(ModelForm): class Meta: model = Dependente fields = ['nome', 'data_nascimento', 'tipo', 'sexo', 'cpf', 'rg', 'titulo_eleitor'] def __init__(self, *args, **kwargs): row1 = sapl.layout.to_row( [('nome', 12)]) row2 = sapl.layout.to_row( [('tipo', 4), ('sexo', 4), ('data_nascimento', 4)]) row3 = sapl.layout.to_row( [('cpf', 4), ('rg', 4), ('titulo_eleitor', 4)]) self.helper = FormHelper() self.helper.layout = Layout( Fieldset('Cadastro de Dependentes', row1, row2, row3, ButtonHolder( Submit('Salvar', 'Salvar', css_class='button primary'), )) ) super(DependenteForm, self).__init__( *args, **kwargs) class DependenteEditForm(DependenteForm): def __init__(self, *args, **kwargs): super(DependenteEditForm, self).__init__( *args, **kwargs) self.helper.layout[0][-1:] = ButtonHolder( Submit('Salvar', 'Salvar', css_class='button primary'), HTML(' '), Submit('Excluir', 'Excluir', css_class='button primary'),) class ParlamentaresDependentesView(FormMixin, GenericView): template_name = "parlamentares/parlamentares_dependentes.html" def get_success_url(self): pk = self.kwargs['pk'] return reverse('parlamentares_dependentes', kwargs={'pk': pk}) def get(self, request, *args, **kwargs): pid = kwargs['pk'] parlamentar = Parlamentar.objects.get(id=pid) dependentes = Dependente.objects.filter( parlamentar=parlamentar).order_by('nome', 'tipo') form = DependenteForm() return self.render_to_response( {'parlamentar': parlamentar, 'dependentes': dependentes, 'form': form, 'legislatura_id': parlamentar.mandato_set.last().legislatura.id}) def post(self, request, *args, **kwargs): form = DependenteForm(request.POST) if form.is_valid(): dependente = form.save(commit=False) pid = kwargs['pk'] parlamentar = Parlamentar.objects.get(id=pid) dependente.parlamentar = parlamentar dependente.save() return self.form_valid(form) else: pid = kwargs['pk'] parlamentar = Parlamentar.objects.get(id=pid) dependentes = Dependente.objects.filter( parlamentar=parlamentar).order_by('nome', 'tipo') return self.render_to_response( {'parlamentar': parlamentar, 'dependentes': dependentes, 'form': form, 'legislatura_id': parlamentar.mandato_set.last( ).legislatura.id}) class ParlamentaresDependentesEditView(FormMixin, GenericView): template_name = "parlamentares/parlamentares_dependentes_edit.html" def get_success_url(self): pk = self.kwargs['pk'] return reverse('parlamentares_dependentes', kwargs={'pk': pk}) def get(self, request, *args, **kwargs): dependente = Dependente.objects.get(id=kwargs['dk']) parlamentar = Parlamentar.objects.get(id=kwargs['pk']) form = DependenteEditForm(instance=dependente) return self.render_to_response( {'form': form, 'parlamentar': parlamentar, 'legislatura_id': dependente.parlamentar.mandato_set.last( ).legislatura_id}) def post(self, request, *args, **kwargs): dependente = Dependente.objects.get(id=kwargs['dk']) form = DependenteEditForm(request.POST, instance=dependente) parlamentar = Parlamentar.objects.get(id=kwargs['pk']) if form.is_valid(): if 'Salvar' in request.POST: dependente.save() elif 'Excluir' in request.POST: dependente.delete() return self.form_valid(form) else: return self.render_to_response( {'form': form, 'parlamentar': parlamentar, 'legislatura_id': dependente.parlamentar.mandato_set.last( ).legislatura_id}) class MesaDiretoraView(FormMixin, GenericView): template_name = "mesa_diretora/mesa_diretora.html" def get_success_url(self): return reverse('mesa_diretora') # Essa função avisa quando se pode compor uma Mesa Legislativa) def validation(self, request): mensagem = "Não há nenhuma Sessão Legislativa cadastrada.\ Só é possível compor uma Mesa Diretora quando há uma Sessão\ Legislativa cadastrada." messages.add_message(request, messages.INFO, mensagem) return self.render_to_response( {'legislaturas': Legislatura.objects.all( ).order_by('-data_inicio'), 'legislatura_selecionada': Legislatura.objects.last(), 'cargos_vagos': CargoMesa.objects.all()}) def get(self, request, *args, **kwargs): if (not Legislatura.objects.all() or not SessaoLegislativa.objects.all()): return self.validation(request) 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( {'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): if 'Incluir' in request.POST: if (not Legislatura.objects.all() or not SessaoLegislativa.objects.all()): return self.validation(request) composicao = ComposicaoMesa() composicao.sessao_legislativa = SessaoLegislativa.objects.get( id=int(request.POST['sessao'])) composicao.parlamentar = Parlamentar.objects.get( id=int(request.POST['parlamentar'])) composicao.cargo = CargoMesa.objects.get( id=int(request.POST['cargo'])) composicao.save() return self.form_valid(form=None) elif 'Excluir' in request.POST: if (not Legislatura.objects.all() or not SessaoLegislativa.objects.all()): return self.validation(request) if 'composicao_mesa' in request.POST: ids = request.POST['composicao_mesa'].split(':') composicao = ComposicaoMesa.objects.get( sessao_legislativa_id=int(request.POST['sessao']), parlamentar_id=int(ids[0]), cargo_id=int(ids[1]) ) composicao.delete() return self.form_valid(form=None) else: mesa = ComposicaoMesa.objects.filter( sessao_legislativa=request.POST['sessao']) 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(request.POST['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( {'legislaturas': Legislatura.objects.all( ).order_by('-data_inicio'), 'legislatura_selecionada': Legislatura.objects.get( id=int(request.POST['legislatura'])), 'sessoes': SessaoLegislativa.objects.filter( legislatura_id=int(request.POST['legislatura'])), 'sessao_selecionada': SessaoLegislativa.objects.get( id=int(request.POST['sessao'])), 'composicao_mesa': mesa, 'parlamentares': parlamentares_vagos, 'cargos_vagos': cargos_vagos }) class FiliacaoForm(ModelForm): class Meta: model = Filiacao fields = ['partido', 'data', 'data_desfiliacao'] def __init__(self, *args, **kwargs): row1 = sapl.layout.to_row( [('partido', 4), ('data', 4), ('data_desfiliacao', 4)]) self.helper = FormHelper() self.helper.layout = Layout( Fieldset('Adicionar Filiação', row1, ButtonHolder( Submit('Salvar', 'Salvar', css_class='button primary'), )) ) super(FiliacaoForm, self).__init__( *args, **kwargs) class FiliacaoEditForm(FiliacaoForm): def __init__(self, *args, **kwargs): super(FiliacaoEditForm, self).__init__( *args, **kwargs) self.helper.layout[0][-1:] = ButtonHolder( Submit('Salvar', 'Salvar', css_class='button primary'), HTML(' '), Submit('Excluir', 'Excluir', css_class='button primary'),) class FiliacaoView(FormMixin, GenericView): template_name = "parlamentares/parlamentares_filiacao.html" def get_success_url(self): pk = self.kwargs['pk'] return reverse('parlamentares_filiacao', kwargs={'pk': pk}) def get(self, request, *args, **kwargs): pid = kwargs['pk'] parlamentar = Parlamentar.objects.get(id=pid) filiacoes = Filiacao.objects.filter( parlamentar=parlamentar) form = FiliacaoForm() return self.render_to_response( {'parlamentar': parlamentar, 'filiacoes': filiacoes, 'form': form, 'legislatura_id': parlamentar.mandato_set.last().legislatura.id}) # Função usada para todos os caso de erro na filiação def error_message(self, parlamentar, form, mensagem, request): filiacoes = Filiacao.objects.filter(parlamentar=parlamentar) messages.add_message(request, messages.INFO, mensagem) return self.render_to_response( {'parlamentar': parlamentar, 'filiacoes': filiacoes, 'form': form, 'legislatura_id': parlamentar.mandato_set.last( ).legislatura.id}) def post(self, request, *args, **kwargs): form = FiliacaoForm(request.POST) if form.is_valid(): data_filiacao = form.cleaned_data['data'] data_desfiliacao = form.cleaned_data['data_desfiliacao'] filiacao = form.save(commit=False) pid = kwargs['pk'] parlamentar = Parlamentar.objects.get(id=pid) candidato_filiado = Filiacao.objects.filter( parlamentar=parlamentar) candidato_nao_desfiliou = Filiacao.objects.filter( parlamentar=parlamentar, data_desfiliacao=None) # Vê se o candidato já se filiou alguma vez a algum partido if not candidato_filiado: filiacao = form.save(commit=False) filiacao.parlamentar = parlamentar filiacao.save() return self.form_valid(form) else: # Dá erro caso não tenha se desfiliado do anterior if candidato_nao_desfiliou: mensagem = "Você não pode se filiar a algum partido\ sem antes se desfiliar do partido anterior" return self.error_message( parlamentar, form, mensagem, request) # Dá erro caso a data de desfiliação seja anterior a de # filiação if data_desfiliacao and data_desfiliacao < data_filiacao: mensagem = "A data de filiação não pode ser\ anterior à data de desfiliação" return self.error_message( parlamentar, form, mensagem, request) # Esse bloco garante que não haverá intersecção entre os # períodos de filiação todas_filiacoes = candidato_filiado for i in range(len(todas_filiacoes)): data_init = todas_filiacoes[i].data data_fim = todas_filiacoes[i].data_desfiliacao if data_filiacao >= data_init and data_filiacao < data_fim: mensagem = "A data de filiação e\ desfiliação não podem estar no intervalo\ de outro período de filiação" return self.error_message( parlamentar, form, mensagem, request) if (data_desfiliacao and data_desfiliacao < data_fim and data_desfiliacao > data_init): mensagem = "A data de filiação e\ desfiliação não podem estar no intervalo\ de outro período de filiação" return self.error_message( parlamentar, form, mensagem, request) if (data_desfiliacao and data_filiacao <= data_init and data_desfiliacao >= data_fim): mensagem = "A data de filiação e\ desfiliação não podem estar no intervalo\ de outro período de filiação" return self.error_message( parlamentar, form, mensagem, request) # Salva a nova filiação caso tudo esteja correto else: filiacao = form.save(commit=False) filiacao.parlamentar = parlamentar filiacao.save() return self.form_valid(form) else: pid = kwargs['pk'] parlamentar = Parlamentar.objects.get(id=pid) mensagem = "" return self.error_message( parlamentar, form, mensagem, request) class FiliacaoEditView(FormMixin, GenericView): template_name = "parlamentares/parlamentares_filiacao_edit.html" def get_success_url(self): pk = self.kwargs['pk'] return reverse('parlamentares_filiacao', kwargs={'pk': pk}) def get(self, request, *args, **kwargs): filiacao = Filiacao.objects.get(id=kwargs['dk']) parlamentar = Parlamentar.objects.get(id=kwargs['pk']) form = FiliacaoEditForm(instance=filiacao) return self.render_to_response( {'form': form, 'parlamentar': parlamentar, 'legislatura_id': parlamentar.mandato_set.last( ).legislatura_id}) def error_message(self, parlamentar, form, mensagem, request): messages.add_message(request, messages.INFO, mensagem) return self.render_to_response( {'form': form, 'parlamentar': parlamentar, 'legislatura_id': parlamentar.mandato_set.last( ).legislatura_id}) def post(self, request, *args, **kwargs): filiacao = Filiacao.objects.get(id=kwargs['dk']) form = FiliacaoEditForm(request.POST, instance=filiacao) parlamentar = Parlamentar.objects.get(id=kwargs['pk']) if form.is_valid(): data_filiacao = form.cleaned_data['data'] data_desfiliacao = form.cleaned_data['data_desfiliacao'] filiacao = form.save(commit=False) pid = kwargs['pk'] parlamentar = Parlamentar.objects.get(id=pid) candidato_filiado = Filiacao.objects.filter( parlamentar=parlamentar) if 'Excluir' in request.POST: filiacao.delete() return self.form_valid(form) # Vê se o candidato já se filiou alguma vez a algum partido if not candidato_filiado: filiacao = form.save(commit=False) filiacao.parlamentar = parlamentar filiacao.save() return self.form_valid(form) else: # Dá erro caso a data de desfiliação seja anterior a de # filiação if data_desfiliacao and data_desfiliacao < data_filiacao: mensagem = "A data de filiação não pode\ anterior à data de desfiliação" return self.error_message( parlamentar, form, mensagem, request) # Esse bloco garante que não haverá intersecção entre os # períodos de filiação todas_filiacoes = candidato_filiado id_filiacao_atual = int(kwargs['dk']) for i in range(len(todas_filiacoes)): if todas_filiacoes[i].id != id_filiacao_atual: data_init = todas_filiacoes[i].data data_fim = todas_filiacoes[i].data_desfiliacao if (data_filiacao >= data_init and data_filiacao < data_fim): mensagem = "A data de filiação e\ desfiliação não podem estar no intervalo\ de outro período de filiação" return self.error_message(parlamentar, form, mensagem, request) if (data_desfiliacao and data_desfiliacao < data_fim and data_desfiliacao > data_init): mensagem = "A data de filiação e\ desfiliação não podem estar no intervalo\ de outro período de filiação" return self.error_message(parlamentar, form, mensagem, request) if (data_desfiliacao and data_filiacao <= data_init and data_desfiliacao >= data_fim): mensagem = "A data de filiação e\ desfiliação não podem estar no intervalo\ de outro período de filiação" return self.error_message(parlamentar, form, mensagem, request) if 'Salvar' in request.POST: filiacao.save() elif 'Excluir' in request.POST: filiacao.delete() return self.form_valid(form) else: return self.render_to_response( {'form': form, 'parlamentar': parlamentar, 'legislatura_id': parlamentar.mandato_set.last( ).legislatura_id}) class MandatoForm(ModelForm): class Meta: model = Mandato fields = ['legislatura', 'coligacao', 'votos_recebidos', 'data_fim_mandato', 'data_expedicao_diploma', 'observacao'] def __init__(self, *args, **kwargs): row1 = sapl.layout.to_row( [('legislatura', 4), ('coligacao', 4), ('votos_recebidos', 4)]) row2 = sapl.layout.to_row( [('data_fim_mandato', 6), ('data_expedicao_diploma', 6)]) row3 = sapl.layout.to_row( [('observacao', 12)]) self.helper = FormHelper() self.helper.layout = Layout( Fieldset('Adicionar Mandato', row1, row2, row3, ButtonHolder( Submit('Salvar', 'Salvar', css_class='button primary'), )) ) super(MandatoForm, self).__init__( *args, **kwargs) class MandatoEditForm(MandatoForm): def __init__(self, *args, **kwargs): super(MandatoEditForm, self).__init__( *args, **kwargs) self.helper.layout[0][-1:] = ButtonHolder( Submit('Salvar', 'Salvar', css_class='button primary'), HTML(' '), Submit('Excluir', 'Excluir', css_class='button primary'),) class MandatoView(FormMixin, GenericView): template_name = "parlamentares/parlamentares_mandato.html" def get_success_url(self): pk = self.kwargs['pk'] return reverse('parlamentares_mandato', kwargs={'pk': pk}) def get(self, request, *args, **kwargs): pid = kwargs['pk'] parlamentar = Parlamentar.objects.get(id=pid) mandatos = Mandato.objects.filter( parlamentar=parlamentar) form = MandatoForm() return self.render_to_response( {'parlamentar': parlamentar, 'mandatos': mandatos, 'form': form, 'legislatura_id': parlamentar.mandato_set.last().legislatura.id}) def post(self, request, *args, **kwargs): form = MandatoForm(request.POST) if form.is_valid(): mandato = form.save(commit=False) pid = kwargs['pk'] parlamentar = Parlamentar.objects.get(id=pid) mandato.parlamentar = parlamentar mandato.save() return self.form_valid(form) else: pid = kwargs['pk'] parlamentar = Parlamentar.objects.get(id=pid) mandatos = Mandato.objects.filter( parlamentar=parlamentar) return self.render_to_response( {'parlamentar': parlamentar, 'mandatos': mandatos, 'form': form, 'legislatura_id': parlamentar.mandato_set.last( ).legislatura.id}) class MandatoEditView(FormMixin, GenericView): template_name = "parlamentares/parlamentares_mandato_edit.html" def get_success_url(self): pk = self.kwargs['pk'] return reverse('parlamentares_mandato', kwargs={'pk': pk}) def get(self, request, *args, **kwargs): mandato = Mandato.objects.get(id=kwargs['dk']) parlamentar = Parlamentar.objects.get(id=kwargs['pk']) form = MandatoEditForm(instance=mandato) return self.render_to_response( {'form': form, 'parlamentar': parlamentar, 'legislatura_id': parlamentar.mandato_set.last( ).legislatura_id}) def post(self, request, *args, **kwargs): mandato = Mandato.objects.get(id=kwargs['dk']) form = MandatoEditForm(request.POST, instance=mandato) parlamentar = Parlamentar.objects.get(id=kwargs['pk']) if form.is_valid(): if 'Salvar' in request.POST: mandato.save() elif 'Excluir' in request.POST: mandato.delete() return self.form_valid(form) else: return self.render_to_response( {'form': form, 'parlamentar': parlamentar, 'legislatura_id': parlamentar.mandato_set.last( ).legislatura_id})