]> git.openstreetmap.org Git - osqa.git/blobdiff - forum/views/readers.py
OSQA-263
[osqa.git] / forum / views / readers.py
index 17cea0fe2599c86331b61f3afb6804d8205327b4..178848bee0085a6bd310ff7d63fd9b7c2d57fbbe 100644 (file)
@@ -1,10 +1,10 @@
-# encoding:utf-8   
+# encoding:utf-8
 import datetime
 import logging
 from urllib import unquote
 from forum import settings as django_settings
 from django.shortcuts import render_to_response, get_object_or_404
 import datetime
 import logging
 from urllib import unquote
 from forum import settings as django_settings
 from django.shortcuts import render_to_response, get_object_or_404
-from django.http import HttpResponseRedirect, HttpResponse, HttpResponseForbidden, Http404, HttpResponsePermanentRedirect
+from django.http import HttpResponseRedirect, HttpResponse, Http404, HttpResponsePermanentRedirect
 from django.core.paginator import Paginator, EmptyPage, InvalidPage
 from django.template import RequestContext
 from django import template
 from django.core.paginator import Paginator, EmptyPage, InvalidPage
 from django.template import RequestContext
 from django import template
@@ -24,7 +24,7 @@ from forum.utils.html import sanitize_html
 from forum.utils.diff import textDiff as htmldiff
 from forum.forms import *
 from forum.models import *
 from forum.utils.diff import textDiff as htmldiff
 from forum.forms import *
 from forum.models import *
-from forum.utils.forms import get_next_url
+from forum.forms import get_next_url
 from forum.actions import QuestionViewAction
 from forum.modules.decorators import decoratable
 import decorators
 from forum.actions import QuestionViewAction
 from forum.modules.decorators import decoratable
 import decorators
@@ -45,8 +45,8 @@ ANSWERS_PAGE_SIZE = 10
 def index(request):
     return question_list(request,
                          Question.objects.all(),
 def index(request):
     return question_list(request,
                          Question.objects.all(),
-                         sort=request.utils.set_sort_method('active'),
-                         base_path=reverse('questions'))
+                         request.utils.set_sort_method('active'),
+                         reverse('questions'))
 
 @decorators.render('questions.html', 'unanswered')
 def unanswered(request):
 
 @decorators.render('questions.html', 'unanswered')
 def unanswered(request):
@@ -55,7 +55,7 @@ def unanswered(request):
                          _('open questions without an accepted answer'),
                          request.utils.set_sort_method('active'),
                          None,
                          _('open questions without an accepted answer'),
                          request.utils.set_sort_method('active'),
                          None,
-                         _("Unanswered questions"))
+                         _("Unanswered Questions"))
 
 @decorators.render('questions.html', 'questions')
 def questions(request):
 
 @decorators.render('questions.html', 'questions')
 def questions(request):
@@ -68,15 +68,22 @@ def tag(request, tag):
                          mark_safe(_('questions tagged <span class="tag">%(tag)s</span>') % {'tag': tag}),
                          request.utils.set_sort_method('active'),
                          None,
                          mark_safe(_('questions tagged <span class="tag">%(tag)s</span>') % {'tag': tag}),
                          request.utils.set_sort_method('active'),
                          None,
-                         mark_safe(_('questions tagged %(tag)s') % {'tag': tag}),
+                         mark_safe(_('Questions Tagged With <span class="tag">%(tag)s</span>') % {'tag': tag}),
                          False)
 
 @decorators.list('questions', QUESTIONS_PAGE_SIZE)
                          False)
 
 @decorators.list('questions', QUESTIONS_PAGE_SIZE)
-def question_list(request, initial, list_description=_('questions'), sort=None, base_path=None, page_title=None, allowIgnoreTags=True):
-    questions = initial.filter(deleted=None, in_moderation=None)
+def question_list(request, initial,
+                  list_description=_('questions'),
+                  sort=None,
+                  base_path=None,
+                  page_title=_("All Questions"),
+                  allowIgnoreTags=True):
+
+    questions = initial.filter_state(deleted=False)
 
     if request.user.is_authenticated() and allowIgnoreTags:
 
     if request.user.is_authenticated() and allowIgnoreTags:
