]> git.openstreetmap.org Git - osqa.git/blobdiff - forum/views/users.py
Several fixes in the OSQA exporter.
[osqa.git] / forum / views / users.py
index 9cac193ff0625591602fe083d65d89c443a13fb5..60e4b38cc991ab2fc4435d36f903b122a7676efb 100644 (file)
@@ -1,4 +1,3 @@
-from django.contrib.auth.decorators import login_required\r
 from forum.models import User\r
 from django.db.models import Q, Count\r
 from django.core.paginator import Paginator, EmptyPage, InvalidPage\r
 from forum.models import User\r
 from django.db.models import Q, Count\r
 from django.core.paginator import Paginator, EmptyPage, InvalidPage\r
@@ -16,15 +15,19 @@ from django.utils import simplejson
 from django.core.urlresolvers import reverse, NoReverseMatch\r
 from forum.forms import *\r
 from forum.utils.html import sanitize_html\r
 from django.core.urlresolvers import reverse, NoReverseMatch\r
 from forum.forms import *\r
 from forum.utils.html import sanitize_html\r
-from forum.modules import decorate\r
+from forum.modules import decorate, ReturnImediatelyException\r
 from datetime import datetime, date\r
 from datetime import datetime, date\r
-import decorators\r
 from forum.actions import EditProfileAction, FavoriteAction, BonusRepAction, SuspendAction\r
 from forum.modules import ui\r
 from forum.utils import pagination\r
 from forum.actions import EditProfileAction, FavoriteAction, BonusRepAction, SuspendAction\r
 from forum.modules import ui\r
 from forum.utils import pagination\r
-\r
+from forum.views.readers import QuestionListPaginatorContext, AnswerPaginatorContext\r
+from forum.settings import ONLINE_USERS\r
\r
+import bisect\r
 import time\r
 import time\r
+import datetime\r
 import decorators\r
 import decorators\r
+import unicodedata\r
 \r
 class UserReputationSort(pagination.SimpleSort):\r
     def apply(self, objects):\r
 \r
 class UserReputationSort(pagination.SimpleSort):\r
     def apply(self, objects):\r
@@ -39,6 +42,18 @@ class UserListPaginatorContext(pagination.PaginatorContext):
             (_('name'), pagination.SimpleSort(_('by username'), 'username', _("sorted by username"))),\r
         ), pagesizes=(20, 35, 60))\r
 \r
             (_('name'), pagination.SimpleSort(_('by username'), 'username', _("sorted by username"))),\r
         ), pagesizes=(20, 35, 60))\r
 \r
+class SubscriptionListPaginatorContext(pagination.PaginatorContext):\r
+    def __init__(self):\r
+        super (SubscriptionListPaginatorContext, self).__init__('SUBSCRIPTION_LIST', pagesizes=(5, 10, 20), default_pagesize=20)\r
+\r
+class UserAnswersPaginatorContext(pagination.PaginatorContext):\r
+    def __init__(self):\r
+        super (UserAnswersPaginatorContext, self).__init__('USER_ANSWER_LIST', sort_methods=(\r
+            (_('oldest'), pagination.SimpleSort(_('oldest answers'), 'added_at', _("oldest answers will be shown first"))),\r
+            (_('newest'), pagination.SimpleSort(_('newest answers'), '-added_at', _("newest answers will be shown first"))),\r
+            (_('votes'), pagination.SimpleSort(_('popular answers'), '-score', _("most voted answers will be shown first"))),\r
+        ), default_sort=_('votes'), pagesizes=(5, 10, 20), default_pagesize=20, prefix=_('answers'))\r
+\r
 USERS_PAGE_SIZE = 35# refactor - move to some constants file\r
 \r
 @decorators.render('users/users.html', 'users', _('users'), weight=200)\r
 USERS_PAGE_SIZE = 35# refactor - move to some constants file\r
 \r
 @decorators.render('users/users.html', 'users', _('users'), weight=200)\r
@@ -46,16 +61,77 @@ def users(request):
     suser = request.REQUEST.get('q', "")\r
     users = User.objects.all()\r
 \r
     suser = request.REQUEST.get('q', "")\r
     users = User.objects.all()\r
 \r
-    if suser == "":\r
+    if suser != "":\r
         users = users.filter(username__icontains=suser)\r
 \r
         users = users.filter(username__icontains=suser)\r
 \r
-    return pagination.paginated(request, 'users', UserListPaginatorContext(), {\r
+    return pagination.paginated(request, ('users', UserListPaginatorContext()), {\r
         "users" : users,\r
         "suser" : suser,\r
     })\r
 \r
 \r
         "users" : users,\r
         "suser" : suser,\r
     })\r
 \r
 \r
