nanterre: add journal web-services

This commit is contained in:
Benjamin Dauvergne 2017-03-02 16:58:09 +01:00
parent 4917207f0e
commit f6b969d6d7
3 changed files with 74 additions and 3 deletions

View File

@ -5,7 +5,7 @@ import datetime
from django.core.urlresolvers import reverse
from zoo.zoo_data.models import Entity, Relation
from zoo.zoo_data.models import Entity, Relation, Log
from zoo.zoo_nanterre.utils import PersonSearch
@ -188,3 +188,23 @@ def test_create_individu(app, rsu_schema):
assert Relation.objects.filter(schema__slug='habite').count() == 3
assert Relation.objects.filter(schema__slug='responsabilite-legale').count() == 2
assert Relation.objects.filter(schema__slug='union').count() == 1
# journal
journal_url = reverse('rsu-api-journal', kwargs={'identifier': first_id})
for i in range(30):
response = app.post_json(journal_url, {
'id': i,
})
assert response.json['err'] == 0
assert Log.objects.filter(entity__id=first_id)[0].content['id'] == i
response = app.get(journal_url + '?limit=10')
assert response.json['err'] == 0
assert len(response.json['data']) == 10
assert 'more' in response.json
print response.json
assert [d['content']['id'] for d in response.json['data']] == range(29, 19, -1)
response = app.get(response.json['more'])
assert [d['content']['id'] for d in response.json['data']] == range(19, 9, -1)
response = app.get(response.json['more'])
assert [d['content']['id'] for d in response.json['data']] == range(9, -1, -1)
assert 'more' not in response.json

View File

@ -3,13 +3,14 @@ import isodate
from django.shortcuts import get_object_or_404
from django.db.models.query import Q
from django.db.transaction import non_atomic_requests, atomic
from django.core.urlresolvers import reverse
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import serializers
from zoo.zoo_meta.models import EntitySchema, RelationSchema
from zoo.zoo_data.models import Entity, Relation, Transaction
from zoo.zoo_data.models import Entity, Relation, Transaction, Log
from . import utils
@ -506,5 +507,54 @@ class DeclarationUnion(APIView):
'err': 0,
})
declaration_union = DeclarationUnion.as_view()
class JournalView(APIView):
def get(self, request, identifier, format=None):
qs = Entity.objects.prefetch_related(
'left_relations__schema', 'left_relations__right',
'right_relations__schema', 'right_relations__left',
)
individu = get_object_or_404(qs, schema__slug='individu', id=identifier)
try:
limit = int(request.GET.get('limit', ''))
except ValueError:
limit = 10
try:
cookie = int(request.GET.get('cookie', ''))
except ValueError:
cookie = 0
limit = min(limit, 100)
qs = Log.objects.filter(entity=individu)
if cookie:
qs = qs.filter(id__lt=cookie)
qs = qs[:limit + 1]
data = [{'timestamp': log.timestamp.isoformat(), 'content': log.content}
for log in qs[:limit]]
content = {
'err': 0,
'data': data,
}
if len(qs) > limit:
max_id = min(log.id for log in qs[:limit])
more_url = request.build_absolute_uri(
reverse('rsu-api-journal', kwargs={'identifier': individu.id}))
more_url += '?limit=%d&cookie=%s' % (limit, max_id)
content['more'] = more_url
return Response(content)
def post(self, request, identifier, format=None):
qs = Entity.objects.prefetch_related(
'left_relations__schema', 'left_relations__right',
'right_relations__schema', 'right_relations__left',
)
individu = get_object_or_404(qs, schema__slug='individu', id=identifier)
Log.objects.create(
entity=individu,
content=request.data)
return Response({
'err': 0,
})
journal = JournalView.as_view()

View File

@ -8,6 +8,7 @@ urlpatterns = [
url(r'^demo/search/$', search, name='demo'),
url(r'^search/$', api_views.search, name='rsu-api-search'),
url(r'^individu/(?P<identifier>\d+)/$', api_views.reseau, name='rsu-api-reseau'),
url(r'^individu/(?P<identifier>\d+)/journal/$', api_views.journal, name='rsu-api-journal'),
url(r'^individu/(?P<identifier>\d+)/declaration-responsabilite-legale/$',
api_views.declaration_responsabilite_legale,
name='rsu-api-declaration-responsabilite-legale'),