Browse Source

Refatoracao mesa diretora (#3423)

* Criado o model de MesaDiretora

* Adicionada ForeignKey para MesaDiretora em ComposicaoMesa

* Editada a classe de MEsaDiretora

* Migration de criacao da classe MesaDiretora e alteracao da classe ComposicaoMesa

* Migration de atribuicao de uma MesaDiretora para cada ComposicaoMesa

* mesa_diretora podendo ser null

* Adicionadas as alterações das models na migration

* Editada a models.py

* Correção de sintaxe

* Alteração no retorno de string da classe MesaDiretora

* Correção da migration de refatoração

* Correção da migration de atribuição da MesaDiretora

* Remoção da redundância de sessao_legislativa nas classes

* Correção da migrations de atribuição de mesa diretora

* Inicio da atualização do acesso de dados das funções que usam ComposicaoMesa

* Alterada o uso de ComposicaoMesa na view nao publica

* Adicionado o manuseio de mais de uma mesa diretora por sessão (Ainda indisponível na interface gráfica

* Adicionado o manuseio de múltiplas mesas diretoras na view não pública

* Alteradas as views para criar a mesa caso nao haja nenhuma na sessao

* Alteracoes na insere_parlamentar

* Correcoes nas views publica e logada

* Correcoes da chamada da view publica
pull/3436/head
Alvaro Gouvea 3 years ago
committed by GitHub
parent
commit
e19dc899e9
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 38
      sapl/parlamentares/migrations/0036_refatoraMesaDiretora.py
  2. 27
      sapl/parlamentares/migrations/0037_atribuiMesaDiretora.py
  3. 17
      sapl/parlamentares/migrations/0038_sessao_legislativa_redundante.py
  4. 24
      sapl/parlamentares/models.py
  5. 106
      sapl/parlamentares/views.py

38
sapl/parlamentares/migrations/0036_refatoraMesaDiretora.py

@ -0,0 +1,38 @@
# Generated by Django 2.2.20 on 2021-07-05 13:41
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('parlamentares', '0035_auto_20210315_1522'),
]
operations = [
migrations.AlterModelOptions(
name='composicaomesa',
options={'ordering': ('cargo', 'parlamentar'), 'verbose_name': 'Ocupação de cargo na Mesa', 'verbose_name_plural': 'Ocupações de cargo na Mesa'},
),
migrations.CreateModel(
name='MesaDiretora',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('data_inicio', models.DateField(null=True, verbose_name='Data Início')),
('data_fim', models.DateField(null=True, verbose_name='Data Fim')),
('descricao', models.TextField(blank=True, verbose_name='Descrição')),
('sessao_legislativa', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='parlamentares.SessaoLegislativa')),
],
options={
'verbose_name': 'Mesa Diretora',
'verbose_name_plural': 'Mesas Diretoras',
'ordering': ('-data_inicio', '-sessao_legislativa'),
},
),
migrations.AddField(
model_name='composicaomesa',
name='mesa_diretora',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, to='parlamentares.MesaDiretora'),
),
]

27
sapl/parlamentares/migrations/0037_atribuiMesaDiretora.py

@ -0,0 +1,27 @@
# Generated by Django 2.2.20 on 2021-07-05 13:43
from django.db import migrations, models
def atribuiMesaDiretora(apps, schema_editor):
sl_anterior = None
ComposicaoMesa = apps.get_model('parlamentares', 'ComposicaoMesa')
for c in ComposicaoMesa.objects.all().order_by('sessao_legislativa_id'):
if sl_anterior is None or c.sessao_legislativa_id != sl_anterior:
sl_anterior = c.sessao_legislativa_id
MesaDiretora = apps.get_model('parlamentares', 'MesaDiretora')
mesa_diretora = MesaDiretora(data_inicio=c.sessao_legislativa.data_inicio,
data_fim=c.sessao_legislativa.data_fim,
sessao_legislativa=c.sessao_legislativa)
mesa_diretora.save()
c.mesa_diretora = mesa_diretora
c.save()
class Migration(migrations.Migration):
dependencies = [
('parlamentares', '0036_refatoraMesaDiretora'),
]
operations = [
migrations.RunPython(atribuiMesaDiretora),
]

