diff --git a/joint_teapot/app.py b/joint_teapot/app.py index ca34ccf..c0bc0bb 100644 --- a/joint_teapot/app.py +++ b/joint_teapot/app.py @@ -242,6 +242,13 @@ def create_personal_channels_on_mm( ) -> None: tea.pot.create_channels_for_individuals(invite_teaching_team) +@app.command( + "invite-students-to-mm-team", + help="invite all canvas students to the mattermost team", +) +def invite_students_to_mattermost_team() -> None: + tea.pot.invite_students_to_mattermost_team() + @app.command( "create-webhooks-for-mm", diff --git a/joint_teapot/teapot.py b/joint_teapot/teapot.py index d2954e3..f2494a3 100644 --- a/joint_teapot/teapot.py +++ b/joint_teapot/teapot.py @@ -231,6 +231,9 @@ class Teapot: self.canvas.students, invite_teaching_teams ) + def invite_students_to_mattermost_team(self) -> None: + return self.mattermost.invite_students_to_team(self.canvas.students) + def joj3_post_issue( self, env: joj3.Env, diff --git a/joint_teapot/workers/canvas.py b/joint_teapot/workers/canvas.py index 641b8af..2ba1782 100644 --- a/joint_teapot/workers/canvas.py +++ b/joint_teapot/workers/canvas.py @@ -39,8 +39,19 @@ class Canvas: student.name = ( re.sub(r"[^\x00-\x7F]+", "", student.name).strip().title() ) # We only care english name - student.sis_id = student.login_id - student.login_id = student.email.split("@")[0] + # Some users (like system users, announcers) might not have login_id + if hasattr(student, 'login_id') and student.login_id: + student.sis_id = student.login_id + student.login_id = student.email.split("@")[0] + else: + # For users without login_id, use email prefix as both sis_id and login_id + if hasattr(student, 'email') and student.email: + student.login_id = student.email.split("@")[0] + student.sis_id = student.login_id + else: + # Fallback for users without email + student.login_id = f"user_{student.id}" + student.sis_id = student.login_id return student self.students = [ diff --git a/joint_teapot/workers/mattermost.py b/joint_teapot/workers/mattermost.py index 93cc47d..a96721b 100644 --- a/joint_teapot/workers/mattermost.py +++ b/joint_teapot/workers/mattermost.py @@ -7,6 +7,7 @@ from mattermostdriver import Driver from joint_teapot.config import settings from joint_teapot.utils.logger import logger from joint_teapot.workers.gitea import Gitea +from joint_teapot.workers.canvas import User class Mattermost: @@ -229,14 +230,21 @@ class Mattermost: logger.warning(f"Error when creating outgoing webhook at Gitea: {e}") # unused since we can give students invitation links instead - def invite_students_to_team(self, students: List[str]) -> None: + def invite_students_to_team(self, students: List[User]) -> None: for student in students: + username = student.login_id + + if not username: + student_id = getattr(student, 'id', 'unknown') + logger.warning(f"Student {student_id} has no login_id, skipping") + continue + try: - mmuser = self.endpoint.users.get_user_by_username(student) + mmuser = self.endpoint.users.get_user_by_username(username) except Exception: - logger.warning(f"User {student} is not found on the Mattermost server") + logger.warning(f"User {username} is not found on the Mattermost server") continue self.endpoint.teams.add_user_to_team( self.team["id"], {"user_id": mmuser["id"], "team_id": self.team["id"]} ) - logger.info(f"Added user {student} to team {self.team['name']}") + logger.info(f"Added user {username} to team {self.team['name']}")