Browse Source

Merge 56b6b4f46e into 2b9fd1e611

pull/1348/merge
Eduardo Calil 9 years ago
committed by GitHub
parent
commit
47ab24f18c
  1. 4
      sapl/crispy_layout_mixin.py
  2. 8
      sapl/materia/forms.py
  3. 5
      sapl/materia/urls.py
  4. 219
      sapl/materia/views.py
  5. 55
      sapl/templates/materia/autoria_form.html

4
sapl/crispy_layout_mixin.py

@ -67,6 +67,10 @@ def get_field_display(obj, fieldname):
ou mesmo uma método no model. ou mesmo uma método no model.
""" """
value = getattr(obj, fieldname) value = getattr(obj, fieldname)
try:
verbose_name = value.model._meta.verbose_name
except AttributeError:
verbose_name = '' verbose_name = ''
else: else:

8
sapl/materia/forms.py

@ -723,6 +723,14 @@ class AutoriaForm(ModelForm):
materia=self.instance.materia, materia=self.instance.materia,
autor=self.cleaned_data['autor'], autor=self.cleaned_data['autor'],
).exists(): ).exists():
if not self.instance.pk:
msg = _('Esse Autor já foi cadastrado.')
raise ValidationError(msg)
else:
autoria = Autoria.objects.get(
materia=self.instance.materia,
autor=self.cleaned_data['autor'])
if autoria != self.instance:
msg = _('Esse Autor já foi cadastrado.') msg = _('Esse Autor já foi cadastrado.')
raise ValidationError(msg) raise ValidationError(msg)

5
sapl/materia/urls.py

@ -21,6 +21,7 @@ from sapl.materia.views import (AcompanhamentoConfirmarView,
TipoFimRelatoriaCrud, TipoMateriaCrud, TipoFimRelatoriaCrud, TipoMateriaCrud,
TipoProposicaoCrud, TramitacaoCrud, TipoProposicaoCrud, TramitacaoCrud,
TramitacaoEmLoteView, UnidadeTramitacaoCrud, TramitacaoEmLoteView, UnidadeTramitacaoCrud,
atualizar_autores,
proposicao_texto, recuperar_materia) proposicao_texto, recuperar_materia)
from .apps import AppConfig from .apps import AppConfig
@ -41,6 +42,10 @@ urlpatterns_materia = [
RelatoriaCrud.get_urls() + RelatoriaCrud.get_urls() +
DocumentoAcessorioCrud.get_urls())), DocumentoAcessorioCrud.get_urls())),
url(r'^materia/autoria/atualizar-autores$',
atualizar_autores,
name='atualizar_autores'),
url(r'^materia/(?P<pk>[0-9]+)/create_simplificado$', url(r'^materia/(?P<pk>[0-9]+)/create_simplificado$',
CriarProtocoloMateriaView.as_view(), CriarProtocoloMateriaView.as_view(),
name='materia_create_simplificado'), name='materia_create_simplificado'),

219
sapl/materia/views.py

