]> git.openstreetmap.org Git - osqa.git/blobdiff - forum/views/users.py
Implemented 'report user' feature
[osqa.git] / forum / views / users.py
index 6eb9baaed1d74da13ee2cf8d4b0d9d89bc03c83a..dc865a236ed3e8824903419c78b88fdb609ce9ba 100644 (file)
@@ -18,7 +18,7 @@ from forum.forms import *
 from forum.utils.html import sanitize_html\r
 from forum.modules import decorate, ReturnImediatelyException\r
 from datetime import datetime, date\r
 from forum.utils.html import sanitize_html\r
 from forum.modules import decorate, ReturnImediatelyException\r
 from datetime import datetime, date\r
-from forum.actions import EditProfileAction, FavoriteAction, BonusRepAction, SuspendAction\r
+from forum.actions import EditProfileAction, FavoriteAction, BonusRepAction, SuspendAction, ReportAction\r
 from forum.modules import ui\r
 from forum.utils import pagination\r
 from forum.views.readers import QuestionListPaginatorContext, AnswerPaginatorContext\r
 from forum.modules import ui\r
 from forum.utils import pagination\r
 from forum.views.readers import QuestionListPaginatorContext, AnswerPaginatorContext\r
@@ -33,13 +33,13 @@ class UserReputationSort(pagination.SimpleSort):
         return objects.order_by('-is_active', self.order_by)\r
 \r
 class UserListPaginatorContext(pagination.PaginatorContext):\r
         return objects.order_by('-is_active', self.order_by)\r
 \r
 class UserListPaginatorContext(pagination.PaginatorContext):\r
-    def __init__(self, pagesizes=(20, 35, 60)):\r
+    def __init__(self, pagesizes=(20, 35, 60), default_pagesize=35):\r
         super (UserListPaginatorContext, self).__init__('USERS_LIST', sort_methods=(\r
             (_('reputation'), UserReputationSort(_('reputation'), '-reputation', _("sorted by reputation"))),\r
             (_('newest'), pagination.SimpleSort(_('recent'), '-date_joined', _("newest members"))),\r
             (_('last'), pagination.SimpleSort(_('oldest'), 'date_joined', _("oldest members"))),\r
             (_('name'), pagination.SimpleSort(_('by username'), 'username', _("sorted by username"))),\r
         super (UserListPaginatorContext, self).__init__('USERS_LIST', sort_methods=(\r
             (_('reputation'), UserReputationSort(_('reputation'), '-reputation', _("sorted by reputation"))),\r
             (_('newest'), pagination.SimpleSort(_('recent'), '-date_joined', _("newest members"))),\r
             (_('last'), pagination.SimpleSort(_('oldest'), 'date_joined', _("oldest members"))),\r
             (_('name'), pagination.SimpleSort(_('by username'), 'username', _("sorted by username"))),\r
-        ), pagesizes=pagesizes)\r
+        ), pagesizes=pagesizes, default_pagesize=default_pagesize)\r
 \r
 class SubscriptionListPaginatorContext(pagination.PaginatorContext):\r
     def __init__(self):\r
 \r
 class SubscriptionListPaginatorContext(pagination.PaginatorContext):\r
     def __init__(self):\r
@@ -131,7 +131,7 @@ def online_users(request):
     })\r
 \r
 \r
     })\r
 \r
 \r
-def edit_user(request, id):\r
+def edit_user(request, id, slug):\r
     user = get_object_or_404(User, id=id)\r
     if not (request.user.is_superuser or request.user == user):\r
         return HttpResponseUnauthorized(request)\r
     user = get_object_or_404(User, id=id)\r
     if not (request.user.is_superuser or request.user == user):\r
         return HttpResponseUnauthorized(request)\r
@@ -236,7 +236,7 @@ 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
+        'bantype': request.POST.get('bantype', 'Indefinitely').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
         'publicmsg': request.POST.get('publicmsg', _('Bad behaviour')),\r
         'privatemsg': request.POST.get('privatemsg', None) or request.POST.get('publicmsg', ''),\r
         'suspended': user\r
@@ -252,6 +252,24 @@ def suspend(request, id):
 \r
     return decorators.RefreshPageCommand()\r
 \r
 \r
     return decorators.RefreshPageCommand()\r
 \r
