def get_partidos(self): filicacoes = Filiacao.objects.filter( parlamentar=self.parlamentar).order_by('data') return [ f.partido.sigla for f in filicacoes if intervalos_tem_intersecao( self.legislatura.data_inicio, self.legislatura.data_fim, f.data, f.data_desfiliacao or timezone.datetime.max.date()) ]
def validar_datas(data_filiacao, data_desfiliacao, parlamentar, filiacao): # Verifica se data de desfiliacao é anterior a data de filiacao if data_desfiliacao and data_desfiliacao < data_filiacao: error_msg = _("A data de desfiliação não pode anterior \ à data de filiação") return [False, error_msg] filiacao_atual_id = filiacao.pk # recupera filiacoes em ordem crescente de data todas_filiacoes = parlamentar.filiacao_set.all().order_by('data') filiacoes_id = [parlamentar.pk for parlamentar in todas_filiacoes] # Novo registro inserido com filiacoes ja existentes if filiacao_atual_id not in filiacoes_id and len(filiacoes_id) > 0: ultima_filiacao = todas_filiacoes.last() # Se ultima filiacao aberta e insercao posterior a esta filiacao if (not ultima_filiacao.data_desfiliacao and data_filiacao >= ultima_filiacao.data): error_msg = _("O parlamentar não pode se filiar \ a novo partido sem antes se \ desfiliar do partido anterior") return [False, error_msg] # checa intervalos de interseccao error_msg = None for filiacoes in todas_filiacoes: # nao comparar o registro com ele mesmo if filiacoes.id != filiacao_atual_id: # Se a atualizacao eh para remover a data de desfiliacao if not data_desfiliacao: # so permite na ultima data (ou a unica) if filiacao_atual_id != filiacoes_id[-1]: error_msg = _("Data de desfiliação do parlamentar não \ pode ser ausente, se existirem datas de \ filiação posteriores") return [False, error_msg] else: data_inicio = filiacoes.data data_fim = filiacoes.data_desfiliacao # Se filiacao ainda em aberto, preenche uma desfiliacao # ficticia para fins de checagem de interseccao if not data_fim: data_fim = date.today() # finalmente verifica intersecao if intervalos_tem_intersecao(data_inicio, data_fim, data_filiacao, data_desfiliacao): error_msg = _("A data de filiação e \ desfiliação não podem estar no intervalo \ de outro período de filiação") break if error_msg: return [False, error_msg] return [True, '']
def validar_datas(data_filiacao, data_desfiliacao, parlamentar, filiacao): # Verifica se data de desfiliacao é anterior a data de filiacao if data_desfiliacao and data_desfiliacao < data_filiacao: error_msg = _("A data de desfiliação não pode anterior \ à data de filiação") return [False, error_msg] filiacao_atual_id = filiacao.pk # recupera filiacoes em ordem crescente de data todas_filiacoes = parlamentar.filiacao_set.all().order_by('data') filiacoes_id = [parlamentar.pk for parlamentar in todas_filiacoes] # Novo registro inserido com filiacoes ja existentes if filiacao_atual_id not in filiacoes_id and len(filiacoes_id) > 0: ultima_filiacao = todas_filiacoes.last() # Se ultima filiacao aberta e insercao posterior a esta filiacao if (not ultima_filiacao.data_desfiliacao and data_filiacao >= ultima_filiacao.data): error_msg = _("O parlamentar não pode se filiar \ a novo partido sem antes se \ desfiliar do partido anterior") return [False, error_msg] # checa intervalos de interseccao error_msg = None for filiacoes in todas_filiacoes: # nao comparar o registro com ele mesmo if filiacoes.id != filiacao_atual_id: # Se a atualizacao eh para remover a data de desfiliacao if not data_desfiliacao: # so permite na ultima data (ou a unica) if filiacao_atual_id != filiacoes_id[-1]: error_msg = _("Data de desfiliação do parlamentar não \ pode ser ausente, se existirem datas de \ filiação posteriores") return [False, error_msg] else: data_inicio = filiacoes.data data_fim = filiacoes.data_desfiliacao # Se filiacao ainda em aberto, preenche uma desfiliacao # ficticia para fins de checagem de interseccao if not data_fim: data_fim = date.today() # finalmente verifica intersecao if intervalos_tem_intersecao(data_inicio, data_fim, data_filiacao, data_desfiliacao): error_msg = _("A data de filiação e \ desfiliação não podem estar no intervalo \ de outro período de filiação") break if error_msg: return [False, error_msg] return [True, '']
def clean(self): super(CargoBlocoPartidoForm, self).clean() cleaned_data = self.cleaned_data aux_data_fim = cleaned_data['data_fim'] if cleaned_data[ 'data_fim'] else (cleaned_data['data_inicio'] + timedelta(days=1)) if cleaned_data['cargo'].unico: for vinculo in CargoBlocoPartido.objects.filter(bloco=self.bloco): if not vinculo.data_fim: vinculo.data_fim = timezone.now().date() if intervalos_tem_intersecao(cleaned_data['data_inicio'], aux_data_fim, vinculo.data_inicio, vinculo.data_fim) and vinculo.cargo.unico and \ not(self.instance and self.instance.id == vinculo.id): raise ValidationError( "Cargo unico já é utilizado nesse período.") if aux_data_fim <= cleaned_data['data_inicio']: raise ValidationError( "Data Inicial deve ser anterior a data final.") if self.instance and self.instance.pk: self.cleaned_data['parlamentar'] = self.instance.parlamentar else: self.cleaned_data['parlamentar'] = self.cleaned_data.get( 'parlamentar') fora_de_mandato = True for mandato in Mandato.objects.filter( parlamentar=self.cleaned_data.get('parlamentar')): if not intervalos_tem_intersecao( mandato.data_inicio_mandato, cleaned_data['data_inicio'], aux_data_fim, mandato.legislatura.data_fim): fora_de_mandato = False if fora_de_mandato: raise ValidationError( "Data de inicio e fim fora de periodo do mandato do parlamentar." ) if self.instance.pk and (cleaned_data['parlamentar'].id != self.instance.parlamentar.id): raise ValidationError("Não é possivel alterar o parlamentar " + str(self.instance.parlamentar))
def get_partidos(self): filicacoes = Filiacao.objects.filter( parlamentar=self.parlamentar).order_by('data') return [f.partido.sigla for f in filicacoes if intervalos_tem_intersecao( self.legislatura.data_inicio, self.legislatura.data_fim, f.data, f.data_desfiliacao or datetime.max.date())]