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: ) -> None:
tea.pot.create_channels_for_individuals(invite_teaching_team) 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( @app.command(
"create-webhooks-for-mm", "create-webhooks-for-mm",

View File

@ -231,6 +231,9 @@ class Teapot:
self.canvas.students, invite_teaching_teams 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( def joj3_post_issue(
self, self,
env: joj3.Env, env: joj3.Env,

View File

@ -39,8 +39,19 @@ class Canvas:
student.name = ( student.name = (
re.sub(r"[^\x00-\x7F]+", "", student.name).strip().title() re.sub(r"[^\x00-\x7F]+", "", student.name).strip().title()
) # We only care english name ) # We only care english name
# 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.sis_id = student.login_id
student.login_id = student.email.split("@")[0] 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 return student
self.students = [ self.students = [

View File

@ -7,6 +7,7 @@ from mattermostdriver import Driver
from joint_teapot.config import settings from joint_teapot.config import settings
from joint_teapot.utils.logger import logger from joint_teapot.utils.logger import logger
from joint_teapot.workers.gitea import Gitea from joint_teapot.workers.gitea import Gitea
from joint_teapot.workers.canvas import User
class Mattermost: class Mattermost:
@ -229,14 +230,21 @@ class Mattermost:
logger.warning(f"Error when creating outgoing webhook at Gitea: {e}") logger.warning(f"Error when creating outgoing webhook at Gitea: {e}")
# unused since we can give students invitation links instead # 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: 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: try:
mmuser = self.endpoint.users.get_user_by_username(student) mmuser = self.endpoint.users.get_user_by_username(username)
except Exception: 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 continue
self.endpoint.teams.add_user_to_team( self.endpoint.teams.add_user_to_team(
self.team["id"], {"user_id": mmuser["id"], "team_id": self.team["id"]} 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']}")