from django.core.urlresolvers import reverse from django.shortcuts import render from boards.abstracts.paginator import get_paginator from boards.abstracts.settingsmanager import get_settings_manager from boards.models import Post from boards.views.base import BaseBoardView from boards.views.posting_mixin import PostMixin POSTS_PER_PAGE = 10 PARAMETER_CURRENT_PAGE = 'current_page' PARAMETER_PAGINATOR = 'paginator' PARAMETER_POSTS = 'posts' PARAMETER_ADDITONAL_ATTRS = 'additional_attrs' PARAMETER_PREV_LINK = 'prev_page_link' PARAMETER_NEXT_LINK = 'next_page_link' TEMPLATE = 'boards/feed.html' DEFAULT_PAGE = 1 class FeedView(PostMixin, BaseBoardView): def get(self, request): page = request.GET.get('page', DEFAULT_PAGE) tripcode = request.GET.get('tripcode', None) params = self.get_context_data(request=request) settings_manager = get_settings_manager(request) posts = Post.objects.exclude( threads__tags__in=settings_manager.get_hidden_tags()).order_by( '-pub_time').prefetch_related('images', 'thread', 'threads') if tripcode: posts = posts.filter(tripcode=tripcode) paginator = get_paginator(posts, POSTS_PER_PAGE) paginator.current_page = int(page) params[PARAMETER_POSTS] = paginator.page(page).object_list additional_params = dict() if tripcode: additional_params['tripcode'] = tripcode params[PARAMETER_ADDITONAL_ATTRS] = '&tripcode=' + tripcode self.get_page_context(paginator, params, page, additional_params) return render(request, TEMPLATE, params) # TODO Dedup this into PagedMixin def get_page_context(self, paginator, params, page, additional_params): """ Get pagination context variables """ params[PARAMETER_PAGINATOR] = paginator current_page = paginator.page(int(page)) params[PARAMETER_CURRENT_PAGE] = current_page if current_page.has_previous(): params[PARAMETER_PREV_LINK] = self.get_previous_page_link( current_page) for param in additional_params.keys(): params[PARAMETER_PREV_LINK] += '&{}={}'.format( param, additional_params[param]) if current_page.has_next(): params[PARAMETER_NEXT_LINK] = self.get_next_page_link(current_page) for param in additional_params.keys(): params[PARAMETER_NEXT_LINK] += '&{}={}'.format( param, additional_params[param]) def get_previous_page_link(self, current_page): return reverse('feed') + '?page={}'.format( current_page.previous_page_number()) def get_next_page_link(self, current_page): return reverse('feed') + '?page={}'.format( current_page.next_page_number())