From: court Date: Fri, 20 Aug 2010 21:14:54 +0000 (+0000) Subject: This is for the online users page. It has been disable. I am committing it so that... X-Git-Tag: live~569 X-Git-Url: https://git.openstreetmap.org/osqa.git/commitdiff_plain/62604660ed4357d8e2cb3e920751c3a7be8d4234 This is for the online users page. It has been disable. I am committing it so that I can look at it over the weekend. git-svn-id: http://svn.osqa.net/svnroot/osqa/trunk@565 0cfe37f9-358a-4d5e-be75-b63607b5c754 --- diff --git a/forum/settings/__init__.py b/forum/settings/__init__.py index 32f11ee..ae09261 100644 --- a/forum/settings/__init__.py +++ b/forum/settings/__init__.py @@ -19,6 +19,7 @@ FORUM_SCRIPT_ALIAS = djsettings.FORUM_SCRIPT_ALIAS OSQA_SKIN = djsettings.OSQA_DEFAULT_SKIN LANGUAGE_CODE = djsettings.LANGUAGE_CODE ADMIN_MEDIA_PREFIX = djsettings.ADMIN_MEDIA_PREFIX +ONLINE_USERS = Setting('ONLINE_USERS', {}) from basic import * diff --git a/forum/skins/default/templates/users/online_users.html b/forum/skins/default/templates/users/online_users.html new file mode 100644 index 0000000..903e895 --- /dev/null +++ b/forum/skins/default/templates/users/online_users.html @@ -0,0 +1,54 @@ +{% extends "base_content.html" %} + +{% load extra_tags %} +{% load humanize %} +{% load i18n %} +{% block title %}{% spaceless %}{% trans "Users Online" %}{% endspaceless %}{% endblock %} +{% block forejs %} + +{% endblock %} +{% block content %} +
+
{% trans "Users Online" %}
+ {{ users.paginator.sort_tabs }} +
+
+

+ {% if suser %} + {% blocktrans %}users matching query {{suser}}:{% endblocktrans %} + {% endif %} + + {% if not users.paginator.count %} + {% trans "Nothing found." %} + {% endif %} +

