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",
)
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__":

View File

@ -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__":

View File

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