17
sapl/parlamentares/migrations/0038_sessao_legislativa_redundante.py

@ -0,0 +1,17 @@
# Generated by Django 2.2.20 on 2021-07-05 13:49
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('parlamentares', '0037_atribuiMesaDiretora'),
]
operations = [
migrations.RemoveField(
model_name='composicaomesa',
name='sessao_legislativa',
),
]

24
sapl/parlamentares/models.py

@ -496,26 +496,42 @@ class CargoMesa(models.Model):
def __str__(self): def __str__(self):
return self.descricao return self.descricao
@reversion.register()
class MesaDiretora(models.Model):
data_inicio = models.DateField(verbose_name=_('Data Início'), null=True)
data_fim = models.DateField(verbose_name=_('Data Fim'), null=True)
sessao_legislativa = models.ForeignKey(SessaoLegislativa,
on_delete=models.PROTECT)
descricao = models.TextField(verbose_name=_('Descrição'), blank=True)
class Meta:
verbose_name = _('Mesa Diretora')
verbose_name_plural = _('Mesas Diretoras')
ordering = ('-data_inicio', '-sessao_legislativa')
def __str__(self):
return _('Mesa da %(sessao)s sessao da %(legislatura)s Legislatura') % {
'sessao':self.sessao_legislativa, 'legislatura':self.sessao_legislativa.legislatura
}
@reversion.register() @reversion.register()
class ComposicaoMesa(models.Model): class ComposicaoMesa(models.Model):
# TODO M2M ???? Ternary????? # TODO M2M ???? Ternary?????
parlamentar = models.ForeignKey(Parlamentar, on_delete=models.PROTECT) parlamentar = models.ForeignKey(Parlamentar, on_delete=models.PROTECT)
sessao_legislativa = models.ForeignKey(SessaoLegislativa,
on_delete=models.PROTECT)
cargo = models.ForeignKey(CargoMesa, on_delete=models.PROTECT) cargo = models.ForeignKey(CargoMesa, on_delete=models.PROTECT)
mesa_diretora = models.ForeignKey(MesaDiretora, on_delete=models.PROTECT, null=True)
class Meta: class Meta:
verbose_name = _('Ocupação de cargo na Mesa') verbose_name = _('Ocupação de cargo na Mesa')
verbose_name_plural = _('Ocupações de cargo na Mesa') verbose_name_plural = _('Ocupações de cargo na Mesa')
ordering = ('cargo', '-sessao_legislativa', 'parlamentar') ordering = ('cargo', 'parlamentar')
def __str__(self): def __str__(self):
return _('%(parlamentar)s - %(cargo)s') % { return _('%(parlamentar)s - %(cargo)s') % {
'parlamentar': self.parlamentar, 'cargo': self.cargo 'parlamentar': self.parlamentar, 'cargo': self.cargo
} }
@reversion.register() @reversion.register()
class Frente(models.Model): class Frente(models.Model):
''' '''

106
sapl/parlamentares/views.py

