]> git.openstreetmap.org Git - osqa.git/blobdiff - forum/views/users.py
reversed the search order of the revisions drop down menu.
[osqa.git] / forum / views / users.py
index fbde0954dd89fc0416383773bafe095d4c504468..ba9e1734bb22a49fcc7413f455386d270a764dde 100644 (file)
@@ -7,22 +7,27 @@ from django.contrib.contenttypes.models import ContentType
 from django.core.urlresolvers import reverse\r
 from django.shortcuts import render_to_response, get_object_or_404\r
 from django.template import RequestContext\r
 from django.core.urlresolvers import reverse\r
 from django.shortcuts import render_to_response, get_object_or_404\r
 from django.template import RequestContext\r
-from django.http import HttpResponse, HttpResponseForbidden, HttpResponseRedirect, Http404\r
+from django.http import HttpResponse, HttpResponseRedirect, Http404\r
+from forum.http_responses import HttpResponseUnauthorized\r
 from django.utils.translation import ugettext as _\r
 from django.utils.http import urlquote_plus\r
 from django.utils.html import strip_tags\r
 from django.utils import simplejson\r
 from django.utils.translation import ugettext as _\r
 from django.utils.http import urlquote_plus\r
 from django.utils.html import strip_tags\r
 from django.utils import simplejson\r
-from django.core.urlresolvers import reverse\r
+from django.core.urlresolvers import reverse, NoReverseMatch\r
 from forum.forms import *\r
 from forum.utils.html import sanitize_html\r
 from forum.forms import *\r
 from forum.utils.html import sanitize_html\r
+from forum.modules import decorate\r
 from datetime import datetime, date\r
 import decorators\r
 from forum.actions import EditProfileAction, FavoriteAction, BonusRepAction, SuspendAction\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
 \r
 import time\r
 \r
 import time\r
+import decorators\r
 \r
 USERS_PAGE_SIZE = 35# refactor - move to some constants file\r
 \r
 \r
 USERS_PAGE_SIZE = 35# refactor - move to some constants file\r
 \r
+@decorators.render('users/users.html', 'users', _('users'), weight=200)\r
 def users(request):\r
     is_paginated = True\r
     sortby = request.GET.get('sort', 'reputation')\r
 def users(request):\r
     is_paginated = True\r
     sortby = request.GET.get('sort', 'reputation')\r
@@ -54,43 +59,37 @@ def users(request):
     except (EmptyPage, InvalidPage):\r
         users = objects_list.page(objects_list.num_pages)\r
 \r
     except (EmptyPage, InvalidPage):\r
         users = objects_list.page(objects_list.num_pages)\r
 \r
-    return render_to_response('users/users.html', {\r
-    "users" : users,\r
-    "suser" : suser,\r
-    "keywords" : suser,\r
-    "tab_id" : sortby,\r
-    "context" : {\r
-    'is_paginated' : is_paginated,\r
-    'pages': objects_list.num_pages,\r
-    'page': page,\r
-    'has_previous': users.has_previous(),\r
-    'has_next': users.has_next(),\r
-    'previous': users.previous_page_number(),\r
-    'next': users.next_page_number(),\r
-    'base_url' : base_url\r
+    return {\r
+        "users" : users,\r
+        "suser" : suser,\r
+        "keywords" : suser,\r
+        "tab_id" : sortby,\r
+        "context" : {\r
+            'is_paginated' : is_paginated,\r
+            'pages': objects_list.num_pages,\r
+            'page': page,\r
+            'has_previous': users.has_previous(),\r
+            'has_next': users.has_next(),\r
+            'previous': users.previous_page_number(),\r
+            'next': users.next_page_number(),\r
+            'base_url' : base_url\r
+        }\r
     }\r
 \r
     }\r
 \r
-    }, context_instance=RequestContext(request))\r
-\r
-def set_new_email(user, new_email, nomessage=False):\r
-    if new_email != user.email:\r
-        user.email = new_email\r
-        user.email_isvalid = False\r
-        user.save()\r
-    #if settings.EMAIL_VALIDATION == 'on':\r
-    #    send_new_email_key(user,nomessage=nomessage)\r
 \r
 @login_required\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
 \r
 @login_required\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
-        return HttpResponseForbidden()\r
+        return HttpResponseUnauthorized(request)\r
     if request.method == "POST":\r
         form = EditUserForm(user, request.POST)\r
         if form.is_valid():\r
             new_email = sanitize_html(form.cleaned_data['email'])\r
 \r
     if request.method == "POST":\r
         form = EditUserForm(user, request.POST)\r
         if form.is_valid():\r
             new_email = sanitize_html(form.cleaned_data['email'])\r
 \r