-@login_required\r
+@decorators.render('users/online_users.html', 'online_users', _('Online Users'), weight=200, tabbed=False)\r
+def online_users(request):\r
+    suser = request.REQUEST.get('q', "")\r
+\r
+    sort = ""\r
+    if request.GET.get("sort", None):\r
+        try:\r
+            sort = int(request.GET["sort"])\r
+        except ValueError:\r
+            logging.error('Found invalid sort "%s", loading %s, refered by %s' % (\r
+                request.GET.get("sort", ''), request.path, request.META.get('HTTP_REFERER', 'UNKNOWN')\r
+            ))\r
+            raise Http404()\r
+\r
+    page = 0\r
+    if request.GET.get("page", None):\r
+        try:\r
+            page = int(request.GET["page"])\r
+        except ValueError:\r
+            logging.error('Found invalid page "%s", loading %s, refered by %s' % (\r
+                request.GET.get("page", ''), request.path, request.META.get('HTTP_REFERER', 'UNKNOWN')\r
+            ))\r
+            raise Http404()\r
+\r
+    pagesize = 10\r
+    if request.GET.get("pagesize", None):\r
+        try:\r
+            pagesize = int(request.GET["pagesize"])\r
+        except ValueError:\r
+            logging.error('Found invalid pagesize "%s", loading %s, refered by %s' % (\r
+                request.GET.get("pagesize", ''), request.path, request.META.get('HTTP_REFERER', 'UNKNOWN')\r
+            ))\r
+            raise Http404()\r
+\r
+\r
+    users = None\r
+    if sort == "reputation":\r
+        users = sorted(ONLINE_USERS.sets.keys(), key=lambda user: user.reputation)\r
+    elif sort == "newest" :\r
+        users = sorted(ONLINE_USERS.sets.keys(), key=lambda user: user.newest)\r
+    elif sort == "last":\r
+        users = sorted(ONLINE_USERS.sets.keys(), key=lambda user: user.last)\r
+    elif sort == "name":\r
+        users = sorted(ONLINE_USERS.sets.keys(), key=lambda user: user.name)\r
+    elif sort == "oldest":\r
+        users = sorted(ONLINE_USERS.sets.keys(), key=lambda user: user.oldest)\r
+    elif sort == "newest":\r
+        users = sorted(ONLINE_USERS.sets.keys(), key=lambda user: user.newest)\r
+    elif sort == "votes":\r
+        users = sorted(ONLINE_USERS.sets.keys(), key=lambda user: user.votes)\r
+    else:\r
+        users = sorted(ONLINE_USERS.iteritems(), key=lambda x: x[1])\r
+\r
+    return render_to_response('users/online_users.html', {\r
+        "users" : users,\r
+        "suser" : suser,\r
+        "sort" : sort,\r
+        "page" : page,\r
+        "pageSize" : pagesize,\r
+    })\r
+\r
+\r
 def edit_user(request, id):\r
     user = get_object_or_404(User, id=id)\r
     if not (request.user.is_superuser or request.user == user):\r
 def edit_user(request, id):\r
     user = get_object_or_404(User, id=id)\r
     if not (request.user.is_superuser or request.user == user):\r
@@ -69,6 +145,12 @@ def edit_user(request, id):
                 user.email = new_email\r
                 user.email_isvalid = False\r
 \r
                 user.email = new_email\r
                 user.email_isvalid = False\r
 \r
+                try:\r
+                    hash = ValidationHash.objects.get(user=request.user, type='email')\r
+                    hash.delete()\r
+                except:\r
+                    pass\r
+\r
             if settings.EDITABLE_SCREEN_NAME:\r
                 user.username = sanitize_html(form.cleaned_data['username'])\r
             user.real_name = sanitize_html(form.cleaned_data['realname'])\r
             if settings.EDITABLE_SCREEN_NAME:\r
                 user.username = sanitize_html(form.cleaned_data['username'])\r
             user.real_name = sanitize_html(form.cleaned_data['realname'])\r
@@ -155,10 +237,10 @@ def suspend(request, id):
             return render_to_response('users/suspend_user.html')\r
 \r
     data = {\r
             return render_to_response('users/suspend_user.html')\r
 \r
     data = {\r
-    'bantype': request.POST.get('bantype', 'indefinetly').strip(),\r
-    'publicmsg': request.POST.get('publicmsg', _('Bad behaviour')),\r
-    'privatemsg': request.POST.get('privatemsg', None) or request.POST.get('publicmsg', ''),\r
-    'suspended': user\r
+        'bantype': request.POST.get('bantype', 'indefinetly').strip(),\r
+        'publicmsg': request.POST.get('publicmsg', _('Bad behaviour')),\r
+        'privatemsg': request.POST.get('privatemsg', None) or request.POST.get('publicmsg', ''),\r
+        'suspended': user\r
     }\r
 \r
     if data['bantype'] == 'forxdays':\r
     }\r
 \r
     if data['bantype'] == 'forxdays':\r
