コード例 #1
0
def users(request):
    is_paginated = True
    sortby = request.GET.get('sort', 'reputation')
    suser = request.REQUEST.get('query', "")
    try:
        page = int(request.GET.get('page', '1'))
    except ValueError:
        page = 1

    if suser == "":
        if sortby == "newest":
            order_by_parameter = '-date_joined'
        elif sortby == "last":
            order_by_parameter = 'date_joined'
        elif sortby == "user":
            order_by_parameter = 'username'
        else:
            # default
            order_by_parameter = '-reputation'

        objects_list = Paginator(
            models.User.objects.all().order_by(order_by_parameter),
            const.USERS_PAGE_SIZE)
        base_url = reverse('users') + '?sort=%s&' % sortby
    else:
        sortby = "reputation"
        objects_list = Paginator(
            models.User.objects.filter(
                username__icontains=suser).order_by('-reputation'),
            const.USERS_PAGE_SIZE)
        base_url = reverse('users') + '?name=%s&sort=%s&' % (suser, sortby)

    try:
        users_page = objects_list.page(page)
    except (EmptyPage, InvalidPage):
        users_page = objects_list.page(objects_list.num_pages)

    paginator_data = {
        'is_paginated': is_paginated,
        'pages': objects_list.num_pages,
        'page': page,
        'has_previous': users_page.has_previous(),
        'has_next': users_page.has_next(),
        'previous': users_page.previous_page_number(),
        'next': users_page.next_page_number(),
        'base_url': base_url
    }
    paginator_context = extra_tags.cnprog_paginator(paginator_data)
    data = {
        'active_tab': 'users',
        'page_class': 'users-page',
        'users': users_page,
        'suser': suser,
        'keywords': suser,
        'tab_id': sortby,
        'paginator_context': paginator_context
    }
    return render_into_skin('users.html', data, request)
コード例 #2
0
ファイル: users.py プロジェクト: sayanchowdhury/askbot-devel
def users(request):
    is_paginated = True
    sortby = request.GET.get("sort", "reputation")
    suser = request.REQUEST.get("query", "")
    try:
        page = int(request.GET.get("page", "1"))
    except ValueError:
        page = 1

    if suser == "":
        if sortby == "newest":
            order_by_parameter = "-date_joined"
        elif sortby == "last":
            order_by_parameter = "date_joined"
        elif sortby == "user":
            order_by_parameter = "username"
        else:
            # default
            order_by_parameter = "-reputation"

        objects_list = Paginator(models.User.objects.all().order_by(order_by_parameter), const.USERS_PAGE_SIZE)
        base_url = reverse("users") + "?sort=%s&" % sortby
    else:
        sortby = "reputation"
        objects_list = Paginator(
            models.User.objects.filter(username__icontains=suser).order_by("-reputation"), const.USERS_PAGE_SIZE
        )
        base_url = reverse("users") + "?name=%s&sort=%s&" % (suser, sortby)

    try:
        users_page = objects_list.page(page)
    except (EmptyPage, InvalidPage):
        users_page = objects_list.page(objects_list.num_pages)

    paginator_data = {
        "is_paginated": is_paginated,
        "pages": objects_list.num_pages,
        "page": page,
        "has_previous": users_page.has_previous(),
        "has_next": users_page.has_next(),
        "previous": users_page.previous_page_number(),
        "next": users_page.next_page_number(),
        "base_url": base_url,
    }
    paginator_context = extra_tags.cnprog_paginator(paginator_data)
    data = {
        "active_tab": "users",
        "page_class": "users-page",
        "users": users_page,
        "suser": suser,
        "keywords": suser,
        "tab_id": sortby,
        "paginator_context": paginator_context,
    }
    return render_into_skin("users.html", data, request)
コード例 #3
0
ファイル: readers.py プロジェクト: NorthIsUp/askbot-devel
def tags(request):#view showing a listing of available tags - plain list
    stag = ""
    is_paginated = True
    sortby = request.GET.get('sort', 'used')
    try:
        page = int(request.GET.get('page', '1'))
    except ValueError:
        page = 1

    if request.method == "GET":
        stag = request.GET.get("query", "").strip()
        if stag != '':
            objects_list = Paginator(
                            models.Tag.objects.filter(
                                                deleted=False,
                                                name__icontains=stag
                                            ).exclude(
                                                used_count=0
                                            ),
                            DEFAULT_PAGE_SIZE
                        )
        else:
            if sortby == "name":
                objects_list = Paginator(models.Tag.objects.all().filter(deleted=False).exclude(used_count=0).order_by("name"), DEFAULT_PAGE_SIZE)
            else:
                objects_list = Paginator(models.Tag.objects.all().filter(deleted=False).exclude(used_count=0).order_by("-used_count"), DEFAULT_PAGE_SIZE)

    try:
        tags = objects_list.page(page)
    except (EmptyPage, InvalidPage):
        tags = objects_list.page(objects_list.num_pages)

    paginator_data = {
        'is_paginated' : is_paginated,
        'pages': objects_list.num_pages,
        'page': page,
        'has_previous': tags.has_previous(),
        'has_next': tags.has_next(),
        'previous': tags.previous_page_number(),
        'next': tags.next_page_number(),
        'base_url' : reverse('tags') + '?sort=%s&' % sortby
    }
    paginator_context = extra_tags.cnprog_paginator(paginator_data)
    data = {
        'active_tab': 'tags',
        'page_class': 'tags-page',
        'tags' : tags,
        'stag' : stag,
        'tab_id' : sortby,
        'keywords' : stag,
        'paginator_context' : paginator_context
    }
    return render_into_skin('tags.html', data, request)
コード例 #4
0
def tags(request):  #view showing a listing of available tags - plain list
    stag = ""
    is_paginated = True
    sortby = request.GET.get('sort', 'used')
    try:
        page = int(request.GET.get('page', '1'))
    except ValueError:
        page = 1

    if request.method == "GET":
        stag = request.GET.get("query", "").strip()
        if stag != '':
            objects_list = Paginator(
                models.Tag.objects.filter(
                    deleted=False, name__icontains=stag).exclude(used_count=0),
                DEFAULT_PAGE_SIZE)
        else:
            if sortby == "name":
                objects_list = Paginator(
                    models.Tag.objects.all().filter(deleted=False).exclude(
                        used_count=0).order_by("name"), DEFAULT_PAGE_SIZE)
            else:
                objects_list = Paginator(
                    models.Tag.objects.all().filter(deleted=False).exclude(
                        used_count=0).order_by("-used_count"),
                    DEFAULT_PAGE_SIZE)

    try:
        tags = objects_list.page(page)
    except (EmptyPage, InvalidPage):
        tags = objects_list.page(objects_list.num_pages)

    paginator_data = {
        'is_paginated': is_paginated,
        'pages': objects_list.num_pages,
        'page': page,
        'has_previous': tags.has_previous(),
        'has_next': tags.has_next(),
        'previous': tags.previous_page_number(),
        'next': tags.next_page_number(),
        'base_url': reverse('tags') + '?sort=%s&' % sortby
    }
    paginator_context = extra_tags.cnprog_paginator(paginator_data)
    data = {
        'active_tab': 'tags',
        'page_class': 'tags-page',
        'tags': tags,
        'stag': stag,
        'tab_id': sortby,
        'keywords': stag,
        'paginator_context': paginator_context
    }
    return render_into_skin('tags.html', data, request)
コード例 #5
0
ファイル: readers.py プロジェクト: exezaid/askbot-devel
def tags(request):#view showing a listing of available tags - plain list
    stag = ""
    is_paginated = True
    sortby = request.GET.get('sort', 'used')
    try:
        page = int(request.GET.get('page', '1'))
    except ValueError:
        page = 1

    if request.method == "GET":
        stag = request.GET.get("q", "").strip()
        if stag != '':
            objects_list = Paginator(models.Tag.objects.filter(deleted=False).exclude(used_count=0).extra(where=['name like %s'], params=['%' + stag + '%']), DEFAULT_PAGE_SIZE)
        else:
            if sortby == "name":
                objects_list = Paginator(models.Tag.objects.all().filter(deleted=False).exclude(used_count=0).order_by("name"), DEFAULT_PAGE_SIZE)
            else:
                objects_list = Paginator(models.Tag.objects.all().filter(deleted=False).exclude(used_count=0).order_by("-used_count"), DEFAULT_PAGE_SIZE)

    try:
        tags = objects_list.page(page)
    except (EmptyPage, InvalidPage):
        tags = objects_list.page(objects_list.num_pages)

    paginator_data = {
        'is_paginated' : is_paginated,
        'pages': objects_list.num_pages,
        'page': page,
        'has_previous': tags.has_previous(),
        'has_next': tags.has_next(),
        'previous': tags.previous_page_number(),
        'next': tags.next_page_number(),
        'base_url' : reverse('tags') + '?sort=%s&' % sortby
    }
    paginator_context = extra_tags.cnprog_paginator(paginator_data)
    data = {
        'view_name':'tags',
        'active_tab': 'tags',
        'tags' : tags,
        'stag' : stag,
        'tab_id' : sortby,
        'keywords' : stag,
        'paginator_context' : paginator_context
    }
    context = RequestContext(request, data)
    template = ENV.get_template('tags.html')
    return HttpResponse(template.render(context))
