Skip to content

Commit

Permalink
Merge 5239f1c into ee75344
Browse files Browse the repository at this point in the history
  • Loading branch information
aniversarioperu committed Jul 14, 2015
2 parents ee75344 + 5239f1c commit da94b7b
Show file tree
Hide file tree
Showing 8 changed files with 121 additions and 31 deletions.
3 changes: 1 addition & 2 deletions proyectos_de_ley/api/serializers.py
Expand Up @@ -16,8 +16,7 @@ class Meta:


class CongresistaSerializer(serializers.Serializer):
resultado = serializers.ListField(
)
resultado = serializers.ListField()
numero_de_congresistas = serializers.IntegerField()


Expand Down
36 changes: 24 additions & 12 deletions proyectos_de_ley/api/tests.py
Expand Up @@ -39,55 +39,67 @@ def setUp(self):
self.c = Client()

def test_getting_proyecto(self):
response = self.c.get('/api/proyecto/03774-2011/')
response = self.c.get('/api/proyecto.json/03774-2011/')
result = json.loads(response.content.decode('utf-8'))
expected = "03774"
self.assertEqual(expected, result['codigo'])

def test_getting_proyecto_missing(self):
response = self.c.get('/api/proyecto/037740-2011/')
response = self.c.get('/api/proyecto.json/037740-2011/')
result = response.content.decode('utf-8')
expected = '{"error": "proyecto no existe"}'
self.assertEqual(expected, result)

def test_getting_projects_of_person(self):
response = self.c.get('/api/congresista/Dammert Ego/')
response = self.c.get('/api/congresista.json/Dammert Ego/')
result = json.loads(response.content.decode('utf-8'))
expected = 'Dammert Ego Aguirre, Manuel Enrique Ernesto'
self.assertEqual(expected, result['resultado'][0]['nombre'])

def test_getting_projects_of_person_csv(self):
response = self.c.get('/api/congresista.csv/Dammert Ego/')
result = response.content.decode('utf-8')
expected = 'Dammert Ego Aguirre, Manuel Enrique Ernesto'
self.assertTrue(expected in result)

def test_getting_projects_of_person_and_comission(self):
response = self.c.get('/api/congresista_y_comision/Dammert Ego/economia/')
response = self.c.get('/api/congresista_y_comision.json/Dammert Ego/economia/')
result = json.loads(response.content.decode('utf-8'))
expected = ['03774-2011']
self.assertEqual(expected, result['resultado'][0]['proyectos'])

def test_not_enough_names_to_search_for_person(self):
response = self.c.get('/api/congresista/Dammert/')
response = self.c.get('/api/congresista.json/Dammert/')
result = json.loads(response.content.decode('utf-8'))
expected = 'ingrese un nombre y un apellido'
self.assertEqual(expected, result['error'])

def test_not_enough_names_to_search_for_person_in_comision(self):
response = self.c.get('/api/congresista_y_comision/Dammert/economia/')
response = self.c.get('/api/congresista_y_comision.json/Dammert/economia/')
result = json.loads(response.content.decode('utf-8'))
expected = 'ingrese un nombre y un apellido'
self.assertEqual(expected, result['error'])

def test_person_cannot_be_found(self):
response = self.c.get('/api/congresista/Aus Bus/')
response = self.c.get('/api/congresista.json/Aus Bus/')
result = json.loads(response.content.decode('utf-8'))
expected = 'no se pudo encontrar congresista'
self.assertEqual(expected, result['error'])

def test_person_name_incomplete(self):
response = self.c.get('/api/congresista/Bus/')
response = self.c.get('/api/congresista.json/Bus/')
result = json.loads(response.content.decode('utf-8'))
expected = 'ingrese un nombre y un apellido'
self.assertEqual(expected, result['error'])

def test_person_name_incomplete_csv(self):
response = self.c.get('/api/congresista.csv/Bus/')
result = response.content.decode('utf-8')
expected = 'error,ingrese un nombre y un apellido'
self.assertEqual(expected, result)

def test_exonerados_dictamen_empty(self):
response = self.c.get('/api/exonerados_dictamen/')
response = self.c.get('/api/exonerados_dictamen.json/')
result = json.loads(response.content.decode('utf-8'))
expected = {'error': 'no se encontraron resultados'}
self.assertEqual(expected, result)
Expand All @@ -96,13 +108,13 @@ def test_exonerados_dictamen(self):
Seguimientos(proyecto=self.p,
evento='exoneración de dictamen',
fecha='2010-10-10').save()
response = self.c.get('/api/exonerados_dictamen/')
response = self.c.get('/api/exonerados_dictamen.json/')
result = json.loads(response.content.decode('utf-8'))
expected = {'resultado': ['03774-2011']}
self.assertEqual(expected, result)