@ -40,7 +40,7 @@ from django.views.generic.base import RedirectView
from django.views.generic.edit import FormView from django.views.generic.edit import FormView
from django_filters.views import FilterView from django_filters.views import FilterView
import sapl import sapl
from sapl.base.models import Autor, CasaLegislativa from sapl.base.models import Autor, CasaLegislativa, TipoAutor
from sapl.comissoes.models import Comissao from sapl.comissoes.models import Comissao
from sapl.comissoes.models import Comissao, Participacao from sapl.comissoes.models import Comissao, Participacao
from sapl.compilacao.models import (STATUS_TA_IMMUTABLE_RESTRICT, from sapl.compilacao.models import (STATUS_TA_IMMUTABLE_RESTRICT,
@ -57,8 +57,9 @@ from sapl.materia.forms import (AnexadaForm, ConfirmarProposicaoForm,
TramitacaoUpdateForm) TramitacaoUpdateForm)
from sapl.materia.models import Autor from sapl.materia.models import Autor
from sapl.norma.models import LegislacaoCitada from sapl.norma.models import LegislacaoCitada
from sapl.parlamentares.models import Parlamentar from sapl.parlamentares.models import Frente, Mandato, Parlamentar
from sapl.protocoloadm.models import Protocolo from sapl.protocoloadm.models import Protocolo
from sapl.sessao.models import Bancada, Bloco
from sapl.utils import (TURNO_TRAMITACAO_CHOICES, YES_NO_CHOICES, autor_label, from sapl.utils import (TURNO_TRAMITACAO_CHOICES, YES_NO_CHOICES, autor_label,
autor_modal, gerar_hash_arquivo, get_base_url, autor_modal, gerar_hash_arquivo, get_base_url,
montar_row_autor) montar_row_autor)
@ -1080,6 +1081,151 @@ class DocumentoAcessorioCrud(MasterDetailCrud):
return context return context
def filtra_ativos(content_type, materia):
if content_type.model_class() == Parlamentar:
mandatos_ativos = Mandato.objects.filter(Q(
data_inicio_mandato__lte=materia.data_apresentacao,
data_fim_mandato__isnull=True) | Q(
data_inicio_mandato__lte=materia.data_apresentacao,
data_fim_mandato__gte=materia.data_apresentacao)
).values_list('parlamentar_id', flat=True).distinct('parlamentar_id')
return Autor.objects.filter(
content_type=content_type,
object_id__in=mandatos_ativos)
elif content_type.model_class() == Comissao:
comissoes = Comissao.objects.filter(
data_criacao__lte=materia.data_apresentacao)
comissoes_id = comissoes.filter(Q(
data_extincao__isnull=True,
data_fim_comissao__isnull=True) | Q(
data_extincao__gte=materia.data_apresentacao,
data_fim_comissao__isnull=True) | Q(
data_extincao__gte=materia.data_apresentacao,
data_fim_comissao__isnull=True) | Q(
data_extincao__isnull=True,
data_fim_comissao__gte=materia.data_apresentacao) | Q(
data_extincao__gte=materia.data_apresentacao,
data_fim_comissao__gte=materia.data_apresentacao)).values_list(
'id', flat=True).distinct()
return Autor.objects.filter(
content_type=content_type,
object_id__in=comissoes_id)
elif content_type.model_class() == Frente:
frentes = Frente.objects.filter(
data_criacao__lte=materia.data_apresentacao)
frentes_id = frentes.filter(Q(
data_extincao__isnull=True) | Q(
data_extincao__gte=materia.data_apresentacao)).values_list(
'id', flat=True).distinct()
return Autor.objects.filter(
content_type=content_type,
object_id__in=frentes_id)
elif content_type.model_class() == Bancada:
bancadas = Bancada.objects.filter(
data_criacao__lte=materia.data_apresentacao)
bancadas_id = bancadas.filter(Q(
data_extincao__isnull=True) | Q(
data_extincao__gte=materia.data_apresentacao)).values_list(
'id', flat=True).distinct()
return Autor.objects.filter(
content_type=content_type,
object_id__in=bancadas_id)
elif content_type.model_class() == Bloco:
blocos = Bloco.objects.filter(
data_criacao__lte=materia.data_apresentacao)
blocos_id = blocos.filter(Q(
data_extincao__isnull=True) | Q(
data_extincao__gte=materia.data_apresentacao)).values_list(
'id', flat=True).distinct()
return Autor.objects.filter(
content_type=content_type,
object_id__in=blocos_id)
elif content_type.model_class() == Orgao:
orgaos_id = Orgao.objects.values_list('id', flat=True)
return Autor.objects.filter(
content_type=content_type,
object_id__in=orgaos_id)
def autores_ativos(materia, tipo=None):
"""
:param materia: é a matéria para na qual a Autoria será inserida
:param tipo: é o tipo de autor que foi selecionado
:return: Lista dos autores ativos disponíveis para serem inseridos
na matéria em questão.
Primeiramente são inseridos em uma lista uma tupla relacionando
cada TipoAutor ao seu ContentType. Posteriormente, para cada elemento
dessa lista são filtrados os autores ativos para aquele ContentType e,
por convêniencia, inseridos em um dicionário no qual a chave é o id
do TipoAutor. Após isso, com a chave 'others' são inseridos os Autores
os quais seu TipoAutor não possui ContentType.
"""
content_types_list = []
for ta in TipoAutor.objects.all():
if ta.content_type:
content_types_list.append((ta.content_type, ta))
autores_by_ct = {}
for ct, ta in content_types_list:
autores_by_ct[str(ta.id)] = filtra_ativos(ct, materia)
ct_list = [c[0] for c in content_types_list]
autores_by_ct['others'] = Autor.objects.exclude(
content_type__in=ct_list).order_by(
'nome'
)
if not tipo:
autor_qs = Autor.objects.none()
for key in autores_by_ct:
autor_qs = autor_qs | autores_by_ct[key]
return (autor_qs | autores_by_ct['others']).order_by('nome')
else:
if not tipo in autores_by_ct:
return autores_by_ct['others'].filter(
tipo_id=tipo).order_by('nome')
return autores_by_ct[tipo].order_by('nome')
def atualizar_autores(request):
if 'materia_id' in request.GET and request.GET['materia_id']:
materia_id = int(request.GET['materia_id'])
try:
materia = MateriaLegislativa.objects.get(id=materia_id)
except ObjectDoesNotExist:
pass
else:
if 'tipo_autor' in request.GET and request.GET['tipo_autor']:
tipo_autor = request.GET['tipo_autor']
autores = autores_ativos(materia, tipo=tipo_autor)
else:
autores = autores_ativos(materia)
empty_option = [('', '---------')]
autores_list = [(a.id, a.__str__()) for a in autores]
return JsonResponse({'lista_autores': empty_option + autores_list})
return JsonResponse({})
class AutoriaCrud(MasterDetailCrud): class AutoriaCrud(MasterDetailCrud):
model = Autoria model = Autoria
parent_field = 'materia' parent_field = 'materia'
@ -1095,24 +1241,67 @@ class AutoriaCrud(MasterDetailCrud):
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super(CreateView, self).get_context_data(**kwargs) context = super(CreateView, self).get_context_data(**kwargs)
autores_ativos = self.autores_ativos()
materia = MateriaLegislativa.objects.get(
id=int(kwargs['root_pk']))
if context['form']['tipo_autor'].data:
autores_ativos_list = autores_ativos(
materia,
context['form']['tipo_autor'].data
)
else:
autores_ativos_list = autores_ativos(materia)
autores = [] autores = []
for a in autores_ativos_list:
autores.append([a.id, a.__str__()])
context['form'].fields['autor'].choices = autores empty_option = [('', '---------')]
context['form'].fields['autor'].choices = empty_option + autores
return context return context
def autores_ativos(self): class UpdateView(MasterDetailCrud.UpdateView):
lista_parlamentares = Parlamentar.objects.filter(ativo=True).values_list('id', flat=True) form_class = AutoriaForm
model_parlamentar = ContentType.objects.get_for_model(Parlamentar)
autor_parlamentar = Autor.objects.filter(content_type=model_parlamentar, object_id__in=lista_parlamentares) @property
def layout_key(self):
lista_comissoes = Comissao.objects.filter(Q(data_extincao__isnull=True)|Q(data_extincao__gt=date.today())).values_list('id', flat=True) return 'AutoriaUpdate'
model_comissao = ContentType.objects.get_for_model(Comissao)
autor_comissoes = Autor.objects.filter(content_type=model_comissao, object_id__in=lista_comissoes) def get_initial(self):
autores_outros = Autor.objects.exclude(content_type__in=[model_parlamentar, model_comissao]) return {
q = autor_parlamentar | autor_comissoes | autores_outros 'tipo_autor': self.object.autor.tipo.id,
return q 'autor': self.object.autor.id,
'primeiro_autor': self.object.primeiro_autor
}
def get_context_data(self, **kwargs):
context = super(UpdateView, self).get_context_data(**kwargs)
materia = MateriaLegislativa.objects.get(
id=int(kwargs['root_pk']))
if context['form']['tipo_autor'].data is None:
autores_ativos_list = autores_ativos(
materia,
str(context['object'].autor.tipo.id))
else:
if context['form']['tipo_autor'].data == '':
autores_ativos_list = autores_ativos(
materia)
else:
autores_ativos_list = autores_ativos(
materia,
context['form']['tipo_autor'].data)
autores = []
for a in autores_ativos_list:
autores.append([a.id, a.__str__()])
empty_option = [('', '---------')]
context['form'].fields['autor'].choices = empty_option + autores
return context
class ListView(MasterDetailCrud.ListView): class ListView(MasterDetailCrud.ListView):

55
sapl/templates/materia/autoria_form.html

@ -4,37 +4,38 @@
{% load common_tags %} {% load common_tags %}
{% block extra_js %} {% block extra_js %}
<script language="Javascript">
function compare(a, b) {
if (a.text < b.text)
return -1;
if (a.text > b.text)
return 1;
return 0;
}
$(document).ready(function() { <script language="Javascript">
$("#id_tipo_autor").change(function() {
$("#id_autor option").remove() function atualizar_autores() {
var selected = $("#id_tipo_autor").val(); var tipo_autor = $("#id_tipo_autor").val();
if (selected !== undefined && selected !== null) { var materia_id = {{ root_pk }};
$.getJSON("/api/autor?tipo=" + selected, function(data){
if (data) { // Limpa a listagem para atualizar
var results = data.results.sort(compare); $("#id_autor").find("option").remove();
if (results.length > 1) {
$("#id_autor").append("<option>-----</option>"); $.get("/materia/autoria/atualizar-autores",
{tipo_autor: tipo_autor, materia_id: materia_id},
function(data) {
// Caso não venha nenhum dado da requisição, retorna null
if ($.isEmptyObject(data)){
return null
} }
$.each(results, function(idx, obj) {
$("#id_autor") lista_autores = data['lista_autores'];
.append($("<option></option>") // Atualiza a listagem de autores
.attr("value", obj.value)
.text(obj.text)); $.each(lista_autores, function(index, obj) {
$("#id_autor").append($("<option></option>")
.attr("value", obj[0])
.text(obj[1]));
}); });
}
}); });
} }
$("#id_tipo_autor").change(function () {
atualizar_autores();
}); });
}); </script>
</script>
{% endblock %} {% endblock %}

Loading…
Cancel
Save