コード例 #6
0
ファイル: readers.py プロジェクト: exezaid/askbot-devel
def questions(request):
    """
    List of Questions, Tagged questions, and Unanswered questions.
    matching search query or user selection
    """
    #don't allow to post to this view
    if request.method == 'POST':
        raise Http404

    #todo: redo SearchState to accept input from
    #view_log, session and request parameters
    search_state = request.session.get('search_state', SearchState())

    view_log = request.session['view_log']

    if view_log.get_previous(1) != 'questions':
        if view_log.get_previous(2) != 'questions':
            #print 'user stepped too far, resetting search state'
            search_state.reset()

    if request.user.is_authenticated():
        search_state.set_logged_in()

    form = AdvancedSearchForm(request.GET)
    #todo: form is used only for validation...
    if form.is_valid():
        search_state.update_from_user_input(
                                    form.cleaned_data,
                                    request.GET,
                                )
        #todo: better put these in separately then analyze
        #what neesd to be done, otherwise there are two routines
        #that take request.GET I don't like this use of parameters
        #another weakness is that order of routine calls matters here
        search_state.relax_stickiness( request.GET, view_log )

        request.session['search_state'] = search_state
        request.session.modified = True

    #force reset for debugging
    #search_state.reset()
    #request.session.modified = True

    #todo: have this call implemented for sphinx, mysql and pgsql
    (qs, meta_data, related_tags) = models.Question.objects.run_advanced_search(
                                            request_user = request.user,
                                            search_state = search_state,
                                        )

    paginator = Paginator(qs, search_state.page_size)

    if paginator.num_pages < search_state.page:
        raise Http404

    page = paginator.page(search_state.page)

    contributors = models.Question.objects.get_question_and_answer_contributors(page.object_list)

    paginator_context = {
        'is_paginated' : (paginator.count > search_state.page_size),
        'pages': paginator.num_pages,
        'page': search_state.page,
        'has_previous': page.has_previous(),
        'has_next': page.has_next(),
        'previous': page.previous_page_number(),
        'next': page.next_page_number(),
        'base_url' : request.path + '?sort=%s&amp;' % search_state.sort,#todo in T sort=>sort_method
        'page_size' : search_state.page_size,#todo in T pagesize -> page_size
    }

    if request.is_ajax():

        q_count = paginator.count
        question_counter = ungettext(
                                '%(q_num)s question',
                                '%(q_num)s questions',
                                q_count
                            ) % {
                                'q_num': humanize.intcomma(q_count),
                            }

        if q_count > search_state.page_size:
            paginator_tpl = ENV.get_template('paginator.html')
            #todo: remove this patch on context after all templates are moved to jinja
            paginator_context['base_url'] = request.path + '?sort=%s&' % search_state.sort
            data = {
                'paginator_context': extra_tags.cnprog_paginator(paginator_context)
            }
            paginator_html = paginator_tpl.render(Context(data))
        else:
            paginator_html = ''
        ajax_data = {
            #current page is 1 by default now
            #because ajax is only called by update in the search button
            'paginator': paginator_html,
            'question_counter': question_counter,
            'questions': list(),
            'related_tags': list(),
            'faces': list()
        }

        badge_levels = dict(const.BADGE_TYPE_CHOICES)
        def pluralize_badge_count(count, level):
            return ungettext(
                '%(badge_count)d %(badge_level)s badge',
                '%(badge_count)d %(badge_level)s badges',
                count
            ) % {
                'badge_count': count, 
                'badge_level': badge_levels[level]
            }

        gold_badge_css_class = const.BADGE_CSS_CLASSES[const.GOLD_BADGE],
        silver_badge_css_class = const.BADGE_CSS_CLASSES[const.SILVER_BADGE],
        bronze_badge_css_class = const.BADGE_CSS_CLASSES[const.BRONZE_BADGE],

        for tag in related_tags:
            tag_data = {
                'name': tag.name,
                'used_count': humanize.intcomma(tag.local_used_count)
            }
            ajax_data['related_tags'].append(tag_data)

        for contributor in contributors:
            ajax_data['faces'].append(extra_tags.gravatar(contributor, 48))

        for question in page.object_list:
            timestamp = question.last_activity_at
            author = question.last_activity_by

            if question.score == 0:
                votes_class = 'no-votes'
            else:
                votes_class = 'some-votes'

            if question.answer_count == 0:
                answers_class = 'no-answers'
            elif question.answer_accepted:
                answers_class = 'accepted'
            else:
                answers_class = 'some-answers'

            if question.view_count == 0:
                views_class = 'no-views'
            else:
                views_class = 'some-views'

            question_data = {
                'title': question.title,
                'summary': question.summary,
                'id': question.id,
                'tags': question.get_tag_names(),
                'votes': extra_filters.humanize_counter(question.score),
                'votes_class': votes_class,
                'votes_word': ungettext('vote', 'votes', question.score),
                'answers': extra_filters.humanize_counter(question.answer_count),
                'answers_class': answers_class,
                'answers_word': ungettext('answer', 'answers', question.answer_count),
                'views': extra_filters.humanize_counter(question.view_count),
                'views_class': views_class,
                'views_word': ungettext('view', 'views', question.view_count),
                'timestamp': unicode(timestamp),
                'timesince': functions.diff_date(timestamp),
                'u_id': author.id,
                'u_name': author.username,
                'u_rep': author.reputation,
                'u_gold': author.gold,
                'u_gold_title': pluralize_badge_count(
                                                author.gold,
                                                const.GOLD_BADGE
                                            ),
                'u_gold_badge_symbol': const.BADGE_DISPLAY_SYMBOL,
                'u_gold_css_class': gold_badge_css_class,
                'u_silver': author.silver,
                'u_silver_title': pluralize_badge_count(
                                            author.silver,
                                            const.SILVER_BADGE
                                        ),
                'u_silver_badge_symbol': const.BADGE_DISPLAY_SYMBOL,
                'u_silver_css_class': silver_badge_css_class,
                'u_bronze': author.bronze,
                'u_bronze_title': pluralize_badge_count(
                                            author.bronze,
                                            const.BRONZE_BADGE
                                        ),
                'u_bronze_badge_symbol': const.BADGE_DISPLAY_SYMBOL,
                'u_bronze_css_class': bronze_badge_css_class,
            }
            ajax_data['questions'].append(question_data)

        return HttpResponse(
                    simplejson.dumps(ajax_data),
                    mimetype = 'application/json'
                )

    tags_autocomplete = _get_tags_cache_json()

    reset_method_count = 0
    if search_state.query:
        reset_method_count += 1
    if search_state.tags:
        reset_method_count += 1
    if meta_data.get('author_name',None):
        reset_method_count += 1

    template_context = RequestContext(request, {
        'language_code': translation.get_language(),
        'reset_method_count': reset_method_count,
        'view_name': 'questions',
        'active_tab': 'questions',
        'questions' : page,
        'contributors' : contributors,
        'author_name' : meta_data.get('author_name',None),
        'tab_id' : search_state.sort,
        'questions_count' : paginator.count,
        'tags' : related_tags,
        'query': search_state.query,
        'search_tags' : search_state.tags,
        'tags_autocomplete' : tags_autocomplete,
        'is_unanswered' : False,#remove this from template
        'interesting_tag_names': meta_data.get('interesting_tag_names',None),
        'ignored_tag_names': meta_data.get('ignored_tag_names',None), 
        'sort': search_state.sort,
        'show_sort_by_relevance': askbot.conf.should_show_sort_by_relevance(),
        'scope': search_state.scope,
        'context' : paginator_context,
    })

    assert(request.is_ajax() == False)
    #ajax request is handled in a separate branch above

    #before = datetime.datetime.now()
    template = ENV.get_template('questions.html')
    response = HttpResponse(template.render(template_context))
    #after = datetime.datetime.now()
    #print after - before
    return response