def test_exonerados_2da_votacion_empty(self):
response = self.c.get('/api/exonerados_2da_votacion/')
response = self.c.get('/api/exonerados_2da_votacion.json/')
result = json.loads(response.content.decode('utf-8'))
expected = {'error': 'no se encontraron resultados'}
self.assertEqual(expected, result)
Expand All @@ -111,7 +123,7 @@ def test_exonerados_2da_votacion(self):
Seguimientos(proyecto=self.p,
evento='dispensado 2da',
fecha='2010-10-10').save()
response = self.c.get('/api/exonerados_2da_votacion/')
response = self.c.get('/api/exonerados_2da_votacion.json/')
result = json.loads(response.content.decode('utf-8'))
expected = {'resultado': ['03774-2011']}
self.assertEqual(expected, result)
11 changes: 6 additions & 5 deletions proyectos_de_ley/api/urls.py
Expand Up @@ -5,9 +5,10 @@

urlpatterns = patterns(
'',
url(r'^proyecto/(?P<codigo>[0-9]+\-[0-9]+)/$', views.proyecto),
url(r'^congresista/(?P<nombre_corto>.+)/$', views.congresista),
url(r'^congresista_y_comision/(?P<nombre_corto>.+)/(?P<comision>.+)/$', views.congresista_y_comision),
url(r'^exonerados_dictamen/$', views.exonerados_dictamen),
url(r'^exonerados_2da_votacion/$', views.exonerados_2da_votacion),
url(r'^proyecto.json/(?P<codigo>[0-9]+\-[0-9]+)/$', views.proyecto),
url(r'^congresista.json/(?P<nombre_corto>.+)/$', views.congresista),
url(r'^congresista.csv/(?P<nombre_corto>.+)/$', views.congresista_csv),
url(r'^congresista_y_comision.json/(?P<nombre_corto>.+)/(?P<comision>.+)/$', views.congresista_y_comision),
url(r'^exonerados_dictamen.json/$', views.exonerados_dictamen),
url(r'^exonerados_2da_votacion.json/$', views.exonerados_2da_votacion),
)
83 changes: 80 additions & 3 deletions proyectos_de_ley/api/views.py
Expand Up @@ -6,8 +6,10 @@
from django.db.models import Q
from rest_framework.decorators import api_view
from rest_framework.decorators import permission_classes
from rest_framework.decorators import renderer_classes
from rest_framework.permissions import AllowAny
from rest_framework.renderers import JSONRenderer
from rest_framework_csv import renderers

from pdl.models import Proyecto
from pdl.models import Seguimientos
Expand All @@ -28,6 +30,29 @@ def __init__(self, data, **kwargs):
super(JSONResponse, self).__init__(content, **kwargs)


class CSVResponse(HttpResponse):
"""
An HttpResponse that renders its content into CSV.
"""
def __init__(self, data, **kwargs):
content = CSVRenderer().render(data)
kwargs['content_type'] = 'text/csv'
super(CSVResponse, self).__init__(content, **kwargs)


class CSVRenderer(renderers.CSVRenderer):
media_type = 'text/csv'
format = 'csv'

def render(self, data, media_type=None, renderer_context=None):
data_to_csv = []
for i in data['resultado']:
data_to_csv.append({'nombre': i['nombre']})
for p in i['proyectos']:
data_to_csv.append({'proyecto': p})
return super(CSVRenderer, self).render(data_to_csv, media_type, renderer_context)


@api_view(['GET'])
@permission_classes((AllowAny, ))
def proyecto(request, codigo):
Expand Down Expand Up @@ -68,7 +93,13 @@ def congresista(request, nombre_corto):
# Por ejemplo:
* <http://proyectosdeley.pe/api/congresista/Manuel+Zerillo/>
* <http://proyectosdeley.pe/api/congresista.json/Manuel+Zerillo/>
# Puedes obtener los resultados en archivo CSV (fácil de importar a MS Excel)
Solo es necesario usar la dirección `congresista.csv`:
* <http://proyectosdeley.pe/api/congresista.csv/Manuel+Zerillo/>
---
type:
nombre_corto:
Expand Down Expand Up @@ -105,6 +136,52 @@ def congresista(request, nombre_corto):
return JSONResponse(serializer.data)


@permission_classes((AllowAny,))
@renderer_classes((CSVRenderer,))
def congresista_csv(request, nombre_corto):
"""
Lista proyectos de ley de cada congresista.
# Por ejemplo:
* <http://proyectosdeley.pe/api/congresista.csv/Manuel+Zerillo/>
---
type:
nombre_corto:
required: true
type: string
omit_serializer: true
parameters:
- name: nombre_corto
description: Nombre y apellido del congresista, por ejemplo<br /> Manuel+Zerillo
type: string
paramType: path
required: true
"""
nombre_corto = nombre_corto.replace('+', ' ')
names = find_name_from_short_name(nombre_corto)

if '---error---' in names:
msg = 'error,{}'.format(names[1])
return HttpResponse(msg, content_type='text/csv')

projects_and_person = []
for name in names:
queryset = Proyecto.objects.filter(congresistas__icontains=name).order_by('-codigo')
projects_list = [str(i.codigo) + '-2011' for i in queryset]
obj = {'nombre': name, 'proyectos': projects_list}
projects_and_person.append(obj)

