def testBadgeAwarded(self): """Tests that badge awarded works for a user.""" from components.makahiki_badges.user_badges import DailyVisitorBadge badges.register(DailyVisitorBadge) profile = self.user.get_profile() self.assertFalse(badge_awarded(self.user, "dailyvisitor"), "New user should not be awarded the daily visitor badge.") # Test as a quest unlock condition. self.quest.unlock_conditions = "badge_awarded('dailyvisitor')" self.quest.save() self.assertTrue(self.quest not in get_quests(self.user), "User should not be able to participate in this quest.") self.quest.unlock_conditions = "not badge_awarded('dailyvisitor')" self.quest.save() self.assertTrue(self.quest in get_quests(self.user)["available_quests"], "User should be able to participate in this quest.") self.quest.accept(self.user) self.quest.completion_conditions = "badge_awarded('dailyvisitor')" self.quest.save() self.assertTrue(self.quest not in possibly_completed_quests(self.user), "User should not be able to complete this quest.") profile.daily_visit_count = 3 profile.save() badges.possibly_award_badge("dailyvisitor", user=self.user) self.assertTrue(badge_awarded(self.user, "dailyvisitor"), "User should have been awarded the daily visitor badge.") self.assertTrue(self.quest in possibly_completed_quests(self.user), "User should have completed this quest.")
def save(self): """Custom save method to set fields depending on whether or not the item is just added or if the item is completed.""" profile = self.user.get_profile() if not self.completion_date: self.completion_date = datetime.date.today() + datetime.timedelta(days=self.commitment.duration) if not self.pk and profile.floor: # User is adding the commitment. message = "is participating in the commitment \"%s\"." % ( self.commitment.title, ) post = Post(user=self.user, floor=profile.floor, text=message, style_class="system_post") post.save() if self.award_date: # User has finished the commitment. # Award the points profile = self.user.get_profile() profile.add_points(self.commitment.point_value, self.award_date) profile.save() if profile.floor: # Construct the points message = "has completed the commitment \"%s\"." % ( self.commitment.title, ) post = Post(user=self.user, floor=self.user.get_profile().floor, text=message, style_class="system_post") post.save() super(CommitmentMember, self).save() # Note, possibly_award is here because the member needs to be saved. badges.possibly_award_badge("fully_committed", user=self.user)
def award_badge(slug, username): try: user = User.objects.get(username=username) badge = badges.possibly_award_badge(slug, user=user) except User.DoesNotExist: self.stderr.write("User with the username %s does not exist.\n" % username) except KeyError: self.stderr.write("Badge with the slug %s does not exist.\n" % slug)
def test_awarding(self): """ Tests that the daily visitor badge is awarded to a user. """ user = User(username="******", password="******") user.save() self.assertEqual(user.badges_earned.count(), 0, "Check that no badges are awarded.") profile = user.get_profile() profile.daily_visit_count = 1 profile.save() badges.possibly_award_badge("dailyvisitor", user=user) self.assertEqual(user.badges_earned.count(), 0, "Check that still no badges are awarded.") profile.daily_visit_count = 3 profile.save() badges.possibly_award_badge("dailyvisitor", user=user) self.assertEqual(user.badges_earned.count(), 1, "Check that a badge has been awarded.") self.assertEqual(user.badges_earned.all()[0].slug, "dailyvisitor", "Check that the daily visitor badge was awarded.")
def process_request(self, request): """Checks if the user is logged in and updates the tracking field.""" if request.user.is_authenticated(): profile = request.user.get_profile() last_visit = request.user.get_profile().last_visit_date today = datetime.date.today() # Look for a previous login. if last_visit and (today - last_visit) == datetime.timedelta(days=1): profile.last_visit_date = today profile.daily_visit_count += 1 profile.save() badges.possibly_award_badge("dailyvisitor", user=request.user) elif not last_visit or (today - last_visit) > datetime.timedelta(days=1): # Reset the daily login count. profile.last_visit_date = today profile.daily_visit_count = 1 profile.save() return None
def process_request(self, request): """Checks if the user is logged in and updates the tracking field.""" user = request.user if user.is_authenticated(): profile = request.user.get_profile() last_visit = request.user.get_profile().last_visit_date today = datetime.date.today() # Look for a previous login. if last_visit and (today - last_visit) == datetime.timedelta(days=1): profile.last_visit_date = today profile.daily_visit_count += 1 profile.save() if user.badges_earned.filter(slug="dailyvisitor").count() == 0: badges.possibly_award_badge(user_badges.DailyVisitorBadge.slug, user=request.user) elif not last_visit or (today - last_visit) > datetime.timedelta(days=1): # Reset the daily login count. profile.last_visit_date = today profile.daily_visit_count = 1 profile.save() return None
def save(self): """Custom save method to set fields depending on whether or not the item is just added or if the item is completed.""" profile = self.user.get_profile() if not self.completion_date: self.completion_date = datetime.date.today() + datetime.timedelta(days=self.commitment.duration) if not self.pk and profile.floor: # User is adding the commitment. message = "is participating in the commitment \"%s\"." % ( self.commitment.title, ) post = Post(user=self.user, floor=profile.floor, text=message, style_class="system_post") post.save() if self.award_date: # User has finished the commitment. # Award the points profile = self.user.get_profile() message = "%sCommitment: %s" % ( 'Canopy ' if self.commitment.is_canopy else '', self.commitment.title ) profile.add_points(self.commitment.point_value, self.award_date, message, self) profile.save() ## award social bonus to myself if the ref user had successfully completed the activity social_message = message + "(Social Bonus)" if self.social_email: ref_user = User.objects.get(email=self.social_email) ref_members = CommitmentMember.objects.filter(user=ref_user, commitment=self.commitment) for m in ref_members: if m.award_date: profile.add_points(self.commitment.social_bonus, self.award_date, social_message, self) profile.save() ## award social bonus to others who referenced my email and successfully completed the activity ref_members = CommitmentMember.objects.filter(commitment=self.commitment, social_email=self.user.email) for m in ref_members: if m.award_date: ref_profile = m.user.get_profile() ref_profile.add_points(self.commitment.social_bonus, self.award_date, social_message, self) ref_profile.save() if profile.floor: # Construct the points message = "has completed the commitment \"%s\"." % ( self.commitment.title, ) post = Post(user=self.user, floor=self.user.get_profile().floor, text=message, style_class="system_post") post.save() # Invalidate the categories cache. cache.delete('smartgrid-categories-%s' % self.user.username) cache.delete('user_events-%s' % self.user.username) invalidate_floor_avatar_cache(self.commitment, self.user) invalidate_commitments_cache(self.user) super(CommitmentMember, self).save() # Note, possibly_award is here because the member needs to be saved. badges.possibly_award_badge(user_badges.FullyCommittedBadge.slug, user=self.user)