feat(signals.py): add gitea repo to team
This commit is contained in:
135
home/signals.py
135
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")
|
logger.debug("GITEA_URL is not set, skipping Gitea repository creation")
|
||||||
return
|
return
|
||||||
|
|
||||||
# check if repository already exists
|
def create_repository() -> None:
|
||||||
try:
|
# check if repository already exists
|
||||||
response = requests.get(
|
try:
|
||||||
f"{api_url}/orgs/{GITEA_ORG_NAME}/repos",
|
response = requests.get(
|
||||||
timeout=5,
|
f"{api_url}/orgs/{GITEA_ORG_NAME}/repos",
|
||||||
headers={"Authorization": f"token {os.getenv('GITEA_API_TOKEN')}"},
|
timeout=5,
|
||||||
)
|
headers={"Authorization": f"token {os.getenv('GITEA_API_TOKEN')}"},
|
||||||
response.raise_for_status()
|
)
|
||||||
repos = response.json()
|
response.raise_for_status()
|
||||||
if any(repo["name"] == repo_name for repo in repos):
|
repos = response.json()
|
||||||
logger.info(
|
if any(repo["name"] == repo_name for repo in repos):
|
||||||
f"Gitea repository {repo_name} already exists, skipping creation"
|
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
|
return
|
||||||
except Exception as e:
|
|
||||||
logger.exception(
|
|
||||||
f"Failed to check existing Gitea repositories: {e}\n{response.text}",
|
|
||||||
e,
|
|
||||||
)
|
|
||||||
return
|
|
||||||
|
|
||||||
# create lesson repository
|
# create lesson repository
|
||||||
url = f"{api_url}/orgs/{GITEA_ORG_NAME}/repos"
|
url = f"{api_url}/orgs/{GITEA_ORG_NAME}/repos"
|
||||||
payload = {
|
payload = {
|
||||||
"auto_init": True,
|
"auto_init": True,
|
||||||
"default_branch": "main",
|
"default_branch": "main",
|
||||||
"description": f"{instance.module.course} – {instance.module}: {instance.title}",
|
"description": f"{instance.module.course} – {instance.module}: {instance.title}",
|
||||||
"name": repo_name,
|
"name": repo_name,
|
||||||
"private": True,
|
"private": True,
|
||||||
}
|
}
|
||||||
|
|
||||||
try:
|
try:
|
||||||
response = requests.post(
|
response = requests.post(
|
||||||
url,
|
url,
|
||||||
json=payload,
|
json=payload,
|
||||||
timeout=5,
|
timeout=5,
|
||||||
headers={"Authorization": f"token {os.getenv('GITEA_API_TOKEN')}"},
|
headers={"Authorization": f"token {os.getenv('GITEA_API_TOKEN')}"},
|
||||||
)
|
)
|
||||||
response.raise_for_status()
|
response.raise_for_status()
|
||||||
repo_url = response.json().get("html_url")
|
repo_url = response.json().get("html_url")
|
||||||
|
|
||||||
instance.gitea_repo_url = repo_url
|
instance.gitea_repo_url = repo_url
|
||||||
instance.save(update_fields=["gitea_repo_url"])
|
instance.save(update_fields=["gitea_repo_url"])
|
||||||
|
|
||||||
logger.info(
|
logger.info(
|
||||||
f"Successfully created Gitea repository for lesson {instance.title}: {repo_url}"
|
f"Successfully created Gitea repository for lesson {instance.title}: {repo_url}"
|
||||||
)
|
)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.exception(
|
logger.exception(
|
||||||
f"Failed to create Gitea repository for lesson {instance.title}: {e}\n{response.text}",
|
f"Failed to create Gitea repository for lesson {instance.title}: {e}\n{response.text}",
|
||||||
e,
|
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()
|
||||||
|
|||||||
Reference in New Issue
Block a user