diff --git a/joint_teapot/app.py b/joint_teapot/app.py index 38e5d3b..e25f2cf 100644 --- a/joint_teapot/app.py +++ b/joint_teapot/app.py @@ -141,14 +141,12 @@ def upload_assignment_grades(assignments_dir: Path, assignment_name: str) -> Non " gitea", ) def create_channels_on_mm(prefix: str = Argument("")) -> None: - groups = [ - group - for group in tea.pot.gitea.get_all_teams() - if isinstance(group["name"], str) and group["name"].startswith(prefix) - ] - logger.info( - f"{len(groups)} channels to be created: {groups[0]['name']} ... {groups[-1]['name']}" - ) + groups = { + group_name: members + for group_name, members in tea.pot.gitea.get_all_teams().items() + if group_name.startswith(prefix) + } + logger.info(f"{len(groups)} channel(s) to be created: {groups.keys()}") tea.pot.mattermost.create_channels_for_groups(groups) @@ -158,13 +156,13 @@ def create_channels_on_mm(prefix: str = Argument("")) -> None: "and configure them so that updates on gitea will be pushed to the mm channel", ) def create_webhooks_for_mm(prefix: str = Argument("")) -> None: - groups = [ - group["name"] - for group in tea.pot.gitea.get_all_teams() - if isinstance(group["name"], str) and group["name"].startswith(prefix) + repo_names = [ + group_name + for group_name in tea.pot.gitea.get_all_teams().keys() + if group_name.startswith(prefix) ] - logger.info(f"{len(groups)} pairs to be created: {groups[0]} ... {groups[-1]}") - tea.pot.mattermost.create_webhooks_for_repos(groups, tea.pot.gitea) + logger.info(f"{len(repo_names)} pair(s) of webhooks to be created: {repo_names}") + tea.pot.mattermost.create_webhooks_for_repos(repo_names, tea.pot.gitea) if __name__ == "__main__": diff --git a/joint_teapot/workers/gitea.py b/joint_teapot/workers/gitea.py index efb7bdf..0b4c485 100644 --- a/joint_teapot/workers/gitea.py +++ b/joint_teapot/workers/gitea.py @@ -1,7 +1,7 @@ from datetime import datetime from enum import Enum from functools import lru_cache -from typing import Any, Callable, Dict, Iterable, List, Optional, Tuple, TypeVar, Union +from typing import Any, Callable, Dict, Iterable, List, Optional, Tuple, TypeVar import focs_gitea from canvasapi.group import Group, GroupMembership @@ -378,19 +378,12 @@ class Gitea: self.org_name, repo.name, body={"archived": True} ) - def get_all_teams( - self, - ) -> List[Dict[str, Union[str, List[str]]]]: - ret: List[Dict[str, Union[str, List[str]]]] = [] - try: - teams_raw = self.organization_api.org_list_teams(self.org_name) - except ApiException as e: - logger.error(f"Failed to get teams from organization {self.org_name}: {e}") - exit(1) - for team_raw in teams_raw: - if team_raw.name == "Owners": + def get_all_teams(self) -> Dict[str, List[str]]: + res: Dict[str, List[str]] = {} + for team in list_all(self.organization_api.org_list_teams, self.org_name): + if team.name == "Owners": continue - team_id = team_raw.id + team_id = team.id try: members = [ m.login.lower() @@ -401,8 +394,8 @@ class Gitea: f"Failed to get members of team {team_id} in {self.org_name}: {e}" ) continue - ret.append({"name": team_raw.name, "members": members}) - return ret + res[team.name] = members + return res if __name__ == "__main__": diff --git a/joint_teapot/workers/mattermost.py b/joint_teapot/workers/mattermost.py index 5415a4f..de95457 100644 --- a/joint_teapot/workers/mattermost.py +++ b/joint_teapot/workers/mattermost.py @@ -1,4 +1,4 @@ -from typing import Dict, List, Union +from typing import Dict, List import focs_gitea from mattermostdriver import Driver @@ -39,26 +39,24 @@ class Mattermost: logger.error(f"Cannot get team {team_name}: {e}") return - def create_channels_for_groups( - self, groups: List[Dict[str, Union[str, List[str]]]] - ) -> None: - for group in groups: + def create_channels_for_groups(self, groups: Dict[str, List[str]]) -> None: + for group_name, members in groups.items(): try: channel = self.endpoint.channels.create_channel( { "team_id": self.team["id"], - "name": group["name"], - "display_name": group["name"], + "name": group_name, + "display_name": group_name, "type": "P", # create private channels } ) - logger.info(f"Added group {group['name']} to Mattermost") + logger.info(f"Added group {group_name} to Mattermost") except Exception as e: logger.warning( - f"Error when creating channel {group['name']}: {e} Perhaps channel already exists?" + f"Error when creating channel {group_name}: {e} Perhaps channel already exists?" ) continue - for member in group["members"]: + for member in members: try: mmuser = self.endpoint.users.get_user_by_username(member) except Exception: @@ -78,7 +76,7 @@ class Mattermost: ) except Exception: logger.warning(f"User {member} is not in the team") - logger.info(f"Added member {member} to channel {group['name']}") + logger.info(f"Added member {member} to channel {group_name}") def create_webhooks_for_repos(self, repos: List[str], gitea: Gitea) -> None: # one group corresponds to one repo so these concepts can be used interchangably