-        questions = questions.filter(~Q(tags__id__in = request.user.marked_tags.filter(user_selections__reason = 'bad')))
+        questions = questions.filter(~Q(tags__id__in = request.user.marked_tags.filter(user_selections__reason = 'bad'))
+                                     )
 
     if sort is not False:
         if sort is None:
 
     if sort is not False:
         if sort is None:
@@ -91,17 +98,25 @@ def question_list(request, initial, list_description=_('questions'), sort=None,
     if page_title is None:
         page_title = _("Questions")
 
     if page_title is None:
         page_title = _("Questions")
 
-    answer_count = Answer.objects.filter(deleted=None, parent__in=questions).count()   
+    keywords =  ""
+    if request.GET.get("q"):
+        keywords = request.GET.get("q").strip()
+
+    answer_count = Answer.objects.filter_state(deleted=False).filter(parent__in=questions).count()
+    answer_description = _("answers")
 
     return {
 
     return {
-        "questions" : questions,
-        "questions_count" : questions.count(),
-        "answer_count" : answer_count,
-        #"tags_autocomplete" : _get_tags_cache_json(),
-        "list_description": list_description,
-        "base_path" : base_path,
-        "page_title" : page_title,
-        }
+    "questions" : questions,
+    "questions_count" : questions.count(),
+    "answer_count" : answer_count,
+    "keywords" : keywords,
+    #"tags_autocomplete" : _get_tags_cache_json(),
+    "list_description": list_description,
+    "answer_description": answer_description,
+    "base_path" : base_path,
+    "page_title" : page_title,
+    "tab" : "questions",
+    }
 
 
 def search(request):
 
 
 def search(request):
@@ -112,24 +127,23 @@ def search(request):
         if not keywords:
             return HttpResponseRedirect(reverse(index))
         if search_type == 'tag':
         if not keywords:
             return HttpResponseRedirect(reverse(index))
         if search_type == 'tag':
-            return HttpResponseRedirect(reverse('tags') + '?q=%s' % (keywords.strip()))
+            return HttpResponseRedirect(reverse('tags') + '?q=%s' % urlquote(keywords.strip()))
         elif search_type == "user":
         elif search_type == "user":
-            return HttpResponseRedirect(reverse('users') + '?q=%s' % (keywords.strip()))
+            return HttpResponseRedirect(reverse('users') + '?q=%s' % urlquote(keywords.strip()))
         elif search_type == "question":
             return question_search(request, keywords)
     else:
         return render_to_response("search.html", context_instance=RequestContext(request))
 
         elif search_type == "question":
             return question_search(request, keywords)
     else:
         return render_to_response("search.html", context_instance=RequestContext(request))
 
-@decoratable
-def do_question_search(keywords):
-    return Question.objects.filter(Q(title__icontains=keywords) | Q(body__icontains=keywords))
-
 @decorators.render('questions.html')
 def question_search(request, keywords):
 @decorators.render('questions.html')
 def question_search(request, keywords):
-    initial = do_question_search(keywords)
+    initial = Question.objects.search(keywords)
 
 
-    return question_list(request, initial, _("questions matching '%(keywords)s'") % {'keywords': keywords},
-            base_path="%s?t=question&q=%s" % (reverse('search'), django_urlquote(keywords)), sort=False)
+    return question_list(request, initial,
+                         _("questions matching '%(keywords)s'") % {'keywords': keywords},
+                         False,
+                         "%s?t=question&q=%s" % (reverse('search'),django_urlquote(keywords)),
+                         _("questions matching '%(keywords)s'") % {'keywords': keywords})
 
 
 def tags(request):#view showing a listing of available tags - plain list
 
 
 def tags(request):#view showing a listing of available tags - plain list
@@ -144,12 +158,12 @@ def tags(request):#view showing a listing of available tags - plain list
     if request.method == "GET":
         stag = request.GET.get("q", "").strip()
         if stag != '':
     if request.method == "GET":
         stag = request.GET.get("q", "").strip()
         if stag != '':
-            objects_list = Paginator(Tag.objects.filter(deleted=False).exclude(used_count=0).extra(where=['name like %s'], params=['%' + stag + '%']), DEFAULT_PAGE_SIZE)
+            objects_list = Paginator(Tag.active.filter(name__contains=stag), DEFAULT_PAGE_SIZE)
         else:
             if sortby == "name":
         else:
             if sortby == "name":
-                objects_list = Paginator(Tag.objects.all().filter(deleted=False).exclude(used_count=0).order_by("name"), DEFAULT_PAGE_SIZE)
+                objects_list = Paginator(Tag.active.order_by("name"), DEFAULT_PAGE_SIZE)
             else:
             else:
-                objects_list = Paginator(Tag.objects.all().filter(deleted=False).exclude(used_count=0).order_by("-used_count"), DEFAULT_PAGE_SIZE)
+                objects_list = Paginator(Tag.active.order_by("-used_count"), DEFAULT_PAGE_SIZE)
 
     try:
         tags = objects_list.page(page)
 
     try:
         tags = objects_list.page(page)
@@ -157,21 +171,21 @@ def tags(request):#view showing a listing of available tags - plain list
         tags = objects_list.page(objects_list.num_pages)
 
     return render_to_response('tags.html', {
         tags = objects_list.page(objects_list.num_pages)
 
     return render_to_response('tags.html', {
-                                            "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
-                                            }
-                                }, context_instance=RequestContext(request))
+    "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
+    }
+    }, context_instance=RequestContext(request))
 
 def get_answer_sort_order(request):
     view_dic = {"latest":"-added_at", "oldest":"added_at", "votes":"-score" }
 
 def get_answer_sort_order(request):
     view_dic = {"latest":"-added_at", "oldest":"added_at", "votes":"-score" }
