nanterre: utilise le timestamp pour le cookie de pagination du journal (fixes #18145)

Cela améliorer la cohérence de la pagination du journal.
This commit is contained in:
Benjamin Dauvergne 2018-01-15 12:02:01 +01:00
parent cd1b31dcf6
commit 7fac631cfe
4 changed files with 57 additions and 16 deletions

View File

@ -5,6 +5,7 @@ import datetime
import isodate
import requests
import threading
import urlparse
import httmock
@ -648,16 +649,25 @@ def test_create_individu(transactional_db, app, rsu_schema):
assert response.json['err'] == 0
assert Log.objects.filter(entity__id=first_id)[0].content['id'] == i
qs = Log.objects.filter(entity__id=first_id)
more = journal_url + '?limit=10'
for i in range(10):
count = 0
all_data = []
while more:
response = app.get(more)
assert response.json['err'] == 0
if 'more' not in response.json:
break
assert len(response.json['data']) == 10
more = response.json['more']
assert 'cookie' in response.json
assert response.json['cookie'] in response.json['more']
assert len(response.json['data'])
count += len(response.json['data'])
all_data.extend(response.json['data'])
more = response.json.get('more')
if more:
assert 'cookie' in response.json
parsed = urlparse.urlparse(response.json['more'])
query = parsed.query
assert urlparse.parse_qs(query)['cookie'] == [response.json['cookie']]
assert sorted(d['id'] for d in all_data) == sorted(qs.values_list('id', flat=True))
assert count == qs.count()
assert 'more' not in response.json
# lecture avec filtrage

View File

@ -0,0 +1,19 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.9 on 2018-01-15 10:41
from __future__ import unicode_literals
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('zoo_data', '0007_remove_log_url'),
]
operations = [
migrations.AlterModelOptions(
name='log',
options={'ordering': ('-timestamp', 'id'), 'verbose_name': 'log', 'verbose_name_plural': 'logs'},
),
]

View File

@ -207,7 +207,7 @@ class Log(models.Model):
verbose_name=_('content'))
class Meta:
ordering = ('-timestamp', '-id')
ordering = ('-timestamp', 'id')
verbose_name = _('log')
verbose_name_plural = _('logs')

View File

@ -816,27 +816,39 @@ class JournalView(IndividuViewMixin, APIView):
except ValueError:
limit = 10
try:
cookie = int(request.GET.get('cookie', ''))
except ValueError:
cookie = 0
cookie = request.GET.get('cookie', '')
timestamp, last_id = cookie.split('_', 1)
timestamp = isodate.parse_datetime(timestamp)
last_id = int(last_id)
except:
cookie = None
limit = min(limit, 100)
qs = Log.objects.filter(entity=individu)
qs = qs.order_by('-timestamp', 'id')
if filters:
qs = qs.filter(**filters)
if cookie:
qs = qs.filter(id__lt=cookie)
qs = qs.filter(Q(timestamp__lt=timestamp) |
Q(timestamp=timestamp, id__gt=last_id))
qs = qs[:limit + 1]
data = [{'timestamp': log.timestamp.isoformat(), 'content': log.content}
for log in qs[:limit]]
data = [
{
'id': log.id,
'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])
timestamp = qs[limit-1].timestamp.isoformat()
last_id = qs[limit-1].id
cookie = '%s_%s' % (timestamp, last_id)
more_url = request.build_absolute_uri(
reverse('rsu-api-journal', kwargs={'identifier': individu.id}))
cookie = str(max_id)
more_url += '?' + urlencode({'limit': limit, 'cookie': cookie})
content['cookie'] = cookie
content['more'] = more_url