From a9d7aef6dd82545e3b02954b3c502495a98ac4d4 Mon Sep 17 00:00:00 2001 From: Artur Borecki Date: Tue, 5 May 2026 12:44:01 +0200 Subject: [PATCH] feat(signals.py): add gitea repo to team --- home/signals.py | 135 +++++++++++++++++++++++++++++++----------------- 1 file changed, 89 insertions(+), 46 deletions(-) diff --git a/home/signals.py b/home/signals.py index 27cd05e..0d562a1 100644 --- a/home/signals.py +++ b/home/signals.py @@ -117,55 +117,98 @@ def create_gitea_repo_on_lesson_creation( logger.debug("GITEA_URL is not set, skipping Gitea repository creation") return - # check if repository already exists - try: - response = requests.get( - f"{api_url}/orgs/{GITEA_ORG_NAME}/repos", - timeout=5, - headers={"Authorization": f"token {os.getenv('GITEA_API_TOKEN')}"}, - ) - response.raise_for_status() - repos = response.json() - if any(repo["name"] == repo_name for repo in repos): - logger.info( - f"Gitea repository {repo_name} already exists, skipping creation" + def create_repository() -> None: + # check if repository already exists + try: + response = requests.get( + f"{api_url}/orgs/{GITEA_ORG_NAME}/repos", + timeout=5, + headers={"Authorization": f"token {os.getenv('GITEA_API_TOKEN')}"}, + ) + response.raise_for_status() + repos = response.json() + if any(repo["name"] == repo_name for repo in repos): + logger.info( + f"Gitea repository {repo_name} already exists, skipping creation" + ) + return + except Exception as e: + logger.exception( + f"Failed to check existing Gitea repositories: {e}\n{response.text}", + e, ) return - except Exception as e: - logger.exception( - f"Failed to check existing Gitea repositories: {e}\n{response.text}", - e, - ) - return - # create lesson repository - url = f"{api_url}/orgs/{GITEA_ORG_NAME}/repos" - payload = { - "auto_init": True, - "default_branch": "main", - "description": f"{instance.module.course} – {instance.module}: {instance.title}", - "name": repo_name, - "private": True, - } + # create lesson repository + url = f"{api_url}/orgs/{GITEA_ORG_NAME}/repos" + payload = { + "auto_init": True, + "default_branch": "main", + "description": f"{instance.module.course} – {instance.module}: {instance.title}", + "name": repo_name, + "private": True, + } - try: - response = requests.post( - url, - json=payload, - timeout=5, - headers={"Authorization": f"token {os.getenv('GITEA_API_TOKEN')}"}, - ) - response.raise_for_status() - repo_url = response.json().get("html_url") + try: + response = requests.post( + url, + json=payload, + timeout=5, + headers={"Authorization": f"token {os.getenv('GITEA_API_TOKEN')}"}, + ) + response.raise_for_status() + repo_url = response.json().get("html_url") - instance.gitea_repo_url = repo_url - instance.save(update_fields=["gitea_repo_url"]) + instance.gitea_repo_url = repo_url + instance.save(update_fields=["gitea_repo_url"]) - logger.info( - f"Successfully created Gitea repository for lesson {instance.title}: {repo_url}" - ) - except Exception as e: - logger.exception( - f"Failed to create Gitea repository for lesson {instance.title}: {e}\n{response.text}", - e, - ) + logger.info( + f"Successfully created Gitea repository for lesson {instance.title}: {repo_url}" + ) + except Exception as e: + logger.exception( + f"Failed to create Gitea repository for lesson {instance.title}: {e}\n{response.text}", + e, + ) + + def add_repository_to_team() -> None: + # add repository to course team + team_name = f"course-{course.id}" + try: + response = requests.get( + f"{api_url}/orgs/{GITEA_ORG_NAME}/teams", + timeout=5, + headers={"Authorization": f"token {os.getenv('GITEA_API_TOKEN')}"}, + ) + response.raise_for_status() + teams = response.json() + + team = next((team for team in teams if team["name"] == team_name), None) + + if not team: + logger.error( + f"Gitea team {team_name} not found when trying to add repository {repo_name}" + ) + return + + team_id = team["id"] + add_repo_url = ( + f"{api_url}/teams/{team_id}/repos/{GITEA_ORG_NAME}/{repo_name}" + ) + add_response = requests.put( + add_repo_url, + timeout=5, + headers={"Authorization": f"token {os.getenv('GITEA_API_TOKEN')}"}, + ) + add_response.raise_for_status() + logger.info( + f"Successfully added repository {repo_name} to Gitea team {team_name}" + ) + except Exception as e: + logger.exception( + f"Failed to add repository {repo_name} to Gitea team {team_name}: {e}\n{response.text}", + e, + ) + + create_repository() + add_repository_to_team()