]> git.openstreetmap.org Git - osqa.git/blobdiff - forum/views/users.py
fixes osqa-54: The user was not being informed that they were trying to submit a...
[osqa.git] / forum / views / users.py
index 162ba2d214f8c484e3f5faca54de980dc7812e81..543d5c79b47589330b7474113729372e1ac53aed 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 forum.authentication import user_updated\r
+from datetime import date\r
+import decorators\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
@@ -126,599 +116,95 @@ def edit_user(request, id):
             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
             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
+            if user.date_of_birth == "None":\r
                 user.date_of_birth = '1900-01-01'\r
             user.about = sanitize_html(form.cleaned_data['about'])\r
 \r
             user.save()\r
                 user.date_of_birth = '1900-01-01'\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
+            # send user updated signal 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
             return HttpResponseRedirect(user.get_profile_url())\r
     else:\r
         form = EditUserForm(user)\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
             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
                                                 '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
+\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:\r
+                return HttpResponseForbidden()\r
+            context = fn(request, user)\r
+            context.update({\r
+                "tab_name" : tab_name,\r
+                "tab_description" : tab_description,\r
+                "page_title" : page_title,\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 profile overview'))\r
+def user_stats(request, user):\r
+    questions = Question.objects.filter(author=user, deleted=False).order_by('-added_at')\r
+    answers = Answer.objects.filter(author=user, deleted=False).order_by('-added_at')\r
 \r
     up_votes = user.get_up_vote_count()\r
     down_votes = user.get_down_vote_count()\r
     votes_today = user.get_vote_count_today()\r
     votes_total = int(settings.MAX_VOTES_PER_DAY)\r
 \r
 \r
     up_votes = user.get_up_vote_count()\r
     down_votes = user.get_down_vote_count()\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
+    awards = Badge.objects.filter(award_badge__user=user).annotate(count=Count('name')).order_by('-count')\r
 \r
     if request.user.is_superuser:\r
         moderate_user_form = ModerateUserForm(instance=user)\r
     else:\r
         moderate_user_form = None\r
 \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
+    return {'moderate_user_form': moderate_user_form,\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" : awards.count(),\r
+        }\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
+@user_view('users/recent.html', 'recent', _('recent user activity'), _('profile - recent activity'))\r
+def user_recent(request, user):\r
+    activities = Activity.objects.filter(activity_type__in=(TYPE_ACTIVITY_PRIZE,\r
+            TYPE_ACTIVITY_ASK_QUESTION, TYPE_ACTIVITY_ANSWER,\r
+            TYPE_ACTIVITY_COMMENT_QUESTION, TYPE_ACTIVITY_COMMENT_ANSWER,\r
+            TYPE_ACTIVITY_MARK_ANSWER), user=user).order_by('-active_at')[:USERS_PAGE_SIZE]\r
 \r
 \r
+    return {"view_user" : user, "activities" : activities}\r
+\r
+\r
+@user_view('users/votes.html', 'votes', _('user vote record'), _('profile - votes'), True)\r
+def user_votes(request, user):\r
+    votes = user.votes.exclude(node__deleted=True).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'), _('profile - user reputation'))\r
+def user_reputation(request, user):\r
     reputation = user.reputes.order_by('-reputed_at')\r
 \r
     graph_data = simplejson.dumps([\r
     reputation = user.reputes.order_by('-reputed_at')\r
 \r
     graph_data = simplejson.dumps([\r
@@ -726,68 +212,16 @@ def user_reputation(request, user_id, user_view):
             for rep in reputation\r
     ])\r
 \r
             for rep in reputation\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
+    return {"view_user": user, "reputation": reputation, "graph_data": graph_data}\r
+\r
+@user_view('users/questions.html', 'favorites', _('favorite questions'),  _('profile - favorite questions'), True)\r
+def user_favorites(request, user):\r
+    questions = user.favorite_questions.filter(deleted=False)\r
 \r
 \r
+    return {"questions" : questions, "view_user" : user}\r
+\r
+@user_view('users/subscriptions.html', 'subscriptions', _('subscription settings'), _('profile - 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
@@ -811,108 +245,10 @@ def user_subscription_settings(request, user_id, user_view):
 \r
     notificatons_on = user.subscription_settings.enable_notifications\r
 \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