Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add aggregator events #6

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
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:
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This could raise multple 500? when object_type is not defined. Is it possible?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this works like an abstract class, if someone use this instead of one of the sub-classes will get the errors that you mentioned

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
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Intesresting that module encompasses section, subsection or unit

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Based on the nelc requirements this should be module they doesn't make any differences between unit section and sub-sections



@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