@ -42,7 +42,7 @@ from .models import (CargoMesa, Coligacao, ComposicaoColigacao, ComposicaoMesa,
Dependente, Filiacao, Frente, Legislatura, Mandato, Dependente, Filiacao, Frente, Legislatura, Mandato,
NivelInstrucao, Parlamentar, Partido, SessaoLegislativa, NivelInstrucao, Parlamentar, Partido, SessaoLegislativa,
SituacaoMilitar, TipoAfastamento, TipoDependente, Votante, SituacaoMilitar, TipoAfastamento, TipoDependente, Votante,
Bloco, FrenteCargo, FrenteParlamentar, BlocoCargo, BlocoMembro) Bloco, FrenteCargo, FrenteParlamentar, BlocoCargo, BlocoMembro, MesaDiretora)
FrenteCargoCrud = CrudAux.build(FrenteCargo, 'frente_cargo') FrenteCargoCrud = CrudAux.build(FrenteCargo, 'frente_cargo')
@ -927,20 +927,21 @@ class MesaDiretoraView(FormView):
legislatura=legislatura).order_by("data_inicio") legislatura=legislatura).order_by("data_inicio")
year = timezone.now().year year = timezone.now().year
month = timezone.now().month
sessao_atual = sessoes.filter(data_inicio__year__lte=year).exclude( sessao_atual = sessoes.filter(data_inicio__year__lte=year).exclude(
data_inicio__gt=timezone.now()).order_by('-data_inicio').first() data_inicio__gt=timezone.now()).order_by('-data_inicio').first()
mesa = sessao_atual.composicaomesa_set.all().order_by( mesa_diretora = sessao_atual.mesadiretora_set.order_by(
'cargo_id') if sessao_atual else [] '-data_inicio').first() if sessao_atual else None
composicao = mesa_diretora.composicaomesa_set.all() if mesa_diretora else []
cargos_ocupados = [m.cargo for m in mesa] cargos_ocupados = [m.cargo for m in composicao]
cargos = CargoMesa.objects.all() cargos = CargoMesa.objects.all()
cargos_vagos = list(set(cargos) - set(cargos_ocupados)) cargos_vagos = list(set(cargos) - set(cargos_ocupados))
parlamentares = legislatura.mandato_set.all() parlamentares = legislatura.mandato_set.all()
parlamentares_ocupados = [m.parlamentar for m in mesa] parlamentares_ocupados = [m.parlamentar for m in composicao]
parlamentares_vagos = list( parlamentares_vagos = list(
set( set(
[p.parlamentar for p in parlamentares if p.parlamentar.ativo]) - set( [p.parlamentar for p in parlamentares if p.parlamentar.ativo]) - set(
@ -957,7 +958,7 @@ class MesaDiretoraView(FormView):
'legislatura_selecionada': legislatura, 'legislatura_selecionada': legislatura,
'sessoes': sessoes, 'sessoes': sessoes,
'sessao_selecionada': sessao_atual, 'sessao_selecionada': sessao_atual,
'composicao_mesa': mesa, 'composicao_mesa': composicao,
'parlamentares': parlamentares_vagos, 'parlamentares': parlamentares_vagos,
'cargos_vagos': cargos_vagos 'cargos_vagos': cargos_vagos
}) })
@ -970,12 +971,14 @@ def altera_field_mesa(request):
operação (Legislatura/Sessão/Inclusão/Remoção), operação (Legislatura/Sessão/Inclusão/Remoção),
atualizando os campos após cada alteração atualizando os campos após cada alteração
""" """
#TODO: Adicionar opção de selecionar mesa diretora no CRUD
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
legislatura = request.GET['legislatura'] legislatura = request.GET['legislatura']
sessoes = SessaoLegislativa.objects.filter( sessoes = SessaoLegislativa.objects.filter(
legislatura=legislatura).order_by('-data_inicio') legislatura=legislatura).order_by('-data_inicio')
username = request.user.username username = request.user.username
if not sessoes: if not sessoes:
return JsonResponse({'msg': ('Nenhuma sessão encontrada!', 0)}) return JsonResponse({'msg': ('Nenhuma sessão encontrada!', 0)})
@ -998,9 +1001,26 @@ def altera_field_mesa(request):
"Selecionado o ID da primeira sessão.".format(year)) "Selecionado o ID da primeira sessão.".format(year))
sessao_selecionada = sessoes.first() sessao_selecionada = sessoes.first()
mesa_diretora = request.GET.get('mesa_diretora')
#Mesa nao deve ser informada ainda
if not mesa_diretora:
#Cria nova mesa diretora ou retorna a primeira
mesa_diretora, _ = MesaDiretora.objects.get_or_create(sessao_legislativa=sessao_selecionada)
#TODO: quando a mesa for criada explicitamente em tabelas auxiliares,
# deve-se somente tentar recuperar a mesa, e caso nao exista
# retornar o erro abaixo
# return JsonResponse({'msg': ('Nenhuma mesa encontrada na sessão!')})
else:
try:
mesa_diretora = MesaDiretora.objects.get(id=mesa_diretora, sessao_legislativa=sessao_selecionada)
except ObjectDoesNotExist:
mesa_diretora = MesaDiretora.objects.filter(sessao_legislativa=sessao_selecionada).first()
# Atualiza os componentes da view após a mudança # Atualiza os componentes da view após a mudança
composicao_mesa = ComposicaoMesa.objects.filter( composicao_mesa = ComposicaoMesa.objects.select_related('cargo', 'parlamentar').filter(
sessao_legislativa=sessao_selecionada).order_by('cargo_id') mesa_diretora=mesa_diretora).order_by('cargo_id')
cargos_ocupados = [m.cargo for m in composicao_mesa] cargos_ocupados = [m.cargo for m in composicao_mesa]
cargos = CargoMesa.objects.all() cargos = CargoMesa.objects.all()
@ -1041,14 +1061,13 @@ def insere_parlamentar_composicao(request):
if request.user.has_perm( if request.user.has_perm(
'%s.add_%s' % ( '%s.add_%s' % (
AppConfig.label, ComposicaoMesa._meta.model_name)): AppConfig.label, ComposicaoMesa._meta.model_name)):
composicao = ComposicaoMesa() composicao = ComposicaoMesa()
try: try:
logger.debug( #logger.debug(
"user=" + username + ". Tentando obter SessaoLegislativa com id={}.".format(request.POST['sessao'])) # "user=" + username + ". Tentando obter SessaoLegislativa com id={}.".format(request.POST['sessao']))
composicao.sessao_legislativa = SessaoLegislativa.objects.get( mesa_diretora, _ = MesaDiretora.objects.get_or_create(sessao_legislativa_id=int(request.POST['sessao']))
id=int(request.POST['sessao'])) composicao.mesa_diretora = mesa_diretora
except MultiValueDictKeyError: except MultiValueDictKeyError:
logger.error( logger.error(
"user=" + username + ". 'MultiValueDictKeyError', nenhuma sessão foi inserida!") "user=" + username + ". 'MultiValueDictKeyError', nenhuma sessão foi inserida!")
@ -1071,12 +1090,11 @@ def insere_parlamentar_composicao(request):
composicao.cargo = CargoMesa.objects.get( composicao.cargo = CargoMesa.objects.get(
id=int(request.POST['cargo'])) id=int(request.POST['cargo']))
parlamentar_ja_inserido = ComposicaoMesa.objects.filter( parlamentar_ja_inserido = ComposicaoMesa.objects.filter(
sessao_legislativa_id=composicao.sessao_legislativa.id, mesa_diretora=mesa_diretora,
cargo_id=composicao.cargo.id).exists() cargo=composicao.cargo).exists()
if parlamentar_ja_inserido: if parlamentar_ja_inserido:
return JsonResponse({'msg': ('Parlamentar já inserido!', 0)}) return JsonResponse({'msg': ('Parlamentar já inserido!', 0)})
composicao.save() composicao.save()
except MultiValueDictKeyError: except MultiValueDictKeyError:
@ -1185,9 +1203,12 @@ def altera_field_mesa_public_view(request):
da Mesa Diretora para usuários anônimos, da Mesa Diretora para usuários anônimos,
atualizando os campos após cada alteração atualizando os campos após cada alteração
""" """
#TODO: Adicionar opção de selecionar mesa diretora no CRUD
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
username = request.user.username username = request.user.username
legislatura = request.GET.get('legislatura') legislatura = request.GET['legislatura']
if legislatura: if legislatura:
legislatura = Legislatura.objects.get(id=legislatura) legislatura = Legislatura.objects.get(id=legislatura)
else: else:
@ -1202,23 +1223,43 @@ def altera_field_mesa_public_view(request):
# Verifica se já tem uma sessão selecionada. Ocorre quando é alterado o # Verifica se já tem uma sessão selecionada. Ocorre quando é alterado o
# campo de sessão # campo de sessão
sessao_selecionada = request.GET.get('sessao') sessao_selecionada = request.GET['sessao']
if not sessao_selecionada: if not sessao_selecionada:
try: year = timezone.now().year
year = timezone.now().year logger.info(
logger.info( f"user={username}. Tentando obter sessões com data_inicio.ano = {year}.")
f"user={username}. Tentando obter sessões com data_inicio.ano = {year}.") sessao_selecionada = sessoes.filter(data_inicio__year=year).first()
sessao_selecionada = sessoes.get(data_inicio__year=year).id if sessao_selecionada is None:
except ObjectDoesNotExist:
logger.error(f"user={username}. Sessões não encontradas com com data_inicio.ano = {year}. " logger.error(f"user={username}. Sessões não encontradas com com data_inicio.ano = {year}. "
"Selecionado o id da primeira sessão.") "Selecionado o id da primeira sessão.")
sessao_selecionada = sessoes.first().id sessao_selecionada = sessoes.first()
else:
sessao_selecionada = SessaoLegislativa.objects.get(id=sessao_selecionada)
# Atualiza os componentes da view após a mudança # Atualiza os componentes da view após a mudança
lista_sessoes = [(s.id, s.__str__()) for s in sessoes] lista_sessoes = [(s.id, s.__str__()) for s in sessoes]
#Pegar Mesas diretoras da sessao
mesa_diretora = request.GET.get('mesa_diretora')
#Mesa nao deve ser informada ainda
if not mesa_diretora:
try:
mesa_diretora = sessao_selecionada.mesadiretora_set.first()
except ObjectDoesNotExist:
logger.error(f"user={username}. Mesa não encontrada com sessão Nº {sessao_selecionada.id}. ")
else:
#Cria nova mesa diretora ou retorna a primeira
mesa_diretora, _ = MesaDiretora.objects.get_or_create(sessao_legislativa=sessao_selecionada)
#TODO: quando a mesa for criada explicitamente em tabelas auxiliares,
# deve-se somente tentar recuperar a mesa, e caso nao exista
# retornar o erro abaixo
# logger.error(f"user={username}. Mesa Nº {mesa_diretora} não encontrada na sessão Nº {sessao_selecionada.id}. "
# "Selecionada a mesa com o primeiro id na sessão")
composicao_mesa = ComposicaoMesa.objects.select_related('cargo', 'parlamentar').filter( composicao_mesa = ComposicaoMesa.objects.select_related('cargo', 'parlamentar').filter(
sessao_legislativa=sessao_selecionada).order_by('cargo_id') mesa_diretora=mesa_diretora).order_by('cargo_id')
cargos_ocupados = list(composicao_mesa.values_list( cargos_ocupados = list(composicao_mesa.values_list(
'cargo__id', 'cargo__descricao')) 'cargo__id', 'cargo__descricao'))
parlamentares_ocupados = list(composicao_mesa.values_list( parlamentares_ocupados = list(composicao_mesa.values_list(
@ -1227,7 +1268,7 @@ def altera_field_mesa_public_view(request):
lista_fotos = [] lista_fotos = []
lista_partidos = [] lista_partidos = []
sessao = SessaoLegislativa.objects.get(id=sessao_selecionada) sessao = SessaoLegislativa.objects.get(id=sessao_selecionada.id)
for p in parlamentares_ocupados: for p in parlamentares_ocupados:
parlamentar = Parlamentar.objects.get(id=p[0]) parlamentar = Parlamentar.objects.get(id=p[0])
lista_partidos.append( lista_partidos.append(
@ -1257,7 +1298,8 @@ def altera_field_mesa_public_view(request):
'lista_cargos': cargos_ocupados, 'lista_cargos': cargos_ocupados,
'lista_sessoes': lista_sessoes, 'lista_sessoes': lista_sessoes,
'lista_fotos': lista_fotos, 'lista_fotos': lista_fotos,
'sessao_selecionada': sessao_selecionada, 'sessao_selecionada': sessao_selecionada.id,
'mesa_diretora':mesa_diretora.id,
'msg': ('', 1) 'msg': ('', 1)
}) })

Loading…
Cancel
Save