feed.py
123 lines
| 3.7 KiB
| text/x-python
|
PythonLexer
|
r1165 | from django.core.urlresolvers import reverse | ||
|
r1302 | from django.shortcuts import render | ||
|
r1165 | |||
|
r1681 | from boards import settings | ||
|
r1165 | from boards.abstracts.paginator import get_paginator | ||
|
r1170 | from boards.abstracts.settingsmanager import get_settings_manager | ||
|
r1302 | from boards.models import Post | ||
|
r1165 | from boards.views.base import BaseBoardView | ||
from boards.views.posting_mixin import PostMixin | ||||
|
r1681 | POSTS_PER_PAGE = settings.get_int('View', 'PostsPerPage') | ||
|
r1165 | |||
PARAMETER_CURRENT_PAGE = 'current_page' | ||||
PARAMETER_PAGINATOR = 'paginator' | ||||
PARAMETER_POSTS = 'posts' | ||||
PARAMETER_PREV_LINK = 'prev_page_link' | ||||
PARAMETER_NEXT_LINK = 'next_page_link' | ||||
TEMPLATE = 'boards/feed.html' | ||||
DEFAULT_PAGE = 1 | ||||
|
r1802 | class FeedFilter: | ||
@staticmethod | ||||
def get_filtered_posts(request, posts): | ||||
return posts | ||||
class TripcodeFilter(FeedFilter): | ||||
@staticmethod | ||||
def get_filtered_posts(request, posts): | ||||
filtered_posts = posts | ||||
tripcode = request.GET.get('tripcode', None) | ||||
if tripcode: | ||||
|
r1804 | filtered_posts = filtered_posts.filter(tripcode=tripcode) | ||
|
r1802 | return filtered_posts | ||
class FavoritesFilter(FeedFilter): | ||||
@staticmethod | ||||
def get_filtered_posts(request, posts): | ||||
filtered_posts = posts | ||||
favorites = 'favorites' in request.GET | ||||
if favorites: | ||||
settings_manager = get_settings_manager(request) | ||||
fav_thread_ops = Post.objects.filter(id__in=settings_manager.get_fav_threads().keys()) | ||||
fav_threads = [op.get_thread() for op in fav_thread_ops] | ||||
filtered_posts = filtered_posts.filter(thread__in=fav_threads) | ||||
return filtered_posts | ||||
class IpFilter(FeedFilter): | ||||
@staticmethod | ||||
def get_filtered_posts(request, posts): | ||||
filtered_posts = posts | ||||
ip = request.GET.get('ip', None) | ||||
if ip and request.user.has_perm('post_delete'): | ||||
filtered_posts = filtered_posts.filter(poster_ip=ip) | ||||
return filtered_posts | ||||
class HashFilter(FeedFilter): | ||||
@staticmethod | ||||
def get_filtered_posts(request, posts): | ||||
filtered_posts = posts | ||||
image_hash = request.GET.get('image_hash', None) | ||||
if image_hash: | ||||
filtered_posts = filtered_posts.filter(attachments__hash=image_hash) | ||||
return filtered_posts | ||||
|
r1165 | class FeedView(PostMixin, BaseBoardView): | ||
|
r1802 | filters = ( | ||
TripcodeFilter, | ||||
FavoritesFilter, | ||||
IpFilter, | ||||
HashFilter, | ||||
) | ||||
|
r1165 | |||
|
r1204 | def get(self, request): | ||
page = request.GET.get('page', DEFAULT_PAGE) | ||||
|
r1165 | params = self.get_context_data(request=request) | ||
|
r1170 | settings_manager = get_settings_manager(request) | ||
|
r1302 | posts = Post.objects.exclude( | ||
|
r1704 | thread__tags__in=settings_manager.get_hidden_tags()).order_by( | ||
'-pub_time').prefetch_related('attachments', 'thread') | ||||
|
r1802 | for filter in self.filters: | ||
posts = filter.get_filtered_posts(request, posts) | ||||
|
r1302 | |||
paginator = get_paginator(posts, POSTS_PER_PAGE) | ||||
|
r1165 | paginator.current_page = int(page) | ||
params[PARAMETER_POSTS] = paginator.page(page).object_list | ||||
|
r1378 | paginator.set_url(reverse('feed'), request.GET.dict()) | ||
self.get_page_context(paginator, params, page) | ||||
|
r1165 | |||
return render(request, TEMPLATE, params) | ||||
# TODO Dedup this into PagedMixin | ||||
|
r1378 | def get_page_context(self, paginator, params, page): | ||
|
r1165 | """ | ||
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(): | ||||
|
r1378 | params[PARAMETER_PREV_LINK] = paginator.get_page_url( | ||
current_page.previous_page_number()) | ||||
|
r1165 | if current_page.has_next(): | ||
|
r1378 | params[PARAMETER_NEXT_LINK] = paginator.get_page_url( | ||
current_page.next_page_number()) | ||||
|
r1165 | |||