@@ -190,7 +204,7 @@ def update_question_view_times(request, question):
     if not 'last_seen_in_question' in request.session:
         request.session['last_seen_in_question'] = {}
 
     if not 'last_seen_in_question' in request.session:
         request.session['last_seen_in_question'] = {}
 
-    last_seen = request.session['last_seen_in_question'].get(question.id,None)
+    last_seen = request.session['last_seen_in_question'].get(question.id, None)
 
     if (not last_seen) or last_seen < question.last_activity_at:
         QuestionViewAction(question, request.user, ip=request.META['REMOTE_ADDR']).save()
 
     if (not last_seen) or last_seen < question.last_activity_at:
         QuestionViewAction(question, request.user, ip=request.META['REMOTE_ADDR']).save()
@@ -200,7 +214,7 @@ def update_question_view_times(request, question):
 
 def match_question_slug(slug):
     slug_words = slug.split('-')
 
 def match_question_slug(slug):
     slug_words = slug.split('-')
-    qs = Question.objects.filter(node_type="question", title__istartswith=slug_words[0])
+    qs = Question.objects.filter(title__istartswith=slug_words[0])
 
     for q in qs:
         if slug == urlquote(slugify(q.title)):
 
     for q in qs:
         if slug == urlquote(slugify(q.title)):
@@ -210,29 +224,31 @@ def match_question_slug(slug):
 
 def question(request, id, slug):
     try:
 
 def question(request, id, slug):
     try:
-        question = Question.objects.get(node_type="question", id=id)
+        question = Question.objects.get(id=id)
     except:
     except:
