from datetime import datetime from datetime import timedelta from django.db.models import Count, Q from django.shortcuts import render from django.utils.decorators import method_decorator from django.views.decorators.csrf import csrf_protect from boards import settings from boards.models import Post, Tag, STATUS_ACTIVE, TagAlias from boards.settings import SECTION_VIEW from boards.views.base import BaseBoardView from boards.abstracts.settingsmanager import get_settings_manager,\ SETTING_ONLY_FAVORITES PARAM_SECTION_STR = 'section_str' PARAM_LATEST_THREADS = 'latest_threads' PARAM_LATEST_POSTS = 'latest_posts' TEMPLATE = 'boards/landing.html' class LandingView(BaseBoardView): @method_decorator(csrf_protect) def get(self, request): params = dict() params[PARAM_SECTION_STR] = Tag.objects.get_tag_url_list( Tag.objects.filter(Q(aliases__in=TagAlias.objects.filter_localized()) & Q(required=True)) .order_by('aliases__name')) today = datetime.now() - timedelta(1) ops = Post.objects.filter(thread__replies__pub_time__gt=today, opening=True, thread__status=STATUS_ACTIVE) fav_tags = self._get_fav_tags(request) if len(fav_tags) > 0: ops = ops.filter(thread__tags__in=fav_tags) ops = ops.annotate(today_post_count=Count('thread__replies'))\ .order_by('-pub_time') max_landing_threads = settings.get_int(SECTION_VIEW, 'MaxLandingThreads') if max_landing_threads > 0: ops = ops[:max_landing_threads] params[PARAM_LATEST_THREADS] = ops max_landing_posts = settings.get_int(SECTION_VIEW, 'MaxLandingPosts') latest_posts = Post.objects.filter(pub_time__gt=today) if len(fav_tags) > 0: latest_posts = latest_posts.filter(thread__tags__in=fav_tags) params[PARAM_LATEST_POSTS] = latest_posts\ .order_by('-pub_time')[:max_landing_posts] return render(request, TEMPLATE, params) def _get_fav_tags(self, request): fav_tags = [] settings_manager = get_settings_manager(request) if settings_manager.get_setting(SETTING_ONLY_FAVORITES): fav_tags = settings_manager.get_fav_tags() return fav_tags