From: Javyer Der Derian Date: Thu, 17 Apr 2014 21:59:05 +0000 (-0300) Subject: Merge pull request #46 from udacity/subfolder_fixes X-Git-Tag: live~21 X-Git-Url: https://git.openstreetmap.org/osqa.git/commitdiff_plain/cdf6f5f965021228d2a411d23726eda56db0b5a7?hp=9b8e2e53b0f70f91868b4c16e130967c7da5a958 Merge pull request #46 from udacity/subfolder_fixes Fix OSQA-819: Link to profile in message is wrong if OSQA is installed in a subfolder --- diff --git a/forum/views/meta.py b/forum/views/meta.py index a47cf1d..e7d1515 100644 --- a/forum/views/meta.py +++ b/forum/views/meta.py @@ -37,7 +37,7 @@ def static(request, title, content): def media(request, skin, path): response = serve(request, "%s/media/%s" % (skin, path), document_root=os.path.join(os.path.dirname(os.path.dirname(__file__)), 'skins').replace('\\', '/')) - content_type = response['Content-Type'] + content_type = response.get('Content-Type', '') if ('charset=' not in content_type): if (content_type.startswith('text') or content_type=='application/x-javascript'): content_type += '; charset=utf-8' diff --git a/forum/views/readers.py b/forum/views/readers.py index 669eaf3..fc819bf 100644 --- a/forum/views/readers.py +++ b/forum/views/readers.py @@ -8,6 +8,7 @@ from django.core.paginator import Paginator, EmptyPage, InvalidPage from django.template import RequestContext from django import template from django.utils.html import * +from django.utils.http import urlquote from django.db.models import Q, Count from django.utils.translation import ugettext as _ from django.core.urlresolvers import reverse @@ -29,9 +30,28 @@ import decorators class HottestQuestionsSort(pagination.SortBase): def apply(self, questions): - return questions.annotate(new_child_count=Count('all_children')).filter( - all_children__added_at__gt=datetime.datetime.now() - datetime.timedelta(days=1)).order_by('-new_child_count') - + return questions.extra(select={'new_child_count': ''' + SELECT COUNT(1) + FROM forum_node fn1 + WHERE fn1.abs_parent_id = forum_node.id + AND fn1.id != forum_node.id + AND NOT(fn1.state_string LIKE '%%(deleted)%%') + AND added_at > %s''' + }, + select_params=[ (datetime.datetime.now() - datetime.timedelta(days=2)) + .strftime('%Y-%m-%d')] + ).order_by('-new_child_count', 'last_activity_at') + +class UnansweredQuestionsSort(pagination.SortBase): + def apply(self, questions): + return questions.extra(select={'answer_count': ''' + SELECT COUNT(1) + FROM forum_node fn1 + WHERE fn1.abs_parent_id = forum_node.id + AND fn1.id != forum_node.id + AND fn1.node_type='answer' + AND NOT(fn1.state_string LIKE '%%(deleted)%%')''' + }).order_by('answer_count', 'last_activity_at') class QuestionListPaginatorContext(pagination.PaginatorContext): def __init__(self, id='QUESTIONS_LIST', prefix='', pagesizes=(15, 30, 50), default_pagesize=30): @@ -40,6 +60,7 @@ class QuestionListPaginatorContext(pagination.PaginatorContext): (_('newest'), pagination.SimpleSort(_('newest'), '-added_at', _("most recently asked questions"))), (_('hottest'), HottestQuestionsSort(_('hottest'), _("most active questions in the last 24 hours"))), (_('mostvoted'), pagination.SimpleSort(_('most voted'), '-score', _("most voted questions"))), + (_('unanswered'), UnansweredQuestionsSort('unanswered', "questions with no answers")), ), pagesizes=pagesizes, default_pagesize=default_pagesize, prefix=prefix) class AnswerSort(pagination.SimpleSort): @@ -52,6 +73,7 @@ class AnswerSort(pagination.SimpleSort): class AnswerPaginatorContext(pagination.PaginatorContext): def __init__(self, id='ANSWER_LIST', prefix='', default_pagesize=10): super (AnswerPaginatorContext, self).__init__(id, sort_methods=( + (_('active'), AnswerSort(_('active answers'), '-last_activity_at', _("most recently updated answers/comments will be shown first"))), (_('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', 'added_at'), _("most voted answers will be shown first"))), diff --git a/forum_modules/akismet/startup.py b/forum_modules/akismet/startup.py index 2387e05..c050754 100644 --- a/forum_modules/akismet/startup.py +++ b/forum_modules/akismet/startup.py @@ -1,5 +1,4 @@ import json -import loggin from django.utils.translation import ugettext as _ from django.http import HttpResponse, HttpResponseRedirect diff --git a/forum_modules/robotstxt/urls.py b/forum_modules/robotstxt/urls.py index 5f74a0a..ddcac3b 100644 --- a/forum_modules/robotstxt/urls.py +++ b/forum_modules/robotstxt/urls.py @@ -3,5 +3,5 @@ from django.http import HttpResponse import settings urlpatterns = patterns('', - (r'^robots.txt$', lambda r: HttpResponse(settings.ROBOTS_FILE.value)), + (r'^robots.txt$', lambda r: HttpResponse(settings.ROBOTS_FILE.value, content_type='text/plain')), ) diff --git a/requirements.txt b/requirements.txt index fd43d5c..8266787 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,7 +3,7 @@ html5lib python-openid South python-memcached -django==1.3.7 +django==1.6.0 django-debug-toolbar django-endless-pagination pytz diff --git a/settings_local.py.dist b/settings_local.py.dist index ad178f6..e687228 100644 --- a/settings_local.py.dist +++ b/settings_local.py.dist @@ -77,7 +77,6 @@ TIME_ZONE = 'America/New_York' USE_I18N = True LANGUAGE_CODE = 'en' -DJANGO_VERSION = 1.1 OSQA_DEFAULT_SKIN = 'default' DISABLED_MODULES = ['books', 'recaptcha', 'project_badges']