chore: List[Dict] -> Dict[str, List]

This commit is contained in:
张泊明518370910136 2022-05-28 00:34:07 +08:00
parent b9b1513542
commit 934343ea7e
No known key found for this signature in database
GPG Key ID: FBEF5DE8B9F4C629
3 changed files with 29 additions and 40 deletions

View File

@ -141,14 +141,12 @@ def upload_assignment_grades(assignments_dir: Path, assignment_name: str) -> Non
" gitea", " gitea",
) )
def create_channels_on_mm(prefix: str = Argument("")) -> None: def create_channels_on_mm(prefix: str = Argument("")) -> None:
groups = [ groups = {
group group_name: members
for group in tea.pot.gitea.get_all_teams() for group_name, members in tea.pot.gitea.get_all_teams().items()
if isinstance(group["name"], str) and group["name"].startswith(prefix) if group_name.startswith(prefix)
] }
logger.info( logger.info(f"{len(groups)} channel(s) to be created: {groups.keys()}")
f"{len(groups)} channels to be created: {groups[0]['name']} ... {groups[-1]['name']}"
)
tea.pot.mattermost.create_channels_for_groups(groups) 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", "and configure them so that updates on gitea will be pushed to the mm channel",
) )
def create_webhooks_for_mm(prefix: str = Argument("")) -> None: def create_webhooks_for_mm(prefix: str = Argument("")) -> None:
groups = [ repo_names = [
group["name"] group_name
for group in tea.pot.gitea.get_all_teams() for group_name in tea.pot.gitea.get_all_teams().keys()
if isinstance(group["name"], str) and group["name"].startswith(prefix) if group_name.startswith(prefix)
] ]
logger.info(f"{len(groups)} pairs to be created: {groups[0]} ... {groups[-1]}") logger.info(f"{len(repo_names)} pair(s) of webhooks to be created: {repo_names}")
tea.pot.mattermost.create_webhooks_for_repos(groups, tea.pot.gitea) tea.pot.mattermost.create_webhooks_for_repos(repo_names, tea.pot.gitea)
if __name__ == "__main__": if __name__ == "__main__":

View File

@ -1,7 +1,7 @@
from datetime import datetime from datetime import datetime
from enum import Enum from enum import Enum
from functools import lru_cache 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 import focs_gitea
from canvasapi.group import Group, GroupMembership from canvasapi.group import Group, GroupMembership
@ -378,19 +378,12 @@ class Gitea:
self.org_name, repo.name, body={"archived": True} self.org_name, repo.name, body={"archived": True}
) )
def get_all_teams( def get_all_teams(self) -> Dict[str, List[str]]:
self, res: Dict[str, List[str]] = {}
) -> List[Dict[str, Union[str, List[str]]]]: for team in list_all(self.organization_api.org_list_teams, self.org_name):
ret: List[Dict[str, Union[str, List[str]]]] = [] if team.name == "Owners":
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":
continue continue
team_id = team_raw.id team_id = team.id
try: try:
members = [ members = [
m.login.lower() m.login.lower()
@ -401,8 +394,8 @@ class Gitea:
f"Failed to get members of team {team_id} in {self.org_name}: {e}" f"Failed to get members of team {team_id} in {self.org_name}: {e}"
) )
continue continue
ret.append({"name": team_raw.name, "members": members}) res[team.name] = members
return ret return res
if __name__ == "__main__": if __name__ == "__main__":

View File

@ -1,4 +1,4 @@
from typing import Dict, List, Union from typing import Dict, List
import focs_gitea import focs_gitea
from mattermostdriver import Driver from mattermostdriver import Driver
@ -39,26 +39,24 @@ class Mattermost:
logger.error(f"Cannot get team {team_name}: {e}") logger.error(f"Cannot get team {team_name}: {e}")
return return
def create_channels_for_groups( def create_channels_for_groups(self, groups: Dict[str, List[str]]) -> None:
self, groups: List[Dict[str, Union[str, List[str]]]] for group_name, members in groups.items():
) -> None:
for group in groups:
try: try:
channel = self.endpoint.channels.create_channel( channel = self.endpoint.channels.create_channel(
{ {
"team_id": self.team["id"], "team_id": self.team["id"],
"name": group["name"], "name": group_name,
"display_name": group["name"], "display_name": group_name,
"type": "P", # create private channels "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: except Exception as e:
logger.warning( 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 continue
for member in group["members"]: for member in members:
try: try:
mmuser = self.endpoint.users.get_user_by_username(member) mmuser = self.endpoint.users.get_user_by_username(member)
except Exception: except Exception:
@ -78,7 +76,7 @@ class Mattermost:
) )
except Exception: except Exception:
logger.warning(f"User {member} is not in the team") 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: 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 # one group corresponds to one repo so these concepts can be used interchangably