mirror of https://github.com/interlegis/sapl.git
				
				
			
			You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							285 lines
						
					
					
						
							10 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							285 lines
						
					
					
						
							10 KiB
						
					
					
				| from django.db import models | |
| from django.utils.translation import ugettext_lazy as _ | |
| from model_utils import Choices | |
| 
 | |
| from materia.models import MateriaLegislativa | |
| from parlamentares.models import (CargoMesa, Legislatura, Parlamentar, | |
|                                   SessaoLegislativa) | |
| from sapl.utils import YES_NO_CHOICES, restringe_tipos_de_arquivo_txt | |
| 
 | |
| 
 | |
| class TipoSessaoPlenaria(models.Model): | |
|     nome = models.CharField(max_length=30, verbose_name=_('Tipo')) | |
|     quorum_minimo = models.PositiveIntegerField( | |
|         verbose_name=_('Quórum mínimo')) | |
| 
 | |
|     class Meta: | |
|         verbose_name = _('Tipo de Sessão Plenária') | |
|         verbose_name_plural = _('Tipos de Sessão Plenária') | |
| 
 | |
|     def __str__(self): | |
|         return self.nome | |
| 
 | |
| 
 | |
| def get_sessao_media_path(instance, subpath, filename): | |
|     return './sessao/%s/%s/%s' % (instance.numero, subpath, filename) | |
| 
 | |
| 
 | |
| def pauta_upload_path(instance, filename): | |
|     return get_sessao_media_path(instance, 'pauta', filename) | |
| 
 | |
| 
 | |
| def ata_upload_path(instance, filename): | |
|     return get_sessao_media_path(instance, 'ata', filename) | |
| 
 | |
| 
 | |
| class SessaoPlenaria(models.Model): | |
|     # TODO trash??? Seems to have been a FK in the past. Would be: | |
|     # andamento_sessao = models.ForeignKey( | |
|     #    AndamentoSessao, blank=True, null=True) | |
|     # TODO analyze querying all hosted databases ! | |
|     cod_andamento_sessao = models.PositiveIntegerField(blank=True, null=True) | |
| 
 | |
|     tipo = models.ForeignKey(TipoSessaoPlenaria, verbose_name=_('Tipo')) | |
|     sessao_legislativa = models.ForeignKey( | |
|         SessaoLegislativa, verbose_name=_('Sessão Legislativa')) | |
|     legislatura = models.ForeignKey(Legislatura, verbose_name=_('Legislatura')) | |
|     # XXX seems to be empty | |
|     data_inicio = models.DateField(verbose_name=_('Abertura')) | |
|     hora_inicio = models.CharField( | |
|         max_length=5, verbose_name=_('Horário (hh:mm)')) | |
|     hora_fim = models.CharField( | |
|         max_length=5, blank=True, verbose_name=_('Horário (hh:mm)')) | |
|     numero = models.PositiveIntegerField(verbose_name=_('Número')) | |
|     data_fim = models.DateField( | |
|         blank=True, null=True, verbose_name=_('Encerramento')) | |
|     url_audio = models.URLField( | |
|         max_length=150, blank=True, | |
|         verbose_name=_('URL Arquivo Áudio (Formatos MP3 / AAC)')) | |
|     url_video = models.URLField( | |
|         max_length=150, blank=True, | |
|         verbose_name=_('URL Arquivo Vídeo (Formatos MP4 / FLV / WebM)')) | |
|     upload_pauta = models.FileField( | |
|         blank=True, | |
|         null=True, | |
|         upload_to=pauta_upload_path, | |
|         verbose_name=_('Pauta da Sessão'), | |
|         validators=[restringe_tipos_de_arquivo_txt]) | |
|     upload_ata = models.FileField( | |
|         blank=True, | |
|         null=True, | |
|         upload_to=ata_upload_path, | |
|         verbose_name=_('Ata da Sessão'), | |
|         validators=[restringe_tipos_de_arquivo_txt]) | |
|     iniciada = models.NullBooleanField(blank=True, | |
|                                        choices=YES_NO_CHOICES, | |
|                                        verbose_name=_('Sessão iniciada?')) | |
|     finalizada = models.NullBooleanField(blank=True, | |
|                                          choices=YES_NO_CHOICES, | |
|                                          verbose_name=_('Sessão finalizada?')) | |
| 
 | |
|     class Meta: | |
|         verbose_name = _('Sessão Plenária') | |
|         verbose_name_plural = _('Sessões Plenárias') | |
| 
 | |
