]> git.openstreetmap.org Git - osqa.git/blobdiff - forum/views/readers.py
Fixed http://jira.osqa.net/browse/OSQA-214 and improved awarded badges list.
[osqa.git] / forum / views / readers.py
index 819384f9e05e31b628bb0816619efc467c872859..1714a5117f24dc233cfccf6a79f85ed2e66d1327 100644 (file)
@@ -4,7 +4,7 @@ import logging
 from urllib import unquote
 from django.conf import settings as django_settings
 from django.shortcuts import render_to_response, get_object_or_404
 from urllib import unquote
 from django.conf import settings as django_settings
 from django.shortcuts import render_to_response, get_object_or_404
-from django.http import HttpResponseRedirect, HttpResponse, HttpResponseForbidden, Http404
+from django.http import HttpResponseRedirect, HttpResponse, HttpResponseForbidden, 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
@@ -26,7 +26,8 @@ from forum.forms import *
 from forum.models import *
 from forum.const import *
 from forum.utils.forms import get_next_url
 from forum.models import *
 from forum.const import *
 from forum.utils.forms import get_next_url
-from forum.models.question import question_view
+from forum.actions import QuestionViewAction
+from forum.modules.decorators import decoratable
 import decorators
 
 # used in index page
 import decorators
 
 # used in index page
@@ -41,26 +42,13 @@ QUESTIONS_PAGE_SIZE = 30
 # used in answers
 ANSWERS_PAGE_SIZE = 10
 
 # used in answers
 ANSWERS_PAGE_SIZE = 10
 
-#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
-
 @decorators.render('index.html')
 def index(request):
 @decorators.render('index.html')
 def index(request):
-    return question_list(request, Question.objects.all(), sort='latest', base_path=reverse('questions'))
+    return question_list(request, Question.objects.all(), sort='active', base_path=reverse('questions'))
 
 @decorators.render('questions.html', 'unanswered')
 def unanswered(request):
 
 @decorators.render('questions.html', 'unanswered')
 def unanswered(request):
-    return question_list(request, Question.objects.filter(answer_accepted=False),
+    return question_list(request, Question.objects.filter(extra_ref=None),
                          _('Open questions without an accepted answer'))
 
 @decorators.render('questions.html', 'questions')
                          _('Open questions without an accepted answer'))
 
 @decorators.render('questions.html', 'questions')
@@ -74,28 +62,26 @@ def tag(request, tag):
 
 @decorators.list('questions', QUESTIONS_PAGE_SIZE)
 def question_list(request, initial, list_description=_('questions'), sort=None, base_path=None):
 
 @decorators.list('questions', QUESTIONS_PAGE_SIZE)
 def question_list(request, initial, list_description=_('questions'), sort=None, base_path=None):
-    pagesize = request.utils.page_size(QUESTIONS_PAGE_SIZE)
-    page = int(request.GET.get('page', 1))
-
-    questions = initial.filter(deleted=False)
+    questions = initial.filter(deleted=None, in_moderation=None)
 
     if request.user.is_authenticated():
         questions = questions.filter(
                 ~Q(tags__id__in=request.user.marked_tags.filter(user_selections__reason='bad')))
 
 
     if request.user.is_authenticated():
         questions = questions.filter(
                 ~Q(tags__id__in=request.user.marked_tags.filter(user_selections__reason='bad')))
 
-    if sort is None:
-        sort = request.utils.sort_method('latest')
-    else:
-        request.utils.set_sort_method(sort)
-    
-    view_dic = {"latest":"-added_at", "active":"-last_activity_at", "hottest":"-answer_count", "mostvoted":"-score" }
+    if sort is not False:
+        if sort is None:
+            sort = request.utils.sort_method('latest')
+        else:
+            request.utils.set_sort_method(sort)
 
 
-    questions=questions.order_by(view_dic.get(sort, '-added_at'))
+        view_dic = {"latest":"-added_at", "active":"-last_activity_at", "hottest":"-extra_count", "mostvoted":"-score" }
+
+        questions=questions.order_by(view_dic.get(sort, '-added_at'))
 
     return {
         "questions" : questions,
         "questions_count" : questions.count(),
 
     return {
         "questions" : questions,
         "questions_count" : questions.count(),
-        "tags_autocomplete" : _get_tags_cache_json(),
+        #"tags_autocomplete" : _get_tags_cache_json(),
         "list_description": list_description,
         "base_path" : base_path,
         }
         "list_description": list_description,
         "base_path" : base_path,
         }
