feat(signals.py): create per-lesson repositories on ModuleLessonPage save
This commit is contained in:
109
home/signals.py
109
home/signals.py
@@ -6,7 +6,7 @@ from django.conf import settings
|
||||
from django.db.models.signals import post_save
|
||||
from django.dispatch import receiver
|
||||
|
||||
from home.models.pages import CoursePage
|
||||
from home.models.pages import CoursePage, ModuleLessonPage
|
||||
|
||||
GITEA_ORG_NAME = "Studio77"
|
||||
|
||||
@@ -14,7 +14,7 @@ logger = lg.getLogger(__name__)
|
||||
|
||||
|
||||
@receiver(post_save, sender=CoursePage)
|
||||
def create_gitea_team_repo_on_course_creation(sender, instance, created, **kwargs):
|
||||
def create_gitea_team_on_course_creation(sender, instance, created, **kwargs):
|
||||
if not instance.live:
|
||||
logger.debug(
|
||||
f"Course {instance.title} is not live, skipping Gitea team creation"
|
||||
@@ -29,7 +29,6 @@ def create_gitea_team_repo_on_course_creation(sender, instance, created, **kwarg
|
||||
logger.debug("GITEA_URL is not set, skipping Gitea team creation")
|
||||
return
|
||||
|
||||
def team():
|
||||
# check if team already exists
|
||||
try:
|
||||
response = requests.get(
|
||||
@@ -84,7 +83,87 @@ def create_gitea_team_repo_on_course_creation(sender, instance, created, **kwarg
|
||||
e,
|
||||
)
|
||||
|
||||
def repo():
|
||||
# def repo():
|
||||
# # 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"] == team_name for repo in repos):
|
||||
# logger.debug(
|
||||
# f"Gitea repository {team_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
|
||||
#
|
||||
# # create course repository
|
||||
# repo_name = f"course-{course.id}"
|
||||
# url = f"{api_url}/orgs/{GITEA_ORG_NAME}/repos"
|
||||
# payload = {
|
||||
# "auto_init": True,
|
||||
# "default_branch": "main",
|
||||
# "description": f"{course.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("url", None)
|
||||
# course.repository_url = repo_url
|
||||
# course.save(update_fields=["repository_url"])
|
||||
# logger.info(
|
||||
# f"Successfully created Gitea repository for course {course.title}"
|
||||
# )
|
||||
# except Exception as e:
|
||||
# logger.exception(
|
||||
# f"Failed to create Gitea repository for course {course.title}: {e}\n{response.text}",
|
||||
# e,
|
||||
# )
|
||||
#
|
||||
#
|
||||
|
||||
|
||||
@receiver(post_save, sender=ModuleLessonPage)
|
||||
def create_gitea_repo_on_lesson_creation(
|
||||
sender, instance: ModuleLessonPage, created, **kwargs
|
||||
):
|
||||
if not instance.live:
|
||||
logger.debug(
|
||||
f"Lesson {instance.title} is not live, skipping Gitea repository creation"
|
||||
)
|
||||
return
|
||||
|
||||
course = instance.module.course
|
||||
repo_name = f"course-{course.id}-lesson-{instance.id}"
|
||||
|
||||
if not course.live:
|
||||
logger.debug(
|
||||
f"Course {course.title} is not live, skipping Gitea repository creation for lesson {instance.title}"
|
||||
)
|
||||
return
|
||||
|
||||
api_url = getattr(settings, "GITEA_URL", None)
|
||||
|
||||
if not api_url:
|
||||
logger.debug("GITEA_URL is not set, skipping Gitea repository creation")
|
||||
return
|
||||
|
||||
# check if repository already exists
|
||||
try:
|
||||
response = requests.get(
|
||||
@@ -94,9 +173,9 @@ def create_gitea_team_repo_on_course_creation(sender, instance, created, **kwarg
|
||||
)
|
||||
response.raise_for_status()
|
||||
repos = response.json()
|
||||
if any(repo["name"] == team_name for repo in repos):
|
||||
logger.debug(
|
||||
f"Gitea repository {team_name} already exists, skipping creation"
|
||||
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:
|
||||
@@ -106,13 +185,12 @@ def create_gitea_team_repo_on_course_creation(sender, instance, created, **kwarg
|
||||
)
|
||||
return
|
||||
|
||||
# create course repository
|
||||
repo_name = f"course-{course.id}"
|
||||
# create lesson repository
|
||||
url = f"{api_url}/orgs/{GITEA_ORG_NAME}/repos"
|
||||
payload = {
|
||||
"auto_init": True,
|
||||
"default_branch": "main",
|
||||
"description": f"{course.title}",
|
||||
"description": f"{instance.module.course} – {instance.module}: {instance.title}",
|
||||
"name": repo_name,
|
||||
"private": True,
|
||||
}
|
||||
@@ -126,16 +204,13 @@ def create_gitea_team_repo_on_course_creation(sender, instance, created, **kwarg
|
||||
)
|
||||
response.raise_for_status()
|
||||
repo_url = response.json().get("url", None)
|
||||
course.repository_url = repo_url
|
||||
course.save(update_fields=["repository_url"])
|
||||
instance.gitea_repo_url = repo_url
|
||||
instance.save()
|
||||
logger.info(
|
||||
f"Successfully created Gitea repository for course {course.title}"
|
||||
f"Successfully created Gitea repository for lesson {instance.title}"
|
||||
)
|
||||
except Exception as e:
|
||||
logger.exception(
|
||||
f"Failed to create Gitea repository for course {course.title}: {e}\n{response.text}",
|
||||
f"Failed to create Gitea repository for lesson {instance.title}: {e}\n{response.text}",
|
||||
e,
|
||||
)
|
||||
|
||||
team()
|
||||
repo()
|
||||
|
||||
Reference in New Issue
Block a user