class Orgao(models.Model): nome = models.CharField(max_length=60, verbose_name=_('Nome')) sigla = models.CharField(max_length=10, verbose_name=_('Sigla')) unidade_deliberativa = models.BooleanField( choices=YES_NO_CHOICES, verbose_name=(_('Unidade Deliberativa'))) endereco = models.CharField(max_length=100, blank=True, verbose_name=_('Endereço')) telefone = models.CharField(max_length=50, blank=True, verbose_name=_('Telefone')) autor = SaplGenericRelation(Autor, related_query_name='orgao_set', fields_search=(('nome', '__icontains'), ('sigla', '__icontains'))) class Meta: verbose_name = _('Órgão') verbose_name_plural = _('Órgãos') def __str__(self): return _('%(nome)s - %(sigla)s') % { 'nome': self.nome, 'sigla': self.sigla }
class Bloco(models.Model): ''' * blocos podem existir por mais de uma legislatura ''' nome = models.CharField(max_length=80, verbose_name=_('Nome do Bloco')) partidos = models.ManyToManyField(Partido, blank=True, verbose_name=_('Bancadas')) data_criacao = models.DateField(blank=True, null=True, verbose_name=_('Data Criação')) data_extincao = models.DateField(blank=True, null=True, verbose_name=_('Data Dissolução')) descricao = models.TextField(blank=True, verbose_name=_('Descrição')) # campo conceitual de reversão genérica para o model Autor que dá a # o meio possível de localização de tipos de autores. autor = SaplGenericRelation(Autor, related_query_name='bloco_set', fields_search=( ('nome', '__icontains'), ('descricao', '__icontains'), ('partidos__sigla', '__icontains'), ('partidos__nome', '__icontains'), )) class Meta: verbose_name = _('Bloco') verbose_name_plural = _('Blocos') def __str__(self): return self.nome
class Bancada(models.Model): legislatura = models.ForeignKey(Legislatura, verbose_name=_('Legislatura')) nome = models.CharField( max_length=80, verbose_name=_('Nome da Bancada, Bloco, ou Frente')) partido = models.ForeignKey(Partido, blank=True, null=True, verbose_name=_('Partido')) data_criacao = models.DateField(blank=True, null=True, verbose_name=_('Data Criação')) data_extincao = models.DateField(blank=True, null=True, verbose_name=_('Data Extinção')) descricao = models.TextField(blank=True, verbose_name=_('Descrição')) # campo conceitual de reversão genérica para o model Autor que dá a # o meio possível de localização de tipos de autores. autor = SaplGenericRelation(Autor, related_query_name='bancada_set', fields_search=( ('nome', '__icontains'), ('descricao', '__icontains'), ('partido__sigla', '__icontains'), ('partido__nome', '__icontains'), )) class Meta: verbose_name = _('Bancada') verbose_name_plural = _('Bancadas') ordering = ('-legislatura__numero', ) def __str__(self): return self.nome
class TipoMateriaLegislativa(models.Model): objects = TipoMateriaManager() sigla = models.CharField(max_length=5, verbose_name=_('Sigla')) descricao = models.CharField(max_length=50, verbose_name=_('Descrição ')) # XXX o que é isso ? num_automatica = models.BooleanField(default=False) # XXX o que é isso ? quorum_minimo_votacao = models.PositiveIntegerField(blank=True, null=True) tipo_proposicao = SaplGenericRelation( TipoProposicao, related_query_name='tipomaterialegislativa_set', fields_search=(('descricao', '__icontains'), ('sigla', '__icontains'))) sequencia_numeracao = models.CharField( max_length=1, blank=True, verbose_name=_('Sequência de numeração'), choices=SEQUENCIA_NUMERACAO_PROTOCOLO) sequencia_regimental = models.PositiveIntegerField( default=0, verbose_name=_('Sequência Regimental'), help_text=_('A sequência regimental diz respeito ao que define ' 'o regimento da Casa Legislativa sobre qual a ordem ' 'de entrada das proposições nas Sessões Plenárias.')) class Meta: verbose_name = _('Tipo de Matéria Legislativa') verbose_name_plural = _('Tipos de Matérias Legislativas') ordering = ['sequencia_regimental', 'descricao'] def __str__(self): return self.descricao
class TipoMateriaLegislativa(models.Model): sigla = models.CharField(max_length=5, verbose_name=_('Sigla')) descricao = models.CharField(max_length=50, verbose_name=_('Descrição ')) # XXX o que é isso ? num_automatica = models.BooleanField(default=False) # XXX o que é isso ? quorum_minimo_votacao = models.PositiveIntegerField(blank=True, null=True) tipo_proposicao = SaplGenericRelation( TipoProposicao, related_query_name='tipomaterialegislativa_set', fields_search=(('descricao', '__icontains'), ('sigla', '__icontains'))) sequencia_numeracao = models.CharField( max_length=1, blank=True, verbose_name=_('Sequência de numeração'), choices=SEQUENCIA_NUMERACAO) class Meta: verbose_name = _('Tipo de Matéria Legislativa') verbose_name_plural = _('Tipos de Matérias Legislativas') ordering = ['descricao'] def __str__(self): return self.descricao
class TipoDocumento(models.Model): descricao = models.CharField(max_length=50, verbose_name=_('Tipo Documento')) tipo_proposicao = SaplGenericRelation( TipoProposicao, related_query_name='tipodocumento_set', fields_search=(('descricao', '__icontains'), )) class Meta: verbose_name = _('Tipo de Documento') verbose_name_plural = _('Tipos de Documento') def __str__(self): return self.descricao
class Frente(models.Model): ''' * Uma frente agrupa vários parlamentares * Cada parlamentar pode fazer parte de uma ou mais frentes * Uma frente pode existir por mais de uma legislatura? ''' nome = models.CharField( max_length=80, verbose_name=_('Nome da Frente')) parlamentares = models.ManyToManyField(Parlamentar, blank=True, verbose_name=_('Parlamentares')) data_criacao = models.DateField(verbose_name=_('Data Criação')) data_extincao = models.DateField( blank=True, null=True, verbose_name=_('Data Dissolução')) descricao = models.TextField(blank=True, verbose_name=_('Descrição')) # campo conceitual de reversão genérica para o model Autor que dá a # o meio possível de localização de tipos de autores. autor = SaplGenericRelation( Autor, related_query_name='frente_set', fields_search=( ('nome', '__icontains'), ('descricao', '__icontains'), ('parlamentares__filiacao__partido__sigla', '__icontains'), ('parlamentares__filiacao__partido__nome', '__icontains'), )) class Meta: verbose_name = _('Frente') verbose_name_plural = _('Frentes') def get_parlamentares(self): return Parlamentar.objects.filter(ativo=True) def __str__(self): return self.nome
class Parlamentar(models.Model): FEMININO = 'F' MASCULINO = 'M' SEXO_CHOICE = ((FEMININO, _('Feminino')), (MASCULINO, _('Masculino'))) nivel_instrucao = models.ForeignKey( NivelInstrucao, blank=True, null=True, on_delete=models.PROTECT, verbose_name=_('Nível Instrução')) situacao_militar = models.ForeignKey( SituacaoMilitar, blank=True, null=True, on_delete=models.PROTECT, verbose_name=_('Situação Militar')) nome_completo = models.CharField( max_length=50, verbose_name=_('Nome Completo')) nome_parlamentar = models.CharField( max_length=50, verbose_name=_('Nome Parlamentar')) sexo = models.CharField( max_length=1, verbose_name=_('Sexo'), choices=SEXO_CHOICE) data_nascimento = models.DateField( blank=True, null=True, verbose_name=_('Data Nascimento')) cpf = models.CharField( max_length=14, blank=True, verbose_name=_('C.P.F')) rg = models.CharField( max_length=15, blank=True, verbose_name=_('R.G.')) titulo_eleitor = models.CharField( max_length=15, blank=True, verbose_name=_('Título de Eleitor')) numero_gab_parlamentar = models.CharField( max_length=10, blank=True, verbose_name=_('Nº Gabinete')) telefone = models.CharField( max_length=50, blank=True, verbose_name=_('Telefone')) fax = models.CharField( max_length=50, blank=True, verbose_name=_('Fax')) endereco_residencia = models.CharField( max_length=100, blank=True, verbose_name=_('Endereço Residencial')) municipio_residencia = models.ForeignKey( Municipio, blank=True, null=True, on_delete=models.PROTECT, verbose_name=_('Município')) cep_residencia = models.CharField( max_length=9, blank=True, verbose_name=_('CEP')) telefone_residencia = models.CharField( max_length=50, blank=True, verbose_name=_('Telefone Residencial')) fax_residencia = models.CharField( max_length=50, blank=True, verbose_name=_('Fax Residencial')) endereco_web = models.URLField( max_length=100, blank=True, verbose_name=_('HomePage')) profissao = models.CharField( max_length=50, blank=True, verbose_name=_('Profissão')) email = models.EmailField( max_length=100, blank=True, verbose_name=_('E-mail')) locais_atuacao = models.CharField( max_length=100, blank=True, verbose_name=_('Locais de Atuação')) ativo = models.BooleanField( db_index=True, default=False, choices=YES_NO_CHOICES, verbose_name=_('Ativo na Casa?')) biografia = models.TextField( blank=True, verbose_name=_('Biografia')) # XXX Esse atribuito foi colocado aqui para não atrapalhar a migração fotografia = models.ImageField( blank=True, null=True, upload_to=foto_upload_path, verbose_name=_('Fotografia'), validators=[restringe_tipos_de_arquivo_img]) # campo conceitual de reversão genérica para o model Autor que dá a # o meio possível de localização de tipos de autores. autor = SaplGenericRelation( Autor, related_query_name='parlamentar_set', fields_search=( # na primeira posição dever ser campo simples sem __ ('nome_completo', '__icontains'), ('nome_parlamentar', '__icontains'), ('filiacao__partido__sigla', '__icontains'), ('ativo', '', true_false_none), )) class Meta: verbose_name = _('Parlamentar') verbose_name_plural = _('Parlamentares') ordering = ['nome_parlamentar'] def __str__(self): return self.nome_completo @property def filiacao_atual(self): ultima_filiacao = self.filiacao_set.order_by('-data').first() if ultima_filiacao and not ultima_filiacao.data_desfiliacao: return ultima_filiacao.partido.sigla else: return _('Sem Partido') @property def avatar_html(self): return '<img class="avatar-parlamentar" src='\ + self.fotografia.url + '>'if self.fotografia else '' def delete(self, using=None, keep_parents=False): if self.fotografia: self.fotografia.delete() return models.Model.delete( self, using=using, keep_parents=keep_parents) def save(self, force_insert=False, force_update=False, using=None, update_fields=None): if not self.pk and self.fotografia: fotografia = self.fotografia self.fotografia = None models.Model.save(self, force_insert=force_insert, force_update=force_update, using=using, update_fields=update_fields) self.fotografia = fotografia return models.Model.save(self, force_insert=force_insert, force_update=force_update, using=using, update_fields=update_fields)
class Comissao(models.Model): tipo = models.ForeignKey(TipoComissao, on_delete=models.PROTECT, verbose_name=_('Tipo')) nome = models.CharField(max_length=100, verbose_name=_('Nome')) sigla = models.CharField(max_length=10, verbose_name=_('Sigla')) data_criacao = models.DateField(verbose_name=_('Data de Criação')) data_extincao = models.DateField(blank=True, null=True, verbose_name=_('Data de Extinção')) apelido_temp = models.CharField(max_length=100, blank=True, verbose_name=_('Apelido')) data_instalacao_temp = models.DateField(blank=True, null=True, verbose_name=_('Data Instalação')) data_final_prevista_temp = models.DateField( blank=True, null=True, verbose_name=_('Data Prevista Término')) data_prorrogada_temp = models.DateField(blank=True, null=True, verbose_name=_('Novo Prazo')) data_fim_comissao = models.DateField(blank=True, null=True, verbose_name=_('Data Término')) secretario = models.CharField(max_length=30, blank=True, verbose_name=_('Secretário')) telefone_reuniao = models.CharField(max_length=15, blank=True, verbose_name=_('Tel. Sala Reunião')) endereco_secretaria = models.CharField( max_length=100, blank=True, verbose_name=_('Endereço Secretaria')) telefone_secretaria = models.CharField(max_length=15, blank=True, verbose_name=_('Tel. Secretaria')) fax_secretaria = models.CharField(max_length=15, blank=True, verbose_name=_('Fax Secretaria')) agenda_reuniao = models.CharField(max_length=100, blank=True, verbose_name=_('Data/Hora Reunião')) local_reuniao = models.CharField(max_length=100, blank=True, verbose_name=_('Local Reunião')) finalidade = models.TextField(blank=True, verbose_name=_('Finalidade')) email = models.EmailField(max_length=100, blank=True, verbose_name=_('E-mail')) unidade_deliberativa = models.BooleanField( choices=YES_NO_CHOICES, verbose_name=_('Unidade Deliberativa')) ativa = models.BooleanField(default=False, choices=YES_NO_CHOICES, verbose_name=_('Comissão Ativa?')) autor = SaplGenericRelation(Autor, related_query_name='comissao_set', fields_search=(('nome', '__icontains'), ('sigla', '__icontains'))) class Meta: verbose_name = _('Comissão') verbose_name_plural = _('Comissões') def __str__(self): return self.sigla + ' - ' + self.nome
class Parlamentar(models.Model): FIELDFILE_NAME = ('capa', 'fotografia', ) metadata = JSONField( verbose_name=_('Metadados'), blank=True, null=True, default=None, encoder=DjangoJSONEncoder) FEMININO = 'F' MASCULINO = 'M' SEXO_CHOICE = ((FEMININO, _('Feminino')), (MASCULINO, _('Masculino'))) nivel_instrucao = models.ForeignKey( NivelInstrucao, blank=True, null=True, on_delete=models.PROTECT, verbose_name=_('Nível Instrução')) situacao_militar = models.ForeignKey( SituacaoMilitar, blank=True, null=True, on_delete=models.PROTECT, verbose_name=_('Situação Militar')) nome_completo = models.CharField( max_length=50, verbose_name=_('Nome Completo')) nome_parlamentar = models.CharField( max_length=50, verbose_name=_('Nome Parlamentar')) sexo = models.CharField( max_length=1, verbose_name=_('Sexo'), choices=SEXO_CHOICE) data_nascimento = models.DateField( blank=True, null=True, verbose_name=_('Data Nascimento')) cpf = models.CharField( max_length=14, blank=True, verbose_name=_('C.P.F')) rg = models.CharField( max_length=15, blank=True, verbose_name=_('R.G.')) titulo_eleitor = models.CharField( max_length=15, blank=True, verbose_name=_('Título de Eleitor')) numero_gab_parlamentar = models.CharField( max_length=10, blank=True, verbose_name=_('Nº Gabinete')) telefone = models.CharField( max_length=50, blank=True, verbose_name=_('Telefone')) fax = models.CharField( max_length=50, blank=True, verbose_name=_('Fax')) endereco_residencia = models.CharField( max_length=100, blank=True, verbose_name=_('Endereço Residencial')) municipio_residencia = models.CharField( max_length=50, blank=True, verbose_name=_('Município')) uf_residencia = models.CharField( max_length=2, blank=True, choices=LISTA_DE_UFS, verbose_name=_('UF')) cep_residencia = models.CharField( max_length=9, blank=True, verbose_name=_('CEP')) telefone_residencia = models.CharField( max_length=50, blank=True, verbose_name=_('Telefone Residencial')) fax_residencia = models.CharField( max_length=50, blank=True, verbose_name=_('Fax Residencial')) endereco_web = models.URLField( max_length=100, blank=True, verbose_name=_('HomePage')) profissao = models.CharField( max_length=50, blank=True, verbose_name=_('Profissão')) email = models.EmailField( max_length=100, blank=True, verbose_name=_('E-mail')) locais_atuacao = models.CharField( max_length=100, blank=True, verbose_name=_('Locais de Atuação')) ativo = models.BooleanField( db_index=True, default=False, choices=YES_NO_CHOICES, verbose_name=_('Ativo na Casa?')) biografia = models.TextField( blank=True, verbose_name=_('Biografia')) fotografia = ImageCropField( verbose_name=_('Fotografia'), upload_to=foto_upload_path, null=True, blank=True) # validators=[restringe_tipos_de_arquivo_img], fotografia_cropping = ImageRatioField( 'fotografia', '128x128', verbose_name=_('Avatar'), size_warning=True, help_text=_('A configuração do Avatar ' 'é possível após a atualização da fotografia.')) capa = ImageCropField( verbose_name=_('Imagem de Capa'), upload_to=capa_upload_path, null=True, blank=True) # validators=[restringe_tipos_de_arquivo_img] capa_cropping = ImageRatioField( 'capa', '280x105', verbose_name=_('Capa'), size_warning=True, help_text=_('A configuração da capa ' 'é possível após a atualização.')) # campo conceitual de reversão genérica para o model Autor que dá a # o meio possível de localização de tipos de autores. autor = SaplGenericRelation( Autor, related_query_name='parlamentar_set', fields_search=( # na primeira posição dever ser campo simples sem __ ('nome_completo', '__icontains'), ('nome_parlamentar', '__icontains'), ('filiacao__partido__sigla', '__icontains'), )) class Meta: verbose_name = _('Parlamentar') verbose_name_plural = _('Parlamentares') ordering = ['nome_parlamentar'] def __str__(self): return self.nome_parlamentar @property def filiacao_atual(self): ultima_filiacao = self.filiacao_set.order_by('-data').first() if ultima_filiacao and not ultima_filiacao.data_desfiliacao: return ultima_filiacao.partido.sigla else: return _('Sem Partido') @property def avatar_html(self): return '<img class="avatar-parlamentar" src='\ + self.fotografia.url + '>'if self.fotografia else '' def delete(self, using=None, keep_parents=False): r = models.Model.delete( self, using=using, keep_parents=keep_parents) if self.fotografia: self.fotografia.delete() if self.capa: self.capa.delete() return r def save(self, force_insert=False, force_update=False, using=None, update_fields=None): if not self.pk: fotografia = None capa = None if self.fotografia: fotografia = self.fotografia self.fotografia = None if self.capa: capa = self.capa self.capa = None models.Model.save(self, force_insert=force_insert, force_update=force_update, using=using, update_fields=update_fields) self.fotografia = fotografia self.capa = capa return models.Model.save(self, force_insert=force_insert, force_update=force_update, using=using, update_fields=update_fields)