Skip to content

Commit ba29b9d

Browse files
committed
draft changes
1 parent cdabc11 commit ba29b9d

File tree

5 files changed

+85
-12
lines changed

5 files changed

+85
-12
lines changed

src/ol_openedx_course_propagator/BUILD

+5-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
python_sources(
22
name="ol_openedx_course_propagator_source",
3+
dependencies=[
4+
"//:external_dependencies#edx-opaque-keys",
5+
"//:external_dependencies#celery",
6+
],
37
)
48

59
python_distribution(
@@ -15,9 +19,7 @@ python_distribution(
1519
zip_safe=False,
1620
keywords="Python edx",
1721
entry_points={
18-
"lms.djangoapp": [
19-
"ol_openedx_course_propagator = ol_openedx_course_propagator.apps:OLOpenEdxCoursePropagatorConfig",
20-
],
22+
"lms.djangoapp": [],
2123
"cms.djangoapp": [
2224
"ol_openedx_course_propagator = ol_openedx_course_propagator.apps:OLOpenEdxCoursePropagatorConfig",
2325
],

src/ol_openedx_course_propagator/apps.py

+14
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,17 @@
88
class OLOpenEdxCoursePropagatorConfig(AppConfig):
99
name = "ol_openedx_course_propagator"
1010
verbose_name = "Open edX Course Propagator"
11+
12+
plugin_app = {
13+
PluginSignals.CONFIG: {
14+
ProjectType.CMS: {
15+
PluginSignals.RECEIVERS: [
16+
{
17+
PluginSignals.RECEIVER_FUNC_NAME: "listen_for_course_publish",
18+
PluginSignals.SIGNAL_PATH: "xmodule.modulestore.django.COURSE_PUBLISHED", # noqa: E501
19+
PluginSignals.DISPATCH_UID: "ol_openedx_course_propagator.signals.listen_for_course_publish", # noqa: E501
20+
}
21+
],
22+
},
23+
},
24+
}
+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
from django.conf import settings
2+
from django.db import models
3+
from jsonfield import JSONField
4+
from model_utils.models import TimeStampedModel
5+
from opaque_keys.edx.django.models import (
6+
CourseKeyField,
7+
UsageKeyField,
8+
)
9+
10+
class CourseSyncMasterOrg(models.Model):
11+
organization = models.CharField(max_length=255, unique=True)
12+
13+
14+
class CourseSyncMapping(models.Model):
15+
source_course = CourseKeyField(max_length=255)
16+
target_courses = model.TextField(null=True, blank=True, help_text="Comma separated list of target course keys")
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
"""
2+
Utility methods for ol-openedx-course-propagator plugin
3+
"""
4+
from xmodule.modulestore.django import modulestore
5+
from xmodule.modulestore.django import SignalHandler
6+
from xmodule.modulestore import ModuleStoreEnum
7+
from opaque_keys.edx.locator import CourseLocator
8+
from xmodule.modulestore.django import SignalHandler
9+
10+
from ol_openedx_course_propagator.models import CourseSyncMasterOrg, CourseSyncMapping
11+
from ol_openedx_course_propagator.tasks import async_course_propagator
12+
13+
log = logging.getLogger(__name__)
14+
15+
16+
@receiver(SignalHandler.course_published)
17+
def listen_for_course_publish(
18+
sender, # noqa: ARG001
19+
course_key,
20+
**kwargs, # noqa: ARG001
21+
):
22+
"""
23+
Copy course content from source course to destination course.
24+
"""
25+
if CourseSyncMasterOrg.objects.filter(organization=course_key.org).exists():
26+
# Get the source and destination course IDs
27+
course_sync_mapping = CourseSyncMapping.objects.filter(
28+
source_course=course_key
29+
).first()
30+
if course_sync_mapping:
31+
source_course = str(course_sync_mapping.source_course)
32+
user_id = 2
33+
for target_course_key in course_sync_mapping.target_courses.split(","):
34+
# Call the async task to copy the course content
35+
async_course_propagator.delay(user_id, source_course, target_course)
36+
else:
37+
log.warning(
38+
"No mapping found for course %s. Skipping copy.", course_key.id
39+
)
40+
return
41+

src/ol_openedx_course_propagator/utils.py renamed to src/ol_openedx_course_propagator/tasks.py

+9-9
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
1-
"""
2-
Utility methods for ol-openedx-course-propagator plugin
3-
"""
1+
from celery import shared_task # pylint: disable=import-error
2+
from celery.utils.log import get_task_logger
3+
from cms.djangoapps.contentstore.git_export_utils import GitExportError, export_to_git
4+
from opaque_keys.edx.keys import CourseKey
45
from xmodule.modulestore.django import modulestore
5-
from xmodule.modulestore.django import SignalHandler
6-
from opaque_keys.edx.locator import CourseLocator
76

8-
def copy_course(user_id, source_course_id, dest_course_id):
9-
"""
10-
Copy course content from source course to destination course.
11-
"""
7+
LOGGER = get_task_logger(__name__)
8+
9+
10+
@shared_task
11+
def async_course_propagator(user_id, source_course_id, dest_course_id):
1212
module_store = modulestore()
1313
source_course_key = CourseLocator.from_string(source_course_id)
1414
source_course_draft = source_course_key.for_branch("draft-branch")

0 commit comments

Comments
 (0)