+
+ {% for user in users.paginator.page %} +
+ +
+ {% endfor %} +
+
+{% endblock %} +{% block tail %} +
+ {{ users.paginator.page_numbers }} +
+{% endblock %} + diff --git a/forum/urls.py b/forum/urls.py index 51cccef..c5a8a16 100644 --- a/forum/urls.py +++ b/forum/urls.py @@ -116,7 +116,7 @@ urlpatterns += patterns('', url(r'^%s$' % _('users/'), app.users.users, name='users'), - url(r'^%s$' % _('online_users/'), app.users.online_users, name='online_users'), + # url(r'^%s$' % _('online_users/'), app.users.online_users, name='online_users'), url(r'^%s(?P\d+)/%s$' % (_('users/'), _('edit/')), app.users.edit_user, name='edit_user'), diff --git a/forum/views/decorators.py b/forum/views/decorators.py index f72703b..20eb45c 100644 --- a/forum/views/decorators.py +++ b/forum/views/decorators.py @@ -6,6 +6,8 @@ from django.core.urlresolvers import reverse from django.template import RequestContext from django.utils.translation import ungettext, ugettext as _ from forum.modules import ui, decorate +from datetime import datetime, date +from forum.settings import ONLINE_USERS import logging def login_required(func, request, *args, **kwargs): @@ -17,6 +19,9 @@ def login_required(func, request, *args, **kwargs): def render(template=None, tab=None, tab_title='', weight=500, tabbed=True): def decorator(func): def decorated(context, request, *args, **kwargs): + if request.user.is_authenticated(): + ONLINE_USERS[request.user] = datetime.now() + if isinstance(context, HttpResponse): return context diff --git a/forum/views/users.py b/forum/views/users.py index d95b302..1d12b4e 100644 --- a/forum/views/users.py +++ b/forum/views/users.py @@ -21,7 +21,9 @@ from forum.actions import EditProfileAction, FavoriteAction, BonusRepAction, Sus from forum.modules import ui from forum.utils import pagination from forum.views.readers import QuestionListPaginatorContext, AnswerPaginatorContext - +from forum.settings import ONLINE_USERS + +import bisect import time import datetime import decorators @@ -68,17 +70,65 @@ def users(request): }) -#@decorators.render('users/online_users.html', 'online_users', _('Online Users'), weight=200) +@decorators.render('users/online_users.html', 'online_users', _('Online Users'), weight=200) def online_users(request): suser = request.REQUEST.get('q', "") - one_hour_ago = datetime.datetime.now() - datetime.timedelta(hours=1) - sql_datetime = datetime.datetime.strftime(one_hour_ago, '%Y-%m-%d %H:%M:%S') - users = User.objects.order_by('-last_seen') + sort = "" + if request.GET.get("sort", None): + try: + sort = int(request.GET["sort"]) + except ValueError: + logging.error('Found invalid sort "%s", loading %s, refered by %s' % ( + request.GET.get("sort", ''), request.path, request.META.get('HTTP_REFERER', 'UNKNOWN') + )) + raise Http404() - return pagination.paginated(request, ('users', UserListPaginatorContext()), { + page = 0 + if request.GET.get("page", None): + try: + page = int(request.GET["page"]) + except ValueError: + logging.error('Found invalid page "%s", loading %s, refered by %s' % ( + request.GET.get("page", ''), request.path, request.META.get('HTTP_REFERER', 'UNKNOWN') + )) + raise Http404() + + pagesize = 10 + if request.GET.get("pagesize", None): + try: + pagesize = int(request.GET["pagesize"]) + except ValueError: + logging.error('Found invalid pagesize "%s", loading %s, refered by %s' % ( + request.GET.get("pagesize", ''), request.path, request.META.get('HTTP_REFERER', 'UNKNOWN') + )) + raise Http404() + + + users = None + if sort == "reputation": + users = sorted(ONLINE_USERS.sets.keys(), key=lambda user: user.reputation) + elif sort == "newest" : + users = sorted(ONLINE_USERS.sets.keys(), key=lambda user: user.newest) + elif sort == "last": + users = sorted(ONLINE_USERS.sets.keys(), key=lambda user: user.last) + elif sort == "name": + users = sorted(ONLINE_USERS.sets.keys(), key=lambda user: user.name) + elif sort == "oldest": + users = sorted(ONLINE_USERS.sets.keys(), key=lambda user: user.oldest) + elif sort == "newest": + users = sorted(ONLINE_USERS.sets.keys(), key=lambda user: user.newest) + elif sort == "votes": + users = sorted(ONLINE_USERS.sets.keys(), key=lambda user: user.votes) + else: + users = sorted(ONLINE_USERS.iteritems(), key=lambda x: x[1]) + + return render_to_response('users/online_users.html', { "users" : users, "suser" : suser, + "sort" : sort, + "page" : page, + "pageSize" : pagesize, }) @@ -187,10 +237,10 @@ def suspend(request, id): return render_to_response('users/suspend_user.html') data = { - 'bantype': request.POST.get('bantype', 'indefinetly').strip(), - 'publicmsg': request.POST.get('publicmsg', _('Bad behaviour')), - 'privatemsg': request.POST.get('privatemsg', None) or request.POST.get('publicmsg', ''), - 'suspended': user + 'bantype': request.POST.get('bantype', 'indefinetly').strip(), + 'publicmsg': request.POST.get('publicmsg', _('Bad behaviour')), + 'privatemsg': request.POST.get('privatemsg', None) or request.POST.get('publicmsg', ''), + 'suspended': user } if data['bantype'] == 'forxdays': diff --git a/forum/views/writers.py b/forum/views/writers.py index 07364f7..017914b 100644 --- a/forum/views/writers.py +++ b/forum/views/writers.py @@ -110,7 +110,17 @@ def ask(request): }, context_instance=RequestContext(request)) def edit_question(request, id): - question = get_object_or_404(Question, id=id) + #question = get_object_or_404(Question, id=id) + try: + question = Question.objects.get(id=id) + except: + if slug: + question = match_question_slug(slug) + if question is not None: + return HttpResponseRedirect(question.get_absolute_url()) + + raise Http404() + if question.nis.deleted and not request.user.can_view_deleted_post(question): raise Http404 if request.user.can_edit_post(question):