-        question = match_question_slug(slug)
-        if question is not None:
-            return HttpResponsePermanentRedirect(question.get_absolute_url())
-        else:
-            raise Http404()
+        if slug:
+            question = match_question_slug(slug)
+            if question is not None:
+                return HttpResponsePermanentRedirect(question.get_absolute_url())
 
 
-    if slug != urlquote(slugify(question.title)):
-        return HttpResponsePermanentRedirect(question.get_absolute_url())
+        raise Http404()
 
     page = int(request.GET.get('page', 1))
     view_id, order_by = get_answer_sort_order(request)
 
 
     page = int(request.GET.get('page', 1))
     view_id, order_by = get_answer_sort_order(request)
 
-    if question.deleted and not request.user.can_view_deleted_post(question):
+    if question.nis.deleted and not request.user.can_view_deleted_post(question):
         raise Http404
 
         raise Http404
 
-    answer_form = AnswerForm(question)
+    if request.POST:
+        answer_form = AnswerForm(question, request.POST)
+    else:
+        answer_form = AnswerForm(question)
+
     answers = request.user.get_visible_answers(question)
 
     if answers is not None:
         answers = [a for a in answers.order_by("-marked", order_by)
     answers = request.user.get_visible_answers(question)
 
     if answers is not None:
         answers = [a for a in answers.order_by("-marked", order_by)
-                   if not a.deleted or a.author == request.user]
+                   if not a.nis.deleted or a.author == request.user]
 
     objects_list = Paginator(answers, ANSWERS_PAGE_SIZE)
     page_objects = objects_list.page(page)
 
     objects_list = Paginator(answers, ANSWERS_PAGE_SIZE)
     page_objects = objects_list.page(page)
@@ -248,24 +264,24 @@ def question(request, id, slug):
         subscription = False
 
     return render_to_response('question.html', {
         subscription = False
 
     return render_to_response('question.html', {
-        "question" : question,
-        "answer" : answer_form,
-        "answers" : page_objects.object_list,
-        "tab_id" : view_id,
-        "similar_questions" : question.get_related_questions(),
-        "subscription": subscription,
-        "context" : {
-            'is_paginated' : True,
-            'pages': objects_list.num_pages,
-            'page': 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&' % view_id,
-            'extend_url' : "#sort-top"
-        }
-        }, context_instance=RequestContext(request))
+    "question" : question,
+    "answer" : answer_form,
+    "answers" : page_objects.object_list,
+    "tab_id" : view_id,
+    "similar_questions" : question.get_related_questions(),
+    "subscription": subscription,
+    "context" : {
+    'is_paginated' : True,
+    'pages': objects_list.num_pages,
+    'page': 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&' % view_id,
+    'extend_url' : "#sort-top"
+    }
+    }, context_instance=RequestContext(request))
 
 
 REVISION_TEMPLATE = template.loader.get_template('node/revision.html')
 
 
 REVISION_TEMPLATE = template.loader.get_template('node/revision.html')
@@ -278,9 +294,9 @@ def revisions(request, id):
 
     for i, revision in enumerate(revisions):
         rev_ctx.append(dict(inst=revision, html=REVISION_TEMPLATE.render(template.Context({
 
     for i, revision in enumerate(revisions):
         rev_ctx.append(dict(inst=revision, html=REVISION_TEMPLATE.render(template.Context({
-                'title': revision.title,
-                'html': revision.html,
-                'tags': revision.tagname_list(),
+        'title': revision.title,
+        'html': revision.html,
+        'tags': revision.tagname_list(),
         }))))
 
         if i > 0:
         }))))
 
         if i > 0:
@@ -294,9 +310,9 @@ def revisions(request, id):
             rev_ctx[i]['summary'] = revision.summary
 
     return render_to_response('revisions.html', {
             rev_ctx[i]['summary'] = revision.summary
 
     return render_to_response('revisions.html', {
-                              'post': post,
-                              'revisions': rev_ctx,
-                              }, context_instance=RequestContext(request))
+    'post': post,
+    'revisions': rev_ctx,
+    }, context_instance=RequestContext(request))