feat: improve function of adding students to mm team (#61)
All checks were successful
build / trigger-build-image (push) Successful in 44s

This commit is contained in:
Lyd 2026-03-15 14:02:58 +08:00 committed by GitHub
parent 66e045fed9
commit 0543701712
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 35 additions and 6 deletions

View File

@ -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",

View File

@ -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,

View File

@ -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 = [

View File

@ -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']}")