feat: suffix argument to mm channel creation (#15)

This commit is contained in:
Salty Fish 2022-06-24 23:16:21 -04:00 committed by GitHub
parent d674fbbc27
commit 462500b33e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 36 additions and 12 deletions

View File

@ -37,60 +37,77 @@ pytest -svv
## Commands & Features ## Commands & Features
### `archive-all-repos` ### `archive-all-repos`
archive all repos in gitea organization archive all repos in gitea organization
### `check-issues` ### `check-issues`
check the existence of issue by title on gitea check the existence of issue by title on gitea
### `checkout-releases` ### `checkout-releases`
checkout git repo to git tag fetched from gitea by release name, with due date checkout git repo to git tag fetched from gitea by release name, with due date
### `clone-all-repos` ### `clone-all-repos`
clone all gitea repos to local clone all gitea repos to local
### `close-all-issues` ### `close-all-issues`
close all issues and pull requests in gitea organization close all issues and pull requests in gitea organization
### `create-channels-on-mm` ### `create-channels-on-mm`
create channels for student groups according to group information on gitea. Optionally specify a prefix to ignore all repos whose names do not start with it.
Example: `python3 -m joint_teapot create_channels_for_groups p1` will fetch all repos whose names start with `"p1"` and create same-name channels on mm for these repos. Members of a repo will be added to the corresponding channel. create channels for student groups according to group information on gitea. Optionally specify a prefix to ignore all repos whose names do not start with it. Optionally specify a suffix to add to all channels created.
Example: `python3 -m joint_teapot create_channels_for_groups --prefix p1 -suffix -private` will fetch all repos whose names start with `"p1"` and create channels on mm for these repos like "p1team1-private". Members of a repo will be added to the corresponding channel.
### `create-issues` ### `create-issues`
create issues on gitea create issues on gitea
### `create-personal-repos` ### `create-personal-repos`
create personal repos on gitea for all canvas students create personal repos on gitea for all canvas students
### `create-teams` ### `create-teams`
create teams on gitea by canvas groups create teams on gitea by canvas groups
### `create-webhooks-for-mm` ### `create-webhooks-for-mm`
Create a pair of webhooks on gitea and mm for all student groups on gitea, and configure them so that updates on gitea will be pushed to the mm channel. Optionally specify a prefix to ignore all repos whose names do not start with it. Create a pair of webhooks on gitea and mm for all student groups on gitea, and configure them so that updates on gitea will be pushed to the mm channel. Optionally specify a prefix to ignore all repos whose names do not start with it.
Example: `python3 -m joint_teapot create-webhooks-for-mm p1` will fetch all repos whose names start with `"p1"` and create two-way webhooks for these repos. All repos should already have same-name mm channels. If not, use `create-channels-on-mm` to create them. Example: `python3 -m joint_teapot create-webhooks-for-mm p1` will fetch all repos whose names start with `"p1"` and create two-way webhooks for these repos. All repos should already have same-name mm channels. If not, use `create-channels-on-mm` to create them.
### `get-no-collaborator-repos` ### `get-no-collaborator-repos`
list all repos with no collaborators list all repos with no collaborators
### `get-public-keys` ### `get-public-keys`
list all public keys on gitea list all public keys on gitea
### `get-repos-status` ### `get-repos-status`
list status of all repos with conditions list status of all repos with conditions
### `invite-to-teams` ### `invite-to-teams`
invite all canvas students to gitea teams by team name invite all canvas students to gitea teams by team name
### `prepare-assignment-dir` ### `prepare-assignment-dir`
prepare assignment dir from extracted canvas "Download Submissions" zip prepare assignment dir from extracted canvas "Download Submissions" zip
### `unsubscribe-from-repos` ### `unsubscribe-from-repos`
Unsubscribe from all repos in the organization specified in the config file where the repo name matches a given regex expression. Unsubscribe from all repos in the organization specified in the config file where the repo name matches a given regex expression.
Example: `python3 -m joint_teapot unsubscribe-from-repos '\d{12}$'` will remove all repos whose names end with a student ID number from your gitea subscription list. Refer to the Python `re` module docs for more info about regex. Example: `python3 -m joint_teapot unsubscribe-from-repos '\d{12}$'` will remove all repos whose names end with a student ID number from your gitea subscription list. Refer to the Python `re` module docs for more info about regex.
### `upload-assignment-grades` ### `upload-assignment-grades`
upload assignment grades to canvas from grade file (GRADE.txt by default), read the first line as grade, the rest as comments upload assignment grades to canvas from grade file (GRADE.txt by default), read the first line as grade, the rest as comments
## License ## License

View File

@ -2,7 +2,7 @@ from datetime import datetime
from pathlib import Path from pathlib import Path
from typing import List from typing import List
from typer import Argument, Typer, echo from typer import Argument, Option, Typer, echo
from joint_teapot.teapot import Teapot from joint_teapot.teapot import Teapot
from joint_teapot.utils.logger import logger from joint_teapot.utils.logger import logger
@ -140,14 +140,18 @@ def upload_assignment_grades(assignments_dir: Path, assignment_name: str) -> Non
help="create channels for student groups according to group information on" help="create channels for student groups according to group information on"
" gitea", " gitea",
) )
def create_channels_on_mm(prefix: str = Argument("")) -> None: def create_channels_on_mm(prefix: str = Option(""), suffix: str = Option("")) -> None:
groups = { groups = {
group_name: members group_name: members
for group_name, members in tea.pot.gitea.get_all_teams().items() for group_name, members in tea.pot.gitea.get_all_teams().items()
if group_name.startswith(prefix) if group_name.startswith(prefix)
} }
logger.info(f"{len(groups)} channel(s) to be created: {groups.keys()}") logger.info(
tea.pot.mattermost.create_channels_for_groups(groups) f"{len(groups)} channel(s) to be created "
+ (f"with suffix {suffix}" if suffix else "")
+ f": {','.join(groups.keys())}"
)
tea.pot.mattermost.create_channels_for_groups(groups, suffix)
@app.command( @app.command(

View File

@ -39,21 +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(self, groups: Dict[str, List[str]]) -> None: def create_channels_for_groups(
self, groups: Dict[str, List[str]], suffix: str = ""
) -> None:
for group_name, members in groups.items(): for group_name, members in groups.items():
channel_name = group_name + suffix
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": channel_name,
"display_name": group_name, "display_name": channel_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 {channel_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 {channel_name}: {e} Perhaps channel already exists?"
) )
continue continue
for member in members: for member in members:
@ -76,7 +79,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 {channel_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 interchangeably # one group corresponds to one repo so these concepts can be used interchangeably