-            set_new_email(user, new_email)\r
+            if new_email != user.email:\r
+                user.email = new_email\r
+                user.email_isvalid = False\r
 \r
             if settings.EDITABLE_SCREEN_NAME:\r
                 user.username = sanitize_html(form.cleaned_data['username'])\r
 \r
             if settings.EDITABLE_SCREEN_NAME:\r
                 user.username = sanitize_html(form.cleaned_data['username'])\r
@@ -105,6 +104,7 @@ def edit_user(request, id):
             user.save()\r
             EditProfileAction(user=user, ip=request.META['REMOTE_ADDR']).save()\r
 \r
             user.save()\r
             EditProfileAction(user=user, ip=request.META['REMOTE_ADDR']).save()\r
 \r
+            request.user.message_set.create(message=_("Profile updated."))\r
             return HttpResponseRedirect(user.get_profile_url())\r
     else:\r
         form = EditUserForm(user)\r
             return HttpResponseRedirect(user.get_profile_url())\r
     else:\r
         form = EditUserForm(user)\r
@@ -118,7 +118,7 @@ def edit_user(request, id):
 @login_required\r
 def user_powers(request, id, action, status):\r
     if not request.user.is_superuser:\r
 @login_required\r
 def user_powers(request, id, action, status):\r
     if not request.user.is_superuser:\r
-        return HttpResponseForbidden()\r
+        return HttpResponseUnauthorized(request)\r
 \r
     user = get_object_or_404(User, id=id)\r
     new_state = action == 'grant'\r
 \r
     user = get_object_or_404(User, id=id)\r
     new_state = action == 'grant'\r
@@ -134,7 +134,7 @@ def user_powers(request, id, action, status):
     return HttpResponseRedirect(user.get_profile_url())\r
 \r
 \r
     return HttpResponseRedirect(user.get_profile_url())\r
 \r
 \r
-@decorators.command\r
+@decorate.withfn(decorators.command)\r
 def award_points(request, id):\r
     if (not request.POST) and request.POST.get('points', None):\r
         raise decorators.CommandException(_("Invalid request type"))\r
 def award_points(request, id):\r
     if (not request.POST) and request.POST.get('points', None):\r
         raise decorators.CommandException(_("Invalid request type"))\r
@@ -152,7 +152,7 @@ def award_points(request, id):
     return dict(reputation=user.reputation)\r
 \r
 \r
     return dict(reputation=user.reputation)\r
 \r
 \r
-@decorators.command\r
+@decorate.withfn(decorators.command)\r
 def suspend(request, id):\r
     user = get_object_or_404(User, id=id)\r
 \r
 def suspend(request, id):\r
     user = get_object_or_404(User, id=id)\r
 \r
@@ -184,31 +184,41 @@ def suspend(request, id):
 \r
     return decorators.RefreshPageCommand()\r
 \r
 \r
     return decorators.RefreshPageCommand()\r
 \r
-def user_view(template, tab_name, tab_description, page_title, private=False):\r
+def user_view(template, tab_name, tab_title, tab_description, private=False, tabbed=True, weight=500):\r
     def decorator(fn):\r
     def decorator(fn):\r
