def handle(self, *args, **options): "Execute the command" if len(args) != 2: raise CommandError("clone requires two arguments: <source-course_id> <dest-course_id>") source_course_id = args[0] dest_course_id = args[1] mstore = modulestore('direct') cstore = contentstore() org, course_num, run = dest_course_id.split("/") mstore.ignore_write_events_on_courses.append('{0}/{1}'.format(org, course_num)) print("Cloning course {0} to {1}".format(source_course_id, dest_course_id)) 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): # be sure to recompute metadata inheritance after all those updates mstore.refresh_cached_metadata_inheritance_tree(dest_location) print("copying User permissions...") _copy_course_group(source_location, dest_location)
def handle(self, *args, **options): "Execute the command" if len(args) != 2: raise CommandError( "clone requires two arguments: <source-course_id> <dest-course_id>" ) source_course_id = args[0] dest_course_id = args[1] mstore = modulestore('direct') cstore = contentstore() org, course_num, run = dest_course_id.split("/") mstore.ignore_write_events_on_courses.append('{0}/{1}'.format( org, course_num)) print("Cloning course {0} to {1}".format(source_course_id, dest_course_id)) 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): # be sure to recompute metadata inheritance after all those updates mstore.refresh_cached_metadata_inheritance_tree(dest_location) print("copying User permissions...") _copy_course_group(source_location, dest_location)
def test_get_all_users(self): """ Test getting all authors for a course where their permissions run the gamut of allowed group types. """ # first check the groupname for the course creator. self.assertTrue( self.user.groups.filter( name="{}_{}".format(INSTRUCTOR_ROLE_NAME, self.course_locator.package_id)).exists(), "Didn't add creator as instructor.") users = copy.copy(self.users) user_by_role = {} # add the misc users to the course in different groups for role in [INSTRUCTOR_ROLE_NAME, STAFF_ROLE_NAME]: user_by_role[role] = [] groupnames, _ = authz.get_all_course_role_groupnames( self.course_locator, role) for groupname in groupnames: group, _ = Group.objects.get_or_create(name=groupname) user = users.pop() user_by_role[role].append(user) user.groups.add(group) user.save() self.assertTrue(has_access(user, self.course_locator), "{} does not have access".format(user)) self.assertTrue(has_access(user, self.course_location), "{} does not have access".format(user)) response = self.client.get_html( self.course_locator.url_reverse('course_team')) for role in [INSTRUCTOR_ROLE_NAME, STAFF_ROLE_NAME]: for user in user_by_role[role]: self.assertContains(response, user.email) # test copying course permissions copy_course_location = Location( ['i4x', 'copyu', 'copydept.mycourse', 'course', 'myrun']) copy_course_locator = loc_mapper().translate_location( copy_course_location.course_id, copy_course_location, False, True) # pylint: disable=protected-access authz._copy_course_group(self.course_locator, copy_course_locator) for role in [INSTRUCTOR_ROLE_NAME, STAFF_ROLE_NAME]: for user in user_by_role[role]: self.assertTrue(has_access(user, copy_course_locator), "{} no copy access".format(user)) self.assertTrue(has_access(user, copy_course_location), "{} no copy access".format(user))
def handle(self, *args, **options): if len(args) != 2: raise CommandError("clone requires two arguments: <source-location> <dest-location>") source_location_str = args[0] dest_location_str = args[1] ms = modulestore('direct') cs = contentstore() print "Cloning course {0} to {1}".format(source_location_str, dest_location_str) source_location = CourseDescriptor.id_to_location(source_location_str) dest_location = CourseDescriptor.id_to_location(dest_location_str) if clone_course(ms, cs, source_location, dest_location): print "copying User permissions..." _copy_course_group(source_location, dest_location)
def test_get_all_users(self): """ Test getting all authors for a course where their permissions run the gamut of allowed group types. """ # first check the groupname for the course creator. self.assertTrue( self.user.groups.filter( name="{}_{}".format(INSTRUCTOR_ROLE_NAME, self.course_locator.package_id) ).exists(), "Didn't add creator as instructor." ) users = copy.copy(self.users) user_by_role = {} # add the misc users to the course in different groups for role in [INSTRUCTOR_ROLE_NAME, STAFF_ROLE_NAME]: user_by_role[role] = [] groupnames, _ = authz.get_all_course_role_groupnames(self.course_locator, role) for groupname in groupnames: group, _ = Group.objects.get_or_create(name=groupname) user = users.pop() user_by_role[role].append(user) user.groups.add(group) user.save() self.assertTrue(has_access(user, self.course_locator), "{} does not have access".format(user)) self.assertTrue(has_access(user, self.course_location), "{} does not have access".format(user)) response = self.client.get_html(self.course_locator.url_reverse('course_team')) for role in [INSTRUCTOR_ROLE_NAME, STAFF_ROLE_NAME]: for user in user_by_role[role]: self.assertContains(response, user.email) # test copying course permissions copy_course_location = Location(['i4x', 'copyu', 'copydept.mycourse', 'course', 'myrun']) copy_course_locator = loc_mapper().translate_location( copy_course_location.course_id, copy_course_location, False, True ) # pylint: disable=protected-access authz._copy_course_group(self.course_locator, copy_course_locator) for role in [INSTRUCTOR_ROLE_NAME, STAFF_ROLE_NAME]: for user in user_by_role[role]: self.assertTrue(has_access(user, copy_course_locator), "{} no copy access".format(user)) self.assertTrue(has_access(user, copy_course_location), "{} no copy access".format(user))
def handle(self, *args, **options): if len(args) != 2: raise CommandError( "clone requires two arguments: <source-location> <dest-location>") source_location_str = args[0] dest_location_str = args[1] ms = modulestore('direct') cs = contentstore() print "Cloning course {0} to {1}".format(source_location_str, dest_location_str) source_location = CourseDescriptor.id_to_location(source_location_str) dest_location = CourseDescriptor.id_to_location(dest_location_str) if clone_course(ms, cs, source_location, dest_location): print "copying User permissions..." _copy_course_group(source_location, dest_location)