mirror of https://github.com/interlegis/sapl.git
Browse Source
- Autor e TipoAutor migrados para app base. - Foram refatorados para GR - Generic Relations - Em TipoAutor: passou se a apontar também para um ContentType que é usado para contextualização de dados da GR em Autor. - A captura da combo de ContentTypes é feita através do apontamento reverso nos models que se queira disponibilizar conceitualmente como Autor - Em Autor: neste commit, o form de create está em desenvolvimento, com o buscador de possiveis autores baseados na seleção do usuário de TipoAutor que, se não possui ContentType, abre o campo nome para insersão, se possui ContentType, abre caixa de busca com atualização jquery de radiobox's para o usuário selecionar um possível autor. - api rest: para a busca funcionar e como objetivo de futuras implementações em DRF, a app api foi criada, anotada nas configurações gerais de sapl.urls com o prefixo /api. - na api foi criada a uma ListAPIView para pesquisa de possiveis autores baseados no tipo autor enviado, url /api/autor/possiveis/?P<pk>[0-9]*)$ que sem pk devolve a lista de TipoAutor e, com pk, devolve a lista dos registros ligados ao ContentType, filtrados pelo parametro qpull/739/head
LeandroRoberto
8 years ago
35 changed files with 913 additions and 336 deletions
@ -0,0 +1 @@ |
|||
default_app_config = 'sapl.api.apps.AppConfig' |
@ -0,0 +1,8 @@ |
|||
from django import apps |
|||
from django.utils.translation import ugettext_lazy as _ |
|||
|
|||
|
|||
class AppConfig(apps.AppConfig): |
|||
name = 'sapl.api' |
|||
label = 'api' |
|||
verbose_name = _('API Rest') |
@ -0,0 +1,25 @@ |
|||
from rest_framework import serializers |
|||
|
|||
from sapl.comissoes.models import Comissao |
|||
from sapl.parlamentares.models import Parlamentar |
|||
|
|||
|
|||
class ChoiceSerializer(serializers.Serializer): |
|||
pk = serializers.IntegerField() |
|||
display = serializers.SerializerMethodField() |
|||
|
|||
def get_display(self, obj): |
|||
return str(obj) |
|||
""" |
|||
|
|||
class ModelChoiceParlamentarSerializer(ModelChoiceSerializer): |
|||
|
|||
class Meta: |
|||
model = Parlamentar |
|||
|
|||
|
|||
class ModelChoiceComissaoSerializer(ModelChoiceSerializer): |
|||
|
|||
class Meta: |
|||
model = Comissao |
|||
""" |
@ -0,0 +1,20 @@ |
|||
from django.conf.urls import include, url |
|||
from rest_framework.routers import DefaultRouter |
|||
|
|||
from sapl.api.views import TipoAutorContentOfModelContentTypeView |
|||
|
|||
from .apps import AppConfig |
|||
|
|||
|
|||
app_name = AppConfig.name |
|||
|
|||
|
|||
# router = DefaultRouter() |
|||
|
|||
urlpatterns = [ |
|||
url(r'^autor/possiveis/(?P<pk>[0-9]*)$', |
|||
TipoAutorContentOfModelContentTypeView.as_view(), |
|||
name='autores_possiveis_pelo_tipo'), |
|||
] |
|||
|
|||
# urlpatterns += router.urls |
@ -0,0 +1,36 @@ |
|||
from django.http import Http404 |
|||
from rest_framework import mixins, viewsets |
|||
from rest_framework.generics import ListAPIView, GenericAPIView,\ |
|||
get_object_or_404 |
|||
from rest_framework.permissions import IsAuthenticated, AllowAny |
|||
from rest_framework.views import APIView |
|||
from rest_framework.viewsets import ModelViewSet |
|||
|
|||
from sapl.api.serializers import ChoiceSerializer |
|||
from sapl.base.models import Autor, TipoAutor |
|||
|
|||
|
|||
class TipoAutorContentOfModelContentTypeView(ListAPIView): |
|||
serializer_class = ChoiceSerializer |
|||
permission_classes = (AllowAny,) |
|||
queryset = TipoAutor.objects.all() |
|||
model = TipoAutor |
|||
pagination_class = None |
|||
|
|||
def get_queryset(self): |
|||
queryset = ModelViewSet.get_queryset(self) |
|||
if not self.kwargs['pk']: |
|||
return queryset |
|||
|
|||
obj = get_object_or_404(queryset, pk=self.kwargs['pk']) |
|||
|
|||
if not obj.content_type: |
|||
raise Http404 |
|||
|
|||
q = self.request.GET.get('q', None) |
|||
|
|||
if not q: |
|||
return [] |
|||
else: |
|||
return obj.content_type.model_class().objects.filter( |
|||
nome__icontains=q)[:10] |
@ -0,0 +1,55 @@ |
|||
# -*- coding: utf-8 -*- |
|||
# Generated by Django 1.9.7 on 2016-10-09 15:22 |
|||
from __future__ import unicode_literals |
|||
|
|||
from django.conf import settings |
|||
from django.db import migrations, models |
|||
import django.db.models.deletion |
|||
|
|||
|
|||
class Migration(migrations.Migration): |
|||
|
|||
dependencies = [ |
|||
migrations.swappable_dependency(settings.AUTH_USER_MODEL), |
|||
('contenttypes', '0002_remove_content_type_name'), |
|||
('base', '0021_auto_20161006_1019'), |
|||
] |
|||
|
|||
operations = [ |
|||
migrations.CreateModel( |
|||
name='Autor', |
|||
fields=[ |
|||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
|||
('object_id', models.PositiveIntegerField(blank=True, default=None, null=True)), |
|||
('nome', models.CharField(blank=True, max_length=50, verbose_name='Autor')), |
|||
('cargo', models.CharField(blank=True, max_length=50)), |
|||
('content_type', models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.CASCADE, to='contenttypes.ContentType')), |
|||
], |
|||
options={ |
|||
'verbose_name': 'Autor', |
|||
'verbose_name_plural': 'Autores', |
|||
}, |
|||
), |
|||
migrations.CreateModel( |
|||
name='TipoAutor', |
|||
fields=[ |
|||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
|||
('descricao', models.CharField(max_length=50, verbose_name='Descrição')), |
|||
('content_type', models.OneToOneField(default=None, null=True, on_delete=django.db.models.deletion.CASCADE, to='contenttypes.ContentType', verbose_name='Modelo do Tipo de Autor')), |
|||
], |
|||
options={ |
|||
'verbose_name': 'Tipo de Autor', |
|||
'verbose_name_plural': 'Tipos de Autor', |
|||
}, |
|||
), |
|||
migrations.AddField( |
|||
model_name='autor', |
|||
name='tipo', |
|||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='base.TipoAutor', verbose_name='Tipo'), |
|||
), |
|||
migrations.AddField( |
|||
model_name='autor', |
|||
name='user', |
|||
field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), |
|||
), |
|||
] |
@ -0,0 +1,25 @@ |
|||
# -*- coding: utf-8 -*- |
|||
# Generated by Django 1.9.7 on 2016-10-09 21:52 |
|||
from __future__ import unicode_literals |
|||
|
|||
from django.db import migrations, models |
|||
import django.db.models.deletion |
|||
|
|||
|
|||
class Migration(migrations.Migration): |
|||
|
|||
dependencies = [ |
|||
('base', '0022_auto_20161009_1222'), |
|||
] |
|||
|
|||
operations = [ |
|||
migrations.AlterField( |
|||
model_name='tipoautor', |
|||
name='content_type', |
|||
field=models.OneToOneField(default=None, null=True, on_delete=django.db.models.deletion.CASCADE, to='contenttypes.ContentType', verbose_name='Modelagem no SAPL'), |
|||
), |
|||
migrations.AlterUniqueTogether( |
|||
name='autor', |
|||
unique_together=set([('content_type', 'object_id')]), |
|||
), |
|||
] |
@ -0,0 +1,53 @@ |
|||
# -*- coding: utf-8 -*- |
|||
# Generated by Django 1.9.7 on 2016-10-09 15:22 |
|||
from __future__ import unicode_literals |
|||
|
|||
from django.db import migrations, models |
|||
import django.db.models.deletion |
|||
|
|||
|
|||
class Migration(migrations.Migration): |
|||
|
|||
dependencies = [ |
|||
('protocoloadm', '0003_auto_20161009_1222'), |
|||
('materia', '0053_auto_20161004_1854'), |
|||
] |
|||
|
|||
operations = [ |
|||
migrations.RemoveField( |
|||
model_name='autor', |
|||
name='comissao', |
|||
), |
|||
migrations.RemoveField( |
|||
model_name='autor', |
|||
name='parlamentar', |
|||
), |
|||
migrations.RemoveField( |
|||
model_name='autor', |
|||
name='partido', |
|||
), |
|||
migrations.RemoveField( |
|||
model_name='autor', |
|||
name='tipo', |
|||
), |
|||
migrations.RemoveField( |
|||
model_name='autor', |
|||
name='user', |
|||
), |
|||
migrations.AlterField( |
|||
model_name='autoria', |
|||
name='autor', |
|||
field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='base.Autor', verbose_name='Autor'), |
|||
), |
|||
migrations.AlterField( |
|||
model_name='proposicao', |
|||
name='autor', |
|||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='base.Autor'), |
|||
), |
|||
migrations.DeleteModel( |
|||
name='Autor', |
|||
), |
|||
migrations.DeleteModel( |
|||
name='TipoAutor', |
|||
), |
|||
] |
@ -0,0 +1,32 @@ |
|||
# -*- coding: utf-8 -*- |
|||
# Generated by Django 1.9.7 on 2016-10-09 17:18 |
|||
from __future__ import unicode_literals |
|||
|
|||
from django.db import migrations, models |
|||
import django.db.models.deletion |
|||
|
|||
|
|||
class Migration(migrations.Migration): |
|||
|
|||
dependencies = [ |
|||
('base', '0022_auto_20161009_1222'), |
|||
('materia', '0054_auto_20161009_1222'), |
|||
] |
|||
|
|||
operations = [ |
|||
migrations.AddField( |
|||
model_name='materialegislativa', |
|||
name='autores', |
|||
field=models.ManyToManyField(through='materia.Autoria', to='base.Autor'), |
|||
), |
|||
migrations.AlterField( |
|||
model_name='autoria', |
|||
name='autor', |
|||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='base.Autor', verbose_name='Autor'), |
|||
), |
|||
migrations.AlterField( |
|||
model_name='autoria', |
|||
name='materia', |
|||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='materia.MateriaLegislativa', verbose_name='Matéria Legislativa'), |
|||
), |
|||
] |
@ -0,0 +1,26 @@ |
|||
# -*- coding: utf-8 -*- |
|||
# Generated by Django 1.9.7 on 2016-10-09 15:22 |
|||
from __future__ import unicode_literals |
|||
|
|||
from django.db import migrations, models |
|||
import django.db.models.deletion |
|||
|
|||
|
|||
class Migration(migrations.Migration): |
|||
|
|||
dependencies = [ |
|||
('protocoloadm', '0002_delete_tipoinstituicao'), |
|||
] |
|||
|
|||
operations = [ |
|||
migrations.AlterField( |
|||
model_name='documentoadministrativo', |
|||
name='autor', |
|||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='base.Autor'), |
|||
), |
|||
migrations.AlterField( |
|||
model_name='protocolo', |
|||
name='autor', |
|||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='base.Autor'), |
|||
), |
|||
] |
@ -0,0 +1,33 @@ |
|||
from django.core.paginator import EmptyPage |
|||
from rest_framework import pagination |
|||
from rest_framework.response import Response |
|||
|
|||
|
|||
class StandardPagination(pagination.PageNumberPagination): |
|||
page_size = 10 |
|||
page_size_query_param = 'page_size' |
|||
max_page_size = 50 |
|||
|
|||
def get_paginated_response(self, data): |
|||
try: |
|||
previous_page_number = self.page.previous_page_number() |
|||
except EmptyPage: |
|||
previous_page_number = None |
|||
|
|||
try: |
|||
next_page_number = self.page.next_page_number() |
|||
except EmptyPage: |
|||
next_page_number = None |
|||
|
|||
return Response({ |
|||
'pagination': { |
|||
'previous_page': previous_page_number, |
|||
'next_page': next_page_number, |
|||
'start_index': self.page.start_index(), |
|||
'end_index': self.page.end_index(), |
|||
'total_entries': self.page.paginator.count, |
|||
'total_pages': self.page.paginator.num_pages, |
|||
'page': self.page.number, |
|||
}, |
|||
'models': data, |
|||
}) |
@ -0,0 +1,61 @@ |
|||
{% extends "crud/form.html" %} |
|||
{% load i18n %} |
|||
{% block extra_js %} |
|||
|
|||
<script type="text/javascript"> |
|||
|
|||
$(document).ready(function(){ |
|||
var active = function(str) { |
|||
if (str == 'nome') { |
|||
$('#id_q').val(''); |
|||
$('#div_id_nome').removeClass('hidden'); |
|||
$("[data-application='AutorSearch']").addClass('hidden'); |
|||
$("#div_id_content_object .controls").html(''); |
|||
} |
|||
else { |
|||
$('#id_nome').val(''); |
|||
$('#div_id_nome').addClass('hidden'); |
|||
$("[data-application='AutorSearch']").removeClass('hidden'); |
|||
} |
|||
} |
|||
var update_search = function(pk) { |
|||
var q = $('#id_q').val(); |
|||
var url = '{% url 'sapl.api:autores_possiveis_pelo_tipo' 0 %}' |
|||
url = url.replace('0', pk); |
|||
|
|||
var formData = { |
|||
'q' : q, |
|||
'format' : 'json', |
|||
} |
|||
$.get(url, formData).done(function(data) { |
|||
var radios = $("#div_id_content_object .controls").html(''); |
|||
active('pesquisa'); |
|||
data.forEach(function (val, index) { |
|||
var html_radio = '<div class="radio"><label><input type="radio" name="content_object" id="id_content_object_'+index+'" value="'+val.pk+'">'+val.display+'</label></div>'; |
|||
radios.append(html_radio); |
|||
}); |
|||
}).fail(function(data) { |
|||
active('nome'); |
|||
}); |
|||
} |
|||
|
|||
$('#id_tipo').change(function(event) { |
|||
if (event.target.selectedIndex == 0) { |
|||
$('#id_nome, #id_q').val(''); |
|||
active('nome'); |
|||
} |
|||
else { |
|||
var pk = this[event.target.selectedIndex].value; |
|||
update_search(pk); |
|||
} |
|||
}); |
|||
$('.btn-filtrar-autor').click(function(event) { |
|||
var pk = $('#id_tipo').val(); |
|||
update_search(pk); |
|||
}); |
|||
}); |
|||
|
|||
|
|||
</script> |
|||
|
|||
{% endblock %} |
@ -0,0 +1,20 @@ |
|||
{% extends "crud/form.html" %} |
|||
{% load i18n %} |
|||
{% block extra_js %} |
|||
|
|||
<script type="text/javascript"> |
|||
|
|||
$(document).ready(function(){ |
|||
|
|||
$('#id_content_type').change(function(event) { |
|||
if (event.target.selectedIndex == 0) |
|||
$('#id_descricao').val(''); |
|||
else |
|||
$('#id_descricao').val(this[event.target.selectedIndex].text); |
|||
}); |
|||
}); |
|||
|
|||
|
|||
</script> |
|||
|
|||
{% endblock %} |
Loading…
Reference in new issue