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/remove course staff role events #267

Merged
merged 10 commits into from
Oct 2, 2023
Merged
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
8 changes: 7 additions & 1 deletion CHANGELOG.rst
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,17 @@ Changed
~~~~~~~
* Re-licensed this repository from AGPL 3.0 to Apache 2.0

[8.8.0] - 2023-10-02
--------------------
Added
~~~~~
* Added new ``MANAGE_STUDENTS_PERMISSION_ADDED`` and ``MANAGE_STUDENTS_PERMISSION_REMOVED`` events in learning

[8.7.0] - 2023-09-29
--------------------
Added
~~~~~
* Added new ``EXAM_ATTEMPT_SUBMITTED``, ``EXAM_ATTEMPT_REJECTED``, ``EXAM_ATTEMPT_VERIFIED``, ``EXAM_ATTEMPT_RESET``, and ``EXAM_ATTEMPT_ERRORED`` in learning.
* Added new ``EXAM_ATTEMPT_SUBMITTED``, ``EXAM_ATTEMPT_REJECTED``, ``EXAM_ATTEMPT_VERIFIED``, ``EXAM_ATTEMPT_RESET``, and ``EXAM_ATTEMPT_ERRORED`` events in learning.

[8.6.0] - 2023-08-28
--------------------
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
11. Enable producing to event bus via settings
12. Enable producing to event bus via settings
Copy link
Member

Choose a reason for hiding this comment

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

Thank you for this! I totally missed it.

##############################################

Status
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
12. Event definitions for special exam post-submission and review
13. Event definitions for special exam post-submission and review
#################################################################

Status
Expand Down
2 changes: 1 addition & 1 deletion openedx_events/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,4 @@
more information about the project.
"""

__version__ = "8.7.0"
__version__ = "8.8.0"
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,9 @@
{
"name": "course_staff_data",
"type": {
"name": "CourseStaffData",
"name": "ManageStudentsPermissionData",
"type": "record",
"fields": [
{
"name": "course_key",
"type": "string"
},
{
"name": "user",
"type": {
Expand Down Expand Up @@ -50,10 +46,30 @@
}
]
}
},
{
"name": "permission",
"type": "string"
},
{
"name": "course_key",
"type": [
"null",
"string"
],
"default": null
},
{
"name": "org",
"type": [
"null",
"string"
],
"default": null
}
]
}
}
],
"namespace": "org.openedx.learning.user.course.staff.role.added.v1"
"namespace": "org.openedx.learning.user.manage.students.permission.added.v1"
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,9 @@
{
"name": "course_staff_data",
"type": {
"name": "CourseStaffData",
"name": "ManageStudentsPermissionData",
"type": "record",
"fields": [
{
"name": "course_key",
"type": "string"
},
{
"name": "user",
"type": {
Expand Down Expand Up @@ -50,10 +46,30 @@
}
]
}
},
{
"name": "permission",
"type": "string"
},
{
"name": "course_key",
"type": [
"null",
"string"
],
"default": null
},
{
"name": "org",
"type": [
"null",
"string"
],
"default": null
}
]
}
}
],
"namespace": "org.openedx.learning.user.course.staff.role.removed.v1"
"namespace": "org.openedx.learning.user.manage.students.permission.removed.v1"
}
43 changes: 43 additions & 0 deletions openedx_events/learning/data.py
Original file line number Diff line number Diff line change
Expand Up @@ -329,3 +329,46 @@ class ExamAttemptData:
usage_key = attr.ib(type=UsageKey)
exam_type = attr.ib(type=str)
requesting_user = attr.ib(type=UserData, default=None)


@attr.s(frozen=True)
class ManageStudentsPermissionData:
"""
Attributes defined for the Open edX to represent users that can manage students within a course/org.

IMPORTANT:
edX currently uses roles, and only roles, to decide what kind of access a user has.

There is an ongoing project to replace this roles-only system with a system that uses roles that are
made up of permissions, which is being worked on in parallel with another project to emit events
whenever users are assigned any type of "Course Staff" role.

It's unclear what the state of this roles/permissions project will be the time the events project
is completed, so each project's respective teams will stay in touch with each other.

For now, we're making a best effort to publish this an event that will regard the permission(s)
we'd expect to "filter" for in the future (For more info, please check out this document:
https://docs.google.com/spreadsheets/d/1htsV0eWq5-y96DZ5A245ukfZ4_qeH0KjHVaOyfqD8OA/edit#gid=908503896)
and not for the roles we have now. Likely this/these permission(s) will be something like `manage_students`,
but we need to evaluate how this will align with some possible future roles such as `limited_staff` or `ccx`.

As such, the current plan is to do one of the following once the roles/permissions project's
feature branch is merged to master:
1. Modify this event to "filter" by the correct permissions once the
2. As a backup plan, make a new event if this proves too difficult.

Until either of these plans are executed, this comment under the IMPORTANT header should stay put.

Arguments:
user (UserData): User who will have a role/permission assigned/removed.
permission (str): The permission the user is being assigned.
course_key (Course ID): identifier of the course where the user will have staff role assigned/removed.
A blank course_id implies org wide role.
org (str): identifier of the org where the user will have staff role assigned/removed.
A blank org is for global group based roles such as course creator (may be deprecated).
"""

user = attr.ib(type=UserData)
Copy link
Member

Choose a reason for hiding this comment

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

which other fields do you think would be useful?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I added some other fields based on the current parameters that CourseAccessRole currently takes: https://github.com/openedx/edx-platform/blob/master/common/djangoapps/student/roles.py#L448

Please note that this is subject to change in the future due to the concurrent roles/permissions project that is being done (see the "IMPORTANT:" comment in the event data for more details).

Copy link
Member

Choose a reason for hiding this comment

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

That's better. Thank you!

permission = attr.ib(type=str)
course_key = attr.ib(type=str, default=None)
org = attr.ib(type=str, default=None)
23 changes: 23 additions & 0 deletions openedx_events/learning/signals.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
CourseDiscussionConfigurationData,
CourseEnrollmentData,
ExamAttemptData,
ManageStudentsPermissionData,
PersistentCourseGradeData,
ProgramCertificateData,
UserData,
Expand Down Expand Up @@ -252,3 +253,25 @@
"exam_attempt": ExamAttemptData,
}
)

# .. event_type: org.openedx.learning.user.manage.students.permission.added.v1
# .. event_name: MANAGE_STUDENTS_PERMISSION_ADDED
# .. event_description: Emitted when permission to manage students within a course is given to a user.
# .. event_data: ManageStudentsPermissionData
MANAGE_STUDENTS_PERMISSION_ADDED = OpenEdxPublicSignal(
event_type="org.openedx.learning.user.manage.students.permission.added.v1",
data={
"course_staff_data": ManageStudentsPermissionData,
}
)

# .. event_type: org.openedx.learning.user.manage.students.permission.removed.v1
# .. event_name: MANAGE_STUDENTS_PERMISSION_REMOVED
# .. event_description: Emitted when permission to manage students within a course is removed from a user.
# .. event_data: ManageStudentsPermissionData
MANAGE_STUDENTS_PERMISSION_REMOVED = OpenEdxPublicSignal(
event_type="org.openedx.learning.user.manage.students.permission.removed.v1",
data={
"course_staff_data": ManageStudentsPermissionData,
}
)