diff --git a/oneplus/learn_views.py b/oneplus/learn_views.py index dcb2a427..402e6cef 100644 --- a/oneplus/learn_views.py +++ b/oneplus/learn_views.py @@ -446,6 +446,40 @@ def post(): special_rule=True ) + if golden_egg: + _golden_egg = get_golden_egg(_participant) + state["won_golden_egg"] = True + if _golden_egg: + if _golden_egg.point_value: + _participant.points += _golden_egg.point_value + _participant.save() + if _golden_egg.airtime: + mail_managers(subject="Golden Egg Airtime Award", + message="%s %s %s won R %d airtime from a Golden Egg" + % (_participant.learner.first_name, _participant.learner.last_name, + _participant.learner.mobile, _golden_egg.airtime), + fail_silently=False) + if _golden_egg.badge: + + b = ParticipantBadgeTemplateRel(participant=_participant, + badgetemplate=_golden_egg.badge.badge, + scenario=_golden_egg.badge, + awarddate=datetime.now()) + b.save() + + BadgeAwardLog(participant_badge_rel=b, award_date=datetime.now()).save() + + if _golden_egg.badge.point and _golden_egg.badge.point.value: + _participant.points += _golden_egg.badge.point.value + _participant.save() + + golden_egg["url"] = Setting.objects.get(key="GOLDEN_EGG_IMG_URL").value + GoldenEggRewardLog(participant=_participant, + points=_golden_egg.point_value, + airtime=_golden_egg.airtime, + badge=_golden_egg.badge).save() + return redirect('learn.golden_egg_splash') + return redirect("learn.right") else: @@ -1495,49 +1529,6 @@ def right(request, state, user, participant): event=_event, ).distinct('participant', 'question', 'event').count() request.session["state"]["total_event_questions"] = EventQuestionRel.objects.filter(event=_event).count() - golden_egg = {} - - if (len(_learnerstate.get_answers_this_week()) + _learnerstate.get_num_questions_answered_today()) == \ - _learnerstate.golden_egg_question and get_golden_egg(_participant): - # ensure the question was answered on the allocated bucket day, 3 days per bucket - # ie. golden_egg_question = 1 Only Monday - # golden_egg_question = 7 Only Wednesday - if ((_learnerstate.golden_egg_question - 1) // 3) == _learnerstate.get_week_day(): - _golden_egg = get_golden_egg(_participant) - if _golden_egg and "won_golden_egg" not in state: - state["won_golden_egg"] = True - if _golden_egg.point_value: - golden_egg["message"] = "You've won this week's Golden Egg and %d points." % _golden_egg.point_value - _participant.points += _golden_egg.point_value - _participant.save() - if _golden_egg.airtime: - golden_egg["message"] = "You've won this week's Golden Egg and your share of R %d airtime. " \ - "You will be awarded your airtime next Monday." % _golden_egg.airtime - mail_managers(subject="Golden Egg Airtime Award", - message="%s %s %s won R %d airtime from a Golden Egg" - % (_participant.learner.first_name, _participant.learner.last_name, - _participant.learner.mobile, _golden_egg.airtime), - fail_silently=False) - if _golden_egg.badge: - golden_egg["message"] = "You've won this week's Golden Egg and a badge" - - b = ParticipantBadgeTemplateRel(participant=_participant, - badgetemplate=_golden_egg.badge.badge, - scenario=_golden_egg.badge, - awarddate=datetime.now()) - b.save() - - BadgeAwardLog(participant_badge_rel=b, award_date=datetime.now()).save() - - if _golden_egg.badge.point and _golden_egg.badge.point.value: - _participant.points += _golden_egg.badge.point.value - _participant.save() - - golden_egg["url"] = Setting.objects.get(key="GOLDEN_EGG_IMG_URL").value - GoldenEggRewardLog(participant=_participant, - points=_golden_egg.point_value, - airtime=_golden_egg.airtime, - badge=_golden_egg.badge).save() state["total_tasks_today"] = _learnerstate.get_total_questions() @@ -1589,7 +1580,6 @@ def get(): { "badges": badges, "comment_messages": _messages, - "golden_egg": golden_egg, "most_popular": _popular_messages, "question": _learnerstate.active_question, "points": points, @@ -1720,6 +1710,30 @@ def post(): return resolve_http_method(request, [get, post]) +@oneplus_participant_required +def golden_egg_splash(request, state, user, participant): + _learnerstate = LearnerState.objects.filter(participant=participant).first() + + golden_egg = GoldenEggRewardLog.objects.filter(participant=participant)\ + .values('award_date', 'points', 'airtime', 'badge')\ + .order_by('-award_date')\ + .first() + + answer = ParticipantQuestionAnswer.objects.filter(participant=participant, + question_id=_learnerstate.active_question.id)\ + .only('answerdate')\ + .order_by('-answerdate')\ + .first() + + def get(): + if not golden_egg or not answer or golden_egg['award_date'] < answer.answerdate: + return redirect('learn.right') + + return render(request, 'prog/golden_egg_splash.html', {'golden_egg': golden_egg}) + + return resolve_http_method(request, [get]) + + @oneplus_participant_required def wrong(request, state, user, participant): # get learner state diff --git a/oneplus/static/css/oneplus.css b/oneplus/static/css/oneplus.css index 5e6c46dd..22f6c379 100644 --- a/oneplus/static/css/oneplus.css +++ b/oneplus/static/css/oneplus.css @@ -1146,6 +1146,9 @@ li.information { li.home { background-image: url("../img/icn_home.png"); } +.icon.home { + background-image: url("../img/icn_home_32.png"); } + li.change_number { background-image: url("../img/icn_chn_number.png"); } diff --git a/oneplus/templates/learn/right.html b/oneplus/templates/learn/right.html index 9828572e..c12800de 100644 --- a/oneplus/templates/learn/right.html +++ b/oneplus/templates/learn/right.html @@ -19,15 +19,6 @@

