X-Git-Url: https://git.openstreetmap.org./osqa.git/blobdiff_plain/f589e41b46ab266706a7f82a5562f50805359b26..01fed0849e47c9ab181963b94b76df1b84a5232b:/forum/views/readers.py diff --git a/forum/views/readers.py b/forum/views/readers.py index 8ed1b27..4a839b0 100644 --- a/forum/views/readers.py +++ b/forum/views/readers.py @@ -28,32 +28,25 @@ from forum.models import * from forum.forms import get_next_url from forum.actions import QuestionViewAction from forum.http_responses import HttpResponseUnauthorized -from forum.feed import RssQuestionFeed +from forum.feed import RssQuestionFeed, RssAnswerFeed import decorators 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)) - -class AnswerSort(pagination.SimpleSort): - def apply(self, objects): - if self.label == _('votes'): - return objects.order_by('-marked', self.order_by, 'added_at') - else: - return objects.order_by('-marked', self.order_by) + ), pagesizes=(15, 30, 50), default_pagesize=default_pagesize, prefix=prefix) class AnswerPaginatorContext(pagination.PaginatorContext): - def __init__(self): - super (AnswerPaginatorContext, self).__init__('ANSWER_LIST', 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)) + def __init__(self, id='ANSWER_LIST', prefix='', default_pagesize=10): + super (AnswerPaginatorContext, self).__init__(id, sort_methods=( + (_('oldest'), pagination.SimpleSort(_('oldest answers'), ('-marked', 'added_at'), _("oldest answers will be shown first"))), + (_('newest'), pagination.SimpleSort(_('newest answers'), ('-marked', '-added_at'), _("newest answers will be shown first"))), + (_('votes'), pagination.SimpleSort(_('popular answers'), ('-marked', '-score', 'added_at'), _("most voted answers will be shown first"))), + ), default_sort=_('votes'), pagesizes=(5, 10, 20), default_pagesize=default_pagesize, prefix=prefix) class TagPaginatorContext(pagination.PaginatorContext): def __init__(self): @@ -65,19 +58,22 @@ class TagPaginatorContext(pagination.PaginatorContext): def feed(request): return RssQuestionFeed( + request, Question.objects.filter_state(deleted=False).order_by('-last_activity_at'), settings.APP_TITLE + _(' - ')+ _('latest questions'), - settings.APP_DESCRIPTION, - request)(request) + settings.APP_DESCRIPTION)(request) @decorators.render('index.html') def index(request): + paginator_context = QuestionListPaginatorContext() + paginator_context.base_path = reverse('questions') return question_list(request, Question.objects.all(), sort=request.utils.set_sort_method('active'), base_path=reverse('questions'), - feed_url=reverse('latest_questions_feed')) + feed_url=reverse('latest_questions_feed'), + paginator_context=paginator_context) @decorators.render('questions.html', 'unanswered', _('unanswered'), weight=400) def unanswered(request): @@ -148,7 +144,8 @@ def question_list(request, initial, page_title = _("Questions") if request.GET.get('type', None) == 'rss': - return RssQuestionFeed(questions, page_title, list_description, request)(request) + questions = questions.order_by('-added_at') + return RssQuestionFeed(request, questions, page_title, list_description)(request) keywords = "" if request.GET.get("q"): @@ -164,7 +161,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, @@ -223,7 +220,7 @@ def tags(request): if stag: tags = tags.filter(name__contains=stag) - return pagination.paginated(request, 'tags', TagPaginatorContext(), { + return pagination.paginated(request, ('tags', TagPaginatorContext()), { "tags" : tags, "stag" : stag, "keywords" : stag @@ -280,7 +277,7 @@ def answer_redirect(request, answer): answer.question.get_absolute_url(), _('page'), page, answer.id)) @decorators.render("question.html", 'questions') -def question(request, id, slug, answer=None): +def question(request, id, slug=None, answer=None): try: question = Question.objects.get(id=id) except: @@ -294,6 +291,9 @@ def question(request, id, slug, answer=None): if question.nis.deleted and not request.user.can_view_deleted_post(question): raise Http404 + if request.GET.get('type', None) == 'rss': + return RssAnswerFeed(request, question, include_comments=request.GET.get('comments', None) == 'yes')(request) + if answer: answer = get_object_or_404(Answer, id=answer) @@ -305,6 +305,9 @@ def question(request, id, slug, answer=None): return answer_redirect(request, answer) + if settings.FORCE_SINGLE_URL and ((not slug) or (slug != slugify(question.title))): + return HttpResponsePermanentRedirect(question.get_absolute_url()) + if request.POST: answer_form = AnswerForm(question, request.POST) else: @@ -322,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,