feed.py
132 lines
| 3.8 KiB
| text/x-python
|
PythonLexer
neko259
|
r1986 | from django.urls import reverse | ||
neko259
|
r1302 | from django.shortcuts import render | ||
neko259
|
r1165 | |||
neko259
|
r1681 | from boards import settings | ||
neko259
|
r2005 | from boards.abstracts.constants import PARAM_PAGE | ||
neko259
|
r1165 | from boards.abstracts.paginator import get_paginator | ||
neko259
|
r1170 | from boards.abstracts.settingsmanager import get_settings_manager | ||
neko259
|
r1302 | from boards.models import Post | ||
neko259
|
r2004 | from boards.settings import SECTION_VIEW | ||
neko259
|
r1165 | from boards.views.base import BaseBoardView | ||
neko259
|
r1854 | from boards.views.mixins import PaginatedMixin | ||
neko259
|
r1165 | |||
neko259
|
r2004 | POSTS_PER_PAGE = settings.get_int(SECTION_VIEW, 'PostsPerPage') | ||
neko259
|
r1165 | |||
PARAMETER_POSTS = 'posts' | ||||
neko259
|
r1823 | PARAMETER_QUERIES = 'queries' | ||
neko259
|
r1165 | |||
TEMPLATE = 'boards/feed.html' | ||||
DEFAULT_PAGE = 1 | ||||
neko259
|
r1802 | class FeedFilter: | ||
@staticmethod | ||||
def get_filtered_posts(request, posts): | ||||
return posts | ||||
neko259
|
r1823 | @staticmethod | ||
def get_query(request): | ||||
return None | ||||
neko259
|
r1802 | |||
class TripcodeFilter(FeedFilter): | ||||
@staticmethod | ||||
def get_filtered_posts(request, posts): | ||||
filtered_posts = posts | ||||
tripcode = request.GET.get('tripcode', None) | ||||
if tripcode: | ||||
neko259
|
r1804 | filtered_posts = filtered_posts.filter(tripcode=tripcode) | ||
neko259
|
r1802 | return filtered_posts | ||
neko259
|
r1823 | @staticmethod | ||
def get_query(request): | ||||
tripcode = request.GET.get('tripcode', None) | ||||
if tripcode: | ||||
return 'Tripcode: {}'.format(tripcode) | ||||
neko259
|
r1802 | |||
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) | ||||
neko259
|
r2044 | last_posts = settings_manager.get_last_posts() | ||
threads = [post.get_thread() for post in last_posts] | ||||
filtered_posts = filtered_posts.filter(thread__in=threads) | ||||
neko259
|
r1802 | 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 | ||||
neko259
|
r1823 | @staticmethod | ||
def get_query(request): | ||||
ip = request.GET.get('ip', None) | ||||
if ip: | ||||
return 'IP: {}'.format(ip) | ||||
neko259
|
r1802 | |||
neko259
|
r1827 | class ImageFilter(FeedFilter): | ||
neko259
|
r1802 | @staticmethod | ||
def get_filtered_posts(request, posts): | ||||
filtered_posts = posts | ||||
neko259
|
r1827 | image = request.GET.get('image', None) | ||
if image: | ||||
filtered_posts = filtered_posts.filter(attachments__file=image) | ||||
neko259
|
r1802 | return filtered_posts | ||
neko259
|
r1823 | @staticmethod | ||
def get_query(request): | ||||
neko259
|
r1827 | image = request.GET.get('image', None) | ||
if image: | ||||
return 'File: {}'.format(image) | ||||
neko259
|
r1823 | |||
neko259
|
r1802 | |||
neko259
|
r1997 | class FeedView(PaginatedMixin, BaseBoardView): | ||
neko259
|
r1802 | filters = ( | ||
TripcodeFilter, | ||||
FavoritesFilter, | ||||
IpFilter, | ||||
neko259
|
r1827 | ImageFilter, | ||
neko259
|
r1802 | ) | ||
neko259
|
r1165 | |||
neko259
|
r1204 | def get(self, request): | ||
neko259
|
r2005 | page = request.GET.get(PARAM_PAGE, DEFAULT_PAGE) | ||
neko259
|
r1204 | |||
neko259
|
r1165 | params = self.get_context_data(request=request) | ||
neko259
|
r1170 | settings_manager = get_settings_manager(request) | ||
neko259
|
r1302 | posts = Post.objects.exclude( | ||
neko259
|
r1704 | thread__tags__in=settings_manager.get_hidden_tags()).order_by( | ||
'-pub_time').prefetch_related('attachments', 'thread') | ||||
neko259
|
r1823 | queries = [] | ||
neko259
|
r1802 | for filter in self.filters: | ||
posts = filter.get_filtered_posts(request, posts) | ||||
neko259
|
r1823 | query = filter.get_query(request) | ||
if query: | ||||
queries.append(query) | ||||
params[PARAMETER_QUERIES] = queries | ||||
neko259
|
r1302 | |||
neko259
|
r2061 | paginator = get_paginator(posts, POSTS_PER_PAGE, | ||
link=reverse('feed'), | ||||
params=request.GET.dict()) | ||||
neko259
|
r1165 | paginator.current_page = int(page) | ||
params[PARAMETER_POSTS] = paginator.page(page).object_list | ||||
neko259
|
r1854 | params.update(self.get_page_context(paginator, page)) | ||
neko259
|
r1165 | |||
return render(request, TEMPLATE, params) | ||||