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 }}
-
+
Share on Twitter
@@ -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