コード例 #7
0
ファイル: readers.py プロジェクト: exezaid/askbot-devel
                        actor = request.user,
                        context_object = question,
                    )

    paginator_data = {
        'is_paginated' : (objects_list.count > const.ANSWERS_PAGE_SIZE),
        'pages': objects_list.num_pages,
        'page': show_page,
        'has_previous': page_objects.has_previous(),
        'has_next': page_objects.has_next(),
        'previous': page_objects.previous_page_number(),
        'next': page_objects.next_page_number(),
        'base_url' : request.path + '?sort=%s&amp;' % answer_sort_method,
        'extend_url' : "#sort-top"
    }
    paginator_context = extra_tags.cnprog_paginator(paginator_data)

    favorited = question.has_favorite_by_user(request.user)
    if request.user.is_authenticated():
        question_vote = question.votes.select_related().filter(user=request.user)
    else:
        question_vote = None #is this correct?
    if question_vote is not None and question_vote.count() > 0:
        question_vote = question_vote[0]


    data = {
        'view_name': 'question',
        'active_tab': 'questions',
        'question' : question,
        'question_vote' : question_vote,
コード例 #8
0
def questions(request, scope=const.DEFAULT_POST_SCOPE, sort=const.DEFAULT_POST_SORT_METHOD, query=None, \
        search=None, tags=None, author=None, page=None, reset_tags=None, \
        reset_author=None, reset_query=None, start_over=True, \
        remove_tag=None, page_size=None):
    """
    List of Questions, Tagged questions, and Unanswered questions.
    matching search query or user selection
    """
    #make parameters dictionary
    params_dict = {
        'scope': scope,
        'sort': sort,
    }
    if query:
        params_dict['query'] = ' '.join(query.split('+'))
    if search:
        params_dict['search'] = search
    if tags:
        params_dict['tags'] = ' '.join(tags.split('+'))
    if author:
        params_dict['author'] = author
    if page:
        params_dict['page'] = page
    if reset_tags:
        params_dict['reset_tags'] = reset_tags
    if reset_author:
        params_dict['reset_author'] = reset_author
    if reset_query:
        params_dict['reset_query'] = reset_query
    if start_over:
        params_dict['start_over'] = start_over
    if remove_tag:
        params_dict['remove_tag'] = remove_tag.decode("utf8")
    if page_size:
        params_dict['page_size'] = page_size
    
    #before = datetime.datetime.now()
    #don't allow to post to this view
    if request.method == 'POST':
        raise Http404
    #update search state
    #form = AdvancedSearchForm(request.GET)
    form = AdvancedSearchForm(params_dict)
    if form.is_valid():
        user_input = form.cleaned_data
    else:
        user_input = None
    search_state = request.session.get('search_state', SearchState())
    view_log = request.session['view_log']
    search_state.update(user_input, view_log, request.user)
    request.session['search_state'] = search_state
    request.session.modified = True

    #force reset for debugging
    #search_state.reset()
    #request.session.modified = True

    #todo: have this call implemented for sphinx, mysql and pgsql
    (qs, meta_data, related_tags) = models.Question.objects.run_advanced_search(
                                            request_user = request.user,
                                            search_state = search_state,
                                        )

    tag_list_type = askbot_settings.TAG_LIST_FORMAT

    #force cloud to sort by name
    if tag_list_type == 'cloud':
        related_tags = sorted(related_tags, key = operator.attrgetter('name'))

    font_size = extra_tags.get_tag_font_size(related_tags)

    paginator = Paginator(qs, search_state.page_size)

    if paginator.num_pages < search_state.page:
        search_state.page = 1

    page = paginator.page(search_state.page)

    contributors = models.Question.objects.get_question_and_answer_contributors(page.object_list)

    paginator_context = {
        'is_paginated' : (paginator.count > search_state.page_size),
        'pages': paginator.num_pages,
        'page': search_state.page,
        'has_previous': page.has_previous(),
        'has_next': page.has_next(),
        'previous': page.previous_page_number(),
        'next': page.next_page_number(),
        'base_url' : search_state.query_string(),#todo in T sort=>sort_method
        'page_size' : search_state.page_size,#todo in T pagesize -> page_size
        'parameters': search_state.make_parameters(),
    }

    # We need to pass the rss feed url based
    # on the search state to the template.
    # We use QueryDict to get a querystring
    # from dicts and arrays. Much cleaner
    # than parsing and string formating.
    rss_query_dict = QueryDict("").copy()
    if search_state.query:
        # We have search string in session - pass it to
        # the QueryDict
        rss_query_dict.update({"q": search_state.query})
    if search_state.tags:
        # We have tags in session - pass it to the
        # QueryDict but as a list - we want tags+
        rss_query_dict.setlist("tags", search_state.tags)
    
    # Format the url with the QueryDict
    context_feed_url = '/feeds/rss/?%s' % rss_query_dict.urlencode()

    reset_method_count = 0
    if search_state.query:
        reset_method_count += 1
    if search_state.tags:
        reset_method_count += 1
    if meta_data.get('author_name',None):
        reset_method_count += 1

    if request.is_ajax():

        q_count = paginator.count
        if search_state.tags:
            question_counter = ungettext(
                                    '%(q_num)s question, tagged',
                                    '%(q_num)s questions, tagged',
                                    q_count
                                ) % {
                                    'q_num': humanize.intcomma(q_count),
                                }
        else:
            question_counter = ungettext(
                                    '%(q_num)s question',
                                    '%(q_num)s questions',
                                    q_count
                                ) % {
                                    'q_num': humanize.intcomma(q_count),
                                }

        if q_count > search_state.page_size:
            paginator_tpl = get_template('main_page/paginator.html', request)
            #todo: remove this patch on context after all templates are moved to jinja
            #paginator_context['base_url'] = request.path + '?sort=%s&' % search_state.sort
            data = {
                'context': extra_tags.cnprog_paginator(paginator_context),
                'questions_count': q_count,
                'page_size' : search_state.page_size,
            }
            paginator_html = paginator_tpl.render(Context(data))
        else:
            paginator_html = ''
        search_tags = list()
        if search_state.tags:
            search_tags = list(search_state.tags)
        query_data = {
            'tags': search_tags,
            'sort_order': search_state.sort
        }
        ajax_data = {
            #current page is 1 by default now
            #because ajax is only called by update in the search button
            'query_data': query_data,
            'paginator': paginator_html,
            'question_counter': question_counter,
            'questions': list(),
            'related_tags': list(),
            'faces': list(),
            'feed_url': context_feed_url,
            'query_string': search_state.query_string(),
            'parameters': search_state.make_parameters(),
            'page_size' : search_state.page_size,
        }

        badge_levels = dict(const.BADGE_TYPE_CHOICES)
        def pluralize_badge_count(count, level):
            return ungettext(
                '%(badge_count)d %(badge_level)s badge',
                '%(badge_count)d %(badge_level)s badges',
                count
            ) % {
                'badge_count': count,
                'badge_level': badge_levels[level]
            }

        gold_badge_css_class = const.BADGE_CSS_CLASSES[const.GOLD_BADGE],
        silver_badge_css_class = const.BADGE_CSS_CLASSES[const.SILVER_BADGE],
        bronze_badge_css_class = const.BADGE_CSS_CLASSES[const.BRONZE_BADGE],

        for tag in related_tags:
            tag_data = {
                'name': tag.name,
                'used_count': humanize.intcomma(tag.local_used_count)
            }
            ajax_data['related_tags'].append(tag_data)

        for contributor in contributors:
            ajax_data['faces'].append(extra_tags.gravatar(contributor, 48))
        #we render the template
        #from django.template import RequestContext
        questions_tpl = get_template('main_page/questions_loop.html', request)
        #todo: remove this patch on context after all templates are moved to jinja
        data = {
            'questions': page,
            'questions_count': q_count,
            'context': paginator_context,
            'language_code': translation.get_language(),
            'query': search_state.query,
            'reset_method_count': reset_method_count,
            'query_string': search_state.query_string(),
        }

        questions_html = questions_tpl.render(Context(data))
        #import pdb; pdb.set_trace()
        ajax_data['questions'] = questions_html.replace('\n','')
        return HttpResponse(
                    simplejson.dumps(ajax_data),
                    mimetype = 'application/json'
                )

    template_data = {
        'active_tab': 'questions',
        'author_name' : meta_data.get('author_name',None),
        'contributors' : contributors,
        'context' : paginator_context,
        'is_unanswered' : False,#remove this from template
        'interesting_tag_names': meta_data.get('interesting_tag_names',None),
        'ignored_tag_names': meta_data.get('ignored_tag_names',None),
        'language_code': translation.get_language(),
        'name_of_anonymous_user' : models.get_name_of_anonymous_user(),
        'page_class': 'main-page',
        'page_size': search_state.page_size,
        'query': search_state.query,
        'questions' : page,
        'questions_count' : paginator.count,
        'reset_method_count': reset_method_count,
        'scope': search_state.scope,
        'show_sort_by_relevance': askbot.conf.should_show_sort_by_relevance(),
        'search_tags' : search_state.tags,
        'sort': search_state.sort,
        'tab_id' : search_state.sort,
        'tags' : related_tags,
        'tag_list_type' : tag_list_type,
        'font_size' : font_size,
        'tag_filter_strategy_choices': const.TAG_FILTER_STRATEGY_CHOICES,
        'update_avatar_data': schedules.should_update_avatar_data(request),
        'query_string': search_state.query_string(),
        'parameters': search_state.make_parameters(),
        'feed_url': context_feed_url,
    }

    assert(request.is_ajax() == False)
    #ajax request is handled in a separate branch above

    #before = datetime.datetime.now()
    response = render_into_skin('main_page.html', template_data, request)
    #after = datetime.datetime.now()
    #print after - before
    return response
コード例 #9
0
def tags(
        request,
        category_name):  #view showing a listing of available tags - plain list
    stag = ""
    is_paginated = True
    sortby = request.GET.get('sort', 'used')
    try:
        page = int(request.GET.get('page', '1'))
    except ValueError:
        page = 1

    if request.method == "GET":
        # have to import this at run time, otherwise there is a circular import
        # dependency...
        from askbot.conf import settings as askbot_settings
        if category_name:
            if askbot.conf.settings.ENABLE_CATEGORIES:
                try:
                    category = Category.objects.get(name=category_name)
                except Category.DoesNotExist:
                    raise Http404
            else:
                # Maybe we can redirect to the bare /questions/ URL instead
                raise Http404
        else:
            category = None

        stag = request.GET.get("query", "").strip()
        filter_spec = Q(deleted=False)
        sort_spec = None
        if stag:
            filter_spec &= Q(name__icontains=stag)
        elif sortby == "name":
            sort_spec = "name"
        else:
            sort_spec = "-used_count"
        if category and askbot_settings.ENABLE_CATEGORIES:
            # Filter out tags not associated with the requested category
            cat_pks = category.get_descendants(include_self=True).values_list(
                'pk', flat=True)
            filter_spec &= Q(categories__in=list(cat_pks))
        paginator_query = models.Tag.objects.filter(filter_spec).exclude(
            used_count=0)
        if sort_spec is not None:
            paginator_query = paginator_query.order_by(sort_spec)
        objects_list = Paginator(paginator_query, DEFAULT_PAGE_SIZE)
        #if stag != '':
        #    objects_list = Paginator(
        #                    models.Tag.objects.filter(
        #                                        deleted=False,
        #                                        name__icontains=stag
        #                                    ).exclude(
        #                                        used_count=0
        #                                    ),
        #                    DEFAULT_PAGE_SIZE
        #                )
        #else:
        #    if sortby == "name":
        #        objects_list = Paginator(models.Tag.objects.filter(deleted=False).exclude(used_count=0).order_by("name"), DEFAULT_PAGE_SIZE)
        #    else:
        #        objects_list = Paginator(models.Tag.objects.filter(deleted=False).exclude(used_count=0).order_by("-used_count"), DEFAULT_PAGE_SIZE)

    try:
        tags = objects_list.page(page)
    except (EmptyPage, InvalidPage):
        tags = objects_list.page(objects_list.num_pages)

    paginator_data = {
        'is_paginated':
        is_paginated,
        'pages':
        objects_list.num_pages,
        'page':
        page,
        'has_previous':
        tags.has_previous(),
        'has_next':
        tags.has_next(),
        'previous':
        tags.previous_page_number(),
        'next':
        tags.next_page_number(),
        'base_url':
        reverse('tags', kwargs={'category_name': category_name}) +
        '?sort=%s&amp;' % sortby
    }
    paginator_context = extra_tags.cnprog_paginator(paginator_data)
    data = {
        'active_tab': 'tags',
        'page_class': 'tags-page',
        'tags': tags,
        'stag': stag,
        'tab_id': sortby,
        'keywords': stag,
        'paginator_context': paginator_context,
        'current_category': category_name,
    }
    return render_into_skin('tags.html', data, request)
コード例 #10
0
            actor=request.user,
            context_object=question,
        )

    paginator_data = {
        'is_paginated': (objects_list.count > const.ANSWERS_PAGE_SIZE),
        'pages': objects_list.num_pages,
        'page': show_page,
        'has_previous': page_objects.has_previous(),
        'has_next': page_objects.has_next(),
        'previous': page_objects.previous_page_number(),
        'next': page_objects.next_page_number(),
        'base_url': request.path + '?sort=%s&amp;' % answer_sort_method,
        'extend_url': "#sort-top"
    }
    paginator_context = extra_tags.cnprog_paginator(paginator_data)

    favorited = question.has_favorite_by_user(request.user)
    if request.user.is_authenticated():
        question_vote = question.votes.select_related().filter(
            user=request.user)
    else:
        question_vote = None  #is this correct?
    if question_vote is not None and question_vote.count() > 0:
        question_vote = question_vote[0]

    data = {
        'page_class': 'question-page',
        'active_tab': 'questions',
        'question': question,
        'question_vote': question_vote,
コード例 #11
0
ファイル: readers.py プロジェクト: sguerin/askbot-devel
def questions(request):
    """
    List of Questions, Tagged questions, and Unanswered questions.
    matching search query or user selection
    """
    #before = datetime.datetime.now()
    #don't allow to post to this view
    if request.method == 'POST':
        raise Http404

    #update search state
    form = AdvancedSearchForm(request.GET)
    if form.is_valid():
        user_input = form.cleaned_data
    else:
        user_input = None
    search_state = request.session.get('search_state', SearchState())
    view_log = request.session['view_log']
    search_state.update(user_input, view_log, request.user)
    request.session['search_state'] = search_state
    request.session.modified = True

    #force reset for debugging
    #search_state.reset()
    #request.session.modified = True

    #todo: have this call implemented for sphinx, mysql and pgsql
    (qs, meta_data, related_tags) = models.Question.objects.run_advanced_search(
                                            request_user = request.user,
                                            search_state = search_state,
                                        )

    tag_list_type = askbot_settings.TAG_LIST_FORMAT
    
    #force cloud to sort by name
    if tag_list_type == 'cloud':
        related_tags = sorted(related_tags, key = operator.attrgetter('name'))

    font_size = extra_tags.get_tag_font_size(related_tags)
    
    paginator = Paginator(qs, search_state.page_size)

    if paginator.num_pages < search_state.page:
        raise Http404

    page = paginator.page(search_state.page)

    contributors = models.Question.objects.get_question_and_answer_contributors(page.object_list)

    paginator_context = {
        'is_paginated' : (paginator.count > search_state.page_size),
        'pages': paginator.num_pages,
        'page': search_state.page,
        'has_previous': page.has_previous(),
        'has_next': page.has_next(),
        'previous': page.previous_page_number(),
        'next': page.next_page_number(),
        'base_url' : request.path + '?sort=%s&amp;' % search_state.sort,#todo in T sort=>sort_method
        'page_size' : search_state.page_size,#todo in T pagesize -> page_size
    }

    if request.is_ajax():

        q_count = paginator.count
        if search_state.tags:
            question_counter = ungettext(
                                    '%(q_num)s question, tagged',
                                    '%(q_num)s questions, tagged',
                                    q_count
                                ) % {
                                    'q_num': humanize.intcomma(q_count),
                                }
        else:
            question_counter = ungettext(
                                    '%(q_num)s question',
                                    '%(q_num)s questions',
                                    q_count
                                ) % {
                                    'q_num': humanize.intcomma(q_count),
                                }

        if q_count > search_state.page_size:
            paginator_tpl = get_template('blocks/paginator.html', request)
            #todo: remove this patch on context after all templates are moved to jinja
            paginator_context['base_url'] = request.path + '?sort=%s&' % search_state.sort
            data = {
                'paginator_context': extra_tags.cnprog_paginator(paginator_context)
            }
            paginator_html = paginator_tpl.render(Context(data))
        else:
            paginator_html = ''
        search_tags = list()
        if search_state.tags:
            search_tags = list(search_state.tags)
        query_data = {
            'tags': search_tags,
            'sort_order': search_state.sort
        }
        ajax_data = {
            #current page is 1 by default now
            #because ajax is only called by update in the search button
            'query_data': query_data,
            'paginator': paginator_html,
            'question_counter': question_counter,
            'questions': list(),
            'related_tags': list(),
            'faces': list()
        }

        badge_levels = dict(const.BADGE_TYPE_CHOICES)
        def pluralize_badge_count(count, level):
            return ungettext(
                '%(badge_count)d %(badge_level)s badge',
                '%(badge_count)d %(badge_level)s badges',
                count
            ) % {
                'badge_count': count, 
                'badge_level': badge_levels[level]
            }

        gold_badge_css_class = const.BADGE_CSS_CLASSES[const.GOLD_BADGE],
        silver_badge_css_class = const.BADGE_CSS_CLASSES[const.SILVER_BADGE],
        bronze_badge_css_class = const.BADGE_CSS_CLASSES[const.BRONZE_BADGE],

        for tag in related_tags:
            tag_data = {
                'name': tag.name,
                'used_count': humanize.intcomma(tag.local_used_count)
            }
            ajax_data['related_tags'].append(tag_data)

        for contributor in contributors:
            ajax_data['faces'].append(extra_tags.gravatar(contributor, 48))

        for question in page.object_list:
            timestamp = question.last_activity_at
            author = question.last_activity_by

            if question.score == 0:
                votes_class = 'no-votes'
            else:
                votes_class = 'some-votes'

            if question.answer_count == 0:
                answers_class = 'no-answers'
            elif question.answer_accepted:
                answers_class = 'accepted'
            else:
                answers_class = 'some-answers'

            if question.view_count == 0:
                views_class = 'no-views'
            else:
                views_class = 'some-views'

            country_code = None
            if author.country and author.show_country:
                country_code = author.country.code

            question_data = {
                'title': question.title,
                'summary': question.summary,
                'id': question.id,
                'tags': question.get_tag_names(),
                'tag_list_type': tag_list_type,
                'font_size': font_size,
                'votes': extra_filters.humanize_counter(question.score),
                'votes_class': votes_class,
                'votes_word': ungettext('vote', 'votes', question.score),
                'answers': extra_filters.humanize_counter(question.answer_count),
                'answers_class': answers_class,
                'answers_word': ungettext('answer', 'answers', question.answer_count),
                'views': extra_filters.humanize_counter(question.view_count),
                'views_class': views_class,
                'views_word': ungettext('view', 'views', question.view_count),
                'timestamp': unicode(timestamp),
                'timesince': functions.diff_date(timestamp),
                'u_id': author.id,
                'u_name': author.username,
                'u_rep': author.reputation,
                'u_gold': author.gold,
                'u_gold_title': pluralize_badge_count(
                                                author.gold,
                                                const.GOLD_BADGE
                                            ),
                'u_gold_badge_symbol': const.BADGE_DISPLAY_SYMBOL,
                'u_gold_css_class': gold_badge_css_class,
                'u_silver': author.silver,
                'u_silver_title': pluralize_badge_count(
                                            author.silver,
                                            const.SILVER_BADGE
                                        ),
                'u_silver_badge_symbol': const.BADGE_DISPLAY_SYMBOL,
                'u_silver_css_class': silver_badge_css_class,
                'u_bronze': author.bronze,
                'u_bronze_title': pluralize_badge_count(
                                            author.bronze,
                                            const.BRONZE_BADGE
                                        ),
                'u_bronze_badge_symbol': const.BADGE_DISPLAY_SYMBOL,
                'u_bronze_css_class': bronze_badge_css_class,
                'u_country_code': country_code,
                'u_is_anonymous': question.is_anonymous,
            }
            ajax_data['questions'].append(question_data)

        return HttpResponse(
                    simplejson.dumps(ajax_data),
                    mimetype = 'application/json'
                )

    reset_method_count = 0
    if search_state.query:
        reset_method_count += 1
    if search_state.tags:
        reset_method_count += 1
    if meta_data.get('author_name',None):
        reset_method_count += 1

    template_data = {
        'active_tab': 'questions',
        'author_name' : meta_data.get('author_name',None),
        'contributors' : contributors,
        'context' : paginator_context,
        'is_unanswered' : False,#remove this from template
        'interesting_tag_names': meta_data.get('interesting_tag_names',None),
        'ignored_tag_names': meta_data.get('ignored_tag_names',None), 
        'language_code': translation.get_language(),
        'name_of_anonymous_user' : models.get_name_of_anonymous_user(),
        'page_class': 'main-page',
        'query': search_state.query,
        'questions' : page,
        'questions_count' : paginator.count,
        'reset_method_count': reset_method_count,
        'scope': search_state.scope,
        'show_sort_by_relevance': askbot.conf.should_show_sort_by_relevance(),
        'search_tags' : search_state.tags,
        'sort': search_state.sort,
        'tab_id' : search_state.sort,
        'tags' : related_tags,
        'tag_list_type' : tag_list_type,
        'font_size' : font_size,
        'tag_filter_strategy_choices': const.TAG_FILTER_STRATEGY_CHOICES,
    }

    assert(request.is_ajax() == False)
    #ajax request is handled in a separate branch above

    #before = datetime.datetime.now()
    response = render_into_skin('main_page.html', template_data, request)
    #after = datetime.datetime.now()
    #print after - before
    return response
コード例 #12
0
ファイル: users.py プロジェクト: exezaid/askbot-devel
def users(request):
    is_paginated = True
    sortby = request.GET.get('sort', 'reputation')
    suser = request.REQUEST.get('q',  "")
    try:
        page = int(request.GET.get('page', '1'))
    except ValueError:
        page = 1

    if suser == "":
        if sortby == "newest":
            order_by_parameter = '-date_joined'
        elif sortby == "last":
            order_by_parameter = 'date_joined'
        elif sortby == "user":
            order_by_parameter = 'username'
        else:
            # default
            order_by_parameter = '-reputation'

        objects_list = Paginator(
                            models.User.objects.all().order_by(
                                                order_by_parameter
                                            ), 
                            const.USERS_PAGE_SIZE
                        )
        base_url = reverse('users') + '?sort=%s&' % sortby
    else:
        sortby = "reputation"
        objects_list = Paginator(
                            models.User.objects.extra(
                                                where=['username like %s'],
                                                params=['%' + suser + '%']
                                            ).order_by(
                                                '-reputation'
                                            ), 
                            const.USERS_PAGE_SIZE
                        )
        base_url = reverse('users') + '?name=%s&sort=%s&' % (suser, sortby)

    try:
        users_page = objects_list.page(page)
    except (EmptyPage, InvalidPage):
        users_page = objects_list.page(objects_list.num_pages)

    paginator_data = {
        'is_paginated' : is_paginated,
        'pages': objects_list.num_pages,
        'page': page,
        'has_previous': users_page.has_previous(),
        'has_next': users_page.has_next(),
        'previous': users_page.previous_page_number(),
        'next': users_page.next_page_number(),
        'base_url' : base_url
    }
    paginator_context = extra_tags.cnprog_paginator(paginator_data)
    data = {
        'active_tab': 'users',
        'users' : users_page,
        'suser' : suser,
        'keywords' : suser,
        'tab_id' : sortby,
        'paginator_context' : paginator_context
    }
    template = ENV.get_template('users.html')
    context = RequestContext(request, data)
    return HttpResponse(template.render(context))
コード例 #13
0
ファイル: readers.py プロジェクト: raags/askbot-devel
def questions(request):
    """
    List of Questions, Tagged questions, and Unanswered questions.
    matching search query or user selection
    """
    # before = datetime.datetime.now()
    # don't allow to post to this view
    if request.method == "POST":
        raise Http404

    # update search state
    form = AdvancedSearchForm(request.GET)
    if form.is_valid():
        user_input = form.cleaned_data
    else:
        user_input = None
    search_state = request.session.get("search_state", SearchState())
    view_log = request.session["view_log"]
    search_state.update(user_input, view_log, request.user)
    request.session["search_state"] = search_state
    request.session.modified = True

    # force reset for debugging
    # search_state.reset()
    # request.session.modified = True

    # todo: have this call implemented for sphinx, mysql and pgsql
    (qs, meta_data, related_tags) = models.Question.objects.run_advanced_search(
        request_user=request.user, search_state=search_state
    )

    tag_list_type = askbot_settings.TAG_LIST_FORMAT

    # force cloud to sort by name
    if tag_list_type == "cloud":
        related_tags = sorted(related_tags, key=operator.attrgetter("name"))

    font_size = extra_tags.get_tag_font_size(related_tags)

    paginator = Paginator(qs, search_state.page_size)

    if paginator.num_pages < search_state.page:
        raise Http404

    page = paginator.page(search_state.page)

    contributors = models.Question.objects.get_question_and_answer_contributors(page.object_list)

    paginator_context = {
        "is_paginated": (paginator.count > search_state.page_size),
        "pages": paginator.num_pages,
        "page": search_state.page,
        "has_previous": page.has_previous(),
        "has_next": page.has_next(),
        "previous": page.previous_page_number(),
        "next": page.next_page_number(),
        "base_url": request.path + "?sort=%s&amp;" % search_state.sort,  # todo in T sort=>sort_method
        "page_size": search_state.page_size,  # todo in T pagesize -> page_size
    }

    if request.is_ajax():

        q_count = paginator.count
        if search_state.tags:
            question_counter = ungettext("%(q_num)s question, tagged", "%(q_num)s questions, tagged", q_count) % {
                "q_num": humanize.intcomma(q_count)
            }
        else:
            question_counter = ungettext("%(q_num)s question", "%(q_num)s questions", q_count) % {
                "q_num": humanize.intcomma(q_count)
            }

        if q_count > search_state.page_size:
            paginator_tpl = get_template("blocks/paginator.html", request)
            # todo: remove this patch on context after all templates are moved to jinja
            paginator_context["base_url"] = request.path + "?sort=%s&" % search_state.sort
            data = {"paginator_context": extra_tags.cnprog_paginator(paginator_context)}
            paginator_html = paginator_tpl.render(Context(data))
        else:
            paginator_html = ""
        search_tags = list()
        if search_state.tags:
            search_tags = list(search_state.tags)
        query_data = {"tags": search_tags, "sort_order": search_state.sort}
        ajax_data = {
            # current page is 1 by default now
            # because ajax is only called by update in the search button
            "query_data": query_data,
            "paginator": paginator_html,
            "question_counter": question_counter,
            "questions": list(),
            "related_tags": list(),
            "faces": list(),
        }

        badge_levels = dict(const.BADGE_TYPE_CHOICES)

        def pluralize_badge_count(count, level):
            return ungettext(
                "%(badge_count)d %(badge_level)s badge", "%(badge_count)d %(badge_level)s badges", count
            ) % {"badge_count": count, "badge_level": badge_levels[level]}

        gold_badge_css_class = (const.BADGE_CSS_CLASSES[const.GOLD_BADGE],)
        silver_badge_css_class = (const.BADGE_CSS_CLASSES[const.SILVER_BADGE],)
        bronze_badge_css_class = (const.BADGE_CSS_CLASSES[const.BRONZE_BADGE],)

        for tag in related_tags:
            tag_data = {"name": tag.name, "used_count": humanize.intcomma(tag.local_used_count)}
            ajax_data["related_tags"].append(tag_data)

        for contributor in contributors:
            ajax_data["faces"].append(extra_tags.gravatar(contributor, 48))

        for question in page.object_list:
            timestamp = question.last_activity_at
            author = question.last_activity_by

            if question.score == 0:
                votes_class = "no-votes"
            else:
                votes_class = "some-votes"

            if question.answer_count == 0:
                answers_class = "no-answers"
            elif question.answer_accepted:
                answers_class = "accepted"
            else:
                answers_class = "some-answers"

            if question.view_count == 0:
                views_class = "no-views"
            else:
                views_class = "some-views"

            country_code = None
            if author.country and author.show_country:
                country_code = author.country.code

            question_data = {
                "title": question.title,
                "summary": question.summary,
                "id": question.id,
                "tags": question.get_tag_names(),
                "tag_list_type": tag_list_type,
                "font_size": font_size,
                "votes": extra_filters.humanize_counter(question.score),
                "votes_class": votes_class,
                "votes_word": ungettext("vote", "votes", question.score),
                "answers": extra_filters.humanize_counter(question.answer_count),
                "answers_class": answers_class,
                "answers_word": ungettext("answer", "answers", question.answer_count),
                "views": extra_filters.humanize_counter(question.view_count),
                "views_class": views_class,
                "views_word": ungettext("view", "views", question.view_count),
                "timestamp": unicode(timestamp),
                "timesince": functions.diff_date(timestamp),
                "u_id": author.id,
                "u_name": author.username,
                "u_rep": author.reputation,
                "u_gold": author.gold,
                "u_gold_title": pluralize_badge_count(author.gold, const.GOLD_BADGE),
                "u_gold_badge_symbol": const.BADGE_DISPLAY_SYMBOL,
                "u_gold_css_class": gold_badge_css_class,
                "u_silver": author.silver,
                "u_silver_title": pluralize_badge_count(author.silver, const.SILVER_BADGE),
                "u_silver_badge_symbol": const.BADGE_DISPLAY_SYMBOL,
                "u_silver_css_class": silver_badge_css_class,
                "u_bronze": author.bronze,
                "u_bronze_title": pluralize_badge_count(author.bronze, const.BRONZE_BADGE),
                "u_bronze_badge_symbol": const.BADGE_DISPLAY_SYMBOL,
                "u_bronze_css_class": bronze_badge_css_class,
                "u_country_code": country_code,
                "u_is_anonymous": question.is_anonymous,
            }
            ajax_data["questions"].append(question_data)

        return HttpResponse(simplejson.dumps(ajax_data), mimetype="application/json")

    reset_method_count = 0
    if search_state.query:
        reset_method_count += 1
    if search_state.tags:
        reset_method_count += 1
    if meta_data.get("author_name", None):
        reset_method_count += 1

    template_data = {
        "active_tab": "questions",
        "author_name": meta_data.get("author_name", None),
        "contributors": contributors,
        "context": paginator_context,
        "is_unanswered": False,  # remove this from template
        "interesting_tag_names": meta_data.get("interesting_tag_names", None),
        "ignored_tag_names": meta_data.get("ignored_tag_names", None),
        "language_code": translation.get_language(),
        "name_of_anonymous_user": models.get_name_of_anonymous_user(),
        "page_class": "main-page",
        "query": search_state.query,
        "questions": page,
        "questions_count": paginator.count,
        "reset_method_count": reset_method_count,
        "scope": search_state.scope,
        "show_sort_by_relevance": askbot.conf.should_show_sort_by_relevance(),
        "search_tags": search_state.tags,
        "sort": search_state.sort,
        "tab_id": search_state.sort,
        "tags": related_tags,
        "tag_list_type": tag_list_type,
        "font_size": font_size,
        "tag_filter_strategy_choices": const.TAG_FILTER_STRATEGY_CHOICES,
        "update_avatar_data": schedules.should_update_avatar_data(request),
    }

    assert request.is_ajax() == False
    # ajax request is handled in a separate branch above

    # before = datetime.datetime.now()
    response = render_into_skin("main_page.html", template_data, request)
    # after = datetime.datetime.now()
    # print after - before
    return response
コード例 #14
0
ファイル: readers.py プロジェクト: raags/askbot-devel
def tags(request):  # view showing a listing of available tags - plain list

    tag_list_type = askbot_settings.TAG_LIST_FORMAT

    if tag_list_type == "list":

        stag = ""
        is_paginated = True
        sortby = request.GET.get("sort", "used")
        try:
            page = int(request.GET.get("page", "1"))
        except ValueError:
            page = 1

        if request.method == "GET":
            stag = request.GET.get("query", "").strip()
            if stag != "":
                objects_list = Paginator(
                    models.Tag.objects.filter(deleted=False, name__icontains=stag).exclude(used_count=0),
                    DEFAULT_PAGE_SIZE,
                )
            else:
                if sortby == "name":
                    objects_list = Paginator(
                        models.Tag.objects.all().filter(deleted=False).exclude(used_count=0).order_by("name"),
                        DEFAULT_PAGE_SIZE,
                    )
                else:
                    objects_list = Paginator(
                        models.Tag.objects.all().filter(deleted=False).exclude(used_count=0).order_by("-used_count"),
                        DEFAULT_PAGE_SIZE,
                    )

        try:
            tags = objects_list.page(page)
        except (EmptyPage, InvalidPage):
            tags = objects_list.page(objects_list.num_pages)

        paginator_data = {
            "is_paginated": is_paginated,
            "pages": objects_list.num_pages,
            "page": page,
            "has_previous": tags.has_previous(),
            "has_next": tags.has_next(),
            "previous": tags.previous_page_number(),
            "next": tags.next_page_number(),
            "base_url": reverse("tags") + "?sort=%s&amp;" % sortby,
        }
        paginator_context = extra_tags.cnprog_paginator(paginator_data)
        data = {
            "active_tab": "tags",
            "page_class": "tags-page",
            "tags": tags,
            "tag_list_type": tag_list_type,
            "stag": stag,
            "tab_id": sortby,
            "keywords": stag,
            "paginator_context": paginator_context,
        }

    else:

        stag = ""
        sortby = request.GET.get("sort", "name")

        if request.method == "GET":
            stag = request.GET.get("query", "").strip()
            if stag != "":
                tags = models.Tag.objects.filter(deleted=False, name__icontains=stag).exclude(used_count=0)
            else:
                if sortby == "name":
                    tags = models.Tag.objects.all().filter(deleted=False).exclude(used_count=0).order_by("name")
                else:
                    tags = models.Tag.objects.all().filter(deleted=False).exclude(used_count=0).order_by("-used_count")

        font_size = extra_tags.get_tag_font_size(tags)

        data = {
            "active_tab": "tags",
            "page_class": "tags-page",
            "tags": tags,
            "tag_list_type": tag_list_type,
            "font_size": font_size,
            "stag": stag,
            "tab_id": sortby,
            "keywords": stag,
        }

    return render_into_skin("tags.html", data, request)
コード例 #15
0
def questions(request):
    """
    List of Questions, Tagged questions, and Unanswered questions.
    matching search query or user selection
    """
    #before = datetime.datetime.now()
    #don't allow to post to this view
    if request.method == 'POST':
        raise Http404

    #update search state
    form = AdvancedSearchForm(request.GET)
    if form.is_valid():
        user_input = form.cleaned_data
    else:
        user_input = None
    search_state = request.session.get('search_state', SearchState())
    view_log = request.session['view_log']
    search_state.update(user_input, view_log, request.user)
    request.session['search_state'] = search_state
    request.session.modified = True

    #force reset for debugging
    #search_state.reset()
    #request.session.modified = True

    #todo: have this call implemented for sphinx, mysql and pgsql
    (qs, meta_data, related_tags) = models.Question.objects.run_advanced_search(
                                            request_user = request.user,
                                            search_state = search_state,
                                        )

    tag_list_type = askbot_settings.TAG_LIST_FORMAT

    #force cloud to sort by name
    if tag_list_type == 'cloud':
        related_tags = sorted(related_tags, key = operator.attrgetter('name'))

    font_size = extra_tags.get_tag_font_size(related_tags)

    paginator = Paginator(qs, search_state.page_size)

    if paginator.num_pages < search_state.page:
        raise Http404

    page = paginator.page(search_state.page)

    contributors = models.Question.objects.get_question_and_answer_contributors(page.object_list)

    paginator_context = {
        'is_paginated' : (paginator.count > search_state.page_size),
        'pages': paginator.num_pages,
        'page': search_state.page,
        'has_previous': page.has_previous(),
        'has_next': page.has_next(),
        'previous': page.previous_page_number(),
        'next': page.next_page_number(),
        'base_url' : request.path + '?sort=%s&amp;' % search_state.sort,#todo in T sort=>sort_method
        'page_size' : search_state.page_size,#todo in T pagesize -> page_size
    }

    if request.is_ajax():

        q_count = paginator.count
        if search_state.tags:
            question_counter = ungettext(
                                    '%(q_num)s question, tagged',
                                    '%(q_num)s questions, tagged',
                                    q_count
                                ) % {
                                    'q_num': humanize.intcomma(q_count),
                                }
        else:
            question_counter = ungettext(
                                    '%(q_num)s question',
                                    '%(q_num)s questions',
                                    q_count
                                ) % {
                                    'q_num': humanize.intcomma(q_count),
                                }

        if q_count > search_state.page_size:
            paginator_tpl = get_template('main_page/paginator.html', request)
            #todo: remove this patch on context after all templates are moved to jinja
            paginator_context['base_url'] = request.path + '?sort=%s&' % search_state.sort
            data = {
                'context': extra_tags.cnprog_paginator(paginator_context),
                'questions_count': q_count
            }
            paginator_html = paginator_tpl.render(Context(data))
        else:
            paginator_html = ''
        search_tags = list()
        if search_state.tags:
            search_tags = list(search_state.tags)
        query_data = {
            'tags': search_tags,
            'sort_order': search_state.sort
        }
        ajax_data = {
            #current page is 1 by default now
            #because ajax is only called by update in the search button
            'query_data': query_data,
            'paginator': paginator_html,
            'question_counter': question_counter,
            'questions': list(),
            'related_tags': list(),
            'faces': list()
        }

        badge_levels = dict(const.BADGE_TYPE_CHOICES)
        def pluralize_badge_count(count, level):
            return ungettext(
                '%(badge_count)d %(badge_level)s badge',
                '%(badge_count)d %(badge_level)s badges',
                count
            ) % {
                'badge_count': count,
                'badge_level': badge_levels[level]
            }

        gold_badge_css_class = const.BADGE_CSS_CLASSES[const.GOLD_BADGE],
        silver_badge_css_class = const.BADGE_CSS_CLASSES[const.SILVER_BADGE],
        bronze_badge_css_class = const.BADGE_CSS_CLASSES[const.BRONZE_BADGE],

        for tag in related_tags:
            tag_data = {
                'name': tag.name,
                'used_count': humanize.intcomma(tag.local_used_count)
            }
            ajax_data['related_tags'].append(tag_data)

        for contributor in contributors:
            ajax_data['faces'].append(extra_tags.gravatar(contributor, 48))
        #we render the template
        #from django.template import RequestContext
        questions_tpl = get_template('main_page/questions_loop.html', request)
        #todo: remove this patch on context after all templates are moved to jinja
        data = {
            'questions': page,
            'questions_count': q_count,
            'context': paginator_context,
            'language_code': translation.get_language(),
            'query': search_state.query,
        }

        questions_html = questions_tpl.render(Context(data))
        ajax_data['questions'] = questions_html.replace('\n','')
        return HttpResponse(
                    simplejson.dumps(ajax_data),
                    mimetype = 'application/json'
                )

    reset_method_count = 0
    if search_state.query:
        reset_method_count += 1
    if search_state.tags:
        reset_method_count += 1
    if meta_data.get('author_name',None):
        reset_method_count += 1

    template_data = {
        'active_tab': 'questions',
        'author_name' : meta_data.get('author_name',None),
        'contributors' : contributors,
        'context' : paginator_context,
        'is_unanswered' : False,#remove this from template
        'interesting_tag_names': meta_data.get('interesting_tag_names',None),
        'ignored_tag_names': meta_data.get('ignored_tag_names',None),
        'language_code': translation.get_language(),
        'name_of_anonymous_user' : models.get_name_of_anonymous_user(),
        'page_class': 'main-page',
        'query': search_state.query,
        'questions' : page,
        'questions_count' : paginator.count,
        'reset_method_count': reset_method_count,
        'scope': search_state.scope,
        'show_sort_by_relevance': askbot.conf.should_show_sort_by_relevance(),
        'search_tags' : search_state.tags,
        'sort': search_state.sort,
        'tab_id' : search_state.sort,
        'tags' : related_tags,
        'tag_list_type' : tag_list_type,
        'font_size' : font_size,
        'tag_filter_strategy_choices': const.TAG_FILTER_STRATEGY_CHOICES,
        'update_avatar_data': schedules.should_update_avatar_data(request),
    }

    assert(request.is_ajax() == False)
    #ajax request is handled in a separate branch above

    #before = datetime.datetime.now()
    response = render_into_skin('main_page.html', template_data, request)
    #after = datetime.datetime.now()
    #print after - before
    return response
コード例 #16
0
def questions(request):
    """
    List of Questions, Tagged questions, and Unanswered questions.
    matching search query or user selection
    """
    #before = datetime.datetime.now()
    #don't allow to post to this view
    if request.method == 'POST':
        raise Http404

    #update search state
    form = AdvancedSearchForm(request.GET)
    if form.is_valid():
        user_input = form.cleaned_data
    else:
        user_input = None
    search_state = request.session.get('search_state', SearchState())
    view_log = request.session['view_log']
    search_state.update(user_input, view_log, request.user)
    request.session['search_state'] = search_state
    request.session.modified = True

    #force reset for debugging
    #search_state.reset()
    #request.session.modified = True

    #todo: have this call implemented for sphinx, mysql and pgsql
    (qs, meta_data,
     related_tags) = models.Question.objects.run_advanced_search(
         request_user=request.user,
         search_state=search_state,
     )

    paginator = Paginator(qs, search_state.page_size)

    if paginator.num_pages < search_state.page:
        raise Http404

    page = paginator.page(search_state.page)

    contributors = models.Question.objects.get_question_and_answer_contributors(
        page.object_list)

    paginator_context = {
        'is_paginated': (paginator.count > search_state.page_size),
        'pages': paginator.num_pages,
        'page': search_state.page,
        'has_previous': page.has_previous(),
        'has_next': page.has_next(),
        'previous': page.previous_page_number(),
        'next': page.next_page_number(),
        'base_url': request.path +
        '?sort=%s&amp;' % search_state.sort,  #todo in T sort=>sort_method
        'page_size': search_state.page_size,  #todo in T pagesize -> page_size
    }

    if request.is_ajax():

        q_count = paginator.count
        if search_state.tags:
            question_counter = ungettext(
                '%(q_num)s question, tagged', '%(q_num)s questions, tagged',
                q_count) % {
                    'q_num': humanize.intcomma(q_count),
                }
        else:
            question_counter = ungettext(
                '%(q_num)s question', '%(q_num)s questions', q_count) % {
                    'q_num': humanize.intcomma(q_count),
                }

        if q_count > search_state.page_size:
            paginator_tpl = get_template('blocks/paginator.html', request)
            #todo: remove this patch on context after all templates are moved to jinja
            paginator_context[
                'base_url'] = request.path + '?sort=%s&' % search_state.sort
            data = {
                'paginator_context':
                extra_tags.cnprog_paginator(paginator_context)
            }
            paginator_html = paginator_tpl.render(Context(data))
        else:
            paginator_html = ''
        search_tags = list()
        if search_state.tags:
            search_tags = list(search_state.tags)
        query_data = {'tags': search_tags, 'sort_order': search_state.sort}
        ajax_data = {
            #current page is 1 by default now
            #because ajax is only called by update in the search button
            'query_data': query_data,
            'paginator': paginator_html,
            'question_counter': question_counter,
            'questions': list(),
            'related_tags': list(),
            'faces': list()
        }

        badge_levels = dict(const.BADGE_TYPE_CHOICES)

        def pluralize_badge_count(count, level):
            return ungettext('%(badge_count)d %(badge_level)s badge',
                             '%(badge_count)d %(badge_level)s badges',
                             count) % {
                                 'badge_count': count,
                                 'badge_level': badge_levels[level]
                             }

        gold_badge_css_class = const.BADGE_CSS_CLASSES[const.GOLD_BADGE],
        silver_badge_css_class = const.BADGE_CSS_CLASSES[const.SILVER_BADGE],
        bronze_badge_css_class = const.BADGE_CSS_CLASSES[const.BRONZE_BADGE],

        for tag in related_tags:
            tag_data = {
                'name': tag.name,
                'used_count': humanize.intcomma(tag.local_used_count)
            }
            ajax_data['related_tags'].append(tag_data)

        for contributor in contributors:
            ajax_data['faces'].append(extra_tags.gravatar(contributor, 48))

        for question in page.object_list:
            timestamp = question.last_activity_at
            author = question.last_activity_by

            if question.score == 0:
                votes_class = 'no-votes'
            else:
                votes_class = 'some-votes'

            if question.answer_count == 0:
                answers_class = 'no-answers'
            elif question.answer_accepted:
                answers_class = 'accepted'
            else:
                answers_class = 'some-answers'

            if question.view_count == 0:
                views_class = 'no-views'
            else:
                views_class = 'some-views'

            country_code = None
            if author.country and author.show_country:
                country_code = author.country.code

            question_data = {
                'title':
                question.title,
                'summary':
                question.summary,
                'id':
                question.id,
                'tags':
                question.get_tag_names(),
                'votes':
                extra_filters.humanize_counter(question.score),
                'votes_class':
                votes_class,
                'votes_word':
                ungettext('vote', 'votes', question.score),
                'answers':
                extra_filters.humanize_counter(question.answer_count),
                'answers_class':
                answers_class,
                'answers_word':
                ungettext('answer', 'answers', question.answer_count),
                'views':
                extra_filters.humanize_counter(question.view_count),
                'views_class':
                views_class,
                'views_word':
                ungettext('view', 'views', question.view_count),
                'timestamp':
                unicode(timestamp),
                'timesince':
                functions.diff_date(timestamp),
                'u_id':
                author.id,
                'u_name':
                author.username,
                'u_rep':
                author.reputation,
                'u_gold':
                author.gold,
                'u_gold_title':
                pluralize_badge_count(author.gold, const.GOLD_BADGE),
                'u_gold_badge_symbol':
                const.BADGE_DISPLAY_SYMBOL,
                'u_gold_css_class':
                gold_badge_css_class,
                'u_silver':
                author.silver,
                'u_silver_title':
                pluralize_badge_count(author.silver, const.SILVER_BADGE),
                'u_silver_badge_symbol':
                const.BADGE_DISPLAY_SYMBOL,
                'u_silver_css_class':
                silver_badge_css_class,
                'u_bronze':
                author.bronze,
                'u_bronze_title':
                pluralize_badge_count(author.bronze, const.BRONZE_BADGE),
                'u_bronze_badge_symbol':
                const.BADGE_DISPLAY_SYMBOL,
                'u_bronze_css_class':
                bronze_badge_css_class,
                'u_country_code':
                country_code,
                'u_is_anonymous':
                question.is_anonymous,
            }
            ajax_data['questions'].append(question_data)

        return HttpResponse(simplejson.dumps(ajax_data),
                            mimetype='application/json')

    reset_method_count = 0
    if search_state.query:
        reset_method_count += 1
    if search_state.tags:
        reset_method_count += 1
    if meta_data.get('author_name', None):
        reset_method_count += 1

    template_data = {
        'active_tab': 'questions',
        'author_name': meta_data.get('author_name', None),
        'contributors': contributors,
        'context': paginator_context,
        'is_unanswered': False,  #remove this from template
        'interesting_tag_names': meta_data.get('interesting_tag_names', None),
        'ignored_tag_names': meta_data.get('ignored_tag_names', None),
        'language_code': translation.get_language(),
        'name_of_anonymous_user': models.get_name_of_anonymous_user(),
        'page_class': 'main-page',
        'query': search_state.query,
        'questions': page,
        'questions_count': paginator.count,
        'reset_method_count': reset_method_count,
        'scope': search_state.scope,
        'show_sort_by_relevance': askbot.conf.should_show_sort_by_relevance(),
        'search_tags': search_state.tags,
        'sort': search_state.sort,
        'tab_id': search_state.sort,
        'tags': related_tags,
        'tag_filter_strategy_choices': const.TAG_FILTER_STRATEGY_CHOICES,
    }

    assert (request.is_ajax() == False)
    #ajax request is handled in a separate branch above

    #before = datetime.datetime.now()
    response = render_into_skin('main_page.html', template_data, request)
    #after = datetime.datetime.now()
    #print after - before
    return response
コード例 #17
0
ファイル: users.py プロジェクト: Plexical/askbot-devel
def users(request):
    is_paginated = True
    sortby = request.GET.get('sort', 'reputation')
    suser = request.REQUEST.get('query',  "")
    try:
        page = int(request.GET.get('page', '1'))
    except ValueError:
        page = 1

    if suser == "":
        if sortby == "newest":
            order_by_parameter = '-date_joined'
        elif sortby == "last":
            order_by_parameter = 'date_joined'
        elif sortby == "user":
            order_by_parameter = 'username'
        else:
            # default
            order_by_parameter = '-reputation'

        objects_list = Paginator(
                            models.User.objects.all().order_by(
                                                order_by_parameter
                                            ),
                            const.USERS_PAGE_SIZE
                        )
        base_url = reverse('users') + '?sort=%s&' % sortby
    else:
        sortby = "reputation"
        objects_list = Paginator(
                            models.User.objects.filter(
                                                username__icontains = suser
                                            ).order_by(
                                                '-reputation'
                                            ),
                            const.USERS_PAGE_SIZE
                        )
        base_url = reverse('users') + '?name=%s&sort=%s&' % (suser, sortby)

    try:
        users_page = objects_list.page(page)
    except (EmptyPage, InvalidPage):
        users_page = objects_list.page(objects_list.num_pages)

    paginator_data = {
        'is_paginated' : is_paginated,
        'pages': objects_list.num_pages,
        'page': page,
        'has_previous': users_page.has_previous(),
        'has_next': users_page.has_next(),
        'previous': users_page.previous_page_number(),
        'next': users_page.next_page_number(),
        'base_url' : base_url
    }
    paginator_context = extra_tags.cnprog_paginator(paginator_data)
    data = {
        'active_tab': 'users',
        'page_class': 'users-page',
        'users' : users_page,
        'suser' : suser,
        'keywords' : suser,
        'tab_id' : sortby,
        'paginator_context' : paginator_context
    }
    return render_into_skin('users.html', data, request)
コード例 #18
0
ファイル: readers.py プロジェクト: ramiro/askbot-devel
def tags(request, category_name):#view showing a listing of available tags - plain list
    stag = ""
    is_paginated = True
    sortby = request.GET.get('sort', 'used')
    try:
        page = int(request.GET.get('page', '1'))
    except ValueError:
        page = 1

    if request.method == "GET":
        # have to import this at run time, otherwise there is a circular import
        # dependency...
        from askbot.conf import settings as askbot_settings
        if category_name:
            if askbot.conf.settings.ENABLE_CATEGORIES:
                try:
                    category = Category.objects.get(name=category_name)
                except Category.DoesNotExist:
                    raise Http404
            else:
                # Maybe we can redirect to the bare /questions/ URL instead
                raise Http404
        else:
            category = None

        stag = request.GET.get("query", "").strip()
        filter_spec = Q(deleted=False)
        sort_spec = None
        if stag:
            filter_spec &= Q(name__icontains=stag)
        elif sortby == "name":
            sort_spec = "name"
        else:
            sort_spec = "-used_count"
        if category and askbot_settings.ENABLE_CATEGORIES:
            # Filter out tags not associated with the requested category
            cat_pks = category.get_descendants(include_self=True).values_list(
                    'pk', flat=True)
            filter_spec &= Q(categories__in=list(cat_pks))
        paginator_query = models.Tag.objects.filter(filter_spec).exclude(used_count=0)
        if sort_spec is not None:
            paginator_query = paginator_query.order_by(sort_spec)
        objects_list = Paginator(
            paginator_query,
            DEFAULT_PAGE_SIZE
        )
        #if stag != '':
        #    objects_list = Paginator(
        #                    models.Tag.objects.filter(
        #                                        deleted=False,
        #                                        name__icontains=stag
        #                                    ).exclude(
        #                                        used_count=0
        #                                    ),
        #                    DEFAULT_PAGE_SIZE
        #                )
        #else:
        #    if sortby == "name":
        #        objects_list = Paginator(models.Tag.objects.filter(deleted=False).exclude(used_count=0).order_by("name"), DEFAULT_PAGE_SIZE)
        #    else:
        #        objects_list = Paginator(models.Tag.objects.filter(deleted=False).exclude(used_count=0).order_by("-used_count"), DEFAULT_PAGE_SIZE)

    try:
        tags = objects_list.page(page)
    except (EmptyPage, InvalidPage):
        tags = objects_list.page(objects_list.num_pages)

    paginator_data = {
        'is_paginated' : is_paginated,
        'pages': objects_list.num_pages,
        'page': page,
        'has_previous': tags.has_previous(),
        'has_next': tags.has_next(),
        'previous': tags.previous_page_number(),
        'next': tags.next_page_number(),
        'base_url' : reverse('tags', kwargs={'category_name': category_name}) + '?sort=%s&amp;' % sortby
    }
    paginator_context = extra_tags.cnprog_paginator(paginator_data)
    data = {
        'active_tab': 'tags',
        'page_class': 'tags-page',
        'tags' : tags,
        'stag' : stag,
        'tab_id' : sortby,
        'keywords' : stag,
        'paginator_context' : paginator_context,
        'current_category': category_name,
    }
    return render_into_skin('tags.html', data, request)