Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion docs/getting_started.rst
Original file line number Diff line number Diff line change
Expand Up @@ -236,7 +236,7 @@ xAPI Filters
+-------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------+
| event_routing_backends.processors.xapi.transformer.xapi_transformer.get_verb | Intercepts and allows to modify the xAPI actor field, this affects all xAPI events |
+-------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------+
| event_routing_backends.processors.xapi.completion_events.completion_created.get_object | Allows to modify the xAPI object field, this just affects completion events |
| event_routing_backends.processors.xapi.completion_events.base_completion.get_object | Allows to modify the xAPI object field, this just affects completion events |
+-------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------+
| event_routing_backends.processors.xapi.enrollment_events.base_enrollment.get_object | Allows to modify the xAPI object field, this just affects enrollment events |
+-------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------+
Expand All @@ -260,6 +260,8 @@ xAPI Filters
+-------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------+
| event_routing_backends.processors.xapi.video_events.base_video.get_object | Allows to modify the xAPI object field, this affects all video events |
+-------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------+
| event_routing_backends.processors.xapi.progress_events.base_progress.get_object | Allows to modify the xAPI object field, this affects all progress events |
+-------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------+

.. _event-tracking: https://github.com/openedx/event-tracking

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
{
"name": "edx.completion_aggregator.completion.chapter",
"timestamp": "2023-12-05T21:34:52.909063+00:00",
"data": {
"user_id": 4,
"course_id": "course-v1:edX+DemoX+Demo_Course",
"context_key": "course-v1:edX+DemoX+Demo_Course",
"block_id": "block-v1:edX+DemoX+Demo_Course+type@chapter+block@b443e0d6bc4d43c1bed991dbd8a10d42",
"block_type": "course",
"percent": 0.5,
"earned": 5,
"possible": 10
},
"context": {
"course_id": "course-v1:edX+DemoX+Demo_Course",
"course_user_tags": {},
"session": "056aca2a1c6b76742b283e73d3424453",
"user_id": 3,
"username": "edx",
"ip": "172.18.0.1",
"host": "localhost:18000",
"agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36",
"path": "/courses/course-v1:edX+DemoX+Demo_Course/xblock/block-v1:edX+DemoX+Demo_Course+type@problem+block@7c54b16c8ed34f9f8772015178c7a175/handler/xmodule_handler/problem_check",
"referer": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course+type@vertical+block@dd8110c941b94d929b56841195213797?show_title=0&show_bookmark_button=0&recheck_access=1&view=student_view",
"accept_language": "en-US,en;q=0.9,es;q=0.8",
"client_id": null,
"org_id": "edX",
"enterprise_uuid": ""
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
{
"name": "edx.completion_aggregator.completion.course",
"timestamp": "2023-12-05T21:34:52.909063+00:00",
"data": {
"user_id": 4,
"course_id": "course-v1:edX+DemoX+Demo_Course",
"context_key": "course-v1:edX+DemoX+Demo_Course",
"block_id": "block-v1:edX+DemoX+Demo_Course+type@course+block@course",
"block_type": "course",
"percent": 0.8,
"earned": 8,
"possible": 10
},
"context": {
"course_id": "course-v1:edX+DemoX+Demo_Course",
"course_user_tags": {},
"session": "056aca2a1c6b76742b283e73d3424453",
"user_id": 3,
"username": "edx",
"ip": "172.18.0.1",
"host": "localhost:18000",
"agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36",
"path": "/courses/course-v1:edX+DemoX+Demo_Course/xblock/block-v1:edX+DemoX+Demo_Course+type@problem+block@7c54b16c8ed34f9f8772015178c7a175/handler/xmodule_handler/problem_check",
"referer": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course+type@vertical+block@dd8110c941b94d929b56841195213797?show_title=0&show_bookmark_button=0&recheck_access=1&view=student_view",
"accept_language": "en-US,en;q=0.9,es;q=0.8",
"client_id": null,
"org_id": "edX",
"enterprise_uuid": "",
"module": {
"display_name": "Checkboxes",
"usage_key": "block-v1:edX+DemoX+Demo_Course+type@problem+block@7c54b16c8ed34f9f8772015178c7a175"
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
{
"name": "edx.completion_aggregator.completion.sequential",
"timestamp": "2023-12-05T21:34:52.909063+00:00",
"data": {
"user_id": 4,
"course_id": "course-v1:edX+DemoX+Demo_Course",
"context_key": "course-v1:edX+DemoX+Demo_Course",
"block_id": "block-v1:edX+DemoX+Demo_Course+type@sequential+block@bf1eac10ebb649e3aaf9cc07325f8e04",
"block_type": "course",
"percent": 0.6,
"earned": 6,
"possible": 10
},
"context": {
"course_id": "course-v1:edX+DemoX+Demo_Course",
"course_user_tags": {},
"session": "056aca2a1c6b76742b283e73d3424453",
"user_id": 3,
"username": "edx",
"ip": "172.18.0.1",
"host": "localhost:18000",
"agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36",
"path": "/courses/course-v1:edX+DemoX+Demo_Course/xblock/block-v1:edX+DemoX+Demo_Course+type@problem+block@7c54b16c8ed34f9f8772015178c7a175/handler/xmodule_handler/problem_check",
"referer": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course+type@vertical+block@dd8110c941b94d929b56841195213797?show_title=0&show_bookmark_button=0&recheck_access=1&view=student_view",
"accept_language": "en-US,en;q=0.9,es;q=0.8",
"client_id": null,
"org_id": "edX",
"enterprise_uuid": ""
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
{
"name": "edx.completion_aggregator.completion.vertical",
"timestamp": "2023-12-05T21:34:52.909063+00:00",
"data": {
"user_id": 4,
"course_id": "course-v1:edX+DemoX+Demo_Course",
"context_key": "course-v1:edX+DemoX+Demo_Course",
"block_id": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@e1fabd9fa55f441caa75580f258ffbc3",
"block_type": "course",
"percent": 1,
"earned": 10,
"possible": 10
},
"context": {
"course_id": "course-v1:edX+DemoX+Demo_Course",
"course_user_tags": {},
"session": "056aca2a1c6b76742b283e73d3424453",
"user_id": 3,
"username": "edx",
"ip": "172.18.0.1",
"host": "localhost:18000",
"agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36",
"path": "/courses/course-v1:edX+DemoX+Demo_Course/xblock/block-v1:edX+DemoX+Demo_Course+type@problem+block@7c54b16c8ed34f9f8772015178c7a175/handler/xmodule_handler/problem_check",
"referer": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course+type@vertical+block@dd8110c941b94d929b56841195213797?show_title=0&show_bookmark_button=0&recheck_access=1&view=student_view",
"accept_language": "en-US,en;q=0.9,es;q=0.8",
"client_id": null,
"org_id": "edX",
"enterprise_uuid": ""
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
{
"name": "edx.completion_aggregator.progress.chapter",
"timestamp": "2023-12-05T21:34:52.909063+00:00",
"data": {
"user_id": 4,
"course_id": "course-v1:edX+DemoX+Demo_Course",
"context_key": "course-v1:edX+DemoX+Demo_Course",
"block_id": "block-v1:edX+DemoX+Demo_Course+type@chapter+block@b443e0d6bc4d43c1bed991dbd8a10d42",
"block_type": "course",
"percent": 0.5,
"earned": 5,
"possible": 10
},
"context": {
"course_id": "course-v1:edX+DemoX+Demo_Course",
"course_user_tags": {},
"session": "056aca2a1c6b76742b283e73d3424453",
"user_id": 3,
"username": "edx",
"ip": "172.18.0.1",
"host": "localhost:18000",
"agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36",
"path": "/courses/course-v1:edX+DemoX+Demo_Course/xblock/block-v1:edX+DemoX+Demo_Course+type@problem+block@7c54b16c8ed34f9f8772015178c7a175/handler/xmodule_handler/problem_check",
"referer": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course+type@vertical+block@dd8110c941b94d929b56841195213797?show_title=0&show_bookmark_button=0&recheck_access=1&view=student_view",
"accept_language": "en-US,en;q=0.9,es;q=0.8",
"client_id": null,
"org_id": "edX",
"enterprise_uuid": ""
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
{
"name": "edx.completion_aggregator.progress.course",
"timestamp": "2023-12-05T21:34:52.909063+00:00",
"data": {
"user_id": 4,
"course_id": "course-v1:edX+DemoX+Demo_Course",
"context_key": "course-v1:edX+DemoX+Demo_Course",
"block_id": "block-v1:edX+DemoX+Demo_Course+type@course+block@course",
"block_type": "course",
"percent": 0.8,
"earned": 8,
"possible": 10
},
"context": {
"course_id": "course-v1:edX+DemoX+Demo_Course",
"course_user_tags": {},
"session": "056aca2a1c6b76742b283e73d3424453",
"user_id": 3,
"username": "edx",
"ip": "172.18.0.1",
"host": "localhost:18000",
"agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36",
"path": "/courses/course-v1:edX+DemoX+Demo_Course/xblock/block-v1:edX+DemoX+Demo_Course+type@problem+block@7c54b16c8ed34f9f8772015178c7a175/handler/xmodule_handler/problem_check",
"referer": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course+type@vertical+block@dd8110c941b94d929b56841195213797?show_title=0&show_bookmark_button=0&recheck_access=1&view=student_view",
"accept_language": "en-US,en;q=0.9,es;q=0.8",
"client_id": null,
"org_id": "edX",
"enterprise_uuid": "",
"module": {
"display_name": "Checkboxes",
"usage_key": "block-v1:edX+DemoX+Demo_Course+type@problem+block@7c54b16c8ed34f9f8772015178c7a175"
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
{
"name": "edx.completion_aggregator.progress.sequential",
"timestamp": "2023-12-05T21:34:52.909063+00:00",
"data": {
"user_id": 4,
"course_id": "course-v1:edX+DemoX+Demo_Course",
"context_key": "course-v1:edX+DemoX+Demo_Course",
"block_id": "block-v1:edX+DemoX+Demo_Course+type@sequential+block@bf1eac10ebb649e3aaf9cc07325f8e04",
"block_type": "course",
"percent": 0.6,
"earned": 6,
"possible": 10
},
"context": {
"course_id": "course-v1:edX+DemoX+Demo_Course",
"course_user_tags": {},
"session": "056aca2a1c6b76742b283e73d3424453",
"user_id": 3,
"username": "edx",
"ip": "172.18.0.1",
"host": "localhost:18000",
"agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36",
"path": "/courses/course-v1:edX+DemoX+Demo_Course/xblock/block-v1:edX+DemoX+Demo_Course+type@problem+block@7c54b16c8ed34f9f8772015178c7a175/handler/xmodule_handler/problem_check",
"referer": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course+type@vertical+block@dd8110c941b94d929b56841195213797?show_title=0&show_bookmark_button=0&recheck_access=1&view=student_view",
"accept_language": "en-US,en;q=0.9,es;q=0.8",
"client_id": null,
"org_id": "edX",
"enterprise_uuid": ""
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
{
"name": "edx.completion_aggregator.progress.vertical",
"timestamp": "2023-12-05T21:34:52.909063+00:00",
"data": {
"user_id": 4,
"course_id": "course-v1:edX+DemoX+Demo_Course",
"context_key": "course-v1:edX+DemoX+Demo_Course",
"block_id": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@e1fabd9fa55f441caa75580f258ffbc3",
"block_type": "course",
"percent": 1,
"earned": 10,
"possible": 10
},
"context": {
"course_id": "course-v1:edX+DemoX+Demo_Course",
"course_user_tags": {},
"session": "056aca2a1c6b76742b283e73d3424453",
"user_id": 3,
"username": "edx",
"ip": "172.18.0.1",
"host": "localhost:18000",
"agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36",
"path": "/courses/course-v1:edX+DemoX+Demo_Course/xblock/block-v1:edX+DemoX+Demo_Course+type@problem+block@7c54b16c8ed34f9f8772015178c7a175/handler/xmodule_handler/problem_check",
"referer": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course+type@vertical+block@dd8110c941b94d929b56841195213797?show_title=0&show_bookmark_button=0&recheck_access=1&view=student_view",
"accept_language": "en-US,en;q=0.9,es;q=0.8",
"client_id": null,
"org_id": "edX",
"enterprise_uuid": ""
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,10 @@
All xAPI transformers.
"""

from event_routing_backends.processors.xapi.event_transformers.completion_events import CompletionCreatedTransformer
from event_routing_backends.processors.xapi.event_transformers.completion_events import (
CourseCompletionTransformer,
ModuleCompletionTransformer,
)
from event_routing_backends.processors.xapi.event_transformers.enrollment_events import (
EnrollmentActivatedTransformer,
EnrollmentDeactivatedTransformer,
Expand Down Expand Up @@ -39,6 +42,11 @@
ProblemEventsTransformer,
ProblemSubmittedTransformer,
)
from event_routing_backends.processors.xapi.event_transformers.progress_events import (
CompletionCreatedTransformer,
CourseProgressTransformer,
ModuleProgressTransformer,
)
from event_routing_backends.processors.xapi.event_transformers.video_events import (
VideoCCTransformers,
VideoCompletedTransformer,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,54 +1,58 @@
"""
Transformers for forum related events.
Transformers for completion related events.
"""
from tincan import Activity, ActivityDefinition, Extensions, LanguageMap, Result, Verb
from tincan import Activity, ActivityDefinition, LanguageMap, Verb

from event_routing_backends.processors.openedx_filters.decorators import openedx_filter
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


@XApiTransformersRegistry.register("edx.completion.block_completion.changed")
class CompletionCreatedTransformer(XApiTransformer):
class BaseCompletionTransformer(XApiTransformer):
"""
Transformers for event generated when an student completion is created or updated.
Base transformer for completion events.
"""

_verb = Verb(
id=constants.XAPI_VERB_PROGRESSED,
display=LanguageMap({constants.EN: constants.PROGRESSED}),
id=constants.XAPI_VERB_COMPLETED,
display=LanguageMap({constants.EN: constants.COMPLETED}),
)

additional_fields = ('result', )
object_type = None

@openedx_filter(
filter_type="event_routing_backends.processors.xapi.completion_events.completion_created.get_object",
filter_type="event_routing_backends.processors.xapi.completion_events.base_completion.get_object",
)
def get_object(self):
"""
Get object for xAPI transformed event related to a thread.
Get object for xAPI transformed event.

Returns:
`Activity`
"""
if not self.object_type:
raise NotImplementedError()

return Activity(
id=self.get_object_iri("xblock", self.get_data("data.block_id")),
definition=ActivityDefinition(
type=constants.XAPI_ACTIVITY_RESOURCE,
type=self.object_type,
),
)

def get_result(self):
"""
Get result for xAPI transformed event related to a thread.

Returns:
`Result`
"""
return Result(
completion=self.get_data("data.completion") == 1.0,
extensions=Extensions(
{constants.XAPI_ACTIVITY_PROGRESS: self.get_data("data.completion")*100}
),
)
@XApiTransformersRegistry.register("edx.completion_aggregator.completion.chapter")
@XApiTransformersRegistry.register("edx.completion_aggregator.completion.sequential")
@XApiTransformersRegistry.register("edx.completion_aggregator.completion.vertical")
class ModuleCompletionTransformer(BaseCompletionTransformer):
"""
Transformer for events generated when a user completes a section, subsection or unit.
"""
object_type = constants.XAPI_ACTIVITY_MODULE


@XApiTransformersRegistry.register("edx.completion_aggregator.completion.course")
class CourseCompletionTransformer(BaseCompletionTransformer):
"""
Transformer for event generated when a user completes a course.
"""
object_type = constants.XAPI_ACTIVITY_COURSE
Loading