##// END OF EJS Templates
Show all reply count and today reply count for threads on landing
Show all reply count and today reply count for threads on landing

File last commit:

r2005:00eae4e7 default
r2007:db58920c default
Show More
feed.py
132 lines | 3.8 KiB | text/x-python | PythonLexer
from django.urls import reverse
from django.shortcuts import render
from boards import settings
from boards.abstracts.constants import PARAM_PAGE
from boards.abstracts.paginator import get_paginator
from boards.abstracts.settingsmanager import get_settings_manager
from boards.models import Post
from boards.settings import SECTION_VIEW
from boards.views.base import BaseBoardView
from boards.views.mixins import PaginatedMixin
POSTS_PER_PAGE = settings.get_int(SECTION_VIEW, 'PostsPerPage')
PARAMETER_POSTS = 'posts'
PARAMETER_QUERIES = 'queries'
TEMPLATE = 'boards/feed.html'
DEFAULT_PAGE = 1
class FeedFilter:
@staticmethod
def get_filtered_posts(request, posts):
return posts
@staticmethod
def get_query(request):
return None
class TripcodeFilter(FeedFilter):
@staticmethod
def get_filtered_posts(request, posts):
filtered_posts = posts
tripcode = request.GET.get('tripcode', None)
if tripcode:
filtered_posts = filtered_posts.filter(tripcode=tripcode)
return filtered_posts
@staticmethod
def get_query(request):
tripcode = request.GET.get('tripcode', None)
if tripcode:
return 'Tripcode: {}'.format(tripcode)
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
@staticmethod
def get_query(request):
ip = request.GET.get('ip', None)
if ip:
return 'IP: {}'.format(ip)
class ImageFilter(FeedFilter):
@staticmethod
def get_filtered_posts(request, posts):
filtered_posts = posts
image = request.GET.get('image', None)
if image:
filtered_posts = filtered_posts.filter(attachments__file=image)
return filtered_posts
@staticmethod
def get_query(request):
image = request.GET.get('image', None)
if image:
return 'File: {}'.format(image)
class FeedView(PaginatedMixin, BaseBoardView):
filters = (
TripcodeFilter,
FavoritesFilter,
IpFilter,
ImageFilter,
)
def get(self, request):
page = request.GET.get(PARAM_PAGE, DEFAULT_PAGE)
params = self.get_context_data(request=request)
settings_manager = get_settings_manager(request)
posts = Post.objects.exclude(
thread__tags__in=settings_manager.get_hidden_tags()).order_by(
'-pub_time').prefetch_related('attachments', 'thread')
queries = []
for filter in self.filters:
posts = filter.get_filtered_posts(request, posts)
query = filter.get_query(request)
if query:
queries.append(query)
params[PARAMETER_QUERIES] = queries
paginator = get_paginator(posts, POSTS_PER_PAGE)
paginator.current_page = int(page)
params[PARAMETER_POSTS] = paginator.page(page).object_list
paginator.set_url(reverse('feed'), request.GET.dict())
params.update(self.get_page_context(paginator, page))
return render(request, TEMPLATE, params)