data = {
'resultado': projects_and_person,
'numero_de_congresistas': len(projects_and_person),
}
if request.method == 'GET':
serializer = CongresistaSerializer(data)
return CSVResponse(serializer.data)


@api_view(['GET'])
@permission_classes((AllowAny, ))
def congresista_y_comision(request, nombre_corto, comision):
Expand All @@ -113,8 +190,8 @@ def congresista_y_comision(request, nombre_corto, comision):
# Por ejemplo:
* <http://proyectosdeley.pe/api/congresista/Manuel+Zerillo/>
* <http://proyectosdeley.pe/api/congresista/Manuel+Zerillo/Economía/>
* <http://proyectosdeley.pe/api/congresista.json/Manuel+Zerillo/>
* <http://proyectosdeley.pe/api/congresista.json/Manuel+Zerillo/Economía/>
---
type:
nombre_corto:
Expand Down
4 changes: 2 additions & 2 deletions proyectos_de_ley/proyectos_de_ley/urls.py
Expand Up @@ -22,8 +22,8 @@
url(r'^sitemap\.xml$', sitemap, {'sitemaps': sitemaps},
name='django.contrib.sitemaps.views.sitemap'),

url(r'^api/seguimientos/(?P<codigo>[0-9]+\-[0-9]+)/$', seg_views.seguimientos_list),
url(r'^api/iniciativas/(?P<codigo>[0-9a-z]+\-[0-9]+)/$', seg_views.iniciativa_list),
url(r'^api/seguimientos.json/(?P<codigo>[0-9]+\-[0-9]+)/$', seg_views.seguimientos_list),
url(r'^api/iniciativas.json/(?P<codigo>[0-9a-z]+\-[0-9]+)/$', seg_views.iniciativa_list),
url(r'^api/', include('api.urls')),

url(r'^search-advanced/', include('search_advanced.urls')),
Expand Down
Expand Up @@ -183,7 +183,7 @@ <h1 id="proyectos_de_ley">Proyecto de Ley {{ item.codigo }}</h1>
<script type="text/javascript" src="{% static 'js/storyjs-embed.js' %}"></script>

<script>
$.getJSON("/api/iniciativas/{{ friendly_code }}", function(data) {
$.getJSON("/api/iniciativas.json/{{ friendly_code }}", function(data) {
var items = [];
$.each(data.iniciativas, function(k, v) {
items.push("<a href='" + v.url + "' title='Proyecto " + v.codigo + "'>" + v.codigo + "</a>")
Expand All @@ -194,7 +194,7 @@ <h1 id="proyectos_de_ley">Proyecto de Ley {{ item.codigo }}</h1>

<script>
$(document).ready(function() {
$.getJSON("/api/seguimientos/{{ friendly_code }}", function(data) {
$.getJSON("/api/seguimientos.json/{{ friendly_code }}", function(data) {
createStoryJS({
type: 'timeline',
width: '100%',
Expand Down
10 changes: 5 additions & 5 deletions proyectos_de_ley/seguimientos/tests/test_api.py
Expand Up @@ -46,35 +46,35 @@ def setUp(self):
self.c = Client()

def test_api_seguimientos(self):
response = self.c.get('/api/seguimientos/03774-2011/')
response = self.c.get('/api/seguimientos.json/03774-2011/')
as_string = response.content.decode("utf-8")
result = json.loads(as_string)
expected = "Proyecto No: 03774_2014-CR"
self.assertEqual(expected, result['timeline']['text'])

def test_api_seguimientos_missing(self):
response = self.c.get('/api/seguimientos/0377400-2011/')
response = self.c.get('/api/seguimientos.json/0377400-2011/')
as_string = response.content.decode("utf-8")
result = json.loads(as_string)
expected = "proyecto no existe"
self.assertEqual(expected, result['error'])

def test_api_iniciativas(self):
response = self.c.get('/api/iniciativas/03775-2011/')
response = self.c.get('/api/iniciativas.json/03775-2011/')
as_string = response.content.decode("utf-8")
result = json.loads(as_string)
expected = '03774'
self.assertEqual(expected, result['iniciativas'][0]['codigo'])

def test_api_iniciativas_missing(self):
response = self.c.get('/api/iniciativas/03774-2011/')
response = self.c.get('/api/iniciativas.json/03774-2011/')
as_string = response.content.decode("utf-8")
result = json.loads(as_string)
expected = 'sin iniciativas agrupadas'
self.assertEqual(expected, result['error'])

def test_api_iniciativas_missing_proyecto(self):
response = self.c.get('/api/iniciativas/000003770000-2011/')
response = self.c.get('/api/iniciativas.json/000003770000-2011/')
as_string = response.content.decode("utf-8")
result = json.loads(as_string)
expected = 'proyecto no existe'
Expand Down
1 change: 1 addition & 0 deletions requirements/base.txt
Expand Up @@ -9,6 +9,7 @@ PyYAML==3.11
Unipath==1.0
django-haystack==2.4.0
djangorestframework==3.1.3
djangorestframework-csv==1.3.4
django-rest-swagger==0.3.2
elasticsearch==1.4.0

0 comments on commit da94b7b

Please sign in to comment.