@@ -117,18 +103,16 @@ def search(request):
     else:
         return render_to_response("search.html", context_instance=RequestContext(request))
 
     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):
-    def question_search(keywords, orderby):
-        return Question.objects.filter(Q(title__icontains=keywords) | Q(html__icontains=keywords))
-
-    from forum.modules import get_handler
-
-    question_search = get_handler('question_search', question_search)
-    initial = question_search(keywords)
+    initial = do_question_search(keywords)
 
     return question_list(request, initial, _("questions matching '%(keywords)s'") % {'keywords': keywords},
 
     return question_list(request, initial, _("questions matching '%(keywords)s'") % {'keywords': keywords},
-            base_path="%s?t=question&q=%s" % (reverse('search'), django_urlquote(keywords)))
+            base_path="%s?t=question&q=%s" % (reverse('search'), django_urlquote(keywords)), sort=False)
     
 
 def tags(request):#view showing a listing of available tags - plain list
     
 
 def tags(request):#view showing a listing of available tags - plain list
@@ -186,22 +170,39 @@ def get_answer_sort_order(request):
     return (view_id, view_dic[view_id])
 
 def update_question_view_times(request, question):
     return (view_id, view_dic[view_id])
 
 def update_question_view_times(request, question):
-    if not 'question_view_times' in request.session:
-        request.session['question_view_times'] = {}
+    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)
+
+    if (not last_seen) or last_seen < question.last_activity_at:
+        QuestionViewAction(question, request.user).save()
+        request.session['last_seen_in_question'][question.id] = datetime.datetime.now()
 
 
-    last_seen = request.session['question_view_times'].get(question.id,None)
+    request.session['last_seen_in_question'][question.id] = datetime.datetime.now()
 
 
-    if not last_seen or last_seen < question.last_activity_at:
-        question_view.send(sender=update_question_view_times, instance=question, user=request.user)
-        request.session['question_view_times'][question.id] = datetime.datetime.now()
+def match_question_slug(slug):
+    slug_words = slug.split('-')
+    qs = Question.objects.filter(node_type="question", title__istartswith=slug_words[0])
 
 
-    request.session['question_view_times'][question.id] = datetime.datetime.now()
+    for q in qs:
+        if slug == urlquote(slugify(q.title)):
+            return q
+
+    return None
 
 def question(request, id, slug):
 
 def question(request, id, slug):
-    question = get_object_or_404(Question, id=id)
+    try:
+        question = Question.objects.get(node_type="question", id=id)
+    except:
+        question = match_question_slug(slug)
+        if question is not None:
+            return HttpResponsePermanentRedirect(question.get_absolute_url())
+        else:
+            raise Http404()
 
     if slug != urlquote(slugify(question.title)):
 
     if slug != urlquote(slugify(question.title)):
-        return HttpResponseRedirect(question.get_absolute_url())
+        return HttpResponsePermanentRedirect(question.get_absolute_url())
 
     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)
@@ -213,7 +214,7 @@ def question(request, id, slug):
     answers = request.user.get_visible_answers(question)
 
     if answers is not None:
     answers = request.user.get_visible_answers(question)
 
     if answers is not None:
-        answers = [a for a in answers.order_by("-accepted", order_by)
+        answers = [a for a in answers.order_by("-marked", order_by)
                    if not a.deleted or a.author == request.user]
 
     objects_list = Paginator(answers, ANSWERS_PAGE_SIZE)
                    if not a.deleted or a.author == request.user]
 
     objects_list = Paginator(answers, ANSWERS_PAGE_SIZE)
@@ -233,7 +234,6 @@ def question(request, id, slug):
         "question" : question,
         "answer" : answer_form,
         "answers" : page_objects.object_list,
         "question" : question,
         "answer" : answer_form,
         "answers" : page_objects.object_list,
-        "tags" : question.tags.all(),
         "tab_id" : view_id,
         "similar_questions" : question.get_related_questions(),
         "subscription": subscription,
         "tab_id" : view_id,
         "similar_questions" : question.get_related_questions(),
         "subscription": subscription,