You've earned {% if points %}{{ points }} point{{ points |pluralize }}{% else %}0 points{% endif %}.

- {% if golden_egg %} -
-
-

Congratulations!

-
-

{{ golden_egg.message }}

-
-
- {% endif %} {% if badges %}
{% for badge in badges %} diff --git a/oneplus/templates/prog/golden_egg_splash.html b/oneplus/templates/prog/golden_egg_splash.html new file mode 100644 index 00000000..b91a2675 --- /dev/null +++ b/oneplus/templates/prog/golden_egg_splash.html @@ -0,0 +1,24 @@ +{% extends "core/main.html" %} + +{% block title %}Golden Egg{% endblock %} + +{% block page_descriptor_text %}Golden Egg{% endblock %} + +{% block content %} +
+

You've won a Golden Egg!

+ +
+ +
+ +

+ You've won this week's Golden Egg{% if golden_egg.points %} and + {{ golden_egg.points }} points{% endif %}{% if golden_egg.airtime %} and R{{ golden_egg.airtime }} + airtime{% endif %}{% if golden_egg.badge %} and a badge{% endif %}. + {% if golden_egg.airtime %}You will be awarded your airtime next Monday.{% endif %} +

+ + Continue +
+{% endblock content %} diff --git a/oneplus/templates/sharing/badge_single.html b/oneplus/templates/sharing/badge_single.html index edb7fab5..503b2843 100644 --- a/oneplus/templates/sharing/badge_single.html +++ b/oneplus/templates/sharing/badge_single.html @@ -38,7 +38,7 @@

{{ badge.name }}

@@ -71,7 +71,7 @@

{{ badge.name }}

