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.
426 lines
15 KiB
426 lines
15 KiB
from django.contrib import messages
|
|
from django.contrib.auth.mixins import PermissionRequiredMixin
|
|
from django.contrib.auth.models import Permission
|
|
from django.contrib.contenttypes.models import ContentType
|
|
from django.core.exceptions import ImproperlyConfigured, ObjectDoesNotExist
|
|
from django.core.urlresolvers import reverse_lazy
|
|
from django.shortcuts import redirect
|
|
from django.utils.datastructures import MultiValueDictKeyError
|
|
from django.utils.translation import ugettext_lazy as _
|
|
from django.views.generic import FormView
|
|
|
|
from sapl.crud.base import (Crud, CrudBaseMixin, CrudCreateView,
|
|
CrudDeleteView, CrudDetailView,
|
|
CrudListView, CrudUpdateView)
|
|
from sapl.crud.masterdetail import MasterDetailCrud
|
|
from sapl.utils import permissao_tb_aux, permissoes_parlamentares
|
|
|
|
from .forms import (ComposicaoColigacaoForm, FiliacaoForm, LegislaturaForm,
|
|
ParlamentarCreateForm, ParlamentarForm)
|
|
from .models import (CargoMesa, Coligacao, ComposicaoColigacao, ComposicaoMesa,
|
|
Dependente, Filiacao, Legislatura, Mandato,
|
|
NivelInstrucao, Parlamentar, Partido, SessaoLegislativa,
|
|
SituacaoMilitar, TipoAfastamento, TipoDependente)
|
|
|
|
|
|
class CargoMesaCrud(Crud):
|
|
model = CargoMesa
|
|
help_path = 'cargo_mesa'
|
|
|
|
class BaseMixin(PermissionRequiredMixin, CrudBaseMixin):
|
|
def has_permission(self):
|
|
return permissao_tb_aux(self)
|
|
|
|
|
|
class PartidoCrud(Crud):
|
|
model = Partido
|
|
help_path = 'partidos'
|
|
|
|
class BaseMixin(PermissionRequiredMixin, CrudBaseMixin):
|
|
def has_permission(self):
|
|
return permissao_tb_aux(self)
|
|
|
|
|
|
class SessaoLegislativaCrud(Crud):
|
|
model = SessaoLegislativa
|
|
help_path = 'sessao_legislativa'
|
|
|
|
class BaseMixin(PermissionRequiredMixin, CrudBaseMixin):
|
|
def has_permission(self):
|
|
return permissao_tb_aux(self)
|
|
|
|
|
|
class TipoDependenteCrud(Crud):
|
|
model = TipoDependente
|
|
help_path = 'nivel_instrucao'
|
|
|
|
class BaseMixin(PermissionRequiredMixin, CrudBaseMixin):
|
|
def has_permission(self):
|
|
return permissao_tb_aux(self)
|
|
|
|
|
|
class NivelInstrucaoCrud(Crud):
|
|
model = NivelInstrucao
|
|
help_path = 'tipo_dependente'
|
|
|
|
class BaseMixin(PermissionRequiredMixin, CrudBaseMixin):
|
|
def has_permission(self):
|
|
return permissao_tb_aux(self)
|
|
|
|
|
|
class TipoAfastamentoCrud(Crud):
|
|
model = TipoAfastamento
|
|
help_path = 'tipo_afastamento'
|
|
|
|
class BaseMixin(PermissionRequiredMixin, CrudBaseMixin):
|
|
def has_permission(self):
|
|
return permissao_tb_aux(self)
|
|
|
|
|
|
class TipoMilitarCrud(Crud):
|
|
model = SituacaoMilitar
|
|
help_path = 'tipo_situa_militar'
|
|
|
|
class BaseMixin(PermissionRequiredMixin, CrudBaseMixin):
|
|
def has_permission(self):
|
|
return permissao_tb_aux(self)
|
|
|
|
|
|
class DependenteCrud(MasterDetailCrud):
|
|
model = Dependente
|
|
parent_field = 'parlamentar'
|
|
help_path = ''
|
|
|
|
class CreateView(PermissionRequiredMixin, MasterDetailCrud.CreateView):
|
|
permission_required = permissoes_parlamentares()
|
|
|
|
class UpdateView(PermissionRequiredMixin, MasterDetailCrud.UpdateView):
|
|
permission_required = permissoes_parlamentares()
|
|
|
|
class DeleteView(PermissionRequiredMixin, MasterDetailCrud.DeleteView):
|
|
permission_required = permissoes_parlamentares()
|
|
|
|
class ListView(PermissionRequiredMixin, MasterDetailCrud.ListView):
|
|
permission_required = permissoes_parlamentares()
|
|
|
|
class DetailView(PermissionRequiredMixin, MasterDetailCrud.DetailView):
|
|
permission_required = permissoes_parlamentares()
|
|
|
|
|
|
class MandatoCrud(MasterDetailCrud):
|
|
model = Mandato
|
|
parent_field = 'parlamentar'
|
|
help_path = ''
|
|
|
|
class ListView(MasterDetailCrud.ListView):
|
|
ordering = ('-legislatura__data_inicio')
|
|
|
|
class CreateView(PermissionRequiredMixin, MasterDetailCrud.CreateView):
|
|
permission_required = permissoes_parlamentares()
|
|
|
|
class UpdateView(PermissionRequiredMixin, MasterDetailCrud.UpdateView):
|
|
permission_required = permissoes_parlamentares()
|
|
|
|
class DeleteView(PermissionRequiredMixin, MasterDetailCrud.DeleteView):
|
|
permission_required = permissoes_parlamentares()
|
|
|
|
|
|
class ColigacaoCrud(Crud):
|
|
model = Coligacao
|
|
help_path = 'tabelas_auxiliares#coligacao'
|
|
|
|
class ListView(CrudListView):
|
|
ordering = ('-legislatura__data_inicio', 'nome')
|
|
|
|
class BaseMixin(PermissionRequiredMixin, CrudBaseMixin):
|
|
def has_permission(self):
|
|
return permissao_tb_aux(self)
|
|
|
|
|
|
class ComposicaoColigacaoCrud(MasterDetailCrud):
|
|
model = ComposicaoColigacao
|
|
parent_field = 'coligacao'
|
|
help_path = ''
|
|
|
|
class CreateView(MasterDetailCrud.CreateView):
|
|
form_class = ComposicaoColigacaoForm
|
|
|
|
def get_initial(self):
|
|
id = self.kwargs['pk']
|
|
return {'coligacao_id': id}
|
|
|
|
class UpdateView(MasterDetailCrud.UpdateView):
|
|
form_class = ComposicaoColigacaoForm
|
|
|
|
def get_initial(self):
|
|
id = self.kwargs['pk']
|
|
return {'coligacao_id': id}
|
|
|
|
class ListView(MasterDetailCrud.ListView):
|
|
ordering = '-partido__sigla'
|
|
|
|
class BaseMixin(PermissionRequiredMixin, MasterDetailCrud.BaseMixin):
|
|
def has_permission(self):
|
|
return permissao_tb_aux(self)
|
|
|
|
|
|
class LegislaturaCrud(Crud):
|
|
model = Legislatura
|
|
help_path = 'tabelas_auxiliares#legislatura'
|
|
|
|
class CreateView(CrudCreateView):
|
|
form_class = LegislaturaForm
|
|
|
|
class UpdateView(CrudUpdateView):
|
|
form_class = LegislaturaForm
|
|
|
|
class BaseMixin(PermissionRequiredMixin, CrudBaseMixin):
|
|
def has_permission(self):
|
|
return permissao_tb_aux(self)
|
|
|
|
|
|
class FiliacaoCrud(MasterDetailCrud):
|
|
model = Filiacao
|
|
parent_field = 'parlamentar'
|
|
help_path = ''
|
|
|
|
class CreateView(PermissionRequiredMixin, MasterDetailCrud.CreateView):
|
|
form_class = FiliacaoForm
|
|
permission_required = permissoes_parlamentares()
|
|
|
|
class UpdateView(PermissionRequiredMixin, MasterDetailCrud.UpdateView):
|
|
form_class = FiliacaoForm
|
|
permission_required = permissoes_parlamentares()
|
|
|
|
class DeleteView(PermissionRequiredMixin, MasterDetailCrud.DeleteView):
|
|
permission_required = permissoes_parlamentares()
|
|
|
|
class ListView(MasterDetailCrud.ListView):
|
|
ordering = '-data'
|
|
|
|
|
|
def get_parlamentar_permissions():
|
|
lista_permissoes = []
|
|
cts = ContentType.objects.filter(app_label='parlamentares')
|
|
perms_parlamentares = list(Permission.objects.filter(
|
|
content_type__in=cts))
|
|
for p in perms_parlamentares:
|
|
lista_permissoes.append('parlamentares.' + p.codename)
|
|
return set(lista_permissoes)
|
|
|
|
|
|
class ParlamentarCrud(Crud):
|
|
model = Parlamentar
|
|
help_path = ''
|
|
|
|
class DetailView(CrudDetailView):
|
|
def get_template_names(self):
|
|
usuario = self.request.user
|
|
lista_permissoes = get_parlamentar_permissions()
|
|
|
|
if usuario.has_perms(lista_permissoes):
|
|
return ['crud/detail.html']
|
|
|
|
else:
|
|
return ['parlamentares/parlamentar_perfil_publico.html']
|
|
|
|
class UpdateView(PermissionRequiredMixin, CrudUpdateView):
|
|
form_class = ParlamentarForm
|
|
permission_required = permissoes_parlamentares()
|
|
|
|
class CreateView(PermissionRequiredMixin, CrudCreateView):
|
|
form_class = ParlamentarCreateForm
|
|
permission_required = permissoes_parlamentares()
|
|
|
|
@property
|
|
def layout_key(self):
|
|
return 'ParlamentarCreate'
|
|
|
|
class DeleteView(PermissionRequiredMixin, CrudDeleteView):
|
|
form_class = ParlamentarCreateForm
|
|
permission_required = permissoes_parlamentares()
|
|
|
|
class ListView(CrudListView):
|
|
template_name = "parlamentares/parlamentares_list.html"
|
|
paginate_by = None
|
|
|
|
def take_legislatura_id(self):
|
|
legislaturas = Legislatura.objects.all().order_by(
|
|
'-data_inicio', '-data_fim')
|
|
|
|
if legislaturas:
|
|
try:
|
|
legislatura_id = int(self.request.GET['periodo'])
|
|
except MultiValueDictKeyError:
|
|
legislatura_id = legislaturas.first().id
|
|
return legislatura_id
|
|
else:
|
|
return 0
|
|
|
|
def get_queryset(self):
|
|
if self.take_legislatura_id() != 0:
|
|
mandatos = Mandato.objects.filter(
|
|
legislatura_id=self.take_legislatura_id())
|
|
return mandatos
|
|
return []
|
|
|
|
def get_rows(self, object_list):
|
|
parlamentares = []
|
|
for m in object_list:
|
|
ultima_filiacao = m.parlamentar.filiacao_set.order_by(
|
|
'-data').first()
|
|
if ultima_filiacao and not ultima_filiacao.data_desfiliacao:
|
|
partido = ultima_filiacao.partido.sigla
|
|
else:
|
|
partido = _('Sem Partido')
|
|
|
|
parlamentar = [
|
|
("<img src=" + m.parlamentar.fotografia.url + " \
|
|
height='42' width='42' />" if m.parlamentar.fotografia
|
|
else '', ''),
|
|
(m.parlamentar.nome_parlamentar, m.parlamentar.id),
|
|
(partido, None),
|
|
('Sim' if m.parlamentar.ativo else 'Não', None)
|
|
]
|
|
parlamentares.append(parlamentar)
|
|
return parlamentares
|
|
|
|
def get_headers(self):
|
|
return ['', 'Parlamentar', 'Partido', 'Ativo?']
|
|
|
|
def get_context_data(self, **kwargs):
|
|
context = super(ParlamentarCrud.ListView, self
|
|
).get_context_data(**kwargs)
|
|
context.setdefault('title', self.verbose_name_plural)
|
|
|
|
# Adiciona legislatura para filtrar parlamentares
|
|
legislaturas = Legislatura.objects.all().order_by(
|
|
'-data_inicio', '-data_fim')
|
|
context['legislaturas'] = legislaturas
|
|
context['legislatura_id'] = self.take_legislatura_id()
|
|
return context
|
|
|
|
|
|
def check_permission_mesa(request):
|
|
lista_permissoes = []
|
|
cts = ContentType.objects.filter(app_label='parlamentares')
|
|
cts = cts.filter(model__icontains='mesa')
|
|
perms = list(Permission.objects.filter(content_type__in=cts))
|
|
for p in perms:
|
|
lista_permissoes.append('parlamentares.' + p.codename)
|
|
|
|
return request.user.has_perms(set(lista_permissoes))
|
|
|
|
|
|
class MesaDiretoraView(FormView):
|
|
template_name = "mesa_diretora/mesa_diretora.html"
|
|
success_url = reverse_lazy('sapl.parlamentares:mesa_diretora')
|
|
|
|
# Essa função avisa quando se pode compor uma Mesa Legislativa
|
|
def validation(self, request):
|
|
mensagem = _('Não há nenhuma Sessão Legislativa cadastrada. ' +
|
|
'Só é possível compor uma Mesa Diretora quando ' +
|
|
'há uma Sessão Legislativa cadastrada.')
|
|
messages.add_message(request, messages.INFO, mensagem)
|
|
|
|
return self.render_to_response(
|
|
{'legislaturas': Legislatura.objects.all(
|
|
).order_by('-data_inicio'),
|
|
'legislatura_selecionada': Legislatura.objects.last(),
|
|
'cargos_vagos': CargoMesa.objects.all()})
|
|
|
|
def get(self, request, *args, **kwargs):
|
|
|
|
if (not Legislatura.objects.exists() or
|
|
not SessaoLegislativa.objects.all()):
|
|
return self.validation(request)
|
|
|
|
mesa = SessaoLegislativa.objects.filter(
|
|
legislatura=Legislatura.objects.last()).first(
|
|
).composicaomesa_set.all()
|
|
|
|
cargos_ocupados = [m.cargo for m in mesa]
|
|
cargos = CargoMesa.objects.all()
|
|
cargos_vagos = list(set(cargos) - set(cargos_ocupados))
|
|
|
|
parlamentares = Legislatura.objects.last().mandato_set.all()
|
|
parlamentares_ocupados = [m.parlamentar for m in mesa]
|
|
parlamentares_vagos = list(
|
|
set(
|
|
[p.parlamentar for p in parlamentares]) - set(
|
|
parlamentares_ocupados))
|
|
|
|
return self.render_to_response(
|
|
{'legislaturas': Legislatura.objects.all(
|
|
).order_by('-data_inicio'),
|
|
'legislatura_selecionada': Legislatura.objects.last(),
|
|
'sessoes': SessaoLegislativa.objects.filter(
|
|
legislatura=Legislatura.objects.last()),
|
|
'sessao_selecionada': SessaoLegislativa.objects.filter(
|
|
legislatura=Legislatura.objects.last()).first(),
|
|
'composicao_mesa': mesa,
|
|
'parlamentares': parlamentares_vagos,
|
|
'cargos_vagos': cargos_vagos
|
|
})
|
|
|
|
def post(self, request, *args, **kwargs):
|
|
if 'Incluir' in request.POST and check_permission_mesa(request):
|
|
|
|
if (not Legislatura.objects.all() or
|
|
not SessaoLegislativa.objects.all()):
|
|
return self.validation(request)
|
|
|
|
composicao = ComposicaoMesa()
|
|
composicao.sessao_legislativa = SessaoLegislativa.objects.get(
|
|
id=int(request.POST['sessao']))
|
|
composicao.parlamentar = Parlamentar.objects.get(
|
|
id=int(request.POST['parlamentar']))
|
|
composicao.cargo = CargoMesa.objects.get(
|
|
id=int(request.POST['cargo']))
|
|
composicao.save()
|
|
|
|
return redirect('sapl.parlamentares:mesa_diretora')
|
|
|
|
elif 'Excluir' in request.POST and check_permission_mesa(request):
|
|
|
|
if (not Legislatura.objects.all() or
|
|
not SessaoLegislativa.objects.all()):
|
|
return self.validation(request)
|
|
|
|
if 'composicao_mesa' in request.POST:
|
|
ids = request.POST['composicao_mesa'].split(':')
|
|
composicao = ComposicaoMesa.objects.get(
|
|
sessao_legislativa_id=int(request.POST['sessao']),
|
|
parlamentar_id=int(ids[0]),
|
|
cargo_id=int(ids[1])
|
|
)
|
|
composicao.delete()
|
|
return redirect('sapl.parlamentares:mesa_diretora')
|
|
else:
|
|
mesa = ComposicaoMesa.objects.filter(
|
|
sessao_legislativa=request.POST['sessao'])
|
|
|
|
cargos_ocupados = [m.cargo for m in mesa]
|
|
cargos = CargoMesa.objects.all()
|
|
cargos_vagos = list(set(cargos) - set(cargos_ocupados))
|
|
|
|
parlamentares = Legislatura.objects.get(
|
|
id=int(request.POST['legislatura'])).mandato_set.all()
|
|
parlamentares_ocupados = [m.parlamentar for m in mesa]
|
|
parlamentares_vagos = list(
|
|
set(
|
|
[p.parlamentar for p in parlamentares]) - set(
|
|
parlamentares_ocupados))
|
|
return self.render_to_response(
|
|
{'legislaturas': Legislatura.objects.all(
|
|
).order_by('-data_inicio'),
|
|
'legislatura_selecionada': Legislatura.objects.get(
|
|
id=int(request.POST['legislatura'])),
|
|
'sessoes': SessaoLegislativa.objects.filter(
|
|
legislatura_id=int(request.POST['legislatura'])),
|
|
'sessao_selecionada': SessaoLegislativa.objects.get(
|
|
id=int(request.POST['sessao'])),
|
|
'composicao_mesa': mesa,
|
|
'parlamentares': parlamentares_vagos,
|
|
'cargos_vagos': cargos_vagos
|
|
})
|
|
|