Ejemplo n.º 1
0
    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)
Ejemplo n.º 2
0
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)
Ejemplo n.º 3
0
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)
Ejemplo n.º 4
0
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)
Ejemplo n.º 5
0
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)
Ejemplo n.º 6
0
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)
Ejemplo n.º 7
0
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)
Ejemplo n.º 8
0
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)
Ejemplo n.º 9
0
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)
Ejemplo n.º 10
0
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)
Ejemplo n.º 11
0
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)
Ejemplo n.º 12
0
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)