Sistema de Apoio ao Processo Legislativo
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.
 
 
 
 
 

601 lines
19 KiB

from collections import OrderedDict
from datetime import datetime, timedelta
from os.path import sys
from braces.views import FormMessagesMixin
from django.contrib.auth.decorators import login_required
from django.contrib.messages.api import success
from django.core.signing import Signer
from django.core.urlresolvers import reverse, reverse_lazy
from django.db.models import Q
from django.http.response import (HttpResponse, HttpResponseRedirect,
JsonResponse)
from django.shortcuts import get_object_or_404, render
from django.utils.dateparse import parse_date
from django.utils.decorators import method_decorator
from django.utils.functional import cached_property
from django.utils.translation import ugettext_lazy as _
from django.views.generic.base import TemplateView
from django.views.generic.detail import DetailView
from django.views.generic.edit import FormMixin, UpdateView, CreateView,\
DeleteView
from django.views.generic.list import ListView
from compilacao import forms, utils
from compilacao.models import (Dispositivo, Nota,
PerfilEstruturalTextoArticulado,
TipoDispositivo, TipoNota, TipoPublicacao,
TipoVide, VeiculoPublicacao, Vide,
TextoArticulado)
DISPOSITIVO_SELECT_RELATED = (
'tipo_dispositivo',
'ta_publicado',
'ta',
'dispositivo_atualizador',
'dispositivo_atualizador__dispositivo_pai',
'dispositivo_atualizador__dispositivo_pai__ta',
'dispositivo_atualizador__dispositivo_pai__ta__tipo_ta',
'dispositivo_pai',
'dispositivo_pai__tipo_dispositivo')
class TaListView(ListView):
model = TextoArticulado
paginate_by = 10
verbose_name = model._meta.verbose_name
title = model._meta.verbose_name_plural
create_url = reverse_lazy('ta_create')
def get_context_data(self, **kwargs):
context = super(TaListView, self).get_context_data(**kwargs)
paginator = context['paginator']
page_obj = context['page_obj']
context['page_range'] = utils.make_pagination(
page_obj.number, paginator.num_pages)
return context
class TaDetailView(DetailView):
model = TextoArticulado
@property
def title(self):
return self.get_object()
class TaCreateView(FormMessagesMixin, CreateView):
model = TextoArticulado
form_class = forms.TaForm
template_name = "compilacao/form.html"
form_valid_message = _('Registro criado com sucesso!')
form_invalid_message = _('O registro não foi criado.')
def get_success_url(self):
return reverse_lazy('ta_detail', kwargs={'pk': self.object.id})
class TaUpdateView(UpdateView):
model = TextoArticulado
form_class = forms.TaForm
template_name = "compilacao/form.html"
@property
def title(self):
return self.get_object()
def get_success_url(self):
return reverse_lazy('ta_detail', kwargs={'pk': self.kwargs['pk']})
class TaDeleteView(DeleteView):
model = TextoArticulado
@property
def title(self):
return self.get_object()
@property
def detail_url(self):
return reverse_lazy('ta_detail', kwargs={'pk': self.kwargs['pk']})
def get_success_url(self):
return reverse_lazy('ta_list')
class TextView(ListView):
template_name = 'compilacao/text_list.html'
flag_alteradora = -1
flag_nivel_ini = 0
flag_nivel_old = -1
itens_de_vigencia = {}
inicio_vigencia = None
fim_vigencia = None
def get_context_data(self, **kwargs):
context = super(TextView, self).get_context_data(**kwargs)
context['object'] = TextoArticulado.objects.get(
pk=self.kwargs['ta_id'])
cita = Vide.objects.filter(
Q(dispositivo_base__ta_id=self.kwargs['ta_id'])).\
select_related(
'dispositivo_ref',
'dispositivo_ref__ta',
'dispositivo_ref__dispositivo_pai',
'dispositivo_ref__dispositivo_pai__ta', 'tipo')
context['cita'] = {}
for c in cita:
if str(c.dispositivo_base_id) not in context['cita']:
context['cita'][str(c.dispositivo_base_id)] = []
context['cita'][str(c.dispositivo_base_id)].append(c)
citado = Vide.objects.filter(
Q(dispositivo_ref__ta_id=self.kwargs['ta_id'])).\
select_related(
'dispositivo_base',
'dispositivo_base__ta',
'dispositivo_base__dispositivo_pai',
'dispositivo_base__dispositivo_pai__ta', 'tipo')
context['citado'] = {}
for c in citado:
if str(c.dispositivo_ref_id) not in context['citado']:
context['citado'][str(c.dispositivo_ref_id)] = []
context['citado'][str(c.dispositivo_ref_id)].append(c)
notas = Nota.objects.filter(
dispositivo__ta_id=self.kwargs['ta_id']).select_related(
'owner', 'tipo')
context['notas'] = {}
for n in notas:
if str(n.dispositivo_id) not in context['notas']:
context['notas'][str(n.dispositivo_id)] = []
context['notas'][str(n.dispositivo_id)].append(n)
return context
def get_queryset(self):
self.flag_alteradora = -1
self.flag_nivel_ini = 0
self.flag_nivel_old = -1
self.inicio_vigencia = None
self.fim_vigencia = None
if 'sign' in self.kwargs:
signer = Signer()
try:
string = signer.unsign(self.kwargs['sign']).split(',')
self.inicio_vigencia = parse_date(string[0])
self.fim_vigencia = parse_date(string[1])
except:
return{}
return Dispositivo.objects.filter(
inicio_vigencia__lte=self.fim_vigencia,
ordem__gt=0,
ta_id=self.kwargs['ta_id'],
).select_related(*DISPOSITIVO_SELECT_RELATED)
else:
r = Dispositivo.objects.filter(
ordem__gt=0,
ta_id=self.kwargs['ta_id'],
).select_related(*DISPOSITIVO_SELECT_RELATED)
return r
def get_vigencias(self):
itens = Dispositivo.objects.filter(
ta_id=self.kwargs['ta_id'],
).order_by(
'inicio_vigencia'
).distinct(
'inicio_vigencia'
).select_related(
'ta_publicado',
'ta',
'ta_publicado__tipo_ta',
'ta__tipo_ta',)
ajuste_datas_vigencia = []
for item in itens:
ajuste_datas_vigencia.append(item)
lenLista = len(ajuste_datas_vigencia)
for i in range(lenLista):
if i + 1 < lenLista:
ajuste_datas_vigencia[
i].fim_vigencia = ajuste_datas_vigencia[
i + 1].inicio_vigencia - timedelta(days=1)
else:
ajuste_datas_vigencia[i].fim_vigencia = None
self.itens_de_vigencia = {}
idx = -1
length = len(ajuste_datas_vigencia)
for item in ajuste_datas_vigencia:
idx += 1
if idx == 0:
self.itens_de_vigencia[0] = [item, ]
continue
if idx + 1 < length:
ano = item.ta_publicado.ano
if ano in self.itens_de_vigencia:
self.itens_de_vigencia[ano].append(item)
else:
self.itens_de_vigencia[ano] = [item, ]
else:
self.itens_de_vigencia[9999] = [item, ]
if len(self.itens_de_vigencia.keys()) <= 1:
return {}
self.itens_de_vigencia = OrderedDict(
sorted(self.itens_de_vigencia.items(), key=lambda t: t[0]))
return self.itens_de_vigencia
def get_ta(self):
return TextoArticulado.objects.select_related('tipo_ta').get(
pk=self.kwargs['ta_id'])
def is_ta_alterador(self):
if self.flag_alteradora == -1:
self.flag_alteradora = Dispositivo.objects.select_related(
'dispositivos_alterados_pelo_texto_articulado_set'
).filter(ta_id=self.kwargs['ta_id']).count()
return self.flag_alteradora > 0
class DispositivoView(TextView):
# template_name = 'compilacao/index.html'
template_name = 'compilacao/text_list_bloco.html'
def get_queryset(self):
self.flag_alteradora = -1
self.flag_nivel_ini = 0
self.flag_nivel_old = -1
try:
bloco = Dispositivo.objects.get(pk=self.kwargs['dispositivo_id'])
except Dispositivo.DoesNotExist:
return []
self.flag_nivel_old = bloco.nivel - 1
self.flag_nivel_ini = bloco.nivel
proximo_bloco = Dispositivo.objects.filter(
ordem__gt=bloco.ordem,
nivel__lte=bloco.nivel,
ta_id=self.kwargs['ta_id'])[:1]
if proximo_bloco.count() == 0:
itens = Dispositivo.objects.filter(
ordem__gte=bloco.ordem,
ta_id=self.kwargs['ta_id']
).select_related(*DISPOSITIVO_SELECT_RELATED)
else:
itens = Dispositivo.objects.filter(
ordem__gte=bloco.ordem,
ordem__lt=proximo_bloco[0].ordem,
ta_id=self.kwargs['ta_id']
).select_related(*DISPOSITIVO_SELECT_RELATED)
return itens
class TextEditView(TextView):
template_name = 'compilacao/text_edit.html'
flag_alteradora = -1
flag_nivel_ini = 0
flag_nivel_old = -1
pk_edit = 0
pk_view = 0
"""
def get(self, request, *args, **kwargs):
self.object_list = self.get_queryset()
context = self.get_context_data(
object_list=self.object_list)
return self.render_to_response(context)"""
def get_queryset(self):
self.pk_edit = 0
self.pk_view = 0
self.flag_alteradora = -1
self.flag_nivel_ini = 0
self.flag_nivel_old = -1
result = Dispositivo.objects.filter(
ta_id=self.kwargs['ta_id']
).select_related(*DISPOSITIVO_SELECT_RELATED)
if not result.exists():
ta = TextoArticulado.objects.get(pk=self.kwargs['ta_id'])
td = TipoDispositivo.objects.filter(class_css='articulacao')[0]
a = Dispositivo()
a.nivel = 0
a.ordem = Dispositivo.INTERVALO_ORDEM
a.ordem_bloco_atualizador = 0
a.set_numero_completo([1, 0, 0, 0, 0, 0, ])
a.ta = ta
a.tipo_dispositivo = td
a.inicio_vigencia = ta.data
a.inicio_eficacia = ta.data
a.timestamp = datetime.now()
a.save()
td = TipoDispositivo.objects.filter(class_css='ementa')[0]
e = Dispositivo()
e.nivel = 1
e.ordem = a.ordem + Dispositivo.INTERVALO_ORDEM
e.ordem_bloco_atualizador = 0
e.set_numero_completo([1, 0, 0, 0, 0, 0, ])
e.ta = ta
e.tipo_dispositivo = td
e.inicio_vigencia = ta.data
e.inicio_eficacia = ta.data
e.timestamp = datetime.now()
e.texto = ta.ementa
e.dispositivo_pai = a
e.save()
a.pk = None
a.nivel = 0
a.ordem = e.ordem + Dispositivo.INTERVALO_ORDEM
a.ordem_bloco_atualizador = 0
a.set_numero_completo([2, 0, 0, 0, 0, 0, ])
a.timestamp = datetime.now()
a.save()
result = Dispositivo.objects.filter(
ta_id=self.kwargs['ta_id']
).select_related(*DISPOSITIVO_SELECT_RELATED)
return result
def set_perfil_in_session(self, request=None, perfil_id=0):
if not request:
return None
if perfil_id:
perfil = PerfilEstruturalTextoArticulado.objects.get(
pk=perfil_id)
request.session['perfil_estrutural'] = perfil.pk
else:
perfis = PerfilEstruturalTextoArticulado.objects.filter(
padrao=True)[:1]
if not perfis.exists():
request.session.pop('perfil_estrutural')
else:
request.session['perfil_estrutural'] = perfis[0].pk
class DispositivoSuccessUrlMixin(object):
def get_success_url(self):
return reverse(
'dispositivo', kwargs={
'ta_id': self.kwargs[
'ta_id'],
'dispositivo_id': self.kwargs[
'dispositivo_id']})
class NotaMixin(DispositivoSuccessUrlMixin):
def get_modelo_nota(self, request):
if 'action' in request.GET and request.GET['action'] == 'modelo_nota':
tn = TipoNota.objects.get(pk=request.GET['id_tipo'])
return True, tn.modelo
return False, ''
def get_initial(self):
dispositivo = get_object_or_404(
Dispositivo, pk=self.kwargs.get('dispositivo_id'))
initial = {'dispositivo': dispositivo}
if 'pk' in self.kwargs:
initial['pk'] = self.kwargs.get('pk')
return initial
@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
return super(NotaMixin, self).dispatch(*args, **kwargs)
class NotasCreateView(NotaMixin, CreateView):
template_name = 'compilacao/ajax_form.html'
form_class = forms.NotaForm
def get(self, request, *args, **kwargs):
flag_action, modelo_nota = self.get_modelo_nota(request)
if flag_action:
return HttpResponse(modelo_nota)
return super(NotasCreateView, self).get(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
try:
ta_id = kwargs.pop('ta_id')
dispositivo_id = kwargs.pop('dispositivo_id')
form = forms.NotaForm(request.POST, request.FILES, **kwargs)
kwargs['ta_id'] = ta_id
kwargs['dispositivo_id'] = dispositivo_id
if form.is_valid():
nt = form.save(commit=False)
nt.owner_id = request.user.pk
nt.save()
self.kwargs['pk'] = nt.pk
return self.form_valid(form)
else:
return self.form_invalid(form)
except Exception as e:
print(e)
return HttpResponse("post")
class NotasEditView(NotaMixin, UpdateView):
model = Nota
template_name = 'compilacao/ajax_form.html'
form_class = forms.NotaForm
def get(self, request, *args, **kwargs):
flag_action, modelo_nota = self.get_modelo_nota(request)
if flag_action:
return HttpResponse(modelo_nota)
return super(NotasEditView, self).get(request, *args, **kwargs)
class NotasDeleteView(NotaMixin, TemplateView):
def get(self, request, *args, **kwargs):
nt = Nota.objects.get(pk=self.kwargs['pk'])
nt.delete()
return HttpResponseRedirect(self.get_success_url())
class VideMixin(DispositivoSuccessUrlMixin):
def get_initial(self):
dispositivo_base = get_object_or_404(
Dispositivo, pk=self.kwargs.get('dispositivo_id'))
initial = {'dispositivo_base': dispositivo_base}
if 'pk' in self.kwargs:
initial['pk'] = self.kwargs.get('pk')
return initial
@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
return super(VideMixin, self).dispatch(*args, **kwargs)
class VideCreateView(VideMixin, CreateView):
template_name = 'compilacao/ajax_form.html'
form_class = forms.VideForm
def post(self, request, *args, **kwargs):
try:
ta_id = kwargs.pop('ta_id')
dispositivo_id = kwargs.pop('dispositivo_id')
form = forms.VideForm(request.POST, request.FILES, **kwargs)
kwargs['ta_id'] = ta_id
kwargs['dispositivo_id'] = dispositivo_id
if form.is_valid():
vd = form.save(commit=False)
vd.save()
self.kwargs['pk'] = vd.pk
return self.form_valid(form)
else:
return self.form_invalid(form)
except Exception as e:
print(e)
return HttpResponse("post")
class VideEditView(VideMixin, UpdateView):
model = Vide
template_name = 'compilacao/ajax_form.html'
form_class = forms.VideForm
class VideDeleteView(VideMixin, TemplateView):
def get(self, request, *args, **kwargs):
vd = Vide.objects.get(pk=self.kwargs['pk'])
vd.delete()
return HttpResponseRedirect(self.get_success_url())
class DispositivoSearchFragmentFormView(ListView):
template_name = 'compilacao/dispositivo_search_fragment_form.html'
@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
return super(
DispositivoSearchFragmentFormView,
self).dispatch(*args, **kwargs)
def get_queryset(self):
try:
busca = ''
if 'busca' in self.request.GET:
busca = self.request.GET['busca']
q = Q(nivel__gt=0)
busca = busca.split(' ')
n = 10
for item in busca:
if not item:
continue
if q:
q = q & (Q(dispositivo_pai__rotulo__icontains=item) |
Q(rotulo__icontains=item) |
Q(texto__icontains=item) |
Q(texto_atualizador__icontains=item))
n = 50
else:
q = (Q(dispositivo_pai__rotulo__icontains=item) |
Q(rotulo__icontains=item) |
Q(texto__icontains=item) |
Q(texto_atualizador__icontains=item))
n = 50
if 'tipo_ta' in self.request.GET:
tipo_ta = self.request.GET['tipo_ta']
if tipo_ta:
q = q & Q(ta__tipo_ta_id=tipo_ta)
n = 50
if 'num_ta' in self.request.GET:
num_ta = self.request.GET['num_ta']
if num_ta:
q = q & Q(ta__numero=num_ta)
n = 50
if 'ano_ta' in self.request.GET:
ano_ta = self.request.GET['ano_ta']
if ano_ta:
q = q & Q(ta__ano=ano_ta)
n = 50
if 'initial_ref' in self.request.GET:
initial_ref = self.request.GET['initial_ref']
if initial_ref:
q = q & Q(pk=initial_ref)
n = 50
return Dispositivo.objects.filter(q)[:n]
except Exception as e:
print(e)