forked from JOJ/Joint-Teapot
		
	feat: suffix argument to mm channel creation (#15)
This commit is contained in:
		
							parent
							
								
									d674fbbc27
								
							
						
					
					
						commit
						462500b33e
					
				
							
								
								
									
										21
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										21
									
								
								README.md
									
									
									
									
									
								
							|  | @ -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 | ||||||
|  |  | ||||||
|  | @ -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( | ||||||
|  |  | ||||||
|  | @ -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 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Salty Fish
						Salty Fish