@@ -174,27 +256,32 @@ def suspend(request, id):
 \r
 def user_view(template, tab_name, tab_title, tab_description, private=False, tabbed=True, render_to=None, weight=500):\r
     def decorator(fn):\r
 \r
 def user_view(template, tab_name, tab_title, tab_description, private=False, tabbed=True, render_to=None, weight=500):\r
     def decorator(fn):\r
-        def decorated(fn, request, id, slug=None):\r
+        def params(request, id, slug=None):\r
             user = get_object_or_404(User, id=id)\r
             if private and not (user == request.user or request.user.is_superuser):\r
             user = get_object_or_404(User, id=id)\r
             if private and not (user == request.user or request.user.is_superuser):\r
-                return HttpResponseUnauthorized(request)\r
+                raise ReturnImediatelyException(HttpResponseUnauthorized(request))\r
 \r
             if render_to and (not render_to(user)):\r
 \r
             if render_to and (not render_to(user)):\r
-                return HttpResponseRedirect(user.get_profile_url())\r
-                \r
-            context = fn(request, user)\r
+                raise ReturnImediatelyException(HttpResponseRedirect(user.get_profile_url()))\r
 \r
 \r
+            return [request, user], {}\r
+\r
+        decorated = decorate.params.withfn(params)(fn)\r
+\r
+        def result(context, request, user):\r
             rev_page_title = user.username + " - " + tab_description\r
 \r
             context.update({\r
             rev_page_title = user.username + " - " + tab_description\r
 \r
             context.update({\r
-            "tab": "users",\r
-            "active_tab" : tab_name,\r
-            "tab_description" : tab_description,\r
-            "page_title" : rev_page_title,\r
-            "can_view_private": (user == request.user) or request.user.is_superuser\r
+                "tab": "users",\r
+                "active_tab" : tab_name,\r
+                "tab_description" : tab_description,\r
+                "page_title" : rev_page_title,\r
+                "can_view_private": (user == request.user) or request.user.is_superuser\r
             })\r
             return render_to_response(template, context, context_instance=RequestContext(request))\r
 \r
             })\r
             return render_to_response(template, context, context_instance=RequestContext(request))\r
 \r
+        decorated = decorate.result.withfn(result, needs_params=True)(decorated)\r
+\r
         if tabbed:\r
             def url_getter(vu):\r
                 try:\r
         if tabbed:\r
             def url_getter(vu):\r
                 try:\r
@@ -206,7 +293,7 @@ def user_view(template, tab_name, tab_title, tab_description, private=False, tab
                 tab_name, tab_title, tab_description,url_getter, private, render_to, weight\r
             ))\r
 \r
                 tab_name, tab_title, tab_description,url_getter, private, render_to, weight\r
             ))\r
 \r
-        return decorate.withfn(decorated)(fn)\r
+        return decorated\r
     return decorator\r
 \r
 \r
     return decorator\r
 \r
 \r
@@ -226,7 +313,9 @@ def user_profile(request, user):
     awards = [(Badge.objects.get(id=b['id']), b['count']) for b in\r
               Badge.objects.filter(awards__user=user).values('id').annotate(count=Count('cls')).order_by('-count')]\r
 \r
     awards = [(Badge.objects.get(id=b['id']), b['count']) for b in\r
               Badge.objects.filter(awards__user=user).values('id').annotate(count=Count('cls')).order_by('-count')]\r
 \r
-    return {\r
+    return pagination.paginated(request, (\r
+    ('questions', QuestionListPaginatorContext('USER_QUESTION_LIST', _('questions'), 15)),\r
+    ('answers', UserAnswersPaginatorContext())), {\r
     "view_user" : user,\r
     "questions" : questions,\r
     "answers" : answers,\r
     "view_user" : user,\r
     "questions" : questions,\r
     "answers" : answers,\r
@@ -238,7 +327,7 @@ def user_profile(request, user):
     "user_tags" : user_tags[:50],\r
     "awards": awards,\r
     "total_awards" : len(awards),\r
     "user_tags" : user_tags[:50],\r
     "awards": awards,\r
     "total_awards" : len(awards),\r
-    }\r
+    })\r
     \r
 @user_view('users/recent.html', 'recent', _('recent activity'), _('recent user activity'))\r
 def user_recent(request, user):\r
     \r
 @user_view('users/recent.html', 'recent', _('recent activity'), _('recent user activity'))\r
 def user_recent(request, user):\r
