]> git.openstreetmap.org Git - osqa.git/blobdiff - forum/views/users.py
Adds custom header and footer, and a preview mechanism.
[osqa.git] / forum / views / users.py
index 162ba2d214f8c484e3f5faca54de980dc7812e81..da556be2654706cf0124786f99bd6b7663142f7e 100644 (file)
@@ -1,5 +1,6 @@
 from django.contrib.auth.decorators import login_required\r
 from forum.models import User\r
 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 django.template.defaultfilters import slugify\r
 from django.contrib.contenttypes.models import ContentType\r
 from django.core.paginator import Paginator, EmptyPage, InvalidPage\r
 from django.template.defaultfilters import slugify\r
 from django.contrib.contenttypes.models import ContentType\r
@@ -14,22 +15,11 @@ from django.utils import simplejson
 from django.core.urlresolvers import reverse\r
 from forum.forms import *\r
 from forum.utils.html import sanitize_html\r
 from django.core.urlresolvers import reverse\r
 from forum.forms import *\r
 from forum.utils.html import sanitize_html\r
-from forum.authentication import user_updated \r
-import time\r
-from django.contrib.contenttypes.models import ContentType\r
+from datetime import datetime, date\r
+import decorators\r
+from forum.actions import EditProfileAction, FavoriteAction, BonusRepAction\r
 \r
 \r
-question_type = ContentType.objects.get_for_model(Question)\r
-answer_type = ContentType.objects.get_for_model(Answer)\r
-comment_type = ContentType.objects.get_for_model(Comment)\r
-question_revision_type = ContentType.objects.get_for_model(QuestionRevision)\r
-answer_revision_type = ContentType.objects.get_for_model(AnswerRevision)\r
-repute_type = ContentType.objects.get_for_model(Repute)\r
-question_type_id = question_type.id\r
-answer_type_id = answer_type.id\r
-comment_type_id = comment_type.id\r
-question_revision_type_id = question_revision_type.id\r
-answer_revision_type_id = answer_revision_type.id\r
-repute_type_id = repute_type.id\r
+import time\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
@@ -63,7 +53,7 @@ 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.html', {\r
+    return render_to_response('users/users.html', {\r
                                 "users" : users,\r
                                 "suser" : suser,\r
                                 "keywords" : suser,\r
                                 "users" : users,\r
                                 "suser" : suser,\r
                                 "keywords" : suser,\r
@@ -81,26 +71,6 @@ def users(request):
 \r
                                 }, context_instance=RequestContext(request))\r
 \r
 \r
                                 }, context_instance=RequestContext(request))\r
 \r
-@login_required\r
-def moderate_user(request, id):\r
-    """ajax handler of user moderation\r
-    """\r
-    if not request.user.is_superuser or request.method != 'POST':\r
-        raise Http404\r
-    if not request.is_ajax():\r
-        return HttpResponseForbidden(mimetype="application/json")\r
-\r
-    user = get_object_or_404(User, id=id)\r
-    form = ModerateUserForm(request.POST, instance=user)\r
-\r
-    if form.is_valid():\r
-        form.save()\r
-        logging.debug('data saved')\r
-        response = HttpResponse(simplejson.dumps(''), mimetype="application/json")\r
-    else:\r
-        response = HttpResponseForbidden(mimetype="application/json")\r
-    return response\r
-\r
 def set_new_email(user, new_email, nomessage=False):\r
     if new_email != user.email:\r
         user.email = new_email\r
 def set_new_email(user, new_email, nomessage=False):\r
     if new_email != user.email:\r
         user.email = new_email\r
@@ -112,8 +82,8 @@ def set_new_email(user, new_email, nomessage=False):
 @login_required\r
 def edit_user(request, id):\r
     user = get_object_or_404(User, id=id)\r
 @login_required\r
 def edit_user(request, id):\r
     user = get_object_or_404(User, id=id)\r
-    if request.user != user:\r
-        raise Http404\r
+    if not (request.user.is_superuser or request.user == user):\r
+        return HttpResponseForbidden()\r
     if request.method == "POST":\r
         form = EditUserForm(user, request.POST)\r
         if form.is_valid():\r
     if request.method == "POST":\r
         form = EditUserForm(user, request.POST)\r
         if form.is_valid():\r
@@ -121,673 +91,154 @@ def edit_user(request, id):
 \r
             set_new_email(user, new_email)\r
 \r
 \r
             set_new_email(user, new_email)\r
 \r
-            #user.username = sanitize_html(form.cleaned_data['username'])\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
             user.website = sanitize_html(form.cleaned_data['website'])\r
             user.location = sanitize_html(form.cleaned_data['city'])\r
             user.real_name = sanitize_html(form.cleaned_data['realname'])\r
             user.website = sanitize_html(form.cleaned_data['website'])\r
             user.location = sanitize_html(form.cleaned_data['city'])\r
-            user.date_of_birth = sanitize_html(form.cleaned_data['birthday'])\r
-            if len(user.date_of_birth) == 0:\r
-                user.date_of_birth = '1900-01-01'\r
+            user.date_of_birth = form.cleaned_data['birthday']\r
+            if user.date_of_birth == "None":\r
+                user.date_of_birth = datetime(1900, 1, 1, 0, 0)\r
             user.about = sanitize_html(form.cleaned_data['about'])\r
 \r
             user.save()\r
             user.about = sanitize_html(form.cleaned_data['about'])\r
 \r
             user.save()\r
