70 lines
2.3 KiB
Python
70 lines
2.3 KiB
Python
"""
|
|
Sync courses from catalog service. This is used to setup a master's
|
|
integration environment.
|
|
"""
|
|
import logging
|
|
from textwrap import dedent
|
|
|
|
from django.contrib.auth.models import User # lint-amnesty, pylint: disable=imported-auth-user
|
|
from django.core.management.base import BaseCommand, CommandError
|
|
from opaque_keys.edx.keys import CourseKey
|
|
|
|
from cms.djangoapps.contentstore.management.commands.utils import user_from_str
|
|
from cms.djangoapps.contentstore.views.course import create_new_course_in_store
|
|
from openedx.core.djangoapps.catalog.utils import get_course_runs
|
|
from xmodule.modulestore import ModuleStoreEnum
|
|
from xmodule.modulestore.exceptions import DuplicateCourseError
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
class Command(BaseCommand):
|
|
"""
|
|
Command to populate modulestore with courses from the discovery service.
|
|
|
|
Example: ./manage.py cms sync_courses staff@example.com
|
|
"""
|
|
help = dedent(__doc__).strip()
|
|
|
|
def add_arguments(self, parser):
|
|
parser.add_argument('instructor')
|
|
|
|
def get_user(self, user):
|
|
"""
|
|
Return a User object.
|
|
"""
|
|
try:
|
|
user_object = user_from_str(user)
|
|
except User.DoesNotExist:
|
|
raise CommandError(f"No user {user} found.") # lint-amnesty, pylint: disable=raise-missing-from
|
|
return user_object
|
|
|
|
def handle(self, *args, **options):
|
|
"""Execute the command"""
|
|
instructor = self.get_user(options['instructor'])
|
|
|
|
course_runs = get_course_runs()
|
|
for course_run in course_runs:
|
|
course_key = CourseKey.from_string(course_run.get('key'))
|
|
fields = {
|
|
"display_name": course_run.get('title')
|
|
}
|
|
|
|
try:
|
|
new_course = create_new_course_in_store(
|
|
ModuleStoreEnum.Type.split,
|
|
instructor,
|
|
course_key.org,
|
|
course_key.course,
|
|
course_key.run,
|
|
fields,
|
|
)
|
|
logger.info("Created {}".format(str(new_course.id)))
|
|
except DuplicateCourseError:
|
|
logger.warning(
|
|
"Course already exists for %s, %s, %s. Skipping",
|
|
course_key.org,
|
|
course_key.course,
|
|
course_key.run,
|
|
)
|