-markdowner = Markdown(html4tags=True)
-
-#system to display main content
-def _get_tags_cache_json():#service routine used by views requiring tag list in the javascript space
- """returns list of all tags in json format
- no caching yet, actually
- """
- tags = Tag.objects.filter(deleted=False).all()
- tags_list = []
- for tag in tags:
- dic = {'n': tag.name, 'c': tag.used_count}
- tags_list.append(dic)
- tags = simplejson.dumps(tags_list)
- return tags
-
-def _get_and_remember_questions_sort_method(request, view_dic, default):#service routine used by q listing views and question view
- """manages persistence of post sort order
- it is assumed that when user wants newest question -
- then he/she wants newest answers as well, etc.
- how far should this assumption actually go - may be a good question
- """
- if default not in view_dic:
- raise Exception('default value must be in view_dic')
-
- q_sort_method = request.REQUEST.get('sort', None)
- if q_sort_method == None:
- q_sort_method = request.session.get('questions_sort_method', default)
-
- if q_sort_method not in view_dic:
- q_sort_method = default
- request.session['questions_sort_method'] = q_sort_method
- return q_sort_method, view_dic[q_sort_method]
-
-#refactor? - we have these
-#views that generate a listing of questions in one way or another:
-#index, unanswered, questions, search, tag
-#should we dry them up?
-#related topics - information drill-down, search refinement
-
-def index(request):#generates front page - shows listing of questions sorted in various ways
- """index view mapped to the root url of the Q&A site
- """
- view_dic = {
- "latest":"-last_activity_at",
- "hottest":"-answer_count",
- "mostvoted":"-score",
- }
- view_id, orderby = _get_and_remember_questions_sort_method(request, view_dic, 'latest')
-
- pagesize = request.session.get("pagesize",QUESTIONS_PAGE_SIZE)
- try:
- page = int(request.GET.get('page', '1'))
- except ValueError:
- page = 1
+class QuestionListPaginatorContext(pagination.PaginatorContext):
+ def __init__(self):
+ super (QuestionListPaginatorContext, self).__init__('QUESTIONS_LIST', 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)
+
+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 feed(request):
+ return RssQuestionFeed(
+ Question.objects.filter_state(deleted=False).order_by('-last_activity_at'),
+ settings.APP_TITLE + _(' - ')+ _('latest questions'),
+ settings.APP_DESCRIPTION,
+ request)(request)
+
+
+@decorators.render('index.html')
+def index(request):
+ return question_list(request,
+ Question.objects.all(),
+ sort=request.utils.set_sort_method('active'),
+ base_path=reverse('questions'),
+ feed_url=reverse('latest_questions_feed'))
+
+@decorators.render('questions.html', 'unanswered', _('unanswered'), weight=400)
+def unanswered(request):
+ return question_list(request,
+ Question.objects.filter(extra_ref=None),
+ _('open questions without an accepted answer'),
+ request.utils.set_sort_method('active'),
+ None,
+ _("Unanswered Questions"))
+
+@decorators.render('questions.html', 'questions', _('questions'), weight=0)
+def questions(request):
+ return question_list(request, Question.objects.all(), _('questions'), request.utils.set_sort_method('active'))
+
+@decorators.render('questions.html')
+def tag(request, tag):
+ return question_list(request,
+ Question.objects.filter(tags__name=unquote(tag)),
+ mark_safe(_('questions tagged <span class="tag">%(tag)s</span>') % {'tag': tag}),
+ request.utils.set_sort_method('active'),
+ None,
+ mark_safe(_('Questions Tagged With %(tag)s') % {'tag': tag}),
+ False)
+
+@decorators.render('questions.html', 'questions', tabbed=False)
+def user_questions(request, mode, user, slug):
+ user = get_object_or_404(User, id=user)
+
+ if mode == _('asked-by'):
+ questions = Question.objects.filter(author=user)
+ description = _("Questions asked by %s")
+ elif mode == _('answered-by'):
+ questions = Question.objects.filter(children__author=user, children__node_type='answer').distinct()
+ description = _("Questions answered by %s")
+ elif mode == _('subscribed-by'):
+ if not (request.user.is_superuser or request.user == user):
+ return HttpResponseUnauthorized(request)
+ questions = user.subscriptions
+
+ if request.user == user:
+ description = _("Questions you subscribed %s")
+ else:
+ description = _("Questions subscribed by %s")
+ else:
+ raise Http404