def put(self): """Handles the put verb.""" assert self.app_context.is_editable_fs() request = self.request.get('request') assert request request = transforms.loads(request) payload = transforms.loads(request.get('payload')) filename = request.get('key') if not (filename and self.assert_xsrf_token_or_fail( request, self.XSRF_TOKEN_NAME, {'key': filename})): return if not FilesRights.can_edit(self): transforms.send_json_response( self, 401, 'Access denied.', {'key': filename}) return if not _is_asset_in_allowed_bases(filename): transforms.send_json_response( self, 400, 'Malformed request.', {'key': filename}) return self.app_context.fs.impl.put( os.path.join(appengine_config.BUNDLE_ROOT, filename), vfs.string_to_stream(unicode(payload.get('contents')))) transforms.send_json_response(self, 200, 'Saved.')
def update_course_config(name, settings): """Merge settings into the saved course.yaml configuration. Args: name: Name of the course. E.g., 'my_test_course'. settings: A nested dict of name/value settings. Names for items here can be found in modules/dashboard/course_settings.py in create_course_registry. See below in simple_add_course() for an example. Returns: Context object for the modified course. """ site_type = 'course' namespace = 'ns_%s' % name slug = '/%s' % name rule = '%s:%s::%s' % (site_type, slug, namespace) context = sites.get_all_courses(rule)[0] environ = courses.deep_dict_merge(settings, courses.Course.get_environ(context)) content = yaml.safe_dump(environ) with common_utils.Namespace(namespace): context.fs.put( context.get_config_filename(), vfs.string_to_stream(unicode(content))) course_config = config.Registry.test_overrides.get( sites.GCB_COURSES_CONFIG.name, 'course:/:/') if rule not in course_config: course_config = '%s, %s' % (rule, course_config) sites.setup_courses(course_config) return context
def put(self): """Handles the put verb.""" assert self.app_context.is_editable_fs() request = self.request.get('request') assert request request = transforms.loads(request) payload = transforms.loads(request.get('payload')) filename = request.get('key') if not (filename and self.assert_xsrf_token_or_fail( request, self.XSRF_TOKEN_NAME, {'key': filename})): return if not FilesRights.can_edit(self): transforms.send_json_response(self, 401, 'Access denied.', {'key': filename}) return if not _is_asset_in_allowed_bases(filename): transforms.send_json_response(self, 400, 'Malformed request.', {'key': filename}) return self.app_context.fs.impl.put( os.path.join(appengine_config.BUNDLE_ROOT, filename), vfs.string_to_stream(unicode(payload.get('contents')))) transforms.send_json_response(self, 200, 'Saved.')
def create_course_file_if_not_exists(handler): assert handler.app_context.is_editable_fs() # Check if course.yaml exists; create if not. fs = handler.app_context.fs.impl course_yaml = fs.physical_to_logical('/course.yaml') if not fs.isfile(course_yaml): fs.put(course_yaml, vfs.string_to_stream( courses.EMPTY_COURSE_YAML % users.get_current_user().email()))
def create_course_file_if_not_exists(handler): assert handler.app_context.is_editable_fs() # Check if course.yaml exists; create if not. fs = handler.app_context.fs.impl course_yaml = fs.physical_to_logical('/course.yaml') if not fs.isfile(course_yaml): fs.put(course_yaml, vfs.string_to_stream( courses.Course.EMPTY_COURSE_YAML % users.get_current_user().email()))
def put(self): """Handles REST PUT verb with JSON payload.""" assert is_editable_fs(self.app_context) request = transforms.loads(self.request.get('request')) key = request.get('key') if not self.assert_xsrf_token_or_fail( request, 'basic-course-settings-put', {'key': key}): return if not CourseSettingsRights.can_edit(self): transforms.send_json_response(self, 401, 'Access denied.', {'key': key}) return payload = request.get('payload') request_data = {} CourseSettingsRESTHandler.REGISTORY.convert_json_to_entity( transforms.loads(payload), request_data) course_data = request_data['course'] if 'forum_email' in course_data.keys(): forum_email = course_data['forum_email'] forum_web_url = self.get_groups_web_url(forum_email) if forum_web_url: course_data['forum_url'] = forum_web_url forum_web_url = self.get_groups_embed_url(forum_email) if forum_web_url: course_data['forum_embed_url'] = forum_web_url if 'announcement_list_email' in course_data.keys(): announcement_email = course_data['announcement_list_email'] announcement_web_url = self.get_groups_web_url(announcement_email) if announcement_web_url: course_data['announcement_list_url'] = announcement_web_url entity = courses.deep_dict_merge(request_data, self.get_course_dict()) content = yaml.safe_dump(entity) try: self.validate_content(content) content_stream = vfs.string_to_stream(unicode(content)) except Exception as e: # pylint: disable=W0703 transforms.send_json_response(self, 412, 'Validation error: %s' % e) return # Store new file content. fs = self.app_context.fs.impl filename = fs.physical_to_logical(key) fs.put(filename, content_stream) # Send reply. transforms.send_json_response(self, 200, 'Saved.')
def put(self): """Handles REST PUT verb with JSON payload.""" assert is_editable_fs(self.app_context) request = transforms.loads(self.request.get('request')) key = request.get('key') if not self.assert_xsrf_token_or_fail( request, 'basic-course-settings-put', {'key': key}): return if not CourseSettingsRights.can_edit(self): transforms.send_json_response( self, 401, 'Access denied.', {'key': key}) return payload = request.get('payload') request_data = {} CourseSettingsRESTHandler.REGISTORY.convert_json_to_entity( transforms.loads(payload), request_data) course_data = request_data['course'] if 'forum_email' in course_data.keys(): forum_email = course_data['forum_email'] forum_web_url = self.get_groups_web_url(forum_email) if forum_web_url: course_data['forum_url'] = forum_web_url forum_web_url = self.get_groups_embed_url(forum_email) if forum_web_url: course_data['forum_embed_url'] = forum_web_url if 'announcement_list_email' in course_data.keys(): announcement_email = course_data['announcement_list_email'] announcement_web_url = self.get_groups_web_url(announcement_email) if announcement_web_url: course_data['announcement_list_url'] = announcement_web_url entity = courses.deep_dict_merge(request_data, self.get_course_dict()) content = yaml.safe_dump(entity) try: self.validate_content(content) content_stream = vfs.string_to_stream(unicode(content)) except Exception as e: # pylint: disable=W0703 transforms.send_json_response(self, 412, 'Validation error: %s' % e) return # Store new file content. fs = self.app_context.fs.impl filename = fs.physical_to_logical(key) fs.put(filename, content_stream) # Send reply. transforms.send_json_response(self, 200, 'Saved.')
def post_create_or_edit_settings(self): """Handles creation or/and editing of course.yaml.""" assert is_editable_fs(self.app_context) # Check if course.yaml exists; create if not. fs = self.app_context.fs.impl course_yaml = fs.physical_to_logical("/course.yaml") if not fs.isfile(course_yaml): fs.put(course_yaml, vfs.string_to_stream(courses.EMPTY_COURSE_YAML % users.get_current_user().email())) self.redirect(self.get_action_url("edit_settings", key="/course.yaml"))
def post_create_or_edit_settings(self): """Handles creation or/and editing of course.yaml.""" assert is_editable_fs(self.app_context) # Check if course.yaml exists; create if not. fs = self.app_context.fs.impl course_yaml = fs.physical_to_logical('/course.yaml') if not fs.isfile(course_yaml): fs.put(course_yaml, vfs.string_to_stream( courses.EMPTY_COURSE_YAML % users.get_current_user().email())) self.redirect(self.get_action_url('edit_settings', key='/course.yaml'))
def post_edit_gDefier_course_settings(self): """Handles editing of DATA table from gDefier.db""" assert is_editable_fs(self.app_context) # Check if gDefier.yaml exists; create if not. fs = self.app_context.fs.impl course_yaml = fs.physical_to_logical('/gDefier.yaml') if not fs.isfile(course_yaml): fs.put(course_yaml, vfs.string_to_stream( courses.EMPTY_COURSE_YAML % users.get_current_user().email())) self.redirect(self.get_action_url( 'edit_gDefier_settings', key='/gDefier.yaml'))
def put(self): """Handles REST PUT verb with JSON payload.""" assert self.app_context.is_editable_fs() request = transforms.loads(self.request.get('request')) key = request.get('key') if not self.assert_xsrf_token_or_fail( request, 'file-put', {'key': key}): return # TODO(psimakov): we don't allow editing of all files; restrict further if not FilesRights.can_edit(self): transforms.send_json_response( self, 401, 'Access denied.', {'key': key}) return payload = request.get('payload') entity = transforms.loads(payload) encoding = entity['encoding'] content = entity['content'] # Validate the file content. errors = [] try: if encoding == self.FILE_ENCODING_TEXT: content_stream = vfs.string_to_stream(content) elif encoding == self.FILE_ENCODING_BINARY: content_stream = base64.b64decode(content) else: errors.append('Unknown encoding: %s.' % encoding) self.validate_content(key, content) except Exception as e: # pylint: disable=W0703 errors.append('Validation error: %s' % e) if errors: transforms.send_json_response(self, 412, ''.join(errors)) return # Store new file content. fs = self.app_context.fs.impl filename = fs.physical_to_logical(key) fs.put(filename, content_stream) # Send reply. transforms.send_json_response(self, 200, 'Saved.')
def put(self): """Handles REST PUT verb with JSON payload.""" assert is_editable_fs(self.app_context) request = transforms.loads(self.request.get('request')) key = request.get('key') if not self.assert_xsrf_token_or_fail(request, 'file-put', {'key': key}): return # TODO(psimakov): we don't allow editing of all files; restrict further if not FilesRights.can_edit(self): transforms.send_json_response(self, 401, 'Access denied.', {'key': key}) return payload = request.get('payload') entity = transforms.loads(payload) encoding = entity['encoding'] content = entity['content'] # Validate the file content. errors = [] try: if encoding == self.FILE_ENCODING_TEXT: content_stream = vfs.string_to_stream(content) elif encoding == self.FILE_ENCODING_BINARY: content_stream = base64.b64decode(content) else: errors.append('Unknown encoding: %s.' % encoding) self.validate_content(key, content) except Exception as e: # pylint: disable=W0703 errors.append('Validation error: %s' % e) if errors: transforms.send_json_response(self, 412, ''.join(errors)) return # Store new file content. fs = self.app_context.fs.impl filename = fs.physical_to_logical(key) fs.put(filename, content_stream) # Send reply. transforms.send_json_response(self, 200, 'Saved.')
def put(self): """Handles the put verb.""" assert is_editable_fs(self.app_context) request = self.request.get("request") assert request request = transforms.loads(request) payload = transforms.loads(request.get("payload")) filename = request.get("key") if not (filename and self.assert_xsrf_token_or_fail(request, self.XSRF_TOKEN_NAME, {"key": filename})): return if not FilesRights.can_edit(self): transforms.send_json_response(self, 401, "Access denied.", {"key": filename}) return self._check_asset_in_allowed_bases(filename) self.app_context.fs.impl.put( os.path.join(appengine_config.BUNDLE_ROOT, filename), vfs.string_to_stream(unicode(payload.get("contents"))) ) transforms.send_json_response(self, 200, "Saved.")
def set_content(cls, course, unit, content): filename = cls.get_content_filename(unit) course.set_file_content( filename, vfs.string_to_stream(unicode(transforms.dumps(content))))
def _set_content(cls, course, filename, content): course.set_file_content( filename, vfs.string_to_stream(unicode(transforms.dumps(content))))