Commit 4d5727a2 by chrisndodge

Merge pull request #570 from edx/fix/cdodge/add-metadata-caching-to-delete-course

Performance enhancements for django-admin commands to delete and clone course
parents 67d1e559 9da0aa2e
...@@ -12,7 +12,14 @@ from auth.authz import _copy_course_group ...@@ -12,7 +12,14 @@ from auth.authz import _copy_course_group
# #
# To run from command line: rake cms:clone SOURCE_LOC=MITx/111/Foo1 DEST_LOC=MITx/135/Foo3 # To run from command line: rake cms:clone SOURCE_LOC=MITx/111/Foo1 DEST_LOC=MITx/135/Foo3
# #
from request_cache.middleware import RequestCache
from django.core.cache import get_cache
#
# To run from command line: rake cms:delete_course LOC=MITx/111/Foo1
#
CACHE = get_cache('mongo_metadata_inheritance')
class Command(BaseCommand): class Command(BaseCommand):
"""Clone a MongoDB-backed course to another location""" """Clone a MongoDB-backed course to another location"""
...@@ -21,19 +28,27 @@ class Command(BaseCommand): ...@@ -21,19 +28,27 @@ class Command(BaseCommand):
def handle(self, *args, **options): def handle(self, *args, **options):
"Execute the command" "Execute the command"
if len(args) != 2: if len(args) != 2:
raise CommandError("clone requires two arguments: <source-location> <dest-location>") raise CommandError("clone requires two arguments: <source-course_id> <dest-course_id>")
source_location_str = args[0] source_course_id = args[0]
dest_location_str = args[1] dest_course_id = args[1]
mstore = modulestore('direct') mstore = modulestore('direct')
cstore = contentstore() cstore = contentstore()
print("Cloning course {0} to {1}".format(source_location_str, dest_location_str)) mstore.metadata_inheritance_cache_subsystem = CACHE
mstore.request_cache = RequestCache.get_request_cache()
org, course_num, run = dest_course_id.split("/")
mstore.ignore_write_events_on_courses.append('{0}/{1}'.format(org, course_num))
source_location = CourseDescriptor.id_to_location(source_location_str) print("Cloning course {0} to {1}".format(source_course_id, dest_course_id))
dest_location = CourseDescriptor.id_to_location(dest_location_str)
source_location = CourseDescriptor.id_to_location(source_course_id)
dest_location = CourseDescriptor.id_to_location(dest_course_id)
if clone_course(mstore, cstore, source_location, dest_location): if clone_course(mstore, cstore, source_location, dest_location):
# be sure to recompute metadata inheritance after all those updates
mstore.refresh_cached_metadata_inheritance_tree(dest_location)
print("copying User permissions...") print("copying User permissions...")
_copy_course_group(source_location, dest_location) _copy_course_group(source_location, dest_location)
...@@ -9,12 +9,14 @@ from xmodule.course_module import CourseDescriptor ...@@ -9,12 +9,14 @@ from xmodule.course_module import CourseDescriptor
from .prompt import query_yes_no from .prompt import query_yes_no
from auth.authz import _delete_course_group from auth.authz import _delete_course_group
from request_cache.middleware import RequestCache
from django.core.cache import get_cache
# #
# To run from command line: rake cms:delete_course LOC=MITx/111/Foo1 # To run from command line: rake cms:delete_course LOC=MITx/111/Foo1
# #
CACHE = get_cache('mongo_metadata_inheritance')
class Command(BaseCommand): class Command(BaseCommand):
help = '''Delete a MongoDB backed course''' help = '''Delete a MongoDB backed course'''
...@@ -22,7 +24,7 @@ class Command(BaseCommand): ...@@ -22,7 +24,7 @@ class Command(BaseCommand):
if len(args) != 1 and len(args) != 2: if len(args) != 1 and len(args) != 2:
raise CommandError("delete_course requires one or more arguments: <location> |commit|") raise CommandError("delete_course requires one or more arguments: <location> |commit|")
loc_str = args[0] course_id = args[0]
commit = False commit = False
if len(args) == 2: if len(args) == 2:
...@@ -34,9 +36,14 @@ class Command(BaseCommand): ...@@ -34,9 +36,14 @@ class Command(BaseCommand):
ms = modulestore('direct') ms = modulestore('direct')
cs = contentstore() cs = contentstore()
if query_yes_no("Deleting course {0}. Confirm?".format(loc_str), default="no"): ms.metadata_inheritance_cache_subsystem = CACHE
ms.request_cache = RequestCache.get_request_cache()
org, course_num, run = course_id.split("/")
ms.ignore_write_events_on_courses.append('{0}/{1}'.format(org, course_num))
if query_yes_no("Deleting course {0}. Confirm?".format(course_id), default="no"):
if query_yes_no("Are you sure. This action cannot be undone!", default="no"): if query_yes_no("Are you sure. This action cannot be undone!", default="no"):
loc = CourseDescriptor.id_to_location(loc_str) loc = CourseDescriptor.id_to_location(course_id)
if delete_course(ms, cs, loc, commit): if delete_course(ms, cs, loc, commit):
print 'removing User permissions from course....' print 'removing User permissions from course....'
# in the django layer, we need to remove all the user permissions groups associated with this course # in the django layer, we need to remove all the user permissions groups associated with this course
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment