Skip to content

Commit

Permalink
feat: add xapi transformer for grading events
Browse files Browse the repository at this point in the history
  • Loading branch information
Ian2012 committed Aug 23, 2023
1 parent 143e821 commit 2137bbb
Show file tree
Hide file tree
Showing 3 changed files with 83 additions and 0 deletions.
2 changes: 2 additions & 0 deletions event_routing_backends/processors/xapi/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
XAPI_VERB_VOTED = 'https://w3id.org/xapi/openedx/verb/voted'
XAPI_VERB_REPORTED = 'https://w3id.org/xapi/acrossx/verbs/reported'
XAPI_VERB_UNREPORTED = 'https://w3id.org/xapi/openedx/verb/unreported'
XAPI_VERB_GRADED = 'http://dimmy.com/verb/graded'

XAPI_VERB_TERMINATED = 'http://adlnet.gov/expapi/verbs/terminated'
XAPI_VERB_ASKED = 'http://adlnet.gov/expapi/verbs/asked'
Expand All @@ -47,6 +48,7 @@
XAPI_ACTIVITY_TOTAL_COUNT = 'https://w3id.org/xapi/acrossx/extensions/total-items'
XAPI_ACTIVITY_MODE = 'https://w3id.org/xapi/acrossx/extensions/type'
XAPI_ACTIVITY_ATTEMPT = 'http://id.tincanapi.com/extension/attempt-id'
XAPI_ACTIVITY_GRADE = 'http://dummy.com/grade'

# xAPI context
XAPI_CONTEXT_VIDEO_LENGTH = 'https://w3id.org/xapi/video/extensions/length'
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
"""
Transformers for grading related events.
"""
from tincan import Activity, ActivityDefinition, Extensions, LanguageMap, Verb

Check warning on line 4 in event_routing_backends/processors/xapi/event_transformers/grading_events.py

View check run for this annotation

Codecov / codecov/patch

event_routing_backends/processors/xapi/event_transformers/grading_events.py#L4

Added line #L4 was not covered by tests

from event_routing_backends.helpers import get_course_from_id
from event_routing_backends.processors.xapi import constants
from event_routing_backends.processors.xapi.registry import XApiTransformersRegistry
from event_routing_backends.processors.xapi.transformer import XApiTransformer

Check warning on line 9 in event_routing_backends/processors/xapi/event_transformers/grading_events.py

View check run for this annotation

Codecov / codecov/patch

event_routing_backends/processors/xapi/event_transformers/grading_events.py#L6-L9

Added lines #L6 - L9 were not covered by tests


@XApiTransformersRegistry.register('edx.grades.subsection.grade_calculated')
class SubsectionGradedTransformer(XApiTransformer):

Check warning on line 13 in event_routing_backends/processors/xapi/event_transformers/grading_events.py

View check run for this annotation

Codecov / codecov/patch

event_routing_backends/processors/xapi/event_transformers/grading_events.py#L13

Added line #L13 was not covered by tests
"""
Transformer for event generated when an subsection is graded.
"""
verb = Verb(

Check warning on line 17 in event_routing_backends/processors/xapi/event_transformers/grading_events.py

View check run for this annotation

Codecov / codecov/patch

event_routing_backends/processors/xapi/event_transformers/grading_events.py#L17

Added line #L17 was not covered by tests
id=constants.XAPI_VERB_GRADED,
display=LanguageMap({constants.EN: constants.EVALUATED}),
)

def get_object(self):

Check warning on line 22 in event_routing_backends/processors/xapi/event_transformers/grading_events.py

View check run for this annotation

Codecov / codecov/patch

event_routing_backends/processors/xapi/event_transformers/grading_events.py#L22

Added line #L22 was not covered by tests
"""
Get object for xAPI transformed event related to subsection grading.
Returns:
`Activity`
"""
return Activity(

Check warning on line 29 in event_routing_backends/processors/xapi/event_transformers/grading_events.py

View check run for this annotation

Codecov / codecov/patch

event_routing_backends/processors/xapi/event_transformers/grading_events.py#L29

Added line #L29 was not covered by tests
id=self.get_object_iri('xblock', self.get_data('data.block_id')),
definition=ActivityDefinition(
type=constants.XAPI_ACTIVITY_RESOURCE,
extensions=Extensions({
constants.XAPI_ACTIVITY_GRADE: self.get_data('data.weighted_total_earned'),
# TODO course_version
# TODO weighted_total_earned
# TODO weighted_total_possible
# TODO weighted_graded_earned
# TODO weighted_graded_possible
})
),
)


@XApiTransformersRegistry.register('edx.grades.course.grade_calculated')
class CourseGradedTransformer(XApiTransformer):

Check warning on line 46 in event_routing_backends/processors/xapi/event_transformers/grading_events.py

View check run for this annotation

Codecov / codecov/patch

event_routing_backends/processors/xapi/event_transformers/grading_events.py#L46

Added line #L46 was not covered by tests
"""
Transformer for event generated when an course is graded.
"""
verb = Verb(

Check warning on line 50 in event_routing_backends/processors/xapi/event_transformers/grading_events.py

View check run for this annotation

Codecov / codecov/patch

event_routing_backends/processors/xapi/event_transformers/grading_events.py#L50

Added line #L50 was not covered by tests
id=constants.XAPI_VERB_GRADED,
display=LanguageMap({constants.EN: constants.EVALUATED}),
)

def get_object(self):

Check warning on line 55 in event_routing_backends/processors/xapi/event_transformers/grading_events.py

View check run for this annotation

Codecov / codecov/patch

event_routing_backends/processors/xapi/event_transformers/grading_events.py#L55

Added line #L55 was not covered by tests
"""
Get object for xAPI transformed event related to course grading.
Returns:
`Activity`
"""
course_id = self.get_data('context.course_id', True)
object_id = self.get_object_iri('course', course_id)
course = get_course_from_id(course_id)
display_name = course['display_name']

Check warning on line 65 in event_routing_backends/processors/xapi/event_transformers/grading_events.py

View check run for this annotation

Codecov / codecov/patch

event_routing_backends/processors/xapi/event_transformers/grading_events.py#L62-L65

Added lines #L62 - L65 were not covered by tests

return Activity(

Check warning on line 67 in event_routing_backends/processors/xapi/event_transformers/grading_events.py

View check run for this annotation

Codecov / codecov/patch

event_routing_backends/processors/xapi/event_transformers/grading_events.py#L67

Added line #L67 was not covered by tests
id=object_id,
definition=ActivityDefinition(
type=constants.XAPI_ACTIVITY_COURSE,
name=LanguageMap(**({constants.EN: display_name} if display_name is not None else {})),
extensions=Extensions({
constants.XAPI_ACTIVITY_GRADE: self.get_data('data.percent_grade')*100,
# TODO letter_grade
# TODO course_version
# TODO grading_policy_hash
})
),
)
2 changes: 2 additions & 0 deletions event_routing_backends/settings/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,8 @@ def plugin_settings(settings):
'edx.course.enrollment.activated',
'edx.course.enrollment.deactivated',
'edx.course.enrollment.mode_changed',
'edx.grades.subsection.grade_calculated',
'edx.grades.course.grade_calculated',
'edx.forum.thread.created',
'edx.forum.thread.deleted',
'edx.forum.thread.edited',
Expand Down

0 comments on commit 2137bbb

Please sign in to comment.