diff --git a/oneplus/tests/test_golden_egg.py b/oneplus/tests/test_golden_egg.py index c90286f1..33e8ba31 100644 --- a/oneplus/tests/test_golden_egg.py +++ b/oneplus/tests/test_golden_egg.py @@ -15,73 +15,85 @@ from oneplus.tasks import reset_learner_states -@override_settings(VUMI_GO_FAKE=True) -class GoldenEggTest(TestCase): +def create_test_question(name, module, **kwargs): + return TestingQuestion.objects.create(name=name, + module=module, + **kwargs) + + +def create_course(name="course name", **kwargs): + return Course.objects.create(name=name, **kwargs) + + +def create_module(name, course, **kwargs): + module = Module.objects.create(name=name, **kwargs) + rel = CourseModuleRel.objects.create(course=course, module=module) + module.save() + rel.save() + return module + + +def create_class(name, course, **kwargs): + return Class.objects.create(name=name, course=course, **kwargs) + + +def create_organisation(name='organisation name', **kwargs): + return Organisation.objects.create(name=name, **kwargs) + + +def create_school(name, organisation, **kwargs): + return School.objects.create( + name=name, organisation=organisation, **kwargs) - def create_test_question(self, name, module, **kwargs): - return TestingQuestion.objects.create(name=name, - module=module, - **kwargs) - def create_course(self, name="course name", **kwargs): - return Course.objects.create(name=name, **kwargs) +def create_learner(school, **kwargs): + if 'grade' not in kwargs: + kwargs['grade'] = 'Grade 11' + if 'terms_accept' not in kwargs: + kwargs['terms_accept'] = True + return Learner.objects.create(school=school, **kwargs) - def create_module(self, name, course, **kwargs): - module = Module.objects.create(name=name, **kwargs) - rel = CourseModuleRel.objects.create(course=course, module=module) - module.save() - rel.save() - return module - def create_class(self, name, course, **kwargs): - return Class.objects.create(name=name, course=course, **kwargs) +def create_participant(learner, classs, **kwargs): + participant = Participant.objects.create( + learner=learner, classs=classs, **kwargs) - def create_organisation(self, name='organisation name', **kwargs): - return Organisation.objects.create(name=name, **kwargs) + return participant - def create_school(self, name, organisation, **kwargs): - return School.objects.create( - name=name, organisation=organisation, **kwargs) - def create_learner(self, school, **kwargs): - if 'grade' not in kwargs: - kwargs['grade'] = 'Grade 11' - if 'terms_accept' not in kwargs: - kwargs['terms_accept'] = True - return Learner.objects.create(school=school, **kwargs) +def create_badgetemplate(name='badge template name', **kwargs): + return GamificationBadgeTemplate.objects.create( + name=name, + image="none", + **kwargs) - def create_participant(self, learner, classs, **kwargs): - participant = Participant.objects.create( - learner=learner, classs=classs, **kwargs) - return participant +def create_gamification_point_bonus(name, value, **kwargs): + return GamificationPointBonus.objects.create( + name=name, + value=value, + **kwargs) - def create_badgetemplate(self, name='badge template name', **kwargs): - return GamificationBadgeTemplate.objects.create( - name=name, - image="none", - **kwargs) - def create_gamification_point_bonus(self, name, value, **kwargs): - return GamificationPointBonus.objects.create( - name=name, - value=value, - **kwargs) +def create_gamification_scenario(**kwargs): + return GamificationScenario.objects.create(**kwargs) - def create_gamification_scenario(self, **kwargs): - return GamificationScenario.objects.create(**kwargs) - def create_test_question_option(self, name, question, correct=True): - return TestingQuestionOption.objects.create( - name=name, question=question, correct=correct) +def create_test_question_option(name, question, correct=True): + return TestingQuestionOption.objects.create( + name=name, question=question, correct=correct) + + +@override_settings(VUMI_GO_FAKE=True) +class GoldenEggTest(TestCase): def setUp(self): - self.course = self.create_course() - self.classs = self.create_class('class name', self.course) - self.organisation = self.create_organisation() - self.school = self.create_school('school name', self.organisation) - self.learner = self.create_learner( + self.course = create_course() + self.classs = create_class('class name', self.course) + self.organisation = create_organisation() + self.school = create_school('school name', self.organisation) + self.learner = create_learner( self.school, username="+27123456789", mobile="+27123456789", @@ -90,10 +102,10 @@ def setUp(self): unique_token='abc123', unique_token_expiry=datetime.now() + timedelta(days=30), is_staff=True) - self.participant = self.create_participant( + self.participant = create_participant( self.learner, self.classs, datejoined=datetime(2014, 7, 18, 1, 1)) - self.module = self.create_module('module name', self.course) - self.badge_template = self.create_badgetemplate() + self.module = create_module('module name', self.course) + self.badge_template = create_badgetemplate() self.scenario = GamificationScenario.objects.create( name='scenario name', @@ -117,17 +129,17 @@ def setUp(self): mobile='+27111111133') def test_golden_egg(self): - new_learner = self.create_learner( + new_learner = create_learner( self.school, username="+27761234567", mobile="+27761234567", unique_token='123456789', unique_token_expiry=datetime.now() + timedelta(days=30)) - self.create_participant(new_learner, self.classs, datejoined=datetime.now()) + create_participant(new_learner, self.classs, datejoined=datetime.now()) - q = self.create_test_question('question_1', module=self.module, state=3) - q_o = self.create_test_question_option('question_option_1', q) + q = create_test_question('question_1', module=self.module, state=3) + q_o = create_test_question_option('question_option_1', q) self.client.get(reverse('auth.autologin', kwargs={'token': new_learner.unique_token})) @@ -147,9 +159,9 @@ def test_golden_egg(self): new_participant.save() # GOLDEN EGG INACTIVE - golden_egg_badge = self.create_badgetemplate('golden egg') - golden_egg_point = self.create_gamification_point_bonus('golden egg', 5) - golden_egg_scenario = self.create_gamification_scenario(badge=golden_egg_badge, point=golden_egg_point) + golden_egg_badge = create_badgetemplate('golden egg') + golden_egg_point = create_gamification_point_bonus('golden egg', 5) + golden_egg_scenario = create_gamification_scenario(badge=golden_egg_badge, point=golden_egg_point) golden_egg = GoldenEgg.objects.create(course=self.course, classs=self.classs, active=False, point_value=5, badge=golden_egg_scenario) @@ -304,3 +316,113 @@ def test_golden_egg(self): cnt = LearnerState.objects.filter(golden_egg_question__gt=0).count() self.assertEquals(0,cnt) + + +@override_settings(VUMI_GO_FAKE=True) +class GoldenEggSplashTest(TestCase): + + def setUp(self): + self.course = create_course() + self.classs = create_class('class name', self.course) + self.organisation = create_organisation() + self.school = create_school('school name', self.organisation) + self.learner = create_learner( + self.school, + username="+27123456789", + mobile="+27123456789", + country="country", + area="Test_Area", + unique_token='abc123', + unique_token_expiry=datetime.now() + timedelta(days=30), + is_staff=True) + self.participant = create_participant( + self.learner, self.classs, datejoined=datetime(2014, 7, 18, 1, 1)) + self.module = create_module('module name', self.course) + self.badge_template = create_badgetemplate() + + self.scenario = GamificationScenario.objects.create( + name='scenario name', + event='1_CORRECT', + course=self.course, + module=self.module, + badge=self.badge_template + ) + self.outgoing_vumi_text = [] + self.outgoing_vumi_metrics = [] + self.handler = RecordingHandler() + logger = logging.getLogger('DEBUG') + logger.setLevel(logging.INFO) + logger.addHandler(self.handler) + + self.admin_user_password = 'mypassword' + self.admin_user = CustomUser.objects.create_superuser( + username='asdf33', + email='asdf33@example.com', + password=self.admin_user_password, + mobile='+27111111133') + + def test_splash(self): + + q = create_test_question('question_1', module=self.module, state=3) + q_o = create_test_question_option('question_option_1', q) + + self.client.get(reverse('auth.autologin', kwargs={'token': self.learner.unique_token})) + + self.client.get(reverse('learn.next')) + golden_egg_badge = create_badgetemplate('golden egg') + golden_egg_point = create_gamification_point_bonus('golden egg', 5) + golden_egg_scenario = create_gamification_scenario(badge=golden_egg_badge, point=golden_egg_point) + golden_egg = GoldenEgg.objects.create(course=self.course, classs=self.classs, active=True, point_value=5, + badge=golden_egg_scenario) + golden_egg.save() + + self.client.get(reverse('learn.next')) + state = LearnerState.objects.filter(participant=self.participant).first() + state.golden_egg_question = 1 + state.save() + + resp = None + with patch("oneplus.learn_views.LearnerState.get_week_day") as mock_get_week_day: + mock_get_week_day.return_value = LearnerState.MONDAY + with patch("oneplus.learn_views.LearnerState.today") as mock_today: + mock_today.return_value = datetime(2015, 8, 24, 1, 0, 0) + with patch("core.models.today") as mock_today2: + mock_today2.return_value = datetime(2015, 8, 24, 1, 0, 0) + resp = self.client.post(reverse('learn.next'), data={'answer': q_o.id}, follow=True) + + self.assertRedirects(resp, reverse('learn.golden_egg_splash')) + self.assertContains(resp, 'Golden Egg') + + def test_splash_wrong(self): + + q = create_test_question('question_1', module=self.module, state=3) + q_o = create_test_question_option('question_option_1', q, correct=False) + + self.client.get(reverse('auth.autologin', kwargs={'token': self.learner.unique_token})) + + self.client.get(reverse('learn.next')) + golden_egg_badge = create_badgetemplate('golden egg') + golden_egg_point = create_gamification_point_bonus('golden egg', 5) + golden_egg_scenario = create_gamification_scenario(badge=golden_egg_badge, point=golden_egg_point) + golden_egg = GoldenEgg.objects.create(course=self.course, classs=self.classs, active=True, point_value=5, + badge=golden_egg_scenario) + golden_egg.save() + + self.client.get(reverse('learn.next')) + state = LearnerState.objects.filter(participant=self.participant).first() + state.golden_egg_question = 1 + state.save() + + resp = None + with patch("oneplus.learn_views.LearnerState.get_week_day") as mock_get_week_day: + mock_get_week_day.return_value = LearnerState.MONDAY + with patch("oneplus.learn_views.LearnerState.today") as mock_today: + mock_today.return_value = datetime(2015, 8, 24, 1, 0, 0) + with patch("core.models.today") as mock_today2: + mock_today2.return_value = datetime(2015, 8, 24, 1, 0, 0) + resp = self.client.post(reverse('learn.next'), data={'answer': q_o.id}, follow=True) + + self.assertRedirects(resp, reverse('learn.wrong')) + + resp = self.client.get(reverse('learn.golden_egg_splash'), follow=True) + self.assertRedirects(resp, reverse('learn.wrong')) diff --git a/oneplus/urls.py b/oneplus/urls.py index 02808f22..0a11e289 100644 --- a/oneplus/urls.py +++ b/oneplus/urls.py @@ -58,6 +58,7 @@ url(r"^next$", oneplus.learn_views.nextchallenge, name="learn.next"), url(r"^right$", oneplus.learn_views.right, name="learn.right"), url(r"^wrong$", oneplus.learn_views.wrong, name="learn.wrong"), + url(r"^golden_egg_splash", oneplus.learn_views.golden_egg_splash, name="learn.golden_egg_splash"), url(r"^event$", oneplus.learn_views.event, name="learn.event"), url(r"^event_right$", oneplus.learn_views.event_right, name="learn.event_right"), url(r"^event_wrong$", oneplus.learn_views.event_wrong, name="learn.event_wrong"), diff --git a/oneplusmvp/media/img/splash/splash_golden_egg.png b/oneplusmvp/media/img/splash/splash_golden_egg.png new file mode 100644 index 00000000..a4636f8c Binary files /dev/null and b/oneplusmvp/media/img/splash/splash_golden_egg.png differ