Skip to content

Commit

Permalink
Migrate existing event handlers to the new framework.
Browse files Browse the repository at this point in the history
  • Loading branch information
seanlip committed Jul 24, 2014
1 parent ffc417f commit 300b075
Show file tree
Hide file tree
Showing 6 changed files with 95 additions and 82 deletions.
2 changes: 1 addition & 1 deletion core/controllers/editor.py
Original file line number Diff line number Diff line change
Expand Up @@ -442,7 +442,7 @@ def put(self, exploration_id, state_name):
resolved_answers)

if 'resolved_answers' in self.payload:
event_services.EventHandler.resolve_answers_for_default_rule(
event_services.DefaultRuleAnswerResolutionEventHandler.record(
exploration_id, state_name, 'submit', resolved_answers)

self.render_json({})
Expand Down
12 changes: 6 additions & 6 deletions core/controllers/reader.py
Original file line number Diff line number Diff line change
Expand Up @@ -137,9 +137,9 @@ def get(self, exploration_id):
})
self.render_json(self.values)

event_services.EventHandler.record_state_hit(
event_services.StateHitEventHandler.record(
exploration_id, exploration.init_state_name, True)
event_services.EventHandler.start_exploration(
event_services.StartExplorationEventHandler.record(
exploration_id, version, exploration.init_state_name,
session_id, reader_params, feconf.PLAY_TYPE_NORMAL)

Expand All @@ -158,7 +158,7 @@ def _append_answer_to_stats_log(

recorded_answer = widget.get_stats_log_html(
old_state.widget.customization_args, old_params, answer)
event_services.EventHandler.record_answer_submitted(
event_services.AnswerSubmissionEventHandler.record(
exploration_id, 1, old_state_name, handler, rule,
recorded_answer)

Expand Down Expand Up @@ -226,11 +226,11 @@ def post(self, exploration_id, escaped_state_name):
None if new_state_name == feconf.END_DEST
else exploration.states[new_state_name])

event_services.EventHandler.record_state_hit(
event_services.StateHitEventHandler.record(
exploration_id, new_state_name,
(new_state_name not in state_history))
if new_state_name == feconf.END_DEST:
event_services.EventHandler.maybe_leave_exploration(
event_services.MaybeLeaveExplorationEventHandler.record(
exploration_id, version, feconf.END_DEST,
session_id, client_time_spent_in_secs, old_params,
feconf.PLAY_TYPE_NORMAL)
Expand Down Expand Up @@ -316,7 +316,7 @@ class ReaderLeaveHandler(base.BaseHandler):
@require_playable
def post(self, exploration_id, escaped_state_name):
"""Handles POST requests."""
event_services.EventHandler.maybe_leave_exploration(
event_services.MaybeLeaveExplorationEventHandler.record(
exploration_id,
self.payload.get('version'),
self.unescape_state_name(escaped_state_name),
Expand Down
39 changes: 26 additions & 13 deletions core/domain/event_services.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,45 +67,58 @@ def record(cls, *args, **kwargs):
cls._handle_event(*args, **kwargs)


class EventHandler(object):
"""Records and dispatches events."""

# TODO(sll): Migrate these over to become subclasses of BaseEventHandler.
class StateHitEventHandler(BaseEventHandler):
"""Event handler for recording state hits."""

@classmethod
def record_state_hit(cls, exploration_id, state_name, first_time):
def _handle_event(cls, exploration_id, state_name, first_time):
"""Record an event when a state is encountered by the reader."""
stats_models.StateCounterModel.inc(
exploration_id, state_name, first_time)


class AnswerSubmissionEventHandler(BaseEventHandler):
"""Event handler for recording answer submissions."""

@classmethod
def record_answer_submitted(
cls, exploration_id, exploration_version, state_name,
handler_name, rule, answer):
def _handle_event(cls, exploration_id, exploration_version, state_name,
handler_name, rule, answer):
"""Records an event when an answer triggers a rule."""
# TODO(sll): Escape these args?
stats_models.process_submitted_answer(
exploration_id, exploration_version, state_name,
handler_name, rule, answer)


class DefaultRuleAnswerResolutionEventHandler(BaseEventHandler):
"""Event handler for recording resolving of answers triggering the default
rule."""

@classmethod
def resolve_answers_for_default_rule(
cls, exploration_id, state_name, handler_name, answers):
def _handle_event(cls, exploration_id, state_name, handler_name, answers):
"""Resolves a list of answers for the default rule of this state."""
# TODO(sll): Escape these args?
stats_models.resolve_answers(
exploration_id, state_name, handler_name,
exp_domain.DEFAULT_RULESPEC_STR, answers)


class StartExplorationEventHandler(BaseEventHandler):
"""Event handler for recording exploration start events."""

@classmethod
def start_exploration(cls, exp_id, exp_version, state_name, session_id,
params, play_type):
def _handle_event(cls, exp_id, exp_version, state_name, session_id,
params, play_type):
stats_models.StartExplorationEventLogEntryModel.create(
exp_id, exp_version, state_name, session_id, params,
play_type)


class MaybeLeaveExplorationEventHandler(BaseEventHandler):
"""Event handler for recording exploration leave events."""

@classmethod
def maybe_leave_exploration(
def _handle_event(
cls, exp_id, exp_version, state_name, session_id, time_spent,
params, play_type):
stats_models.MaybeLeaveExplorationEventLogEntryModel.create(
Expand Down
30 changes: 15 additions & 15 deletions core/domain/stats_domain_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ def test_state_entry_counts(self):
self.assertEquals(state1_counter.active_answer_count, 0)
self.assertEquals(state1_counter.no_answer_count, 0)

event_services.EventHandler.record_state_hit('eid', state1_name, True)
event_services.StateHitEventHandler.record('eid', state1_name, True)

state1_counter = stats_domain.StateCounter.get('eid', state1_name)
self.assertEquals(state1_counter.first_entry_count, 1)
Expand All @@ -54,8 +54,8 @@ def test_state_entry_counts(self):
self.assertEquals(state1_counter.active_answer_count, 0)
self.assertEquals(state1_counter.no_answer_count, 1)

event_services.EventHandler.record_state_hit('eid', state2_name, True)
event_services.EventHandler.record_state_hit('eid', state2_name, False)
event_services.StateHitEventHandler.record('eid', state2_name, True)
event_services.StateHitEventHandler.record('eid', state2_name, False)

state1_counter = stats_domain.StateCounter.get('eid', state1_name)
self.assertEquals(state1_counter.first_entry_count, 1)
Expand Down Expand Up @@ -89,7 +89,7 @@ def test_state_rule_answer_logs(self):

state_name = exp.init_state_name

event_services.EventHandler.record_state_hit(
event_services.StateHitEventHandler.record(
'eid', state_name, True)

answer_log = stats_domain.StateRuleAnswerLog.get(
Expand All @@ -98,7 +98,7 @@ def test_state_rule_answer_logs(self):
self.assertEquals(answer_log.total_answer_count, 0)
self.assertEquals(answer_log.get_top_answers(2), [])

event_services.EventHandler.record_answer_submitted(
event_services.AnswerSubmissionEventHandler.record(
'eid', 1, state_name, self.SUBMIT_HANDLER,
self.DEFAULT_RULESPEC, 'answer1')

Expand All @@ -109,10 +109,10 @@ def test_state_rule_answer_logs(self):
self.assertEquals(answer_log.get_top_answers(1), [('answer1', 1)])
self.assertEquals(answer_log.get_top_answers(2), [('answer1', 1)])

event_services.EventHandler.record_answer_submitted(
event_services.AnswerSubmissionEventHandler.record(
'eid', 1, state_name, self.SUBMIT_HANDLER,
self.DEFAULT_RULESPEC, 'answer1')
event_services.EventHandler.record_answer_submitted(
event_services.AnswerSubmissionEventHandler.record(
'eid', 1, state_name, self.SUBMIT_HANDLER, self.DEFAULT_RULESPEC,
'answer2')

Expand All @@ -125,10 +125,10 @@ def test_state_rule_answer_logs(self):
self.assertEquals(
answer_log.get_top_answers(2), [('answer1', 2), ('answer2', 1)])

event_services.EventHandler.record_answer_submitted(
event_services.AnswerSubmissionEventHandler.record(
'eid', 1, state_name, self.SUBMIT_HANDLER, self.DEFAULT_RULESPEC,
'answer2')
event_services.EventHandler.record_answer_submitted(
event_services.AnswerSubmissionEventHandler.record(
'eid', 1, state_name, self.SUBMIT_HANDLER, self.DEFAULT_RULESPEC,
'answer2')

Expand Down Expand Up @@ -160,10 +160,10 @@ def test_recording_answer_for_different_rules(self):

state_name = exp.init_state_name

event_services.EventHandler.record_answer_submitted(
event_services.AnswerSubmissionEventHandler.record(
'eid', 1, state_name, self.SUBMIT_HANDLER, self.DEFAULT_RULESPEC,
'answer1')
event_services.EventHandler.record_answer_submitted(
event_services.AnswerSubmissionEventHandler.record(
'eid', 1, state_name, self.SUBMIT_HANDLER, rule,
'answer2')

Expand All @@ -188,13 +188,13 @@ def test_resolving_answers(self):
'eid', state_name, self.SUBMIT_HANDLER, self.DEFAULT_RULESPEC_STR)
self.assertEquals(answer_log.answers, {})

event_services.EventHandler.record_answer_submitted(
event_services.AnswerSubmissionEventHandler.record(
'eid', 1, state_name, self.SUBMIT_HANDLER,
self.DEFAULT_RULESPEC, 'answer1')
event_services.EventHandler.record_answer_submitted(
event_services.AnswerSubmissionEventHandler.record(
'eid', 1, state_name, self.SUBMIT_HANDLER,
self.DEFAULT_RULESPEC, 'answer1')
event_services.EventHandler.record_answer_submitted(
event_services.AnswerSubmissionEventHandler.record(
'eid', 1, state_name, self.SUBMIT_HANDLER,
self.DEFAULT_RULESPEC, 'answer2')

Expand All @@ -203,7 +203,7 @@ def test_resolving_answers(self):
self.assertEquals(answer_log.answers, {'answer1': 2, 'answer2': 1})
self.assertEquals(answer_log.total_answer_count, 3)

event_services.EventHandler.resolve_answers_for_default_rule(
event_services.DefaultRuleAnswerResolutionEventHandler.record(
'eid', state_name, self.SUBMIT_HANDLER, ['answer1'])

answer_log = stats_domain.StateRuleAnswerLog.get(
Expand Down
16 changes: 8 additions & 8 deletions core/domain/stats_jobs_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,9 @@ def test_no_completion(self):
exp_id = 'eid'
version = 1
state = 'sid'
event_services.EventHandler.start_exploration(
event_services.StartExplorationEventHandler.record(
exp_id, version, state, 'session1', {}, feconf.PLAY_TYPE_NORMAL)
event_services.EventHandler.start_exploration(
event_services.StartExplorationEventHandler.record(
exp_id, version, state, 'session2', {}, feconf.PLAY_TYPE_NORMAL)
job_id = (
stats_jobs.StatisticsPageJobManager.create_new())
Expand All @@ -57,14 +57,14 @@ def test_all_complete(self):
exp_id = 'eid'
version = 1
state = 'sid'
event_services.EventHandler.start_exploration(
event_services.StartExplorationEventHandler.record(
exp_id, version, state, 'session1', {}, feconf.PLAY_TYPE_NORMAL)
event_services.EventHandler.maybe_leave_exploration(
event_services.MaybeLeaveExplorationEventHandler.record(
exp_id, version, feconf.END_DEST, 'session1', 27, {},
feconf.PLAY_TYPE_NORMAL)
event_services.EventHandler.start_exploration(
event_services.StartExplorationEventHandler.record(
exp_id, version, state, 'session2', {}, feconf.PLAY_TYPE_NORMAL)
event_services.EventHandler.maybe_leave_exploration(
event_services.MaybeLeaveExplorationEventHandler.record(
exp_id, version, feconf.END_DEST, 'session2', 27, {},
feconf.PLAY_TYPE_NORMAL)
job_id = stats_jobs.StatisticsPageJobManager.create_new()
Expand Down Expand Up @@ -97,13 +97,13 @@ def test_multiple_maybe_leaves_same_session(self):
exp_id = 'eid'
version = 1
state = 'sid'
event_services.EventHandler.start_exploration(
event_services.StartExplorationEventHandler.record(
exp_id, version, state, 'session1', {}, feconf.PLAY_TYPE_NORMAL)
self._create_leave_event(exp_id, version, state, 'session1', 0)
self._create_leave_event(exp_id, version, state, 'session1', 1)
self._create_leave_event(
exp_id, version, feconf.END_DEST, 'session1', 2)
event_services.EventHandler.start_exploration(
event_services.StartExplorationEventHandler.record(
exp_id, version, state, 'session2', {}, feconf.PLAY_TYPE_NORMAL)
self._create_leave_event(exp_id, version, state, 'session2', 3)
self._create_leave_event(exp_id, version, state, 'session2', 4)
Expand Down
Loading

0 comments on commit 300b075

Please sign in to comment.