summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEvgeny Fadeev <evgeny.fadeev@gmail.com>2010-12-10 15:41:48 -0500
committerEvgeny Fadeev <evgeny.fadeev@gmail.com>2010-12-10 15:41:48 -0500
commite330bd44400d933347d28255172f9a6720b38520 (patch)
tree7f5cc44b27dfe14e04bfb9227a8172d5192859e3
parent73efdec429ffa9fbf4b19d75dd719c8dbcd94d60 (diff)
downloadaskbot-e330bd44400d933347d28255172f9a6720b38520.tar.gz
askbot-e330bd44400d933347d28255172f9a6720b38520.tar.bz2
askbot-e330bd44400d933347d28255172f9a6720b38520.zip
removed badges cron jobs
-rw-r--r--askbot/__init__.py2
-rw-r--r--askbot/cron/askbot_cron_job2
-rw-r--r--askbot/management/commands/multi_award_badges.py300
-rw-r--r--askbot/management/commands/once_award_badges.py364
4 files changed, 1 insertions, 667 deletions
diff --git a/askbot/__init__.py b/askbot/__init__.py
index 49e03c53..2ce4ba4c 100644
--- a/askbot/__init__.py
+++ b/askbot/__init__.py
@@ -19,4 +19,4 @@ def get_version():
"""returns version of the askbot app
this version is meaningful for pypi only
"""
- return '0.6.41'
+ return '0.6.42'
diff --git a/askbot/cron/askbot_cron_job b/askbot/cron/askbot_cron_job
index 71910f27..39d7d2d5 100644
--- a/askbot/cron/askbot_cron_job
+++ b/askbot/cron/askbot_cron_job
@@ -14,5 +14,3 @@ PROJECT_ROOT=$PYTHONPATH/$PROJECT_NAME
#these are actual commands that are to be run
python $PROJECT_ROOT/manage.py send_email_alerts
-python $PROJECT_ROOT/manage.py once_award_badges
-python $PROJECT_ROOT/manage.py multi_award_badges
diff --git a/askbot/management/commands/multi_award_badges.py b/askbot/management/commands/multi_award_badges.py
deleted file mode 100644
index 9cb870c9..00000000
--- a/askbot/management/commands/multi_award_badges.py
+++ /dev/null
@@ -1,300 +0,0 @@
-#encoding:utf-8
-"""
-#-------------------------------------------------------------------------------
-# Name: Award badges command
-# Purpose: This is a command file croning in background process regularly to
-# query database and award badges for user's special acitivities.
-#
-# Author: Mike, Sailing
-#
-# Created: 22/01/2009
-# Copyright: (c) Mike 2009
-# Licence: GPL V2
-#-------------------------------------------------------------------------------
-"""
-#!/usr/bin/env python
-
-import logging
-from django.db import connection, transaction
-from django.shortcuts import get_object_or_404
-from django.contrib.contenttypes.models import ContentType
-
-from askbot.models import Badge, User, Award, Question, Answer, Tag
-from askbot import const
-from askbot.management.commands.base_command import BaseCommand
-
-class Command(BaseCommand):
- @transaction.commit_manually
- def handle_noargs(self, **options):
- badge_calls = (
- self.delete_question_be_voted_up_3,
- self.delete_answer_be_voted_up_3,
- self.delete_question_be_vote_down_3,
- self.delete_answer_be_voted_down_3,
- self.answer_be_voted_up_10,
- self.question_be_voted_up_10,
- self.question_view_1000,
- self.answer_self_question_be_voted_up_3,
- self.answer_be_voted_up_100,
- self.question_be_voted_up_100,
- self.question_be_favorited_100,
- self.question_view_10000,
- self.answer_be_voted_up_25,
- self.question_be_voted_up_25,
- self.question_be_favorited_25,
- self.question_view_2500,
- self.answer_be_accepted_and_voted_up_40,
- self.question_be_answered_after_60_days_and_be_voted_up_5,
- self.created_tag_be_used_in_question_50
- )
- try:
- for badge_call in badge_calls:
- try:
- badge_call()
- transaction.commit()
- except Exception, e:
- logging.critical('badge award error ' + unicode(e) + 'in ' + badge_call.__name__)
- finally:
- connection.close()
-
- def delete_question_be_voted_up_3(self):
- """
- (1, '炼狱法师', 3, '炼狱法师', '删除自己有3个以上赞成票的帖子', 1, 0),
- """
- query = "SELECT act.id, act.user_id, act.object_id FROM activity act, question q WHERE act.object_id = q.id AND\
- act.activity_type = %s AND\
- q.vote_up_count >=3 AND \
- act.is_auditted = False" % (const.TYPE_ACTIVITY_DELETE_QUESTION)
- self.__process_activities_badge(query, 1, Question)
-
- def delete_answer_be_voted_up_3(self):
- """
- (1, '炼狱法师', 3, '炼狱法师', '删除自己有3个以上赞成票的帖子', 1, 0),
- """
- query = "SELECT act.id, act.user_id, act.object_id FROM activity act, answer an WHERE act.object_id = an.id AND\
- act.activity_type = %s AND\
- an.vote_up_count >=3 AND \
- act.is_auditted = False" % (const.TYPE_ACTIVITY_DELETE_ANSWER)
- self.__process_activities_badge(query, 1, Answer)
-
- def delete_question_be_vote_down_3(self):
- """
- (2, '压力白领', 3, '压力白领', '删除自己有3个以上反对票的帖子', 1, 0),
- """
- query = "SELECT act.id, act.user_id, act.object_id FROM activity act, question q WHERE act.object_id = q.id AND\
- act.activity_type = %s AND\
- q.vote_down_count >=3 AND \
- act.is_auditted = False" % (const.TYPE_ACTIVITY_DELETE_QUESTION)
- content_type = ContentType.objects.get_for_model(Question)
- self.__process_activities_badge(query, 2, Question)
-
- def delete_answer_be_voted_down_3(self):
- """
- (2, '压力白领', 3, '压力白领', '删除自己有3个以上反对票的帖子', 1, 0),
- """
- query = "SELECT act.id, act.user_id, act.object_id FROM activity act, answer an WHERE act.object_id = an.id AND\
- act.activity_type = %s AND\
- an.vote_down_count >=3 AND \
- act.is_auditted = False" % (const.TYPE_ACTIVITY_DELETE_ANSWER)
- self.__process_activities_badge(query, 2, Answer)
-
- def answer_be_voted_up_10(self):
- """
- (3, '优秀回答', 3, '优秀回答', '回答好评10次以上', 1, 0),
- """
- query = "SELECT act.id, act.user_id, act.object_id FROM \
- activity act, answer a WHERE act.object_id = a.id AND\
- act.activity_type = %s AND \
- a.vote_up_count >= 10 AND\
- act.is_auditted = False" % (const.TYPE_ACTIVITY_ANSWER)
- self.__process_activities_badge(query, 3, Answer)
-
- def question_be_voted_up_10(self):
- """
- (4, '优秀问题', 3, '优秀问题', '问题好评10次以上', 1, 0),
- """
- query = "SELECT act.id, act.user_id, act.object_id FROM \
- activity act, question q WHERE act.object_id = q.id AND\
- act.activity_type = %s AND \
- q.vote_up_count >= 10 AND\
- act.is_auditted = False" % (const.TYPE_ACTIVITY_ASK_QUESTION)
- self.__process_activities_badge(query, 4, Question)
-
- def question_view_1000(self):
- """
- (6, '流行问题', 3, '流行问题', '问题的浏览量超过1000人次', 1, 0),
- """
- query = "SELECT act.id, act.user_id, act.object_id FROM \
- activity act, question q WHERE act.activity_type = %s AND\
- act.object_id = q.id AND \
- q.view_count >= 1000 AND\
- act.object_id NOT IN \
- (SELECT object_id FROM award WHERE award.badge_id = %s)" \
- % (const.TYPE_ACTIVITY_ASK_QUESTION, 6)
- self.__process_activities_badge(query, 6, Question, False)
-
- def answer_self_question_be_voted_up_3(self):
- """
- (17, '自学成才', 3, '自学成才', '回答自己的问题并且有3个以上赞成票', 1, 0),
- """
- query = "SELECT act.id, act.user_id, act.object_id FROM \
- activity act, answer an WHERE act.activity_type = %s AND\
- act.object_id = an.id AND\
- an.vote_up_count >= 3 AND\
- act.user_id = (SELECT user_id FROM question q WHERE q.id = an.question_id) AND\
- act.object_id NOT IN \
- (SELECT object_id FROM award WHERE award.badge_id = %s)" \
- % (const.TYPE_ACTIVITY_ANSWER, 17)
- self.__process_activities_badge(query, 17, Question, False)
-
- def answer_be_voted_up_100(self):
- """
- (18, '最有价值回答', 1, '最有价值回答', '回答超过100次赞成票', 1, 0),
- """
- query = "SELECT an.id, an.author_id FROM answer an WHERE an.vote_up_count >= 100 AND an.id NOT IN \
- (SELECT object_id FROM award WHERE award.badge_id = %s)" % (18)
-
- self.__process_badge(query, 18, Answer)
-
- def question_be_voted_up_100(self):
- """
- (19, '最有价值问题', 1, '最有价值问题', '问题超过100次赞成票', 1, 0),
- """
- query = "SELECT q.id, q.author_id FROM question q WHERE q.vote_up_count >= 100 AND q.id NOT IN \
- (SELECT object_id FROM award WHERE award.badge_id = %s)" % (19)
-
- self.__process_badge(query, 19, Question)
-
- def question_be_favorited_100(self):
- """
- (20, '万人迷', 1, '万人迷', '问题被100人以上收藏', 1, 0),
- """
- query = "SELECT q.id, q.author_id FROM question q WHERE q.favourite_count >= 100 AND q.id NOT IN \
- (SELECT object_id FROM award WHERE award.badge_id = %s)" % (20)
-
- self.__process_badge(query, 20, Question)
-
- def question_view_10000(self):
- """
- (21, '著名问题', 1, '著名问题', '问题的浏览量超过10000人次', 1, 0),
- """
- query = "SELECT q.id, q.author_id FROM question q WHERE q.view_count >= 10000 AND q.id NOT IN \
- (SELECT object_id FROM award WHERE award.badge_id = %s)" % (21)
-
- self.__process_badge(query, 21, Question)
-
- def answer_be_voted_up_25(self):
- """
- (23, '极好回答', 2, '极好回答', '回答超过25次赞成票', 1, 0),
- """
- query = "SELECT a.id, a.author_id FROM answer a WHERE a.vote_up_count >= 25 AND a.id NOT IN \
- (SELECT object_id FROM award WHERE award.badge_id = %s)" % (23)
-
- self.__process_badge(query, 23, Answer)
-
- def question_be_voted_up_25(self):
- """
- (24, '极好问题', 2, '极好问题', '问题超过25次赞成票', 1, 0),
- """
- query = "SELECT q.id, q.author_id FROM question q WHERE q.vote_up_count >= 25 AND q.id NOT IN \
- (SELECT object_id FROM award WHERE award.badge_id = %s)" % (24)
-
- self.__process_badge(query, 24, Question)
-
- def question_be_favorited_25(self):
- """
- (25, '受欢迎问题', 2, '受欢迎问题', '问题被25人以上收藏', 1, 0),
- """
- query = "SELECT q.id, q.author_id FROM question q WHERE q.favourite_count >= 25 AND q.id NOT IN \
- (SELECT object_id FROM award WHERE award.badge_id = %s)" % (25)
-
- self.__process_badge(query, 25, Question)
-
- def question_view_2500(self):
- """
- (31, '最受关注问题', 2, '最受关注问题', '问题的浏览量超过2500人次', 1, 0),
- """
- query = "SELECT q.id, q.author_id FROM question q WHERE q.view_count >= 2500 AND q.id NOT IN \
- (SELECT object_id FROM award WHERE award.badge_id = %s)" % (31)
-
- self.__process_badge(query, 31, Question)
-
- def answer_be_accepted_and_voted_up_40(self):
- """
- (34, '导师', 2, '导师', '被指定为最佳答案并且赞成票40以上', 1, 0),
- """
- query = "SELECT a.id, a.author_id FROM answer a WHERE a.vote_up_count >= 40 AND\
- a.accepted = True AND\
- a.id NOT IN \
- (SELECT object_id FROM award WHERE award.badge_id = %s)" % (34)
-
- self.__process_badge(query, 34, Answer)
-
- def question_be_answered_after_60_days_and_be_voted_up_5(self):
- """
- (35, '巫师', 2, '巫师', '在提问60天之后回答并且赞成票5次以上', 1, 0),
- """
- query = "SELECT a.id, a.author_id FROM question q, answer a WHERE q.id = a.question_id AND\
- DATEDIFF(a.added_at, q.added_at) >= 60 AND\
- a.vote_up_count >= 5 AND \
- a.id NOT IN \
- (SELECT object_id FROM award WHERE award.badge_id = %s)" % (35)
-
- self.__process_badge(query, 35, Answer)
-
- def created_tag_be_used_in_question_50(self):
- """
- (36, '分类专家', 2, '分类专家', '创建的标签被50个以上问题使用', 1, 0);
- """
- query = "SELECT t.id, t.created_by_id FROM tag t, auth_user u WHERE t.created_by_id = u.id AND \
- t. used_count >= 50 AND \
- t.id NOT IN \
- (SELECT object_id FROM award WHERE award.badge_id = %s)" % (36)
-
- self.__process_badge(query, 36, Tag)
-
- def __process_activities_badge(self, query, badge, content_object, update_auditted=True):
- content_type = ContentType.objects.get_for_model(content_object)
-
- cursor = connection.cursor()
- try:
- cursor.execute(query)
- rows = cursor.fetchall()
-
- if update_auditted:
- activity_ids = []
- badge = get_object_or_404(Badge, id=badge)
- for row in rows:
- activity_id = row[0]
- user_id = row[1]
- object_id = row[2]
-
- user = get_object_or_404(User, id=user_id)
- award = Award(user=user, badge=badge, content_type=content_type, object_id=object_id)
- award.save()
-
- if update_auditted:
- activity_ids.append(activity_id)
-
- if update_auditted:
- self.update_activities_auditted(cursor, activity_ids)
- finally:
- cursor.close()
-
- def __process_badge(self, query, badge, content_object):
- content_type = ContentType.objects.get_for_model(Answer)
- cursor = connection.cursor()
- try:
- cursor.execute(query)
- rows = cursor.fetchall()
-
- badge = get_object_or_404(Badge, id=badge)
- for row in rows:
- object_id = row[0]
- user_id = row[1]
-
- user = get_object_or_404(User, id=user_id)
- award = Award(user=user, badge=badge, content_type=content_type, object_id=object_id)
- award.save()
- finally:
- cursor.close()
diff --git a/askbot/management/commands/once_award_badges.py b/askbot/management/commands/once_award_badges.py
deleted file mode 100644
index 42be67f5..00000000
--- a/askbot/management/commands/once_award_badges.py
+++ /dev/null
@@ -1,364 +0,0 @@
-#!/usr/bin/env python
-#encoding:utf-8
-#-------------------------------------------------------------------------------
-# Name: Award badges command
-# Purpose: This is a command file croning in background process regularly to
-# query database and award badges for user's special acitivities.
-#
-# Author: Mike, Sailing
-#
-# Created: 18/01/2009
-# Copyright: (c) Mike 2009
-# Licence: GPL V2
-#-------------------------------------------------------------------------------
-
-import logging
-from datetime import datetime, date
-from django.db import connection, transaction
-from django.shortcuts import get_object_or_404
-from django.contrib.contenttypes.models import ContentType
-
-from askbot.models import User, Activity, Badge, Award, Question, Answer
-from askbot import const
-from base_command import BaseCommand
-"""
-(1, '炼狱法师', 3, '炼狱法师', '删除自己有3个以上赞成票的帖子', 1, 0),
-(2, '压力白领', 3, '压力白领', '删除自己有3个以上反对票的帖子', 1, 0),
-(3, '优秀回答', 3, '优秀回答', '回答好评10次以上', 1, 0),
-(4, '优秀问题', 3, '优秀问题', '问题好评10次以上', 1, 0),
-(5, '评论家', 3, '评论家', '评论10次以上', 0, 0),
-(6, '流行问题', 3, '流行问题', '问题的浏览量超过1000人次', 1, 0),
-(7, '巡逻兵', 3, '巡逻兵', '第一次标记垃圾帖子', 0, 0),
-(8, '清洁工', 3, '清洁工', '第一次撤销投票', 0, 0),
-(9, '批评家', 3, '批评家', '第一次反对票', 0, 0),
-(10, '小编', 3, '小编', '第一次编辑更新', 0, 0),
-(11, '村长', 3, '村长', '第一次重新标签', 0, 0),
-(12, '学者', 3, '学者', '第一次标记答案', 0, 0),
-(13, '学生', 3, '学生', '第一次提问并且有一次以上赞成票', 0, 0),
-(14, '支持者', 3, '支持者', '第一次赞成票', 0, 0),
-(15, '教师', 3, '教师', '第一次回答问题并且得到一个以上赞成票', 0, 0),
-(16, '自传作者', 3, '自传作者', '完整填写用户资料所有选项', 0, 0),
-(17, '自学成才', 3, '自学成才', '回答自己的问题并且有3个以上赞成票', 1, 0),
-(18, '最有价值回答', 1, '最有价值回答', '回答超过100次赞成票', 1, 0),
-(19, '最有价值问题', 1, '最有价值问题', '问题超过100次赞成票', 1, 0),
-(20, '万人迷', 1, '万人迷', '问题被100人以上收藏', 1, 0),
-(21, '著名问题', 1, '著名问题', '问题的浏览量超过10000人次', 1, 0),
-(22, 'alpha用户', 2, 'alpha用户', '内测期间的活跃用户', 0, 0),
-(23, '极好回答', 2, '极好回答', '回答超过25次赞成票', 1, 0),
-(24, '极好问题', 2, '极好问题', '问题超过25次赞成票', 1, 0),
-(25, '受欢迎问题', 2, '受欢迎问题', '问题被25人以上收藏', 1, 0),
-(26, '优秀市民', 2, '优秀市民', '投票300次以上', 0, 0),
-(27, '编辑主任', 2, '编辑主任', '编辑了100个帖子', 0, 0),
-(28, '通才', 2, '通才', '在多个标签领域活跃', 0, 0),
-(29, '专家', 2, '专家', '在一个标签领域活跃出众', 0, 0),
-(30, '老鸟', 2, '老鸟', '活跃超过一年的用户', 0, 0),
-(31, '最受关注问题', 2, '最受关注问题', '问题的浏览量超过2500人次', 1, 0),
-(32, '学问家', 2, '学问家', '第一次回答被投赞成票10次以上', 0, 0),
-(33, 'beta用户', 2, 'beta用户', 'beta期间活跃参与', 0, 0),
-(34, '导师', 2, '导师', '被指定为最佳答案并且赞成票40以上', 1, 0),
-(35, '巫师', 2, '巫师', '在提问60天之后回答并且赞成票5次以上', 1, 0),
-(36, '分类专家', 2, '分类专家', '创建的标签被50个以上问题使用', 1, 0);
-
-
-TYPE_ACTIVITY_ASK_QUESTION=1
-TYPE_ACTIVITY_ANSWER=2
-TYPE_ACTIVITY_COMMENT_QUESTION=3
-TYPE_ACTIVITY_COMMENT_ANSWER=4
-TYPE_ACTIVITY_UPDATE_QUESTION=5
-TYPE_ACTIVITY_UPDATE_ANSWER=6
-TYPE_ACTIVITY_PRIZE=7
-TYPE_ACTIVITY_MARK_ANSWER=8
-TYPE_ACTIVITY_VOTE_UP=9
-TYPE_ACTIVITY_VOTE_DOWN=10
-TYPE_ACTIVITY_CANCEL_VOTE=11
-TYPE_ACTIVITY_DELETE_QUESTION=12
-TYPE_ACTIVITY_DELETE_ANSWER=13
-TYPE_ACTIVITY_MARK_OFFENSIVE=14
-TYPE_ACTIVITY_UPDATE_TAGS=15
-TYPE_ACTIVITY_FAVORITE=16
-TYPE_ACTIVITY_USER_FULL_UPDATED = 17
-"""
-
-BADGE_AWARD_TYPE_FIRST = {
- const.TYPE_ACTIVITY_MARK_OFFENSIVE : 7,
- const.TYPE_ACTIVITY_CANCEL_VOTE: 8,
- const.TYPE_ACTIVITY_VOTE_DOWN : 9,
- const.TYPE_ACTIVITY_UPDATE_QUESTION : 10,
- const.TYPE_ACTIVITY_UPDATE_ANSWER : 10,
- const.TYPE_ACTIVITY_UPDATE_TAGS : 11,
- const.TYPE_ACTIVITY_MARK_ANSWER : 12,
- const.TYPE_ACTIVITY_VOTE_UP : 14,
- const.TYPE_ACTIVITY_USER_FULL_UPDATED: 16
-
-}
-
-class Command(BaseCommand):
- @transaction.commit_manually
- def handle_noargs(self, **options):
- badge_calls = (
- self.alpha_user,
- self.beta_user,
- self.first_type_award,
- self.first_ask_be_voted,
- self.first_answer_be_voted,
- self.first_answer_be_voted_10,
- self.vote_count_300,
- self.edit_count_100,
- self.comment_count_10
- )
- try:
- for badge_call in badge_calls:
- try:
- badge_call()
- transaction.commit()
- except Exception, e:
- logging.critical('badge award error ' + unicode(e) + 'in ' + badge_call.__name__)
- finally:
- connection.close()
-
- def alpha_user(self):
- """
- Before Jan 25, 2009(Chinese New Year Eve and enter into Beta for CNProg), every registered user
- will be awarded the "Alpha" badge if he has any activities.
- """
- alpha_end_date = date(2009, 1, 25)
- if date.today() < alpha_end_date:
- badge = get_object_or_404(Badge, id=22)
- for user in User.objects.all():
- award = Award.objects.filter(user=user, badge=badge)
- if award and not badge.multiple:
- continue
- activities = Activity.objects.filter(user=user)
- if len(activities) > 0:
- new_award = Award(user=user, badge=badge)
- new_award.save()
-
- def beta_user(self):
- """
- Before Feb 25, 2009, every registered user
- will be awarded the "Beta" badge if he has any activities.
- """
- beta_end_date = date(2009, 2, 25)
- if date.today() < beta_end_date:
- badge = get_object_or_404(Badge, id=33)
- for user in User.objects.all():
- award = Award.objects.filter(user=user, badge=badge)
- if award and not badge.multiple:
- continue
- activities = Activity.objects.filter(user=user)
- if len(activities) > 0:
- new_award = Award(user=user, badge=badge)
- new_award.save()
-
- def first_type_award(self):
-
- activity_types = ','.join('%s' % item for item in BADGE_AWARD_TYPE_FIRST.keys())
- # ORDER BY user_id, activity_type
- query = "SELECT id, user_id, activity_type, content_type_id, object_id FROM activity WHERE is_auditted = False AND activity_type IN (%s) ORDER BY user_id, activity_type" % activity_types
- cursor = connection.cursor()
- try:
- cursor.execute(query)
- rows = cursor.fetchall()
- # collect activity_id in current process
- activity_ids = []
- last_user_id = 0
- last_activity_type = 0
- for row in rows:
- activity_ids.append(row[0])
- user_id = row[1]
- activity_type = row[2]
- content_type_id = row[3]
- object_id = row[4]
-
- # if the user and activity are same as the last, continue
- if user_id == last_user_id and activity_type == last_activity_type:
- continue;
-
- user = get_object_or_404(User, id=user_id)
- badge = get_object_or_404(Badge, id=BADGE_AWARD_TYPE_FIRST[activity_type])
- content_type = get_object_or_404(ContentType, id=content_type_id)
-
- count = Award.objects.filter(user=user, badge=badge).count()
- if count and not badge.multiple:
- continue
- else:
- # new award
- award = Award(user=user, badge=badge, content_type=content_type, object_id=object_id)
- award.save()
-
- # set the current user_id and activity_type to last
- last_user_id = user_id
- last_activity_type = activity_type
-
- # update processed rows to auditted
- self.update_activities_auditted(cursor, activity_ids)
- finally:
- cursor.close()
-
- def first_ask_be_voted(self):
- """
- For user asked question and got first upvote, we award him following badge:
- """
- query = ('SELECT act.user_id, q.vote_up_count, act.object_id FROM ' \
- + 'activity act, question q WHERE act.activity_type = %s AND ' \
- + 'act.object_id = q.id AND ' \
- + 'act.user_id NOT IN ' \
- + '(SELECT distinct user_id FROM award WHERE badge_id = %s)') \
- % (const.TYPE_ACTIVITY_ASK_QUESTION, 13)
- cursor = connection.cursor()
- try:
- cursor.execute(query)
- rows = cursor.fetchall()
-
- badge = get_object_or_404(Badge, id=13)
- content_type = ContentType.objects.get_for_model(Question)
- awarded_users = []
- for row in rows:
- user_id = row[0]
- vote_up_count = row[1]
- object_id = row[2]
- if vote_up_count > 0 and user_id not in awarded_users:
- user = get_object_or_404(User, id=user_id)
- award = Award(user=user, badge=badge, content_type=content_type, object_id=object_id)
- award.save()
- awarded_users.append(user_id)
- finally:
- cursor.close()
-
- def first_answer_be_voted(self):
- """
- When user answerd questions and got first upvote, we award him following badge:
-
- (15, '教师', 3, '教师', '第一次回答问题并且得到一个以上赞成票', 0, 0),
- """
- query = ("SELECT act.user_id, a.vote_up_count, act.object_id FROM "\
- + "activity act, answer a WHERE act.activity_type = %s AND "\
- + "act.object_id = a.id AND "\
- + "act.user_id NOT IN "\
- + "(SELECT distinct user_id FROM award WHERE badge_id = %s)") \
- % (const.TYPE_ACTIVITY_ANSWER, 15)
- cursor = connection.cursor()
- try:
- cursor.execute(query)
- rows = cursor.fetchall()
-
- awarded_users = []
- badge = get_object_or_404(Badge, id=15)
- content_type = ContentType.objects.get_for_model(Answer)
- for row in rows:
- user_id = row[0]
- vote_up_count = row[1]
- object_id = row[2]
- if vote_up_count > 0 and user_id not in awarded_users:
- user = get_object_or_404(User, id=user_id)
- award = Award(user=user, badge=badge, content_type=content_type, object_id=object_id)
- award.save()
- awarded_users.append(user_id)
- finally:
- cursor.close()
-
- def first_answer_be_voted_10(self):
- """
- (32, '学问家', 2, '学问家', '第一次回答被投赞成票10次以上', 0, 0)
- """
- query = ("SELECT act.user_id, act.object_id FROM " \
- + "activity act, answer a WHERE act.object_id = a.id AND "\
- + "act.activity_type = %s AND "\
- + "a.vote_up_count >= 10 AND "\
- + "act.user_id NOT IN "\
- + "(SELECT user_id FROM award WHERE badge_id = %s)") \
- % (const.TYPE_ACTIVITY_ANSWER, 32)
- cursor = connection.cursor()
- try:
- cursor.execute(query)
- rows = cursor.fetchall()
-
- awarded_users = []
- badge = get_object_or_404(Badge, id=32)
- content_type = ContentType.objects.get_for_model(Answer)
- for row in rows:
- user_id = row[0]
- if user_id not in awarded_users:
- user = get_object_or_404(User, id=user_id)
- object_id = row[1]
- award = Award(user=user, badge=badge, content_type=content_type, object_id=object_id)
- award.save()
- awarded_users.append(user_id)
- finally:
- cursor.close()
-
- def vote_count_300(self):
- """
- (26, '优秀市民', 2, '优秀市民', '投票300次以上', 0, 0)
- """
- query = ("SELECT count(*) vote_count, user_id FROM activity WHERE " \
- + "activity_type = %s OR " \
- + "activity_type = %s AND " \
- + "user_id NOT IN (SELECT user_id FROM award WHERE badge_id = %s) " \
- + "GROUP BY user_id HAVING vote_count >= 300") \
- % (
- const.TYPE_ACTIVITY_VOTE_UP,
- const.TYPE_ACTIVITY_VOTE_DOWN,
- 2
- )
-
- self.__award_for_count_num(query, 26)
-
- def edit_count_100(self):
- """
- (27, '编辑主任', 2, '编辑主任', '编辑了100个帖子', 0, 0)
- """
- query = ("SELECT count(*) vote_count, user_id FROM activity WHERE " \
- + "activity_type = %s OR " \
- + "activity_type = %s AND " \
- + "user_id NOT IN (SELECT user_id FROM award WHERE badge_id = %s) " \
- + "GROUP BY user_id HAVING vote_count >= 100" )\
- % (
- const.TYPE_ACTIVITY_UPDATE_QUESTION,
- const.TYPE_ACTIVITY_UPDATE_ANSWER,
- 27
- )
-
- self.__award_for_count_num(query, 27)
-
- def comment_count_10(self):
- """
- (5, '评论家', 3, '评论家', '评论10次以上', 0, 0),
- """
- query = ("SELECT count(*) vote_count, user_id FROM activity WHERE " \
- + "activity_type = %s OR " \
- + "activity_type = %s AND " \
- + "user_id NOT IN (SELECT user_id FROM award WHERE badge_id = %s) " \
- + "GROUP BY user_id HAVING vote_count >= 10" )\
- % (
- const.TYPE_ACTIVITY_COMMENT_QUESTION,
- const.TYPE_ACTIVITY_COMMENT_ANSWER,
- 5
- )
- self.__award_for_count_num(query, 5)
-
- def __award_for_count_num(self, query, badge):
- cursor = connection.cursor()
- try:
- cursor.execute(query)
- rows = cursor.fetchall()
-
- awarded_users = []
- badge = get_object_or_404(Badge, id=badge)
- for row in rows:
- vote_count = row[0]
- user_id = row[1]
-
- if user_id not in awarded_users:
- user = get_object_or_404(User, id=user_id)
- award = Award(user=user, badge=badge)#todo: will this work with content_object null?
- award.save()
- awarded_users.append(user_id)
- finally:
- cursor.close()
-
-def main():
- pass
-
-if __name__ == '__main__':
- main()