X-Git-Url: https://git.openstreetmap.org./osqa.git/blobdiff_plain/0239211fee497d6de7927004febadb8eb08891c3..914442cbeb4f84cb0a54c2b99ee2562c51ec6b2e:/forum/views/readers.py diff --git a/forum/views/readers.py b/forum/views/readers.py index 9420ce0..da881d7 100644 --- a/forum/views/readers.py +++ b/forum/views/readers.py @@ -31,26 +31,14 @@ from forum.http_responses import HttpResponseUnauthorized from forum.feed import RssQuestionFeed import decorators -# used in index page -#refactor - move these numbers somewhere? -INDEX_PAGE_SIZE = 30 -INDEX_AWARD_SIZE = 15 -INDEX_TAGS_SIZE = 25 -# used in tags list -DEFAULT_PAGE_SIZE = 60 -# used in questions -QUESTIONS_PAGE_SIZE = 30 -# used in answers -ANSWERS_PAGE_SIZE = 10 - class QuestionListPaginatorContext(pagination.PaginatorContext): - def __init__(self): - super (QuestionListPaginatorContext, self).__init__('QUESTIONS_LIST', sort_methods=( + def __init__(self, id='QUESTIONS_LIST', prefix='', default_pagesize=30): + super (QuestionListPaginatorContext, self).__init__(id, sort_methods=( (_('active'), pagination.SimpleSort(_('active'), '-last_activity_at', _("most recently updated questions"))), (_('newest'), pagination.SimpleSort(_('newest'), '-added_at', _("most recently asked questions"))), (_('hottest'), pagination.SimpleSort(_('hottest'), '-extra_count', _("hottest questions"))), (_('mostvoted'), pagination.SimpleSort(_('most voted'), '-score', _("most voted questions"))), - ), pagesizes=(15, 30, 50)) + ), pagesizes=(15, 30, 50), default_pagesize=default_pagesize, prefix=prefix) class AnswerSort(pagination.SimpleSort): def apply(self, objects): @@ -60,12 +48,19 @@ class AnswerSort(pagination.SimpleSort): return objects.order_by('-marked', self.order_by) class AnswerPaginatorContext(pagination.PaginatorContext): - def __init__(self): - super (AnswerPaginatorContext, self).__init__('ANSWER_LIST', sort_methods=( + def __init__(self, id='ANSWER_LIST', prefix='', default_pagesize=10): + super (AnswerPaginatorContext, self).__init__(id, sort_methods=( (_('oldest'), AnswerSort(_('oldest answers'), 'added_at', _("oldest answers will be shown first"))), (_('newest'), AnswerSort(_('newest answers'), '-added_at', _("newest answers will be shown first"))), (_('votes'), AnswerSort(_('popular answers'), '-score', _("most voted answers will be shown first"))), - ), default_sort=_('votes'), sticky_sort = True, pagesizes=(5, 10, 20)) + ), default_sort=_('votes'), sticky_sort = True, pagesizes=(5, 10, 20), default_pagesize=default_pagesize, prefix=prefix) + +class TagPaginatorContext(pagination.PaginatorContext): + def __init__(self): + super (TagPaginatorContext, self).__init__('TAG_LIST', sort_methods=( + (_('name'), pagination.SimpleSort(_('by name'), 'name', _("sorted alphabetically"))), + (_('used'), pagination.SimpleSort(_('by popularity'), '-used_count', _("sorted by frequency of tag use"))), + ), default_sort=_('used'), pagesizes=(30, 60, 120)) def feed(request): @@ -169,7 +164,7 @@ def question_list(request, initial, feed_url = mark_safe(request.path + "?type=rss" + req_params) - return pagination.paginated(request, 'questions', paginator_context or QuestionListPaginatorContext(), { + return pagination.paginated(request, ('questions', paginator_context or QuestionListPaginatorContext()), { "questions" : questions, "questions_count" : questions.count(), "answer_count" : answer_count, @@ -221,44 +216,18 @@ def question_search(request, keywords): @decorators.render('tags.html', 'tags', _('tags'), weight=100) def tags(request): stag = "" - is_paginated = True - sortby = request.GET.get('sort', 'used') - try: - page = int(request.GET.get('page', '1')) - except ValueError: - page = 1 + tags = Tag.active.all() if request.method == "GET": stag = request.GET.get("q", "").strip() - if stag != '': - objects_list = Paginator(Tag.active.filter(name__contains=stag), DEFAULT_PAGE_SIZE) - else: - if sortby == "name": - objects_list = Paginator(Tag.active.order_by("name"), DEFAULT_PAGE_SIZE) - else: - objects_list = Paginator(Tag.active.order_by("-used_count"), DEFAULT_PAGE_SIZE) - - try: - tags = objects_list.page(page) - except (EmptyPage, InvalidPage): - tags = objects_list.page(objects_list.num_pages) + if stag: + tags = tags.filter(name__contains=stag) - return { + return pagination.paginated(request, ('tags', TagPaginatorContext()), { "tags" : tags, "stag" : stag, - "tab_id" : sortby, - "keywords" : stag, - "context" : { - '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 - } - } + "keywords" : stag + }) def update_question_view_times(request, question): if not 'last_seen_in_question' in request.session: @@ -310,8 +279,8 @@ def answer_redirect(request, answer): return HttpResponsePermanentRedirect("%s?%s=%s#%s" % ( answer.question.get_absolute_url(), _('page'), page, answer.id)) -@decorators.render("question.html", 'questions', tabbed=False) -def question(request, id, slug, answer=None): +@decorators.render("question.html", 'questions') +def question(request, id, slug=None, answer=None): try: question = Question.objects.get(id=id) except: @@ -336,6 +305,9 @@ def question(request, id, slug, answer=None): return answer_redirect(request, answer) + if (not slug) or (slug != urlquote(slugify(question.title))): + return HttpResponsePermanentRedirect(question.get_absolute_url()) + if request.POST: answer_form = AnswerForm(question, request.POST) else: @@ -353,7 +325,7 @@ def question(request, id, slug, answer=None): else: subscription = False - return pagination.paginated(request, 'answers', AnswerPaginatorContext(), { + return pagination.paginated(request, ('answers', AnswerPaginatorContext()), { "question" : question, "answer" : answer_form, "answers" : answers,