-            # send user updated singal if full fields have been updated\r
-            if user.email and user.real_name and user.website and user.location and \\r
-                user.date_of_birth and user.about:\r
-                user_updated.send(sender=user.__class__, instance=user, updated_by=user)\r
+            EditProfileAction(user=user, ip=request.META['REMOTE_ADDR']).save()\r
+\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
-    return render_to_response('user_edit.html', {\r
+    return render_to_response('users/edit.html', {\r
+                                                'user': user,\r
                                                 'form' : form,\r
                                                 'gravatar_faq_url' : reverse('faq') + '#gravatar',\r
                                     }, context_instance=RequestContext(request))\r
 \r
                                                 'form' : form,\r
                                                 'gravatar_faq_url' : reverse('faq') + '#gravatar',\r
                                     }, context_instance=RequestContext(request))\r
 \r
-def user_stats(request, user_id, user_view):\r
-    user = get_object_or_404(User, id=user_id)\r
-\r
-    questions = Question.objects.filter(deleted=False, author=user).order_by('-added_at')\r
-\r
-    answered_questions = Question.objects.filter(deleted=False, answers__author=user).distinct()\r
-\r
-    """answered_questions = Question.objects.extra(\r
-        select={\r
-            'vote_up_count' : 'answer.vote_up_count',\r
-            'vote_down_count' : 'answer.vote_down_count',\r
-            'answer_id' : 'answer.id',\r
-            'accepted' : 'answer.accepted',\r
-            'vote_count' : 'answer.score',\r
-            'comment_count' : 'answer.comment_count'\r
-            },\r
-        tables=['question', 'answer'],\r
-        where=['NOT answer.deleted AND NOT question.deleted AND answer.author_id=%s AND answer.question_id=question.id'],\r
-        params=[user_id],\r
-        order_by=['-vote_count', '-answer_id'],\r
-        select_params=[user_id]\r
-    ).distinct().values('comment_count',\r
-                        'id',\r
-                        'answer_id',\r
-                        'title',\r
-                        'author_id',\r
-                        'accepted',\r
-                        'vote_count',\r
-                        'answer_count',\r
-                        'vote_up_count',\r
-                        'vote_down_count')[:100]"""\r
-\r
-    up_votes = user.get_up_vote_count()\r
-    down_votes = user.get_down_vote_count()\r
+\r
+@login_required\r
+def user_powers(request, id, action, status):\r
+    if not request.user.is_superuser:\r
+        return HttpResponseForbidden()\r
+\r
+    user = get_object_or_404(User, id=id)\r
+    new_state = action == 'grant'\r
+\r
+    if status == 'super':\r
+        user.is_superuser = new_state\r
+    elif status == 'staff':\r
+        user.is_staff = new_state\r
+    else:\r
+        raise Http404()\r
+\r
+    user.save()    \r
+    return HttpResponseRedirect(user.get_profile_url())\r
+\r
+\r
+@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
+\r
+    if not request.user.is_superuser:\r
+        raise decorators.CommandException(_("Only superusers are allowed to award reputation points"))\r
+\r
+    user = get_object_or_404(User, id=id)\r
+    points = int(request.POST['points'])\r
+\r
+    extra = dict(message=request.POST.get('message', ''), awarding_user=request.user.id, value=points)\r
+\r
+    BonusRepAction(user=user, extra=extra).save(data=dict(value=points))\r
+\r
+    return dict(reputation=user.reputation)\r
+\r
+\r
+def user_view(template, tab_name, tab_description, page_title, private=False):\r
+    def decorator(fn):\r
+        def decorated(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
+                return HttpResponseForbidden()\r
+            context = fn(request, user)\r
+\r
+            rev_page_title = user.username + " - " + page_title\r
+\r
+            context.update({\r
+                "tab_name" : 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
+        return decorated\r
+    return decorator\r
+\r
+\r
+@user_view('users/stats.html', 'stats', _('user profile'), _('user overview'))\r
+def user_stats(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
+    up_votes = user.vote_up_count\r
+    down_votes = user.vote_down_count\r
     votes_today = user.get_vote_count_today()\r
     votes_total = int(settings.MAX_VOTES_PER_DAY)\r
 \r
     votes_today = user.get_vote_count_today()\r
     votes_total = int(settings.MAX_VOTES_PER_DAY)\r
 \r
-    #question_id_set = set(map(lambda v: v['id'], list(questions))) \\r
-    #                    | set(map(lambda v: v['id'], list(answered_questions)))\r
+    user_tags = Tag.objects.filter(Q(nodes__author=user) | Q(nodes__children__author=user)) \\r
+        .annotate(user_tag_usage_count=Count('name')).order_by('-user_tag_usage_count')\r
 \r
 \r
-    user_tags = Tag.objects.filter(questions__author=user)\r
-    try:\r
-        from django.db.models import Count\r
-        awards = Award.objects.extra(\r
-                                        select={'id': 'badge.id', \r
-                                                'name':'badge.name', \r
-                                                'description': 'badge.description', \r
-                                                'type': 'badge.type'},\r
-                                        tables=['award', 'badge'],\r
-                                        order_by=['-awarded_at'],\r
-                                        where=['user_id=%s AND badge_id=badge.id'],\r
-                                        params=[user.id]\r
-                                    ).values('id', 'name', 'description', 'type')\r
-        total_awards = awards.count()\r
-        awards = awards.annotate(count = Count('badge__id'))\r
-        user_tags = user_tags.annotate(user_tag_usage_count=Count('name'))\r
-\r
-    except ImportError:\r
-        awards = Award.objects.extra(\r
-                                        select={'id': 'badge.id', \r
-                                                'count': 'count(badge_id)', \r
-                                                'name':'badge.name', \r
-                                                'description': 'badge.description', \r
-                                                'type': 'badge.type'},\r
-                                        tables=['award', 'badge'],\r
-                                        order_by=['-awarded_at'],\r
-                                        where=['user_id=%s AND badge_id=badge.id'],\r
-                                        params=[user.id]\r
-                                    ).values('id', 'count', 'name', 'description', 'type')\r
-        total_awards = awards.count()\r
-        awards.query.group_by = ['badge_id']\r
-\r
-        user_tags = user_tags.extra(\r
-            select={'user_tag_usage_count': 'COUNT(1)',},\r
-            order_by=['-user_tag_usage_count'],\r
-        )\r
-        user_tags.query.group_by = ['name']\r
-\r
-    if request.user.is_superuser:\r
-        moderate_user_form = ModerateUserForm(instance=user)\r
-    else:\r
-        moderate_user_form = None\r
-\r
-    return render_to_response(user_view.template_file,{\r
-                                'moderate_user_form': moderate_user_form,\r
-                                "tab_name" : user_view.id,\r
-                                "tab_description" : user_view.tab_description,\r
-                                "page_title" : user_view.page_title,\r
-                                "view_user" : user,\r
-                                "questions" : questions,\r
-                                "answered_questions" : answered_questions,\r
-                                "up_votes" : up_votes,\r
-                                "down_votes" : down_votes,\r
-                                "total_votes": up_votes + down_votes,\r
-                                "votes_today_left": votes_total-votes_today,\r
-                                "votes_total_per_day": votes_total,\r
-                                "user_tags" : user_tags[:50],\r
-                                "awards": awards,\r
-                                "total_awards" : total_awards,\r
-                            }, context_instance=RequestContext(request))\r
-\r
-def user_recent(request, user_id, user_view):\r
-    user = get_object_or_404(User, id=user_id)\r
-    def get_type_name(type_id):\r
-        for item in TYPE_ACTIVITY:\r
-            if type_id in item:\r
-                return item[1]\r
-\r
-    class Event:\r
-        def __init__(self, time, type, title, summary, answer_id, question_id):\r
-            self.time = time\r
-            self.type = get_type_name(type)\r
-            self.type_id = type\r
-            self.title = title\r
-            self.summary = summary\r
-            slug_title = slugify(title)\r
-            self.title_link = reverse('question', kwargs={'id':question_id, 'slug':slug_title})\r
-            if int(answer_id) > 0:\r
-                self.title_link += '#%s' % answer_id\r
-\r
-    class AwardEvent:\r
-        def __init__(self, time, type, id):\r
-            self.time = time\r
-            self.type = get_type_name(type)\r
-            self.type_id = type\r
-            self.badge = get_object_or_404(Badge, id=id)\r
-\r
-    activities = []\r
-    # ask questions\r
-    questions = Activity.objects.extra(\r
-        select={\r
-            'title' : 'question.title',\r
-            'question_id' : 'question.id',\r
-            'active_at' : 'activity.active_at',\r
-            'activity_type' : 'activity.activity_type'\r
-            },\r
-        tables=['activity', 'question'],\r
-        where=['activity.content_type_id = %s AND activity.object_id = ' +\r
-            'question.id AND NOT question.deleted AND activity.user_id = %s AND activity.activity_type = %s'],\r
-        params=[question_type_id, user_id, TYPE_ACTIVITY_ASK_QUESTION],\r
-        order_by=['-activity.active_at']\r
-    ).values(\r
-            'title',\r
-            'question_id',\r
-            'active_at',\r
-            'activity_type'\r
-            )\r
-    if len(questions) > 0:\r
-        questions = [(Event(q['active_at'], q['activity_type'], q['title'], '', '0', \\r
-                      q['question_id'])) for q in questions]\r
-        activities.extend(questions)\r
-\r
-    # answers\r
-    answers = Activity.objects.extra(\r
-        select={\r
-            'title' : 'question.title',\r
-            'question_id' : 'question.id',\r
-            'answer_id' : 'answer.id',\r
-            'active_at' : 'activity.active_at',\r
-            'activity_type' : 'activity.activity_type'\r
-            },\r
-        tables=['activity', 'answer', 'question'],\r
-        where=['activity.content_type_id = %s AND activity.object_id = answer.id AND ' + \r
-            'answer.question_id=question.id AND NOT answer.deleted AND activity.user_id=%s AND '+\r
-            'activity.activity_type=%s AND NOT question.deleted'],\r
-        params=[answer_type_id, user_id, TYPE_ACTIVITY_ANSWER],\r
-        order_by=['-activity.active_at']\r
-    ).values(\r
-            'title',\r
-            'question_id',\r
-            'answer_id',\r
-            'active_at',\r
-            'activity_type'\r
-            )\r
-    if len(answers) > 0:\r
-        answers = [(Event(q['active_at'], q['activity_type'], q['title'], '', q['answer_id'], \\r
-                    q['question_id'])) for q in answers]\r
-        activities.extend(answers)\r
-\r
-    # question comments\r
-    comments = Activity.objects.extra(\r
-        select={\r
-            'title' : 'question.title',\r
-            'question_id' : 'comment.object_id',\r
-            'added_at' : 'comment.added_at',\r
-            'activity_type' : 'activity.activity_type'\r
-            },\r
-        tables=['activity', 'question', 'comment'],\r
-\r
-        where=['activity.content_type_id = %s AND activity.object_id = comment.id AND '+\r
-            'activity.user_id = comment.user_id AND comment.object_id=question.id AND '+\r
-            'comment.content_type_id=%s AND activity.user_id = %s AND activity.activity_type=%s AND ' +\r
-            'NOT question.deleted'],\r
-        params=[comment_type_id, question_type_id, user_id, TYPE_ACTIVITY_COMMENT_QUESTION],\r
-        order_by=['-comment.added_at']\r
-    ).values(\r
-            'title',\r
-            'question_id',\r
-            'added_at',\r
-            'activity_type'\r
-            )\r
-\r
-    if len(comments) > 0:\r
-        comments = [(Event(q['added_at'], q['activity_type'], q['title'], '', '0', \\r
-                     q['question_id'])) for q in comments]\r
-        activities.extend(comments)\r
-\r
-    # answer comments\r
-    comments = Activity.objects.extra(\r
-        select={\r
-            'title' : 'question.title',\r
-            'question_id' : 'question.id',\r
-            'answer_id' : 'answer.id',\r
-            'added_at' : 'comment.added_at',\r
-            'activity_type' : 'activity.activity_type'\r
-            },\r
-        tables=['activity', 'question', 'answer', 'comment'],\r
-\r
-        where=['activity.content_type_id = %s AND activity.object_id = comment.id AND '+\r
-            'activity.user_id = comment.user_id AND comment.object_id=answer.id AND '+\r
-            'comment.content_type_id=%s AND question.id = answer.question_id AND '+\r
-            'activity.user_id = %s AND activity.activity_type=%s AND '+\r
-            'NOT answer.deleted AND NOT question.deleted'],\r
-        params=[comment_type_id, answer_type_id, user_id, TYPE_ACTIVITY_COMMENT_ANSWER],\r
-        order_by=['-comment.added_at']\r
-    ).values(\r
-            'title',\r
-            'question_id',\r
-            'answer_id',\r
-            'added_at',\r
-            'activity_type'\r
-            )\r
-\r
-    if len(comments) > 0:\r
-        comments = [(Event(q['added_at'], q['activity_type'], q['title'], '', q['answer_id'], \\r
-                     q['question_id'])) for q in comments]\r
-        activities.extend(comments)\r
-\r
-    # question revisions\r
-    revisions = Activity.objects.extra(\r
-        select={\r
-            'title' : 'question_revision.title',\r
-            'question_id' : 'question_revision.question_id',\r
-            'added_at' : 'activity.active_at',\r
-            'activity_type' : 'activity.activity_type',\r
-            'summary' : 'question_revision.summary'\r
-            },\r
-        tables=['activity', 'question_revision', 'question'],\r
-        where=['activity.content_type_id = %s AND activity.object_id = question_revision.id AND '+\r
-            'question_revision.id=question.id AND NOT question.deleted AND '+\r
-            'activity.user_id = question_revision.author_id AND activity.user_id = %s AND '+\r
-            'activity.activity_type=%s'],\r
-        params=[question_revision_type_id, user_id, TYPE_ACTIVITY_UPDATE_QUESTION],\r
-        order_by=['-activity.active_at']\r
-    ).values(\r
-            'title',\r
-            'question_id',\r
-            'added_at',\r
-            'activity_type',\r
-            'summary'\r
-            )\r
-\r
-    if len(revisions) > 0:\r
-        revisions = [(Event(q['added_at'], q['activity_type'], q['title'], q['summary'], '0', \\r
-                      q['question_id'])) for q in revisions]\r
-        activities.extend(revisions)\r
-\r
-    # answer revisions\r
-    revisions = Activity.objects.extra(\r
-        select={\r
-            'title' : 'question.title',\r
-            'question_id' : 'question.id',\r
-            'answer_id' : 'answer.id',\r
-            'added_at' : 'activity.active_at',\r
-            'activity_type' : 'activity.activity_type',\r
-            'summary' : 'answer_revision.summary'\r
-            },\r
-        tables=['activity', 'answer_revision', 'question', 'answer'],\r
-\r
-        where=['activity.content_type_id = %s AND activity.object_id = answer_revision.id AND '+\r
-            'activity.user_id = answer_revision.author_id AND activity.user_id = %s AND '+\r
-            'answer_revision.answer_id=answer.id AND answer.question_id = question.id AND '+\r
-            'NOT question.deleted AND NOT answer.deleted AND '+\r
-            'activity.activity_type=%s'],\r
-        params=[answer_revision_type_id, user_id, TYPE_ACTIVITY_UPDATE_ANSWER],\r
-        order_by=['-activity.active_at']\r
-    ).values(\r
-            'title',\r
-            'question_id',\r
-            'added_at',\r
-            'answer_id',\r
-            'activity_type',\r
-            'summary'\r
-            )\r
-\r
-    if len(revisions) > 0:\r
-        revisions = [(Event(q['added_at'], q['activity_type'], q['title'], q['summary'], \\r
-                      q['answer_id'], q['question_id'])) for q in revisions]\r
-        activities.extend(revisions)\r
-\r
-    # accepted answers\r
-    accept_answers = Activity.objects.extra(\r
-        select={\r
-            'title' : 'question.title',\r
-            'question_id' : 'question.id',\r
-            'added_at' : 'activity.active_at',\r
-            'activity_type' : 'activity.activity_type',\r
-            },\r
-        tables=['activity', 'answer', 'question'],\r
-        where=['activity.content_type_id = %s AND activity.object_id = answer.id AND '+\r
-            'activity.user_id = question.author_id AND activity.user_id = %s AND '+\r
-            'NOT answer.deleted AND NOT question.deleted AND '+\r
-            'answer.question_id=question.id AND activity.activity_type=%s'],\r
-        params=[answer_type_id, user_id, TYPE_ACTIVITY_MARK_ANSWER],\r
-        order_by=['-activity.active_at']\r
-    ).values(\r
-            'title',\r
-            'question_id',\r
-            'added_at',\r
-            'activity_type',\r
-            )\r
-    if len(accept_answers) > 0:\r
-        accept_answers = [(Event(q['added_at'], q['activity_type'], q['title'], '', '0', \\r
-            q['question_id'])) for q in accept_answers]\r
-        activities.extend(accept_answers)\r
-    #award history\r
-    awards = Activity.objects.extra(\r
-        select={\r
-            'badge_id' : 'badge.id',\r
-            'awarded_at': 'award.awarded_at',\r
-            'activity_type' : 'activity.activity_type'\r
-            },\r
-        tables=['activity', 'award', 'badge'],\r
-        where=['activity.user_id = award.user_id AND activity.user_id = %s AND '+\r
-            'award.badge_id=badge.id AND activity.object_id=award.id AND activity.activity_type=%s'],\r
-        params=[user_id, TYPE_ACTIVITY_PRIZE],\r
-        order_by=['-activity.active_at']\r
-    ).values(\r
-            'badge_id',\r
-            'awarded_at',\r
-            'activity_type'\r
-            )\r
-    if len(awards) > 0:\r
-        awards = [(AwardEvent(q['awarded_at'], q['activity_type'], q['badge_id'])) for q in awards]\r
-        activities.extend(awards)\r
-\r
-    activities.sort(lambda x,y: cmp(y.time, x.time))\r
-\r
-    return render_to_response(user_view.template_file,{\r
-                                    "tab_name" : user_view.id,\r
-                                    "tab_description" : user_view.tab_description,\r
-                                    "page_title" : user_view.page_title,\r
-                                    "view_user" : user,\r
-                                    "activities" : activities[:user_view.data_size]\r
-                                }, context_instance=RequestContext(request))\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
+            "view_user" : user,\r
+            "questions" : questions,\r
+            "answers" : answers,\r
+            "up_votes" : up_votes,\r
+            "down_votes" : down_votes,\r
+            "total_votes": up_votes + down_votes,\r
+            "votes_today_left": votes_total-votes_today,\r
+            "votes_total_per_day": votes_total,\r
+            "user_tags" : user_tags[:50],\r
+            "awards": awards,\r
+            "total_awards" : len(awards),\r
+        }\r
+\r
+@user_view('users/recent.html', 'recent', _('recent user activity'), _('recent activity'))\r
+def user_recent(request, user):\r
+    activities = user.actions.exclude(action_type__in=("voteup", "votedown", "voteupcomment", "flag", "newpage", "editpage")).order_by('-action_date')[:USERS_PAGE_SIZE]\r
 \r
 \r
-def user_responses(request, user_id, user_view):\r
-    """\r
-    We list answers for question, comments, and answer accepted by others for this user.\r
-    """\r
-    class Response:\r
-        def __init__(self, type, title, question_id, answer_id, time, username, user_id, content):\r
-            self.type = type\r
-            self.title = title\r
-            self.titlelink = reverse('question', args=[question_id]) + u'%s#%s' % (slugify(title), answer_id)\r
-            self.time = time\r
-            self.userlink = reverse('users') + u'%s/%s/' % (user_id, username)\r
-            self.username = username\r
-            self.content = u'%s ...' % strip_tags(content)[:300]\r
-\r
-        def __unicode__(self):\r
-            return u'%s %s' % (self.type, self.titlelink)\r
-\r
-    user = get_object_or_404(User, id=user_id)\r
-    responses = []\r
-    answers = Answer.objects.extra(\r
-                                    select={\r
-                                        'title' : 'question.title',\r
-                                        'question_id' : 'question.id',\r
-                                        'answer_id' : 'answer.id',\r
-                                        'added_at' : 'answer.added_at',\r
-                                        'html' : 'answer.html',\r
-                                        'username' : 'auth_user.username',\r
-                                        'user_id' : 'auth_user.id'\r
-                                        },\r
-                                    select_params=[user_id],\r
-                                    tables=['answer', 'question', 'auth_user'],\r
-                                    where=['answer.question_id = question.id AND NOT answer.deleted AND NOT question.deleted AND '+\r
-                                        'question.author_id = %s AND answer.author_id <> %s AND answer.author_id=auth_user.id'],\r
-                                    params=[user_id, user_id],\r
-                                    order_by=['-answer.id']\r
-                                ).values(\r
-                                        'title',\r
-                                        'question_id',\r
-                                        'answer_id',\r
-                                        'added_at',\r
-                                        'html',\r
-                                        'username',\r
-                                        'user_id'\r
-                                        )\r
-    if len(answers) > 0:\r
-        answers = [(Response(TYPE_RESPONSE['QUESTION_ANSWERED'], a['title'], a['question_id'],\r
-        a['answer_id'], a['added_at'], a['username'], a['user_id'], a['html'])) for a in answers]\r
-        responses.extend(answers)\r
-\r
-\r
-    # question comments\r
-    comments = Comment.active.extra(\r
-                                select={\r
-                                    'title' : 'question.title',\r
-                                    'question_id' : 'comment.object_id',\r
-                                    'added_at' : 'comment.added_at',\r
-                                    'comment' : 'comment.comment',\r
-                                    'username' : 'auth_user.username',\r
-                                    'user_id' : 'auth_user.id'\r
-                                    },\r
-                                tables=['question', 'auth_user', 'comment'],\r
-                                where=['NOT question.deleted AND question.author_id = %s AND comment.object_id=question.id AND '+\r
-                                    'comment.content_type_id=%s AND comment.user_id <> %s AND comment.user_id = auth_user.id'],\r
-                                params=[user_id, question_type_id, user_id],\r
-                                order_by=['-comment.added_at']\r
-                            ).values(\r
-                                    'title',\r
-                                    'question_id',\r
-                                    'added_at',\r
-                                    'comment',\r
-                                    'username',\r
-                                    'user_id'\r
-                                    )\r
-\r
-    if len(comments) > 0:\r
-        comments = [(Response(TYPE_RESPONSE['QUESTION_COMMENTED'], c['title'], c['question_id'],\r
-            '', c['added_at'], c['username'], c['user_id'], c['comment'])) for c in comments]\r
-        responses.extend(comments)\r
-\r
-    # answer comments\r
-    comments = Comment.active.extra(\r
-        select={\r
-            'title' : 'question.title',\r
-            'question_id' : 'question.id',\r
-            'answer_id' : 'answer.id',\r
-            'added_at' : 'comment.added_at',\r
-            'comment' : 'comment.comment',\r
-            'username' : 'auth_user.username',\r
-            'user_id' : 'auth_user.id'\r
-            },\r
-        tables=['answer', 'auth_user', 'comment', 'question'],\r
-        where=['NOT answer.deleted AND answer.author_id = %s AND comment.object_id=answer.id AND '+\r
-            'comment.content_type_id=%s AND comment.user_id <> %s AND comment.user_id = auth_user.id '+\r
-            'AND question.id = answer.question_id'],\r
-        params=[user_id, answer_type_id, user_id],\r
-        order_by=['-comment.added_at']\r
-    ).values(\r
-            'title',\r
-            'question_id',\r
-            'answer_id',\r
-            'added_at',\r
-            'comment',\r
-            'username',\r
-            'user_id'\r
-            )\r
-\r
-    if len(comments) > 0:\r
-        comments = [(Response(TYPE_RESPONSE['ANSWER_COMMENTED'], c['title'], c['question_id'],\r
-        c['answer_id'], c['added_at'], c['username'], c['user_id'], c['comment'])) for c in comments]\r
-        responses.extend(comments)\r
-\r
-    # answer has been accepted\r
-    answers = Answer.objects.extra(\r
-        select={\r
-            'title' : 'question.title',\r
-            'question_id' : 'question.id',\r
-            'answer_id' : 'answer.id',\r
-            'added_at' : 'answer.accepted_at',\r
-            'html' : 'answer.html',\r
-            'username' : 'auth_user.username',\r
-            'user_id' : 'auth_user.id'\r
-            },\r
-        select_params=[user_id],\r
-        tables=['answer', 'question', 'auth_user'],\r
-        where=['answer.question_id = question.id AND NOT answer.deleted AND NOT question.deleted AND '+\r
-            'answer.author_id = %s AND answer.accepted=True AND question.author_id=auth_user.id'],\r
-        params=[user_id],\r
-        order_by=['-answer.id']\r
-    ).values(\r
-            'title',\r
-            'question_id',\r
-            'answer_id',\r
-            'added_at',\r
-            'html',\r
-            'username',\r
-            'user_id'\r
-            )\r
-    if len(answers) > 0:\r
-        answers = [(Response(TYPE_RESPONSE['ANSWER_ACCEPTED'], a['title'], a['question_id'],\r
-            a['answer_id'], a['added_at'], a['username'], a['user_id'], a['html'])) for a in answers]\r
-        responses.extend(answers)\r
-\r
-    # sort posts by time\r
-    responses.sort(lambda x,y: cmp(y.time, x.time))\r
-\r
-    return render_to_response(user_view.template_file,{\r
-        "tab_name" : user_view.id,\r
-        "tab_description" : user_view.tab_description,\r
-        "page_title" : user_view.page_title,\r
-        "view_user" : user,\r
-        "responses" : responses[:user_view.data_size],\r
-\r
-    }, context_instance=RequestContext(request))\r
-\r
-def user_votes(request, user_id, user_view):\r
-    user = get_object_or_404(User, id=user_id)\r
-    if not request.user == user:\r
-        raise Http404\r
-    votes = []\r
-    question_votes = Vote.active.extra(\r
-        select={\r
-            'title' : 'question.title',\r
-            'question_id' : 'question.id',\r
-            'answer_id' : 0,\r
-            'voted_at' : 'vote.voted_at',\r
-            'vote' : 'vote',\r
-            },\r
-        select_params=[user_id],\r
-        tables=['vote', 'question', 'auth_user'],\r
-        where=['vote.content_type_id = %s AND vote.user_id = %s AND vote.object_id = question.id '+\r
-            'AND vote.user_id=auth_user.id'],\r
-        params=[question_type_id, user_id],\r
-        order_by=['-vote.id']\r
-    ).values(\r
-            'title',\r
-            'question_id',\r
-            'answer_id',\r
-            'voted_at',\r
-            'vote',\r
-            )\r
-    if(len(question_votes) > 0):\r
-        votes.extend(question_votes)\r
-\r
-    answer_votes = Vote.active.extra(\r
-        select={\r
-            'title' : 'question.title',\r
-            'question_id' : 'question.id',\r
-            'answer_id' : 'answer.id',\r
-            'voted_at' : 'vote.voted_at',\r
-            'vote' : 'vote',\r
-            },\r
-        select_params=[user_id],\r
-        tables=['vote', 'answer', 'question', 'auth_user'],\r
-        where=['vote.content_type_id = %s AND vote.user_id = %s AND vote.object_id = answer.id '+\r
-            'AND answer.question_id = question.id AND vote.user_id=auth_user.id'],\r
-        params=[answer_type_id, user_id],\r
-        order_by=['-vote.id']\r
-    ).values(\r
-            'title',\r
-            'question_id',\r
-            'answer_id',\r
-            'voted_at',\r
-            'vote',\r
-            )\r
-\r
-    if(len(answer_votes) > 0):\r
-        votes.extend(answer_votes)\r
-    votes.sort(lambda x,y: cmp(y['voted_at'], x['voted_at']))\r
-    return render_to_response(user_view.template_file,{\r
-        "tab_name" : user_view.id,\r
-        "tab_description" : user_view.tab_description,\r
-        "page_title" : user_view.page_title,\r
-        "view_user" : user,\r
-        "votes" : votes[:user_view.data_size]\r
-\r
-    }, context_instance=RequestContext(request))\r
-\r
-def user_reputation(request, user_id, user_view):\r
-    user = get_object_or_404(User, id=user_id)\r
-\r
-    reputation = user.reputes.order_by('-reputed_at')\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(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
+def user_reputation(request, user):\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
 \r
     graph_data = simplejson.dumps([\r
-            (time.mktime(rep.reputed_at.timetuple()) * 1000, rep.reputation)\r
-            for rep in reputation\r
+            (time.mktime(rep[i].date.timetuple()) * 1000, reduce(redux, values[:i], 0))\r
+            for i in range(len(values))\r
     ])\r
 \r
     ])\r
 \r
-    return render_to_response(user_view.template_file, {\r
-                              "tab_name": user_view.id,\r
-                              "tab_description": user_view.tab_description,\r
-                              "page_title": user_view.page_title,\r
-                              "view_user": user,\r
-                              "reputation": reputation,\r
-                              "graph_data": graph_data\r
-                              }, context_instance=RequestContext(request))\r
-\r
-def user_favorites(request, user_id, user_view):\r
-    user = get_object_or_404(User, id=user_id)\r
-    questions = Question.objects.extra(\r
-        select={\r
-            'vote_count' : 'question.vote_up_count + question.vote_down_count',\r
-            'favorited_myself' : 'SELECT count(*) FROM favorite_question f WHERE f.user_id = %s '+\r
-                'AND f.question_id = question.id',\r
-            'la_user_id' : 'auth_user.id',\r
-            'la_username' : 'auth_user.username',\r
-            'la_user_gold' : 'forum_user.gold',\r
-            'la_user_silver' : 'forum_user.silver',\r
-            'la_user_bronze' : 'forum_user.bronze',\r
-            'la_user_reputation' : 'forum_user.reputation'\r
-            },\r
-        select_params=[user_id],\r
-        tables=['question', 'auth_user', 'favorite_question', 'forum_user'],\r
-        where=['NOT question.deleted AND question.last_activity_by_id = auth_user.id '+\r
-            'AND favorite_question.question_id = question.id AND favorite_question.user_id = %s AND forum_user.user_ptr_id = auth_user.id'],\r
-        params=[user_id],\r
-        order_by=['-vote_count', '-question.id']\r
-    ).values('vote_count',\r
-             'favorited_myself',\r
-             'id',\r
-             'title',\r
-             'author_id',\r
-             'added_at',\r
-             'answer_accepted',\r
-             'answer_count',\r
-             'comment_count',\r
-             'view_count',\r
-             'favourite_count',\r
-             'summary',\r
-             'tagnames',\r
-             'vote_up_count',\r
-             'vote_down_count',\r
-             'last_activity_at',\r
-             'la_user_id',\r
-             'la_username',\r
-             'la_user_gold',\r
-             'la_user_silver',\r
-             'la_user_bronze',\r
-             'la_user_reputation')\r
-    return render_to_response(user_view.template_file,{\r
-        "tab_name" : user_view.id,\r
-        "tab_description" : user_view.tab_description,\r
-        "page_title" : user_view.page_title,\r
-        "questions" : questions[:user_view.data_size],\r
-        "view_user" : user\r
-    }, context_instance=RequestContext(request))\r
-\r
-def user_subscription_settings(request, user_id, user_view):\r
-    user = get_object_or_404(User, id=user_id)\r
+    rep = user.reputes.filter(action__canceled=False).order_by('-date')[0:20]\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
+def user_favorites(request, user):\r
+    favorites = FavoriteAction.objects.filter(canceled=False, user=user)\r
 \r
 \r
+    return {"favorites" : favorites, "view_user" : user}\r
+\r
+@user_view('users/subscriptions.html', 'subscriptions', _('subscription settings'), _('subscriptions'), True)\r
+def user_subscriptions(request, user):\r
     if request.method == 'POST':\r
         form = SubscriptionSettingsForm(request.POST)\r
 \r
     if request.method == 'POST':\r
         form = SubscriptionSettingsForm(request.POST)\r
 \r
@@ -799,120 +250,22 @@ def user_subscription_settings(request, user_id, user_view):
                 request.user.message_set.create(message=_('Notifications are now enabled'))\r
             else:\r
                 request.user.message_set.create(message=_('Notifications are now disabled'))\r
                 request.user.message_set.create(message=_('Notifications are now enabled'))\r
             else:\r
                 request.user.message_set.create(message=_('Notifications are now disabled'))\r
-        else:\r
-            form.is_valid()\r
-            for k,v in form.cleaned_data.items():\r
-                setattr(user.subscription_settings, k, v)\r
 \r
 \r
-            user.subscription_settings.save()\r
-            request.user.message_set.create(message=_('New subscription settings are now saved'))\r
+        form.is_valid()\r
+        for k,v in form.cleaned_data.items():\r
+            setattr(user.subscription_settings, k, v)\r
+\r
+        user.subscription_settings.save()\r
+        request.user.message_set.create(message=_('New subscription settings are now saved'))\r
     else:\r
         form = SubscriptionSettingsForm(user.subscription_settings.__dict__)\r
 \r
     notificatons_on = user.subscription_settings.enable_notifications\r
 \r
     else:\r
         form = SubscriptionSettingsForm(user.subscription_settings.__dict__)\r
 \r
     notificatons_on = user.subscription_settings.enable_notifications\r
 \r
-    return render_to_response(user_view.template_file,{\r
-        'tab_name':user_view.id,\r
-        'tab_description':user_view.tab_description,\r
-        'page_title':user_view.page_title,\r
-        'view_user':user,\r
-        'notificatons_on': notificatons_on,\r
-        'form':form,\r
-    }, context_instance=RequestContext(request))\r
-\r
-class UserView:\r
-    def __init__(self, id, tab_title, tab_description, page_title, view_func, template_file, data_size=0):\r
-        self.id = id\r
-        self.tab_title = tab_title\r
-        self.tab_description = tab_description\r
-        self.page_title = page_title\r
-        self.view_func = view_func \r
-        self.template_file = template_file\r
-        self.data_size = data_size\r
-        \r
-USER_TEMPLATE_VIEWS = (\r
-    UserView(\r
-        id = 'stats',\r
-        tab_title = _('overview'),\r
-        tab_description = _('user profile'),\r
-        page_title = _('user profile overview'),\r
-        view_func = user_stats,\r
-        template_file = 'user_stats.html'\r
-    ),\r
-    UserView(\r
-        id = 'recent',\r
-        tab_title = _('recent activity'),\r
-        tab_description = _('recent user activity'),\r
-        page_title = _('profile - recent activity'),\r
-        view_func = user_recent,\r
-        template_file = 'user_recent.html',\r
-        data_size = 50\r
-    ),\r
-    UserView(\r
-        id = 'responses',\r
-        tab_title = _('responses'),\r
-        tab_description = _('comments and answers to others questions'),\r
-        page_title = _('profile - responses'),\r
-        view_func = user_responses,\r
-        template_file = 'user_responses.html',\r
-        data_size = 50\r
-    ),\r
-    UserView(\r
-        id = 'reputation',\r
-        tab_title = _('reputation'),\r
-        tab_description = _('user reputation in the community'),\r
-        page_title = _('profile - user reputation'),\r
-        view_func = user_reputation,\r
-        template_file = 'user_reputation.html'\r
-    ),\r
-    UserView(\r
-        id = 'favorites',\r
-        tab_title = _('favorite questions'),\r
-        tab_description = _('users favorite questions'),\r
-        page_title = _('profile - favorite questions'),\r
-        view_func = user_favorites,\r
-        template_file = 'user_favorites.html',\r
-        data_size = 50\r
-    ),\r
-    UserView(\r
-        id = 'votes',\r
-        tab_title = _('casted votes'),\r
-        tab_description = _('user vote record'),\r
-        page_title = _('profile - votes'),\r
-        view_func = user_votes,\r
-        template_file = 'user_votes.html',\r
-        data_size = 50\r
-    ),\r
-    UserView(\r
-        id = 'subscriptions',\r
-        tab_title = _('subscriptions'),\r
-        tab_description = _('subscription settings'),\r
-        page_title = _('profile - subscriptions'),\r
-        view_func = user_subscription_settings,\r
-        template_file = 'user_subscriptions.html'\r
-    )\r
-)\r
-\r
-def user(request, id, slug=None):\r
-    sort = request.GET.get('sort', 'stats')\r
-    user_view = dict((v.id, v) for v in USER_TEMPLATE_VIEWS).get(sort, USER_TEMPLATE_VIEWS[0])\r
-    from forum.views import users\r
-    func = user_view.view_func\r
-    return func(request, id, user_view)\r
+    return {'view_user':user, 'notificatons_on': notificatons_on, 'form':form}\r
 \r
 @login_required\r
 def account_settings(request):\r
 \r
 @login_required\r
 def account_settings(request):\r
-    """\r
-    index pages to changes some basic account settings :\r
-     - change password\r
-     - change email\r
-     - associate a new openid\r
-     - delete account\r
-\r
-    url : /\r
-\r
-    template : authopenid/settings.html\r
-    """\r
     logging.debug('')\r
     msg = request.GET.get('msg', '')\r
     is_openid = False\r
     logging.debug('')\r
     msg = request.GET.get('msg', '')\r
     is_openid = False\r