|     def __str__(self): | |
|         return _('%(numero)sª Sessão %(tipo_nome)s' | |
|                  ' da %(sessao_legislativa_numero)sª Sessão Legislativa' | |
|                  ' da %(legislatura_id)sª Legislatura') % { | |
| 
 | |
|             'numero': self.numero, | |
|             'tipo_nome': self.tipo.nome, | |
|             'sessao_legislativa_numero': self.sessao_legislativa.numero, | |
|             # XXX check if it shouldn't be legislatura.numero | |
|             'legislatura_id': self.legislatura.id} | |
| 
 | |
| 
 | |
| class AbstractOrdemDia(models.Model): | |
|     TIPO_VOTACAO_CHOICES = Choices( | |
|         (1, 'simbolica', (('Simbólica'))), | |
|         (2, 'nominal', (('Nominal'))), | |
|         (3, 'secreta', (('Secreta'))), | |
|     ) | |
| 
 | |
|     sessao_plenaria = models.ForeignKey(SessaoPlenaria) | |
|     materia = models.ForeignKey(MateriaLegislativa) | |
|     data_ordem = models.DateField(verbose_name=_('Data da Sessão')) | |
|     observacao = models.TextField( | |
|         blank=True, verbose_name=_('Ementa')) | |
|     numero_ordem = models.PositiveIntegerField(verbose_name=_('Nº Ordem')) | |
|     resultado = models.TextField(blank=True) | |
|     tipo_votacao = models.PositiveIntegerField( | |
|         verbose_name=_('Tipo de votação'), choices=TIPO_VOTACAO_CHOICES) | |
|     votacao_aberta = models.NullBooleanField( | |
|         blank=True, | |
|         choices=YES_NO_CHOICES, | |
|         verbose_name=_('Votação iniciada?')) | |
| 
 | |
|     class Meta: | |
|         abstract = True | |
| 
 | |
|     def __str__(self): | |
|         return '%s - %s' % (self.numero_ordem, self.sessao_plenaria) | |
| 
 | |
| 
 | |
| class ExpedienteMateria(AbstractOrdemDia): | |
| 
 | |
|     class Meta: | |
|         verbose_name = _('Matéria do Expediente') | |
|         verbose_name_plural = _('Matérias do Expediente') | |
|         ordering = ['numero_ordem'] | |
| 
 | |
| 
 | |
| class TipoExpediente(models.Model): | |
|     nome = models.CharField(max_length=100, verbose_name=_('Tipo')) | |
| 
 | |
|     class Meta: | |
|         verbose_name = _('Tipo de Expediente') | |
|         verbose_name_plural = _('Tipos de Expediente') | |
| 
 | |
|     def __str__(self): | |
|         return self.nome | |
| 
 | |
| 
 | |
| class ExpedienteSessao(models.Model):  # ExpedienteSessaoPlenaria | |
|     sessao_plenaria = models.ForeignKey(SessaoPlenaria) | |
|     tipo = models.ForeignKey(TipoExpediente) | |
|     conteudo = models.TextField( | |
|         blank=True, verbose_name=_('Conteúdo do expediente')) | |
| 
 | |
|     class Meta: | |
|         verbose_name = _('Expediente de Sessão Plenaria') | |
|         verbose_name_plural = _('Expedientes de Sessão Plenaria') | |
| 
 | |
|     def __str__(self): | |
|         return '%s - %s' % (self.tipo, self.sessao_plenaria) | |
| 
 | |
| 
 | |
| class IntegranteMesa(models.Model):  # MesaSessaoPlenaria | |
|     sessao_plenaria = models.ForeignKey(SessaoPlenaria) | |
|     cargo = models.ForeignKey(CargoMesa) | |
|     parlamentar = models.ForeignKey(Parlamentar) | |
| 
 | |
|     class Meta: | |
|         verbose_name = _('Participação em Mesa de Sessão Plenaria') | |
|         verbose_name_plural = _('Participações em Mesas de Sessão Plenaria') | |
| 
 | |
|     def __str__(self): | |
|         return '%s - %s' % (self.cargo, self.parlamentar) | |
| 
 | |
| 
 | |
| class AbstractOrador(models.Model):  # Oradores | |
|     sessao_plenaria = models.ForeignKey(SessaoPlenaria) | |
|     parlamentar = models.ForeignKey(Parlamentar, verbose_name=_('Parlamentar')) | |
|     numero_ordem = models.PositiveIntegerField( | |
|         verbose_name=_('Ordem de pronunciamento')) | |
|     url_discurso = models.URLField( | |
|         max_length=150, blank=True, verbose_name=_('URL Vídeo')) | |
| 
 | |
|     class Meta: | |
|         abstract = True | |
| 
 | |
|     def __str__(self): | |
|         return _('%(nome)s (%(numero)sº orador)') % { | |
|             'nome': self.parlamentar, | |
|             'numero': self.numero_ordem} | |
| 
 | |
| 
 | |
| class Orador(AbstractOrador):  # Oradores | |
| 
 | |
