def pagination_ajax(request): if not request.is_ajax(): return Http404() try: value, pk = serializers.page_key(request.GET.get('p', '')) except serializers.InvalidPage: return Http404() try: page = paginator.paginate(query_set=Article.objects.all(), lookup_field='-date', value=value, pk=pk, per_page=20, move_to=paginator.NEXT_PAGE) except paginator.EmptyPage: data = {'error': "this page is empty"} else: data = { 'articles': [{ 'title': article.title } for article in page], 'has_next': page.has_next(), 'has_prev': page.has_previous(), 'next_objects_left': page.next_objects_left(limit=100), 'prev_objects_left': page.prev_objects_left(limit=100), 'next_pages_left': page.next_pages_left(limit=100), 'prev_pages_left': page.prev_pages_left(limit=100), 'next_page': serializers.to_page_key(**page.next_page()), 'prev_page': serializers.to_page_key(**page.prev_page()) } return HttpResponse(json.dumps(data), content_type="application/json")
def pagination_ajax(request): if not request.is_ajax(): return Http404() try: value, pk = serializers.page_key(request.GET.get('p', '')) except serializers.InvalidPage: return Http404() try: page = paginator.paginate( query_set=Article.objects.all(), lookup_field='-date', value=value, pk=pk, per_page=20, move_to=paginator.NEXT_PAGE) except paginator.EmptyPage: data = {'error': "this page is empty"} else: data = { 'articles': [{'title': article.title} for article in page], 'has_next': page.has_next(), 'has_prev': page.has_previous(), 'next_objects_left': page.next_objects_left(limit=100), 'prev_objects_left': page.prev_objects_left(limit=100), 'next_pages_left': page.next_pages_left(limit=100), 'prev_pages_left': page.prev_pages_left(limit=100), 'next_page': serializers.to_page_key(**page.next_page()), 'prev_page': serializers.to_page_key(**page.prev_page())} return HttpResponse(json.dumps(data), content_type="application/json")
def test_paginate(self): # first page req = RequestFactory().get('/') page = infinite_paginator.paginate(req, self.queryset, per_page=15, lookup_field="date") page_last = list(self.queryset[:15])[-1] self.assertEqual(page.next_page(), { 'pk': page_last.pk, 'value': page_last.date }) # second page page_last = list(self.queryset[:15])[-1] param = to_page_key(value=page_last.date, pk=page_last.pk) req = RequestFactory().get('/?p=%s' % param) page = infinite_paginator.paginate(req, self.queryset, per_page=15, lookup_field="date", page_var='p') second_page_last = list(self.queryset[15:30])[-1] self.assertEqual(page.next_page(), { 'pk': second_page_last.pk, 'value': second_page_last.date }) # invalid (id) page last = self.queryset.order_by("-date").last() param = to_page_key(value=last.date - timedelta(days=123), pk=last.pk) req = RequestFactory().get('/?p=%s' % param) self.assertRaises(Http404, infinite_paginator.paginate, req, self.queryset, per_page=15, lookup_field="date", page_var='p') # empty page valid = self.queryset.last() param = to_page_key(value=valid.date, pk=valid.pk) req = RequestFactory().get('/?p=%s' % param) self.assertRaises(Http404, infinite_paginator.paginate, req, self.queryset.none(), per_page=15, lookup_field="date", page_var='p') # empty first page req = RequestFactory().get('/') page = infinite_paginator.paginate(req, self.queryset.none(), per_page=15, lookup_field="date") self.assertEqual(len(page), 0)
def test_page_key_to_page_key_naive(self): # The datetime naive version should work too, # but we can't compare the string key because # it vary depending on the platform dt = datetime.datetime( year=2012, month=3, day=9, hour=22, minute=30, second=40, microsecond=123123) self.assertEqual( serializers.page_key( serializers.to_page_key( *serializers.page_key( serializers.to_page_key(value=dt, pk=1)))), (dt, '1'))
def test_page_key_to_page_key_tight_api(self): tz = pytz.timezone('UTC') dt = tz.localize(datetime.datetime( year=2012, month=3, day=9, hour=22, minute=30, second=40, microsecond=123123)) self.assertEqual( serializers.to_page_key( *serializers.page_key( serializers.to_page_key(value=dt, pk=1))), '1331332240.123123-1') self.assertEqual( serializers.to_page_key( *serializers.page_key( serializers.to_page_key(value=None, pk=None))), '')
def test_topic_notification_list_unread(self): """ topic notification list """ topic = utils.create_topic(self.category, user=self.user2) comment = utils.create_comment(topic=topic, user=self.user2) topic_notification = TopicNotification.objects.create(user=self.user, topic=topic, comment=comment, is_active=True, action=COMMENT) utils.login(self) response = self.client.get( reverse('spirit:topic:notification:index-unread')) self.assertEqual(list(response.context['page']), [topic_notification, self.topic_notification]) # fake next page response = self.client.get( reverse('spirit:topic:notification:index-unread'), { 'p': to_page_key(value=topic_notification.date, pk=topic_notification.pk) }) self.assertEqual(list(response.context['page']), [ self.topic_notification, ])
def test_to_page_key_microseconds(self): tz = pytz.timezone('UTC') dt = tz.localize(datetime.datetime( year=2012, month=3, day=9, hour=22, minute=30, second=40, microsecond=0)) self.assertEqual( serializers.to_page_key(value=dt, pk=1), '1331332240.000000-1')
def test_topic_unread_list_invalid_page(self): utils.login(self) last = TopicUnread.objects.order_by("pk").last() response = self.client.get( reverse('spirit:topic:unread:index'), {'p': to_page_key( value=last.topic.last_active + timedelta(days=123), pk=last.topic.pk)}) self.assertEqual(response.status_code, 404)
def test_page_key_to_page_key(self): tz = pytz.timezone('UTC') dt = tz.localize(datetime.datetime( year=2012, month=3, day=9, hour=22, minute=30, second=40, microsecond=123123)) key = serializers.to_page_key(value=dt, pk=1) self.assertEqual(key, '1331332240.123123-1') page_dt, page_key = serializers.page_key(key) self.assertEqual(page_dt, dt) self.assertEqual(page_key, '1')
def test_last_page(self): articles = list(Article.objects.all().order_by("-date", "-pk")) art = articles[20] page = serializers.to_page_key(value=art.date, pk=art.pk) response = self.client.get( reverse('pagination-ajax') + '?p={}'.format(page), HTTP_X_REQUESTED_WITH='XMLHttpRequest') res = json.loads(response.content.decode('utf-8')) self.assertEqual( res['articles'], [{'title': a.title} for a in articles[21:]])
def test_page_key_to_page_key_buenos_aires(self): tz = pytz.timezone('UTC') dt = tz.localize(datetime.datetime( year=2012, month=3, day=9, hour=22, minute=30, second=40, microsecond=123123)) bs_as = pytz.timezone('America/Argentina/Buenos_Aires') key = serializers.to_page_key(value=dt.astimezone(bs_as), pk=1) self.assertEqual(key, '1331332240.123123-1') page_dt, page_key = serializers.page_key(key) self.assertEqual(page_dt, dt) self.assertEqual(page_key, '1')
def index(request): # TODO: add button to clean up read topics? or read all? # redirect to first page if empty topics = (Topic.objects.for_access(user=request.user).for_unread( user=request.user).with_bookmarks(user=request.user)) page = paginate(request, query_set=topics, lookup_field="last_active", page_var='p') context = {'page': page, 'next_page': to_page_key(**page.next_page())} return render(request, 'spirit/topic/unread/index.html', context)
def index_unread(request): notifications = (TopicNotification.objects.for_access( request.user).filter(is_read=False).with_related_data()) page = paginate(request, query_set=notifications, lookup_field='date', page_var='p', per_page=settings.ST_NOTIFICATIONS_PER_PAGE) return render(request=request, template_name='spirit/topic/notification/index_unread.html', context={ 'page': page, 'next_page': to_page_key(**page.next_page()) })
def index(request): # TODO: add button to clean up read topics? or read all? # redirect to first page if empty loggedinuser = request.user profile = Profile.objects.get(user=loggedinuser) if profile.is_allowed == True: topics = (Topic.objects.for_access(user=request.user).for_unread( user=request.user).with_bookmarks(user=request.user)) page = paginate(request, query_set=topics, lookup_field="last_active", page_var='p') context = {'page': page, 'next_page': to_page_key(**page.next_page())} return render(request, 'spirit/topic/unread/index.html', context) else: return HttpResponseRedirect('/')
def test_topic_unread_list(self): """ topic unread list """ (TopicUnread.objects.filter( pk__in=[self.topic_unread.pk, self.topic_unread2.pk]).update( is_read=False)) utils.login(self) response = self.client.get(reverse('spirit:topic:unread:index')) self.assertEqual(list(response.context['page']), [self.topic2, self.topic]) # fake next page response = self.client.get(reverse('spirit:topic:unread:index'), { 'p': to_page_key(value=self.topic2.last_active, pk=self.topic2.pk) }) self.assertEqual(list(response.context['page']), [self.topic])
def index_unread(request): loggedinuser = request.user profile = Profile.objects.get(user=loggedinuser) notifications = (TopicNotification.objects.for_access( request.user).filter(is_read=False).with_related_data()) page = paginate(request, query_set=notifications, lookup_field='date', page_var='p', per_page=settings.ST_NOTIFICATIONS_PER_PAGE) context = { 'page': page, 'next_page': to_page_key(**page.next_page()), 'profile': profile, } return render(request, 'spirit/topic/notification/index_unread.html', context)