diff --git a/sapl/test_utils.py b/sapl/test_utils.py new file mode 100644 index 000000000..b005601e3 --- /dev/null +++ b/sapl/test_utils.py @@ -0,0 +1,12 @@ +from pytest import mark +from utils import make_choices + + +@mark.parametrize("choice_pairs, result", [ + ( + ['A', 'aaa', 'B', 'bbb'], + [[('A', 'aaa'), ('B', 'bbb')], 'A', 'B'] + ), +]) +def test_make_choices(choice_pairs, result): + assert list(make_choices(*choice_pairs)) == result diff --git a/sapl/utils.py b/sapl/utils.py index da019dfb9..c129bd6ac 100644 --- a/sapl/utils.py +++ b/sapl/utils.py @@ -11,3 +11,12 @@ def register_all_models_in_admin(module_name): if not admin.site.is_registered(model): admin.site.register(model, CustomModelAdmin) + + +def make_choices(*choice_pairs): + assert len(choice_pairs) % 2 == 0 + choice_pairs = iter(choice_pairs) + choices = zip(choice_pairs, choice_pairs) + yield choices + for key, value in choices: + yield key diff --git a/sessao/models.py b/sessao/models.py index 44f63409f..5cc018870 100644 --- a/sessao/models.py +++ b/sessao/models.py @@ -4,11 +4,12 @@ from django.utils.translation import ugettext as _ from materia.models import MateriaLegislativa from parlamentares.models import CargoMesa, Parlamentar, SessaoLegislativa, Legislatura +from sapl.utils import make_choices class TipoSessaoPlenaria(models.Model): - nome_sessao = models.CharField(max_length=30, verbose_name=_(u'Tipo')) # nom_sessao - numero_minimo = models.IntegerField(verbose_name=_(u'Quórum mínimo')) # num_minimo + nome = models.CharField(max_length=30, verbose_name=_(u'Tipo')) # nom_sessao + quorum_minimo = models.IntegerField(verbose_name=_(u'Quórum mínimo')) # num_minimo class Meta: verbose_name = _(u'Tipo de Sessão Plenária') @@ -16,20 +17,22 @@ class TipoSessaoPlenaria(models.Model): class SessaoPlenaria(models.Model): - # TODO lixo??? parece que era FK. Seria: + # 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.IntegerField(blank=True, null=True) # cod_andamento_sessao tipo = models.ForeignKey(TipoSessaoPlenaria, verbose_name=_(u'Tipo')) # tip_sessao - sessao_leg = models.ForeignKey(SessaoLegislativa, verbose_name=_(u'Sessão Legislativa')) # cod_sessao_leg + sessao_legislativa = models.ForeignKey(SessaoLegislativa, verbose_name=_(u'Sessão Legislativa')) # cod_sessao_leg legislatura = models.ForeignKey(Legislatura, verbose_name=_(u'Legislatura')) # num_legislatura + # XXX seems to be empty tipo_expediente = models.CharField(max_length=10) # tip_expediente - data_inicio_sessao = models.DateField(verbose_name=_(u'Abertura')) # dat_inicio_sessao - dia_sessao = models.CharField(max_length=15) # dia_sessao - hr_inicio_sessao = models.CharField(max_length=5, verbose_name=_(u'Horário')) # hr_inicio_sessao - hr_fim_sessao = models.CharField(max_length=5, blank=True, null=True, verbose_name=_(u'Horário')) # hr_fim_sessao - numero_sessao_plen = models.IntegerField(verbose_name=_(u'Número')) # num_sessao_plen - data_fim_sessao = models.DateField(blank=True, null=True, verbose_name=_(u'Encerramento')) # dat_fim_sessao + data_inicio = models.DateField(verbose_name=_(u'Abertura')) # dat_inicio_sessao + dia = models.CharField(max_length=15) # dia_sessao + hora_inicio = models.CharField(max_length=5, verbose_name=_(u'Horário')) # hr_inicio_sessao + hora_fim = models.CharField(max_length=5, blank=True, null=True, verbose_name=_(u'Horário')) # hr_fim_sessao + numero = models.IntegerField(verbose_name=_(u'Número')) # num_sessao_plen + data_fim = models.DateField(blank=True, null=True, verbose_name=_(u'Encerramento')) # dat_fim_sessao url_audio = models.CharField(max_length=150, blank=True, null=True, verbose_name=_(u'URL Arquivo Áudio (Formatos MP3 / AAC)')) # url_audio url_video = models.CharField(max_length=150, blank=True, null=True, verbose_name=_(u'URL Arquivo Vídeo (Formatos MP4 / FLV / WebM)')) # url_video @@ -38,14 +41,26 @@ class SessaoPlenaria(models.Model): verbose_name_plural = _(u'Sessões Plenárias') -class ExpedienteMateria(models.Model): - sessao_plen = models.ForeignKey(SessaoPlenaria) # cod_sessao_plen +class AbstractOrdemDia(models.Model): + TIPO_VOTACAO_CHOICES, SIMBOLICA, NOMINAL, SECRETA = make_choices( + 1, _(u'Simbólica'), + 2, _(u'Nominal'), + 3, _(u'Secreta'), + ) + + sessao_plenaria = models.ForeignKey(SessaoPlenaria) # cod_sessao_plen materia = models.ForeignKey(MateriaLegislativa) # cod_materia data_ordem = models.DateField(verbose_name=_(u'Data da Sessão')) # dat_ordem observacao = models.TextField(blank=True, null=True, verbose_name=_(u'Ementa')) # txt_observacao numero_ordem = models.IntegerField(verbose_name=_(u'Nº Ordem')) # num_ordem resultado = models.TextField(blank=True, null=True) # txt_resultado - tipo_votacao = models.IntegerField(verbose_name=_(u'Tipo de votação')) # tip_votacao + tipo_votacao = models.IntegerField(verbose_name=_(u'Tipo de votação'), choices=TIPO_VOTACAO_CHOICES) # tip_votacao + + class Meta: + abstract = True + + +class ExpedienteMateria(AbstractOrdemDia): class Meta: verbose_name = _(u'Matéria do Expediente') @@ -53,72 +68,66 @@ class ExpedienteMateria(models.Model): class TipoExpediente(models.Model): - nome_expediente = models.CharField(max_length=100, verbose_name=_(u'Tipo')) # nom_expediente + nome = models.CharField(max_length=100, verbose_name=_(u'Tipo')) # nom_expediente class Meta: verbose_name = _(u'Tipo de Expediente') verbose_name_plural = _(u'Tipos de Expediente') -class ExpedienteSessaoPlenaria(models.Model): - sessao_plen = models.ForeignKey(SessaoPlenaria) # cod_sessao_plen - expediente = models.ForeignKey(TipoExpediente) # cod_expediente - expediente = models.TextField(blank=True, null=True) # txt_expediente +class ExpedienteSessao(models.Model): # ExpedienteSessaoPlenaria + sessao_plenaria = models.ForeignKey(SessaoPlenaria) # cod_sessao_plen + tipo = models.ForeignKey(TipoExpediente) # cod_expediente + conteudo = models.TextField(blank=True, null=True, verbose_name=_(u'Conteúdo do expediente')) # txt_expediente class Meta: verbose_name = _(u'Expediente de Sessão Plenaria') verbose_name_plural = _(u'Expedientes de Sessão Plenaria') -class MesaSessaoPlenaria(models.Model): +class IntegranteMesa(models.Model): # MesaSessaoPlenaria + sessao_plenaria = models.ForeignKey(SessaoPlenaria) # cod_sessao_plen cargo = models.ForeignKey(CargoMesa) # cod_cargo - sessao_leg = models.ForeignKey(SessaoLegislativa) # cod_sessao_leg parlamentar = models.ForeignKey(Parlamentar) # cod_parlamentar - sessao_plen = models.ForeignKey(SessaoPlenaria) # cod_sessao_plen class Meta: - verbose_name = _(u'Mesa de Sessão Plenaria') - verbose_name_plural = _(u'Mesas de Sessão Plenaria') + verbose_name = _(u'Participação em Mesa de Sessão Plenaria') + verbose_name_plural = _(u'Participações em Mesas de Sessão Plenaria') -class Oradores(models.Model): - sessao_plen = models.ForeignKey(SessaoPlenaria) # cod_sessao_plen +class AbstractOrador(models.Model): # Oradores + sessao_plenaria = models.ForeignKey(SessaoPlenaria) # cod_sessao_plen parlamentar = models.ForeignKey(Parlamentar, verbose_name=_(u'Parlamentar')) # cod_parlamentar numero_ordem = models.IntegerField(verbose_name=_(u'Ordem de pronunciamento')) # num_ordem url_discurso = models.CharField(max_length=150, blank=True, null=True, verbose_name=_(u'URL Vídeo')) # url_discurso + class Meta: + abstract = True + + +class Orador(AbstractOrador): # Oradores + class Meta: verbose_name = _(u'Orador das Explicações Pessoais') verbose_name_plural = _(u'Oradores das Explicações Pessoais') -class OradoresExpediente(models.Model): - sessao_plen = models.ForeignKey(SessaoPlenaria) # cod_sessao_plen - parlamentar = models.ForeignKey(Parlamentar, verbose_name=_(u'Parlamentar')) # cod_parlamentar - numero_ordem = models.IntegerField(verbose_name=_(u'Ordem de pronunciamento')) # num_ordem - url_discurso = models.CharField(max_length=150, blank=True, null=True, verbose_name=_(u'URL Vídeo')) # url_discurso +class OradorExpediente(AbstractOrador): # OradoresExpediente class Meta: verbose_name = _(u'Orador do Expediente') verbose_name_plural = _(u'Oradores do Expediente') -class OrdemDia(models.Model): - sessao_plen = models.ForeignKey(SessaoPlenaria) # cod_sessao_plen - materia = models.ForeignKey(MateriaLegislativa) # cod_materia - data_ordem = models.DateField(verbose_name=_(u'Data da Sessão')) # dat_ordem - observacao = models.TextField(blank=True, null=True, verbose_name=_(u'Ementa')) # txt_observacao - numero_ordem = models.IntegerField(verbose_name=_(u'Nº Ordem')) # num_ordem - resultado = models.TextField(blank=True, null=True) # txt_resultado - tipo_votacao = models.IntegerField(verbose_name=_(u'Tipo de votação')) # tip_votacao +class OrdemDia(AbstractOrdemDia): class Meta: verbose_name = _(u'Matéria da Ordem do Dia') verbose_name_plural = _(u'Matérias da Ordem do Dia') -class OrdemDiaPresenca(models.Model): - sessao_plen = models.ForeignKey(SessaoPlenaria) # cod_sessao_plen +class PresencaOrdemDia(models.Model): # OrdemDiaPresenca + sessao_plenaria = models.ForeignKey(SessaoPlenaria) # cod_sessao_plen parlamentar = models.ForeignKey(Parlamentar) # cod_parlamentar data_ordem = models.DateField() # dat_ordem @@ -128,7 +137,7 @@ class OrdemDiaPresenca(models.Model): class TipoResultadoVotacao(models.Model): - nome_resultado = models.CharField(max_length=100, verbose_name=_(u'Tipo')) # nom_resultado + nome = models.CharField(max_length=100, verbose_name=_(u'Tipo')) # nom_resultado class Meta: verbose_name = _(u'Tipo de Resultado de Votação') @@ -139,9 +148,9 @@ class RegistroVotacao(models.Model): tipo_resultado_votacao = models.ForeignKey(TipoResultadoVotacao, verbose_name=_(u'Resultado da Votação')) # tip_resultado_votacao materia = models.ForeignKey(MateriaLegislativa) # cod_materia ordem = models.ForeignKey(OrdemDia) # cod_ordem - numero_votos_sim = models.IntegerField(verbose_name=_(u'Sim:')) # num_votos_sim - numero_votos_nao = models.IntegerField(verbose_name=_(u'Não:')) # num_votos_nao - numero_abstencao = models.IntegerField(verbose_name=_(u'Abstenções:')) # num_abstencao + numero_votos_sim = models.IntegerField(verbose_name=_(u'Sim')) # num_votos_sim + numero_votos_nao = models.IntegerField(verbose_name=_(u'Não')) # num_votos_nao + numero_abstencoes = models.IntegerField(verbose_name=_(u'Abstenções')) # num_abstencao observacao = models.TextField(blank=True, null=True, verbose_name=_(u'Observações')) # txt_observacao class Meta: @@ -149,18 +158,19 @@ class RegistroVotacao(models.Model): verbose_name_plural = _(u'Votações') -class RegistroVotacaoParlamentar(models.Model): +class VotoParlamentar(models.Model): # RegistroVotacaoParlamentar votacao = models.ForeignKey(RegistroVotacao) # cod_votacao parlamentar = models.ForeignKey(Parlamentar) # cod_parlamentar - vot_parlamentar = models.CharField(max_length=10) # vot_parlamentar + # XXX change to restricted choices + voto = models.CharField(max_length=10) # vot_parlamentar class Meta: verbose_name = _(u'Registro de Votação de Parlamentar') verbose_name_plural = _(u'Registros de Votações de Parlamentares') -class SessaoPlenariaPresenca(models.Model): - sessao_plen = models.ForeignKey(SessaoPlenaria) # cod_sessao_plen +class PresencaSessao(models.Model): # SessaoPlenariaPresenca + sessao_plenaria = models.ForeignKey(SessaoPlenaria) # cod_sessao_plen parlamentar = models.ForeignKey(Parlamentar) # cod_parlamentar data_sessao = models.DateField(blank=True, null=True) # dat_sessao