def GET(self, request): sortBy = request.GET.get('sortby', 'id') if sortBy == 'post_count': posters = (Poster.objects .annotate(post_count=Count('post')) .order_by('-post_count')) elif sortBy == 'username': posters = Poster.objects.all().order_by('username') elif sortBy == 'id': posters = Poster.objects.all().order_by('id') else: raise PermissionDenied('Invalid sortby value') posters_per_page = utils.get_config('general_items_per_page') paginator = Paginator(posters, posters_per_page) page = utils.page_by_request(paginator, request) ctx = { 'rel_page': page, 'posters': page } return render(request, 'user_index.html', ctx)
def latest_threads(request): effective_prefs = (LatestThreadsForumPreference .get_effective_preferences( request.user if request.user.is_authenticated() else None)) excluded_forums = [ fpk for fpk, include in effective_prefs.items() if not include] threads = (Thread.objects.all() .filter(~Q(forum_id__in=excluded_forums)) .order_by('-last_update') .select_related('author')) threads_per_page = utils.get_config('threads_per_forum_page') paginator = utils.MappingPaginator(threads, threads_per_page) paginator.install_map_func(lambda t: utils.ThreadFascet(t, request)) page = utils.page_by_request(paginator, request) # We can apparently do aggregate queries faster than the ORM, so do that. # This is ugly but this is one of the highest traffic pages in the project # and we can make a _big_ perf difference (as in an order of magnitude) by # doing these queries together like this. with connection.cursor() as cursor: cursor.execute(""" SELECT post.thread_id, COUNT(*) FROM "ISS_post" AS post WHERE post.thread_id = ANY(%s) GROUP BY post.thread_id """, ([tf._thread.pk for tf in page],)) counts = dict(cursor.fetchall()) for tf in page: tf._thread.post_count = counts[tf._thread.pk] if request.user.is_authenticated(): ppk = request.user.pk flags = ThreadFlag.objects.raw(""" SELECT tf.* FROM "ISS_thread" AS thread JOIN "ISS_threadflag" AS tf ON tf.thread_id = thread.id AND tf.poster_id = %s WHERE thread.id = ANY(%s) """, (ppk, [tf._thread.pk for tf in page])) fd = dict([(flag.thread_id, flag) for flag in flags]) for tf in page: if tf._thread.pk in fd: tf._thread._flag_cache[ppk] = fd[tf._thread.pk] ctx = { 'rel_page': page, 'threads': page } return render(request, 'latest_threads.html', ctx)
def user_list(request): posters = Poster.objects.all().order_by('username') posters_per_page = 20 pagniator = Paginator(posters, posters_per_page) page = utils.page_by_request(posters, posters_per_page) ctx = {'rel_page': page, 'posters': page} return render(request, 'user_list.html', ctx)
def posts_by_user(request, user_id): poster = get_object_or_404(Poster, pk=user_id) posts = (poster.post_set.order_by('-created').select_related('thread')) posts_per_page = utils.get_config('general_items_per_page') paginator = Paginator(posts, posts_per_page) page = utils.page_by_request(paginator, request) ctx = {'rel_page': page, 'poster': poster, 'posts': page} return render(request, 'posts_by_user.html', ctx)
def threads_by_user(request, user_id): poster = get_object_or_404(Poster, pk=user_id) threads = Thread.objects.filter(author=poster).order_by('-created') threads_per_page = utils.get_config('general_items_per_page') paginator = Paginator(threads, threads_per_page) page = utils.page_by_request(paginator, request) ctx = {'rel_page': page, 'poster': poster, 'threads': page} return render(request, 'threads_started.html', ctx)
def latest_threads(request): threads = (Thread.objects.all().filter( forum__is_trash=False).order_by('-last_update')) threads_per_page = utils.get_config('threads_per_forum_page') paginator = utils.MappingPaginator(threads, threads_per_page) paginator.install_map_func(lambda t: utils.ThreadFascet(t, request)) page = utils.page_by_request(paginator, request) ctx = {'rel_page': page, 'threads': page} return render(request, 'latest_threads.html', ctx)
def search(request): q = request.GET.get('q', None) # Special case for no query param, user is probably landing here # without having filled out a query yet. if not q: return render(request, 'search_results.html', { 'form': forms.SearchForm() }) else: form = forms.SearchForm(request.GET) if form.is_valid(): d = form.cleaned_data terms = ' & '.join(d['q'].split(' ')) model = None filter_q = {} if d['search_type'] == 'threads': model = Thread filter_q['title__tsmatch'] = terms if d['forum']: filter_q['forum__in'] = d['forum'] else: model = Post filter_q['content__tsmatch'] = terms if d['forum']: filter_q['thread__forum__in'] = d['forum'] if d['author']: filter_q['author__in'] = d['author'] qs = model.objects.filter(**filter_q).order_by('-created') items_per_page = utils.get_config('general_items_per_page') paginator = Paginator(qs, items_per_page) page = utils.page_by_request(paginator, request) ctx = { 'rel_page': page, 'page': page, 'form': form, 'q': d['q'] } else: ctx = { 'form': form } return render(request, 'search_results.html', ctx)
def usercp(request): threads = (Thread.objects.all().filter( threadflag__poster_id=request.user.id, threadflag__subscribed=True, last_update__gt=F('threadflag__last_read_date')).order_by( '-last_update')) threads_per_page = utils.get_config('threads_per_forum_page') paginator = utils.MappingPaginator(threads, threads_per_page) paginator.install_map_func(lambda t: utils.ThreadFascet(t, request)) page = utils.page_by_request(paginator, request) ctx = {'rel_page': page, 'threads': page} return render(request, 'user_cp.html', ctx)
def search(request): q = request.GET.get('q', None) if not q: return render(request, 'search_results.html', {}) terms = ' & '.join(q.split(' ')) qs = Post.objects.filter(content__tsmatch=terms).order_by('-created') posts_per_page = utils.get_config('general_items_per_page') paginator = Paginator(qs, posts_per_page) page = utils.page_by_request(paginator, request) ctx = {'rel_page': page, 'q': q, 'posts': page} return render(request, 'search_results.html', ctx)
def sent(request): messages = (request.user.privatemessage_set.filter( sender=request.user).order_by('-created')) items_per_page = utils.get_config('general_items_per_page') paginator = Paginator(messages, items_per_page) page = utils.page_by_request(paginator, request) ctx = { 'messages': page, 'page_name': 'Sent', 'active_tab': 'sent', 'show_from': False, 'show_to': True, 'pm_action_form': forms.PrivateMessageActionForm(), 'breadcrumbs': [('Private Messages', ''), ('Sent', 'sent-pms')] } return render(request, 'private_messages/pm_list.html', ctx)
def thread_index(request, forum_id): forum = get_object_or_404(Forum, pk=forum_id) threads = forum.thread_set.order_by('-stickied', '-last_update') threads_per_page = utils.get_config('threads_per_forum_page') paginator = utils.MappingPaginator(threads, threads_per_page) paginator.install_map_func(lambda t: utils.ThreadFascet(t, request)) page = utils.page_by_request(paginator, request) ctx = { 'rel_page': page, 'forum': forum, 'threads': page, 'can_start_thread': forum.create_thread_pack.check_request(request) } if request.user.is_authenticated(): forum.mark_read(request.user) return render(request, 'thread_index.html', ctx)
def inbox(request): messages = (request.user .privatemessage_set .filter(receiver=request.user) .order_by('-created')) items_per_page = utils.get_config('general_items_per_page') paginator = Paginator(messages, items_per_page) page = utils.page_by_request(paginator, request) ctx = { 'messages': page, 'page_name': 'Inbox', 'active_tab': 'inbox', 'show_from': True, 'show_to': False, 'breadcrumbs': [ ('Private Messages', ''), ('Inbox', 'inbox') ] } return render(request, 'private_messages/pm_list.html', ctx)