+@decorate.withfn(decorators.command)\r
+def report_user(request, id):\r
+    user = get_object_or_404(User, id=id)\r
+\r
+    if not request.POST.get('publicmsg', None):\r
+        return render_to_response('users/report_user.html')\r
+\r
+    data = {\r
+        'publicmsg': request.POST.get('publicmsg', _('N/A')),\r
+        'reported': user\r
+    }\r
+\r
+    ReportAction(user=request.user, ip=request.META['REMOTE_ADDR']).save(data=data)\r
+\r
+\r
+    return decorators.RefreshPageCommand()\r
+\r
+\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
 \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
@@ -261,7 +279,10 @@ def user_view(template, tab_name, tab_title, tab_description, private=False, tab
                 user = get_object_or_404(User, id=id)\r
             # ...or by slug if the slug has been given\r
             elif slug is not None:\r
                 user = get_object_or_404(User, id=id)\r
             # ...or by slug if the slug has been given\r
             elif slug is not None:\r
-                user = get_object_or_404(User, username=slug)\r
+                try:\r
+                    user = User.objects.get(username__iexact=slug)\r
+                except User.DoesNotExist:\r
+                    raise Http404\r
 \r
             if private and not (user == request.user or request.user.is_superuser):\r
                 raise ReturnImediatelyException(HttpResponseUnauthorized(request))\r
 \r
             if private and not (user == request.user or request.user.is_superuser):\r
                 raise ReturnImediatelyException(HttpResponseUnauthorized(request))\r
@@ -269,13 +290,23 @@ def user_view(template, tab_name, tab_title, tab_description, private=False, tab
             if render_to and (not render_to(user)):\r
                 raise ReturnImediatelyException(HttpResponseRedirect(user.get_profile_url()))\r
 \r
             if render_to and (not render_to(user)):\r
                 raise ReturnImediatelyException(HttpResponseRedirect(user.get_profile_url()))\r
 \r
-            return [request, user], {}\r
+            return [request, user], { 'slug' : slug, }\r
 \r
         decorated = decorate.params.withfn(params)(fn)\r
 \r
 \r
         decorated = decorate.params.withfn(params)(fn)\r
 \r
-        def result(context, request, user):\r
+        def result(context_or_response, request, user, **kwargs):\r
             rev_page_title = smart_unicode(user.username) + " - " + tab_description\r
 \r
             rev_page_title = smart_unicode(user.username) + " - " + tab_description\r
 \r
+            # Check whether the return type of the decorated function is a context or Http Response\r
+            if isinstance(context_or_response, HttpResponse):\r
+                response = context_or_response\r
+\r
+                # If it is a response -- show it\r
+                return response\r
+            else:\r
+                # ...if it is a context move forward, update it and render it to response\r
+                context = context_or_response\r
+\r
             context.update({\r
                 "tab": "users",\r
                 "active_tab" : tab_name,\r
             context.update({\r
                 "tab": "users",\r
                 "active_tab" : tab_name,\r
@@ -292,7 +323,10 @@ def user_view(template, tab_name, tab_title, tab_description, private=False, tab
                 try:\r
                     return reverse(fn.__name__, kwargs={'id': vu.id, 'slug': slugify(smart_unicode(vu.username))})\r
                 except NoReverseMatch:\r
                 try:\r
                     return reverse(fn.__name__, kwargs={'id': vu.id, 'slug': slugify(smart_unicode(vu.username))})\r
                 except NoReverseMatch:\r
-                    return reverse(fn.__name__, kwargs={'id': vu.id})\r
+                    try:\r
+                        return reverse(fn.__name__, kwargs={'id': vu.id})\r
+                    except NoReverseMatch:\r
+                        return reverse(fn.__name__, kwargs={'slug': slugify(smart_unicode(vu.username))})\r
 \r
             ui.register(ui.PROFILE_TABS, ui.ProfileTab(\r
                 tab_name, tab_title, tab_description,url_getter, private, render_to, weight\r
 \r
             ui.register(ui.PROFILE_TABS, ui.ProfileTab(\r
                 tab_name, tab_title, tab_description,url_getter, private, render_to, weight\r
@@ -303,10 +337,15 @@ def user_view(template, tab_name, tab_title, tab_description, private=False, tab
 \r
 \r
 @user_view('users/stats.html', 'stats', _('overview'), _('user overview'))\r
 \r
 \r
 @user_view('users/stats.html', 'stats', _('overview'), _('user overview'))\r
-def user_profile(request, user):\r
+def user_profile(request, user, **kwargs):\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
+    # Check whether the passed slug matches the one for the user object\r
+    slug = kwargs['slug']\r
+    if slug != slugify(smart_unicode(user.username)):\r
+        return HttpResponseRedirect(user.get_absolute_url())\r
+\r
     up_votes = user.vote_up_count\r
     down_votes = user.vote_down_count\r
     votes_today = user.get_vote_count_today()\r
     up_votes = user.vote_up_count\r
     down_votes = user.vote_down_count\r
     votes_today = user.get_vote_count_today()\r
@@ -335,7 +374,7 @@ def user_profile(request, user):
     })\r
     \r
 @user_view('users/recent.html', 'recent', _('recent activity'), _('recent user activity'))\r
     })\r
     \r
 @user_view('users/recent.html', 'recent', _('recent activity'), _('recent user activity'))\r
-def user_recent(request, user):\r
+def user_recent(request, user, **kwargs):\r
     activities = user.actions.exclude(\r
             action_type__in=("voteup", "votedown", "voteupcomment", "flag", "newpage", "editpage")).order_by(\r
             '-action_date')[:USERS_PAGE_SIZE]\r
     activities = user.actions.exclude(\r
             action_type__in=("voteup", "votedown", "voteupcomment", "flag", "newpage", "editpage")).order_by(\r
             '-action_date')[:USERS_PAGE_SIZE]\r
@@ -344,13 +383,13 @@ def user_recent(request, user):
 \r
 \r
 @user_view('users/reputation.html', 'reputation', _('reputation history'), _('graph of user karma'))\r
 \r
 \r
 @user_view('users/reputation.html', 'reputation', _('reputation history'), _('graph of user karma'))\r
-def user_reputation(request, user):\r
+def user_reputation(request, user, **kwargs):\r
     rep = list(user.reputes.order_by('date'))\r
     values = [r.value for r in rep]\r
     redux = lambda x, y: x+y\r
 \r
     graph_data = simplejson.dumps([\r
     rep = list(user.reputes.order_by('date'))\r
     values = [r.value for r in rep]\r
     redux = lambda x, y: x+y\r
 \r
     graph_data = simplejson.dumps([\r
-    (time.mktime(rep[i].date.timetuple()) * 1000, reduce(redux, values[:i], 0))\r
+    (time.mktime(rep[i].date.timetuple()) * 1000, reduce(redux, values[:i+1], 0))\r
     for i in range(len(values))\r
     ])\r
 \r
     for i in range(len(values))\r
     ])\r
 \r
@@ -359,25 +398,47 @@ def user_reputation(request, user):
     return {"view_user": user, "reputation": rep, "graph_data": graph_data}\r
 \r
 @user_view('users/votes.html', 'votes', _('votes'), _('user vote record'), True)\r
     return {"view_user": user, "reputation": rep, "graph_data": graph_data}\r
 \r
 @user_view('users/votes.html', 'votes', _('votes'), _('user vote record'), True)\r
-def user_votes(request, user):\r
+def user_votes(request, user, **kwargs):\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
     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
+def user_favorites(request, user, **kwargs):\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'), _('subscriptions'), True, tabbed=False)\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'), _('subscriptions'), True, tabbed=False)\r
-def user_subscriptions(request, user):\r
+def user_subscriptions(request, user, **kwargs):\r
+    return _user_subscriptions(request, user, **kwargs)\r
+\r
+def _user_subscriptions(request, user, **kwargs):\r
     enabled = True\r
 \r
     tab = request.GET.get('tab', "settings")\r
 \r
     enabled = True\r
 \r
     tab = request.GET.get('tab', "settings")\r
 \r
-    if tab == 'settings':\r
+    # Manage tab\r
+    if 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
+        return pagination.paginated(request, ('subscriptions', SubscriptionListPaginatorContext()), {\r
+            'subscriptions':subscriptions,\r
+            'view_user':user,\r
+            "auto":show_auto,\r
+            'manage_open':manage_open,\r
+        })\r
+    # Settings Tab and everything else\r
+    else:\r
         manage_open = False\r
         if request.method == 'POST':\r
             manage_open = False\r
         manage_open = False\r
         if request.method == 'POST':\r
             manage_open = False\r
@@ -401,36 +462,8 @@ def user_subscriptions(request, user):
             'manage_open':manage_open,\r
         }\r
 \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
-        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
-    # 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
 @user_view('users/preferences.html', 'preferences', _('preferences'), _('preferences'), True, tabbed=False)\r
-def user_preferences(request, user):\r
+def user_preferences(request, user, **kwargs):\r
     if request.POST:\r
         form = UserPreferencesForm(request.POST)\r
 \r
     if request.POST:\r
         form = UserPreferencesForm(request.POST)\r
 \r