class AyahsContributedBadge(Badge): """Number of Ayahs a user has contributed.""" slug = "ayahs_contributed" levels = [ BadgeDetail(name='10 Ayahs', description="Contributed 10 Ayahs."), BadgeDetail(name='50 Ayahs', description="Contributed 50 Ayahs."), BadgeDetail(name='100 Ayahs', description="Contributed 100 Ayahs."), BadgeDetail(name='500+ Ayahs', description="Contributed 500 Ayahs."), ] events = [ "points_awarded", ] multiple = False def award(self, **state): user = state["user"] points = user.get_profile().ayah_points if points > 10: return BadgeAwarded(level=1) elif points > 50: return BadgeAwarded(level=2) elif points > 100: return BadgeAwarded(level=3) elif points > 500: return BadgeAwarded(level=4)
class DaysBadge(Badge): """Number of consecutive days a user has logged in.""" slug = "days" levels = [ BadgeDetail(name='3 Days', description="Active for 3 days in a row."), BadgeDetail(name='1 Week', description="Active for 7 days in a row."), BadgeDetail(name='1 Month', description="Active for 30 days in a row."), BadgeDetail(name='6 Month', description="Active for 6 months in a row."), BadgeDetail(name='1 Year', description="Active for 365 days in a row."), ] events = [ "login", ] multiple = False def award(self, **state): user = state["user"] points = user.get_profile().login_points if points > 3: return BadgeAwarded(level=1) elif points > 7: return BadgeAwarded(level=2) elif points > 30: return BadgeAwarded(level=3) elif points > 180: return BadgeAwarded(level=4) elif points > 365: return BadgeAwarded(level=5)
class PointsBadge(Badge): slug = "points" levels = [ BadgeDetail(name='Bronze', description='Awarded for completing at least 1 level.'), BadgeDetail(name='Silver', description='Awarded for completing more than 5 levels.'), BadgeDetail(name='Gold', description='Awarded for completing more than 15 levels.'), BadgeDetail(name='Silicon', description='Awarded for completing more than 20 levels.'), ] events = [ "points_awarded", ] multiple = False def award(self, **state): user = state["user"] points = user.profile.points if points > 20: return BadgeAwarded(level=4) elif points > 15: return BadgeAwarded(level=3) elif points > 5: return BadgeAwarded(level=2) elif points > 0: return BadgeAwarded(level=1)
class OpinionatorBadge(Badge): slug = "opinionator_badge" levels = [ BadgeDetail("opinionator_first_three_votes", "User Voted First 3 Times"), BadgeDetail("opinionator_level_2", "User Voted 40 Times"), BadgeDetail("opinionator_level_3", "User Voted 80 Times"), BadgeDetail("opinionator_level_4", "User Voted 120 Times") ] events = [ "vote_cast", ] multiple = False def award(self, **state): user = state["user"] vote_count = Vote.objects.filter(author=user).count() if vote_count >= 120: return BadgeAwarded(level=4) elif vote_count >= 80: return BadgeAwarded(level=3) elif vote_count >= 40: return BadgeAwarded(level=2) elif vote_count >= 3: return BadgeAwarded(level=1)
def __init__(self): # hoop jumping to ensure that BadgeAward objects pick up the correct name # and description self.levels = [ BadgeDetail(name=self.name, description=self.description) ] super(Badge, self).__init__()
class WarmHeartedBadage(Badge): slug = 'WarmHearted' levels = [BadgeDetail('热心参与奖章', '')] events = ['warm_hearted_awarded'] multiple = False image_path = "badges/warm.png" def award(self, **state): # user = User.objects.get(username=state["user"]) # if user.production_set.all().count() > 1: return BadgeAwarded(level=1)
class ProductionNumberBadage(Badge): slug = 'ProductionNumber' levels = [BadgeDetail('首届编程周纪念章', '')] events = ['production_number_awarded'] multiple = False image_path = "badges/badge.gif" def award(self, **state): # user = User.objects.get(username=state["user"]) # if user.production_set.all().count() > 1: return BadgeAwarded(level=1)
class UserCreatedBadge(Badge): slug = "user_created_badge" levels = [ BadgeDetail("created", "Badge POVOQUER"), ] events = [ "user_created", ] multiple = False def award(self, **state): return BadgeAwarded(level=1)
class UserProfileFilledBadge(Badge): slug = "user_profile_created_badge" levels = [ BadgeDetail("user_profile_filled", "User Profile Filled"), ] events = [ "user_profile_filled", ] multiple = False def award(self, **state): user = state["user"] if user.profile_filled: return BadgeAwarded(level=1)
class KnowItAllBadge(Badge): slug = "know_it_all_badge" levels = [ BadgeDetail("know_it_all_level_1", "Know-it-all Level 1"), BadgeDetail("know_it_all_level_2", "Know-it-all Level 2"), BadgeDetail("know_it_all_level_3", "Know-it-all level 3"), BadgeDetail("know_it_all_level_4", "Know-it-all level 4"), BadgeDetail("know_it_all_level_5", "Know-it-all level 5"), BadgeDetail("know_it_all_level_6", "Know-it-all level 6"), BadgeDetail("know_it_all_level_7", "Know-it-all level 7"), BadgeDetail("know_it_all_level_8", "Know-it-all level 8"), BadgeDetail("know_it_all_level_9", "Know-it-all level 9"), BadgeDetail("know_it_all_level_10", "Know-it-all level 10"), BadgeDetail("know_it_all_level_11", "Know-it-all level 11"), BadgeDetail("know_it_all_level_12", "Know-it-all level 12"), BadgeDetail("know_it_all_level_13", "Know-it-all level 13"), BadgeDetail("know_it_all_level_14", "Know-it-all level 14"), BadgeDetail("know_it_all_level_15", "Know-it-all level 15"), BadgeDetail("know_it_all_level_16", "Know-it-all level 16"), BadgeDetail("know_it_all_level_17", "Know-it-all level 17"), BadgeDetail("know_it_all_level_18", "Know-it-all level 18"), BadgeDetail("know_it_all_level_19", "Know-it-all level 19"), BadgeDetail("know_it_all_level_20", "Know-it-all level 20"), ] events = [ "vote_cast", ] multiple = False def award(self, **state): award_level = 0 user = state["user"] votes_list = [ Vote.objects.filter(comment__conversation=c, author=user).count() for c in Conversation.objects.all() ] # If the user has any number of votes in at least two conversations, give him the level 1 if sum(i > 0 for i in votes_list) >= 2: award_level = 1 # major_participations stores the number of conversations in wich the user voted 30 or more times major_participations = sum([i >= 30 for i in votes_list]) award_level = award_level + major_participations # Ensure that you'll never award a level that is not set yet available_levels = len(KnowItAllBadge.levels) if award_level > available_levels: return BadgeAwarded(level=available_levels) return BadgeAwarded(level=award_level)