-        def decorated(request, id, slug=None):\r
+        def decorated(fn, 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 HttpResponseForbidden()\r
+                return HttpResponseUnauthorized(request)\r
             context = fn(request, user)\r
 \r
             context = fn(request, user)\r
 \r
-            rev_page_title = user.username + " - " + page_title\r
+            rev_page_title = user.username + " - " + tab_description\r
 \r
             context.update({\r
 \r
             context.update({\r
-            "tab_name" : tab_name,\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
             "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
-        return decorated\r
+        if tabbed:\r
+            def url_getter(vu):\r
+                try:\r
+                    return reverse(fn.__name__, kwargs={'id': vu.id, 'slug': slugify(vu.username)})\r
+                except NoReverseMatch:\r
+                    return reverse(fn.__name__, kwargs={'id': vu.id})\r
 \r
 \r
+            ui.register(ui.PROFILE_TABS, ui.ProfileTab(\r
+                tab_name, tab_title, tab_description,url_getter, private, weight\r
+            ))\r
+\r
+        return decorate.withfn(decorated)(fn)\r
     return decorator\r
 \r
 \r
     return decorator\r
 \r
 \r
-@user_view('users/stats.html', 'stats', _('user profile'), _('user overview'))\r
-def user_stats(request, user):\r
+@user_view('users/stats.html', 'stats', _('overview'), _('user overview'))\r
+def user_profile(request, user):\r
     questions = Question.objects.filter_state(deleted=False).filter(author=user).order_by('-added_at')\r
     answers = Answer.objects.filter_state(deleted=False).filter(author=user).order_by('-added_at')\r
 \r
     questions = Question.objects.filter_state(deleted=False).filter(author=user).order_by('-added_at')\r
     answers = Answer.objects.filter_state(deleted=False).filter(author=user).order_by('-added_at')\r
 \r
@@ -236,8 +246,8 @@ def user_stats(request, user):
     "awards": awards,\r
     "total_awards" : len(awards),\r
     }\r
     "awards": awards,\r
     "total_awards" : len(awards),\r
     }\r
-\r
-@user_view('users/recent.html', 'recent', _('recent user activity'), _('recent activity'))\r
+    \r
+@user_view('users/recent.html', 'recent', _('recent activity'), _('recent user activity'))\r
 def user_recent(request, user):\r
     activities = user.actions.exclude(\r
             action_type__in=("voteup", "votedown", "voteupcomment", "flag", "newpage", "editpage")).order_by(\r
 def user_recent(request, user):\r
     activities = user.actions.exclude(\r
             action_type__in=("voteup", "votedown", "voteupcomment", "flag", "newpage", "editpage")).order_by(\r
@@ -246,15 +256,7 @@ def user_recent(request, user):
     return {"view_user" : user, "activities" : activities}\r
 \r
 \r
     return {"view_user" : user, "activities" : activities}\r
 \r
 \r
-@user_view('users/votes.html', 'votes', _('user vote record'), _('votes'), True)\r
-def user_votes(request, user):\r
-    votes = user.votes.exclude(node__state_string__contains="(deleted").filter(\r
-            node__node_type__in=("question", "answer")).order_by('-voted_at')[:USERS_PAGE_SIZE]\r
-\r
-    return {"view_user" : user, "votes" : votes}\r
-\r
-\r
-@user_view('users/reputation.html', 'reputation', _('user reputation in the community'), _('user reputation'))\r
+@user_view('users/reputation.html', 'reputation', _('karma history'), _('graph of user karma'))\r
 def user_reputation(request, user):\r
     rep = list(user.reputes.order_by('date'))\r
     values = [r.value for r in rep]\r
 def user_reputation(request, user):\r
     rep = list(user.reputes.order_by('date'))\r
     values = [r.value for r in rep]\r
@@ -269,13 +271,20 @@ def user_reputation(request, user):
 \r
     return {"view_user": user, "reputation": rep, "graph_data": graph_data}\r
 \r
 \r
     return {"view_user": user, "reputation": rep, "graph_data": graph_data}\r
 \r
-@user_view('users/questions.html', 'favorites', _('favorite questions'), _('favorite questions'))\r
+@user_view('users/votes.html', 'votes', _('votes'), _('user vote record'), True)\r
+def user_votes(request, user):\r
+    votes = user.votes.exclude(node__state_string__contains="(deleted").filter(\r
+            node__node_type__in=("question", "answer")).order_by('-voted_at')[:USERS_PAGE_SIZE]\r
+\r
+    return {"view_user" : user, "votes" : votes}\r
+\r
+@user_view('users/questions.html', 'favorites', _('favorites'), _('questions that user selected as his/her favorite'))\r
 def user_favorites(request, user):\r
     favorites = FavoriteAction.objects.filter(canceled=False, user=user)\r
 \r
     return {"favorites" : favorites, "view_user" : user}\r
 \r
 def user_favorites(request, user):\r
     favorites = FavoriteAction.objects.filter(canceled=False, user=user)\r
 \r
     return {"favorites" : favorites, "view_user" : user}\r
 \r
-@user_view('users/subscriptions.html', 'subscriptions', _('subscription settings'), _('subscriptions'), True)\r
+@user_view('users/subscriptions.html', 'subscriptions', _('subscription settings'), _('subscriptions'), True, tabbed=False)\r
 def user_subscriptions(request, user):\r
     if request.method == 'POST':\r
         form = SubscriptionSettingsForm(request.POST)\r
 def user_subscriptions(request, user):\r
     if request.method == 'POST':\r
         form = SubscriptionSettingsForm(request.POST)\r