diff options
author | Evgeny Fadeev <evgeny.fadeev@gmail.com> | 2010-06-05 17:35:56 -0400 |
---|---|---|
committer | Evgeny Fadeev <evgeny.fadeev@gmail.com> | 2010-06-05 17:35:56 -0400 |
commit | 056b2a1ffbdbe04dc42cd2719923398e0bf222ce (patch) | |
tree | c141b896ba5b2d79aab6658cde3608c1b2f69bbc /forum/views/users.py | |
parent | e5ea67fd5ec4d15a217689faa216a01814f55748 (diff) | |
download | askbot-056b2a1ffbdbe04dc42cd2719923398e0bf222ce.tar.gz askbot-056b2a1ffbdbe04dc42cd2719923398e0bf222ce.tar.bz2 askbot-056b2a1ffbdbe04dc42cd2719923398e0bf222ce.zip |
mentions work in all kinds of posts, unified activity logging for post updates
Diffstat (limited to 'forum/views/users.py')
-rw-r--r-- | forum/views/users.py | 203 |
1 files changed, 125 insertions, 78 deletions
diff --git a/forum/views/users.py b/forum/views/users.py index cb530af1..0d2c8c3f 100644 --- a/forum/views/users.py +++ b/forum/views/users.py @@ -5,7 +5,8 @@ from django.contrib.contenttypes.models import ContentType from django.core.urlresolvers import reverse from django.shortcuts import render_to_response, get_object_or_404 from django.template import RequestContext -from django.http import HttpResponse, HttpResponseForbidden, HttpResponseRedirect, Http404 +from django.http import HttpResponse, HttpResponseForbidden +from django.http import HttpResponseRedirect, Http404 from django.utils.translation import ugettext as _ from django.utils.html import strip_tags from django.utils import simplejson @@ -22,8 +23,13 @@ import logging question_type = ContentType.objects.get_for_model(models.Question) answer_type = ContentType.objects.get_for_model(models.Answer) comment_type = ContentType.objects.get_for_model(models.Comment) -question_revision_type = ContentType.objects.get_for_model(models.QuestionRevision) -answer_revision_type = ContentType.objects.get_for_model(models.AnswerRevision) +question_revision_type = ContentType.objects.get_for_model( + models.QuestionRevision + ) + +answer_revision_type = ContentType.objects.get_for_model( + models.AnswerRevision + ) repute_type = ContentType.objects.get_for_model(models.Repute) question_type_id = question_type.id answer_type_id = answer_type.id @@ -53,7 +59,9 @@ def users(request): order_by_parameter = '-reputation' objects_list = Paginator( - models.User.objects.all().order_by(order_by_parameter), + models.User.objects.all().order_by( + order_by_parameter + ), const.USERS_PAGE_SIZE ) base_url = reverse('users') + '?sort=%s&' % sortby @@ -61,9 +69,11 @@ def users(request): sortby = "reputation" objects_list = Paginator( models.User.objects.extra( - where=['username like %s'], - params=['%' + suser + '%'] - ).order_by('-reputation'), + where=['username like %s'], + params=['%' + suser + '%'] + ).order_by( + '-reputation' + ), const.USERS_PAGE_SIZE ) base_url = reverse('users') + '?name=%s&sort=%s&' % (suser, sortby) @@ -73,24 +83,27 @@ def users(request): except (EmptyPage, InvalidPage): users_page = objects_list.page(objects_list.num_pages) - return render_to_response('users.html', { - 'active_tab': 'users', - 'users' : users_page, - 'suser' : suser, - 'keywords' : suser, - 'tab_id' : sortby, - 'context' : { - 'is_paginated' : is_paginated, - 'pages': objects_list.num_pages, - 'page': page, - 'has_previous': users_page.has_previous(), - 'has_next': users_page.has_next(), - 'previous': users_page.previous_page_number(), - 'next': users_page.next_page_number(), - 'base_url' : base_url - } - - }, context_instance=RequestContext(request)) + return render_to_response( + 'users.html', + { + 'active_tab': 'users', + 'users' : users_page, + 'suser' : suser, + 'keywords' : suser, + 'tab_id' : sortby, + 'context' : { + 'is_paginated' : is_paginated, + 'pages': objects_list.num_pages, + 'page': page, + 'has_previous': users_page.has_previous(), + 'has_next': users_page.has_next(), + 'previous': users_page.previous_page_number(), + 'next': users_page.next_page_number(), + 'base_url' : base_url + } + }, + context_instance=RequestContext(request) + ) @login_required def moderate_user(request, id): @@ -107,7 +120,10 @@ def moderate_user(request, id): if form.is_valid(): form.save() logging.debug('data saved') - response = HttpResponse(simplejson.dumps(''), mimetype="application/json") + response = HttpResponse( + simplejson.dumps(''), + mimetype="application/json" + ) else: response = HttpResponseForbidden(mimetype="application/json") return response @@ -140,23 +156,33 @@ def edit_user(request, id): user.website = sanitize_html(form.cleaned_data['website']) user.location = sanitize_html(form.cleaned_data['city']) user.date_of_birth = sanitize_html(form.cleaned_data['birthday']) + if len(user.date_of_birth) == 0: user.date_of_birth = '1900-01-01' + user.about = sanitize_html(form.cleaned_data['about']) user.save() # send user updated singal if full fields have been updated - if user.email and user.real_name and user.website and user.location and \ - user.date_of_birth and user.about: - signals.user_updated.send(sender=user.__class__, instance=user, updated_by=user) + if user.email and user.real_name and user.website \ + and user.location and user.date_of_birth and user.about: + signals.user_updated.send( + sender=user.__class__, + instance=user, + updated_by=user + ) return HttpResponseRedirect(user.get_profile_url()) else: form = forms.EditUserForm(user) - return render_to_response('user_edit.html', { - 'active_tab': 'users', - 'form' : form, - 'gravatar_faq_url' : reverse('faq') + '#gravatar', - }, context_instance=RequestContext(request)) + return render_to_response( + 'user_edit.html', + { + 'active_tab': 'users', + 'form' : form, + 'gravatar_faq_url' : reverse('faq') + '#gravatar', + }, + context_instance=RequestContext(request) + ) def user_stats(request, user_id, user_view): user = get_object_or_404(models.User, id=user_id) @@ -230,24 +256,26 @@ def user_stats(request, user_id, user_view): votes_today = models.Vote.objects.get_votes_count_today_from_user(user) votes_total = forum_settings.MAX_VOTES_PER_USER_PER_DAY - question_id_set = set(map(lambda v: v['id'], list(questions))) \ - | set(map(lambda v: v['id'], list(answered_questions))) - + question_id_set = set() + #todo: there may be a better way to do these queries + question_id_set.update([q['id'] for q in questions]) + question_id_set.update([q['id'] for q in answered_questions]) user_tags = models.Tag.objects.filter(questions__id__in = question_id_set) try: from django.db.models import Count #todo - rewrite template to do the table joins within standard ORM #awards = models.Award.objects.filter(user=user).order_by('-awarded_at') awards = models.Award.objects.extra( - select={'id': 'badge.id', - 'name':'badge.name', - 'description': 'badge.description', - 'type': 'badge.type'}, - tables=['award', 'badge'], - order_by=['-awarded_at'], - where=['user_id=%s AND badge_id=badge.id'], - params=[user.id] - ).values('id', 'name', 'description', 'type') + select={'id': 'badge.id', + 'name':'badge.name', + 'description': 'badge.description', + 'type': 'badge.type'}, + tables=['award', 'badge'], + order_by=['-awarded_at'], + where=['user_id=%s AND badge_id=badge.id'], + params=[user.id] + ).values('id', 'name', 'description', 'type') + total_awards = awards.count() awards = awards.annotate(count = Count('badge__id')) user_tags = user_tags.annotate(user_tag_usage_count=Count('name')) @@ -255,16 +283,17 @@ def user_stats(request, user_id, user_view): except ImportError: #todo: remove all old django stuff, e.g. with '.group_by = ' pattern awards = models.Award.objects.extra( - select={'id': 'badge.id', - 'count': 'count(badge_id)', - 'name':'badge.name', - 'description': 'badge.description', - 'type': 'badge.type'}, - tables=['award', 'badge'], - order_by=['-awarded_at'], - where=['user_id=%s AND badge_id=badge.id'], - params=[user.id] - ).values('id', 'count', 'name', 'description', 'type') + select={'id': 'badge.id', + 'count': 'count(badge_id)', + 'name':'badge.name', + 'description': 'badge.description', + 'type': 'badge.type'}, + tables=['award', 'badge'], + order_by=['-awarded_at'], + where=['user_id=%s AND badge_id=badge.id'], + params=[user.id] + ).values('id', 'count', 'name', 'description', 'type') + total_awards = awards.count() awards.query.group_by = ['badge_id'] @@ -279,24 +308,28 @@ def user_stats(request, user_id, user_view): else: moderate_user_form = None - return render_to_response(user_view.template_file,{ - 'active_tab':'users', - 'moderate_user_form': moderate_user_form, - "tab_name" : user_view.id, - "tab_description" : user_view.tab_description, - "page_title" : user_view.page_title, - "view_user" : user, - "questions" : questions, - "answered_questions" : answered_questions, - "up_votes" : up_votes, - "down_votes" : down_votes, - "total_votes": up_votes + down_votes, - "votes_today_left": votes_total-votes_today, - "votes_total_per_day": votes_total, - "user_tags" : user_tags[:50], - "awards": awards, - "total_awards" : total_awards, - }, context_instance=RequestContext(request)) + return render_to_response( + user_view.template_file, + { + 'active_tab':'users', + 'moderate_user_form': moderate_user_form, + "tab_name" : user_view.id, + "tab_description" : user_view.tab_description, + "page_title" : user_view.page_title, + "view_user" : user, + "questions" : questions, + "answered_questions" : answered_questions, + "up_votes" : up_votes, + "down_votes" : down_votes, + "total_votes": up_votes + down_votes, + "votes_today_left": votes_total-votes_today, + "votes_total_per_day": votes_total, + "user_tags" : user_tags[:50], + "awards": awards, + "total_awards" : total_awards, + }, + context_instance=RequestContext(request) + ) def user_recent(request, user_id, user_view): user = get_object_or_404(models.User, id=user_id) @@ -313,7 +346,10 @@ def user_recent(request, user_id, user_view): self.title = title self.summary = summary slug_title = slugify(title) - self.title_link = reverse('question', kwargs={'id':question_id}) + u'%s' % slug_title + self.title_link = reverse( + 'question', + kwargs={'id':question_id} + ) + u'%s' % slug_title if int(answer_id) > 0: self.title_link += '#%s' % answer_id @@ -345,9 +381,20 @@ def user_recent(request, user_id, user_view): 'activity_type' ) if len(questions) > 0: - questions = [(Event(q['active_at'], q['activity_type'], q['title'], '', '0', \ - q['question_id'])) for q in questions] - activities.extend(questions) + + question_activities = [] + for q in questions: + q_event = Event( + q['active_at'], + q['activity_type'], + q['title'], + '', + '0', + q['question_id'] + ) + question_activities.append(q_event) + + activities.extend(question_activities) # answers answers = models.Activity.objects.extra( |