示例#1
0
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")
示例#3
0
    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)
示例#4
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'))
示例#5
0
 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))),
         '')
示例#6
0
    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,
        ])
示例#7
0
 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')
示例#8
0
 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)
示例#9
0
 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')
示例#10
0
 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:]])
示例#11
0
 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')
示例#12
0
文件: views.py 项目: wangwox/Spirit
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)
示例#13
0
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())
                  })
示例#14
0
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('/')
示例#15
0
    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])
示例#16
0
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)