@@ -277,42 +366,89 @@ def user_favorites(request, user):
 \r
     return {"favorites" : favorites, "view_user" : user}\r
 \r
 \r
     return {"favorites" : favorites, "view_user" : user}\r
 \r
-@user_view('users/subscriptions.html', 'subscriptions', _('subscription settings'), _('subscriptions'), True, tabbed=False)\r
+@user_view('users/subscriptions.html', 'subscriptions', _('subscription'), _('subscriptions'), True, tabbed=False)\r
 def user_subscriptions(request, user):\r
     enabled = user.subscription_settings.enable_notifications\r
 \r
 def user_subscriptions(request, user):\r
     enabled = user.subscription_settings.enable_notifications\r
 \r
-    if request.method == 'POST':        \r
-        form = SubscriptionSettingsForm(data=request.POST, instance=user.subscription_settings)\r
+    tab = request.GET.get('tab', "settings")\r
 \r
 \r
-        if form.is_valid():\r
-            form.save()\r
-            message = _('New subscription settings are now saved')\r
+    if tab == 'settings':\r
+        manage_open = False\r
+        if request.method == 'POST':\r
+            manage_open = False\r
+            form = SubscriptionSettingsForm(data=request.POST, instance=user.subscription_settings)\r
 \r
 \r
-            if 'notswitch' in request.POST:\r
-                enabled = not enabled\r
+            if form.is_valid():\r
+                form.save()\r
+                message = _('New subscription settings are now saved')\r
 \r
 \r
-                if enabled:\r
-                    message = _('Notifications are now enabled')\r
-                else:\r
-                    message = _('Notifications are now disabled')\r
+                if 'notswitch' in request.POST:\r
+                    enabled = not enabled\r
 \r
 \r
-            user.subscription_settings.enable_notifications = enabled\r
-            user.subscription_settings.save()\r
+                    if enabled:\r
+                        message = _('Notifications are now enabled')\r
+                    else:\r
+                        message = _('Notifications are now disabled')\r
 \r
 \r
-            request.user.message_set.create(message=message)\r
-    else:\r
-        form = SubscriptionSettingsForm(instance=user.subscription_settings)\r
+                user.subscription_settings.enable_notifications = enabled\r
+                user.subscription_settings.save()\r
+\r
+                request.user.message_set.create(message=message)\r
+        else:\r
+            form = SubscriptionSettingsForm(instance=user.subscription_settings)\r
+\r
+        return {\r
+            'view_user':user,\r
+            'notificatons_on': enabled,\r
+            'form':form,\r
+            'manage_open':manage_open,\r
+        }\r
+\r
+    elif tab == 'manage':\r
+        manage_open = True\r
+\r
+        auto = request.GET.get('auto', 'True')\r
+        if auto == 'True':\r
+            show_auto = True\r
+            subscriptions = QuestionSubscription.objects.filter(user=user).order_by('-last_view')\r
+        else:\r
+            show_auto = False\r
+            subscriptions = QuestionSubscription.objects.filter(user=user, auto_subscription=False).order_by('-last_view')\r
 \r
 \r
-    return {'view_user':user, 'notificatons_on': enabled, 'form':form}\r
+        return pagination.paginated(request, ('subscriptions', SubscriptionListPaginatorContext()), {\r
+            'subscriptions':subscriptions,\r
+            'view_user':user,\r
+            "auto":show_auto,\r
+            'manage_open':manage_open,\r
+        })\r
 \r
 \r
-@login_required\r
-def account_settings(request):\r
-    logging.debug('')\r
-    msg = request.GET.get('msg', '')\r
-    is_openid = False\r
+    # else:\r
+        # todo: probably want to throw an error\r
+        # error = "error to throw"\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+@user_view('users/preferences.html', 'preferences', _('preferences'), _('preferences'), True, tabbed=False)\r
+def user_preferences(request, user):\r
+    if request.POST:\r
+        form = UserPreferencesForm(request.POST)\r
+\r
+        if form.is_valid():\r
+            user.prop.preferences = form.cleaned_data\r
+            request.user.message_set.create(message=_('New preferences saved'))\r
+\r
+    else:\r
+        preferences = user.prop.preferences\r
+\r
+        if preferences:\r
+            form = UserPreferencesForm(initial=preferences)\r
+        else:\r
+            form = UserPreferencesForm()\r
+            \r
+    return {'view_user': user, 'form': form}\r
 \r
 \r
-    return render_to_response('account_settings.html', {\r
-    'msg': msg,\r
-    'is_openid': is_openid\r
-    }, context_instance=RequestContext(request))\r
 \r
 \r