|     class Meta: | |
|         verbose_name = _('Orador das Explicações Pessoais') | |
|         verbose_name_plural = _('Oradores das Explicações Pessoais') | |
| 
 | |
| 
 | |
| class OradorExpediente(AbstractOrador):  # OradoresExpediente | |
| 
 | |
|     class Meta: | |
|         verbose_name = _('Orador do Expediente') | |
|         verbose_name_plural = _('Oradores do Expediente') | |
| 
 | |
| 
 | |
| class OrdemDia(AbstractOrdemDia): | |
| 
 | |
|     class Meta: | |
|         verbose_name = _('Matéria da Ordem do Dia') | |
|         verbose_name_plural = _('Matérias da Ordem do Dia') | |
|         ordering = ['numero_ordem'] | |
| 
 | |
| 
 | |
| class PresencaOrdemDia(models.Model):  # OrdemDiaPresenca | |
|     sessao_plenaria = models.ForeignKey(SessaoPlenaria) | |
|     parlamentar = models.ForeignKey(Parlamentar) | |
| 
 | |
|     class Meta: | |
|         verbose_name = _('Presença da Ordem do Dia') | |
|         verbose_name_plural = _('Presenças da Ordem do Dia') | |
|         ordering = ['parlamentar__nome_parlamentar'] | |
| 
 | |
|     def __str__(self): | |
|         # FIXME ambigous | |
|         return _('Sessão: %(sessao)s Parlamentar: %(parlamentar)s') % { | |
|             'sessao': self.sessao_plenaria, | |
|             'parlamentar': self.parlamentar} | |
| 
 | |
| 
 | |
| class TipoResultadoVotacao(models.Model): | |
|     nome = models.CharField(max_length=100, verbose_name=_('Tipo')) | |
| 
 | |
|     class Meta: | |
|         verbose_name = _('Tipo de Resultado de Votação') | |
|         verbose_name_plural = _('Tipos de Resultado de Votação') | |
| 
 | |
|     def __str__(self): | |
|         return self.nome | |
| 
 | |
| 
 | |
| class RegistroVotacao(models.Model): | |
|     tipo_resultado_votacao = models.ForeignKey( | |
|         TipoResultadoVotacao, verbose_name=_('Resultado da Votação')) | |
|     materia = models.ForeignKey(MateriaLegislativa) | |
|     ordem = models.ForeignKey(OrdemDia, blank=True, null=True) | |
|     expediente = models.ForeignKey(ExpedienteMateria, blank=True, null=True) | |
|     numero_votos_sim = models.PositiveIntegerField(verbose_name=_('Sim')) | |
|     numero_votos_nao = models.PositiveIntegerField(verbose_name=_('Não')) | |
|     numero_abstencoes = models.PositiveIntegerField( | |
|         verbose_name=_('Abstenções')) | |
|     observacao = models.TextField( | |
|         blank=True, verbose_name=_('Observações')) | |
| 
 | |
|     class Meta: | |
|         verbose_name = _('Votação') | |
|         verbose_name_plural = _('Votações') | |
| 
 | |
|     def __str__(self): | |
|         return _('Ordem: %(ordem)s - Votação: %(votacao)s - ' | |
|                  'Matéria: %(materia)s') % { | |
|                      'ordem': self.ordem, | |
|                      'votacao': self.tipo_resultado_votacao, | |
|             'materia': self.materia} | |
| 
 | |
| 
 | |
| class VotoParlamentar(models.Model):  # RegistroVotacaoParlamentar | |
|     votacao = models.ForeignKey(RegistroVotacao) | |
|     parlamentar = models.ForeignKey(Parlamentar) | |
|     # XXX change to restricted choices | |
|     voto = models.CharField(max_length=10) | |
| 
 | |
|     class Meta: | |
|         verbose_name = _('Registro de Votação de Parlamentar') | |
|         verbose_name_plural = _('Registros de Votações de Parlamentares') | |
| 
 | |
|     def __str__(self): | |
|         return _('Votação: %(votacao)s - Parlamentar: %(parlamentar)s') % { | |
|             'votacao': self.votacao, 'parlamentar': self.parlamentar} | |
| 
 | |
| 
 | |
| class SessaoPlenariaPresenca(models.Model): | |
|     sessao_plenaria = models.ForeignKey(SessaoPlenaria) | |
|     parlamentar = models.ForeignKey(Parlamentar) | |
|     data_sessao = models.DateField(blank=True, null=True) | |
| 
 | |
|     class Meta: | |
|         verbose_name = _('Presença em Sessão Plenária') | |
|         verbose_name_plural = _('Presenças em Sessões Plenárias') | |
|         ordering = ['parlamentar__nome_parlamentar']
 | |
| 
 |