-# encoding:utf-8
+# encoding:utf-8
import datetime
import logging
from urllib import unquote
-from django.conf import settings as django_settings
+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
+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 forum.utils.diff import textDiff as htmldiff
from forum.forms import *
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
# 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):
- return question_list(request, Question.objects.all(), sort='latest', base_path=reverse('questions'))
+ return question_list(request,
+ Question.objects.all(),
+ sort=request.utils.set_sort_method('active'),
+ base_path=reverse('questions'))
@decorators.render('questions.html', 'unanswered')
def unanswered(request):
- return question_list(request, Question.objects.filter(accepted_answer=None),
- _('Open questions without an accepted answer'))
+ 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')
def questions(request):
- return question_list(request, Question.objects.all())
+ 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}))
+ 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 %(tag)s') % {'tag': tag}),
+ False)
@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))
+def question_list(request, initial, list_description=_('questions'), sort=None, base_path=None, page_title=None, allowIgnoreTags=True):
+ questions = initial.filter_state(deleted=False)
- questions = initial.filter(deleted=False)
-
- 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() and allowIgnoreTags:
+ 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:
else:
request.utils.set_sort_method(sort)
- view_dic = {"latest":"-added_at", "active":"-last_activity_at", "hottest":"-answer_count", "mostvoted":"-score" }
+ view_dic = {"latest":"-added_at", "active":"-last_activity_at", "hottest":"-extra_count", "mostvoted":"-score" }
questions=questions.order_by(view_dic.get(sort, '-added_at'))
+ if page_title is None:
+ page_title = _("Questions")
+
+ 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 {
"questions" : questions,
"questions_count" : questions.count(),
- "tags_autocomplete" : _get_tags_cache_json(),
+ "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",
}
if request.method == "GET" and "q" in request.GET:
keywords = request.GET.get("q")
search_type = request.GET.get("t")
-
+
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":
- 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:
@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 = 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)
-
+
def tags(request):#view showing a listing of available tags - plain list
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":
- 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:
- 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)
last_seen = request.session['last_seen_in_question'].get(question.id,None)
if (not last_seen) or last_seen < question.last_activity_at:
- question_view.send(sender=update_question_view_times, instance=question, user=request.user)
+ QuestionViewAction(question, request.user, ip=request.META['REMOTE_ADDR']).save()
request.session['last_seen_in_question'][question.id] = datetime.datetime.now()
request.session['last_seen_in_question'][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])
+
+ for q in qs:
+ if slug == urlquote(slugify(q.title)):
+ return q
+
+ return None
+
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)):
- 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)
- 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
- 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("-accepted", order_by)
- if not a.deleted or a.author == request.user]
+ answers = [a for a in answers.order_by("-marked", order_by)
+ if not a.nis.deleted or a.author == request.user]
objects_list = Paginator(answers, ANSWERS_PAGE_SIZE)
page_objects = objects_list.page(page)
"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,
rev_ctx[i]['summary'] = _('Revision n. %(rev_number)d') % {'rev_number': revision.revision}
else:
rev_ctx[i]['summary'] = revision.summary
-
- return render_to_response('revisions_question.html', {
+
+ return render_to_response('revisions.html', {
'post': post,
'revisions': rev_ctx,
}, context_instance=RequestContext(request))