def import_static_content(modules, course_loc, course_data_path, static_content_store, target_location_namespace, subpath='static', verbose=False): remap_dict = {} # now import all static assets static_dir = course_data_path / subpath verbose = True for dirname, dirnames, filenames in os.walk(static_dir): for filename in filenames: try: content_path = os.path.join(dirname, filename) if verbose: log.debug( 'importing static content {0}...'.format(content_path)) fullname_with_subpath = content_path.replace( static_dir, '') # strip away leading path from the name if fullname_with_subpath.startswith('/'): fullname_with_subpath = fullname_with_subpath[1:] content_loc = StaticContent.compute_location( target_location_namespace.org, target_location_namespace.course, fullname_with_subpath) mime_type = mimetypes.guess_type(filename)[0] with open(content_path, 'rb') as f: data = f.read() content = StaticContent(content_loc, filename, mime_type, data, import_path=fullname_with_subpath) # first let's save a thumbnail so we can get back a thumbnail # location (thumbnail_content, thumbnail_location ) = static_content_store.generate_thumbnail(content) if thumbnail_content is not None: content.thumbnail_location = thumbnail_location # then commit the content static_content_store.save(content) # store the remapping information which will be needed to # subsitute in the module data remap_dict[fullname_with_subpath] = content_loc.name except: raise return remap_dict
def verify_content_links(module, base_dir, static_content_store, link, remap_dict=None): if link.startswith('/static/'): # yes, then parse out the name path = link[len('/static/'):] static_pathname = base_dir / path if os.path.exists(static_pathname): try: content_loc = StaticContent.compute_location(module.location.org, module.location.course, path) filename = os.path.basename(path) mime_type = mimetypes.guess_type(filename)[0] with open(static_pathname, 'rb') as f: data = f.read() content = StaticContent(content_loc, filename, mime_type, data, import_path=path) # first let's save a thumbnail so we can get back a thumbnail location (thumbnail_content, thumbnail_location) = static_content_store.generate_thumbnail(content) if thumbnail_content is not None: content.thumbnail_location = thumbnail_location #then commit the content static_content_store.save(content) new_link = StaticContent.get_url_path_from_location(content_loc) if remap_dict is not None: remap_dict[link] = new_link return new_link except Exception, e: logging.exception('Skipping failed content load from {0}. Exception: {1}'.format(path, e))
def import_static_content( modules, course_loc, course_data_path, static_content_store, target_location_namespace, subpath="static", verbose=False, ): remap_dict = {} # now import all static assets static_dir = course_data_path / subpath verbose = True for dirname, dirnames, filenames in os.walk(static_dir): for filename in filenames: try: content_path = os.path.join(dirname, filename) if verbose: log.debug("importing static content {0}...".format(content_path)) fullname_with_subpath = content_path.replace(static_dir, "") # strip away leading path from the name if fullname_with_subpath.startswith("/"): fullname_with_subpath = fullname_with_subpath[1:] content_loc = StaticContent.compute_location( target_location_namespace.org, target_location_namespace.course, fullname_with_subpath ) mime_type = mimetypes.guess_type(filename)[0] with open(content_path, "rb") as f: data = f.read() content = StaticContent(content_loc, filename, mime_type, data, import_path=fullname_with_subpath) # first let's save a thumbnail so we can get back a thumbnail location (thumbnail_content, thumbnail_location) = static_content_store.generate_thumbnail(content) if thumbnail_content is not None: content.thumbnail_location = thumbnail_location # then commit the content static_content_store.save(content) # store the remapping information which will be needed to subsitute in the module data remap_dict[fullname_with_subpath] = content_loc.name except: raise return remap_dict
def import_static_content(modules, course_loc, course_data_path, static_content_store, target_location_namespace, subpath='static', verbose=False): remap_dict = {} # now import all static assets static_dir = course_data_path / subpath verbose = True for dirname, _, filenames in os.walk(static_dir): for filename in filenames: content_path = os.path.join(dirname, filename) if verbose: log.debug('importing static content %s...', content_path) try: with open(content_path, 'rb') as f: data = f.read() except IOError: if filename.startswith('._'): # OS X "companion files". See http://www.diigo.com/annotated/0c936fda5da4aa1159c189cea227e174 continue # Not a 'hidden file', then re-raise exception raise fullname_with_subpath = content_path.replace(static_dir, '') # strip away leading path from the name if fullname_with_subpath.startswith('/'): fullname_with_subpath = fullname_with_subpath[1:] content_loc = StaticContent.compute_location(target_location_namespace.org, target_location_namespace.course, fullname_with_subpath) mime_type = mimetypes.guess_type(filename)[0] content = StaticContent(content_loc, filename, mime_type, data, import_path=fullname_with_subpath) # first let's save a thumbnail so we can get back a thumbnail location (thumbnail_content, thumbnail_location) = static_content_store.generate_thumbnail(content) if thumbnail_content is not None: content.thumbnail_location = thumbnail_location #then commit the content try: static_content_store.save(content) except Exception as err: log.exception('Error importing {0}, error={1}'.format(fullname_with_subpath, err)) #store the remapping information which will be needed to subsitute in the module data remap_dict[fullname_with_subpath] = content_loc.name return remap_dict
def verify_content_links(module, base_dir, static_content_store, link, remap_dict=None): if link.startswith('/static/'): # yes, then parse out the name path = link[len('/static/'):] static_pathname = base_dir / path if os.path.exists(static_pathname): try: content_loc = StaticContent.compute_location( module.location.org, module.location.course, path) filename = os.path.basename(path) mime_type = mimetypes.guess_type(filename)[0] with open(static_pathname, 'rb') as f: data = f.read() content = StaticContent(content_loc, filename, mime_type, data, import_path=path) # first let's save a thumbnail so we can get back a thumbnail # location (thumbnail_content, thumbnail_location ) = static_content_store.generate_thumbnail(content) if thumbnail_content is not None: content.thumbnail_location = thumbnail_location # then commit the content static_content_store.save(content) new_link = StaticContent.get_url_path_from_location( content_loc) if remap_dict is not None: remap_dict[link] = new_link return new_link except Exception, e: logging.exception( 'Skipping failed content load from {0}. Exception: {1}'. format(path, e))
def import_static_content( modules, course_loc, course_data_path, static_content_store, target_location_namespace, subpath='static', verbose=False): remap_dict = {} # now import all static assets static_dir = course_data_path / subpath try: with open(course_data_path / 'policies/assets.json') as f: policy = json.load(f) except (IOError, ValueError) as err: # xml backed courses won't have this file, only exported courses; # so, its absence is not really an exception. policy = {} verbose = True mimetypes_list = mimetypes.types_map.values() for dirname, _, filenames in os.walk(static_dir): for filename in filenames: content_path = os.path.join(dirname, filename) if filename.endswith('~'): if verbose: log.debug('skipping static content %s...', content_path) continue if verbose: log.debug('importing static content %s...', content_path) try: with open(content_path, 'rb') as f: data = f.read() except IOError: if filename.startswith('._'): # OS X "companion files". See # http://www.diigo.com/annotated/0c936fda5da4aa1159c189cea227e174 continue # Not a 'hidden file', then re-raise exception raise # strip away leading path from the name fullname_with_subpath = content_path.replace(static_dir, '') if fullname_with_subpath.startswith('/'): fullname_with_subpath = fullname_with_subpath[1:] content_loc = StaticContent.compute_location( target_location_namespace.org, target_location_namespace.course, fullname_with_subpath ) policy_ele = policy.get(content_loc.name, {}) displayname = policy_ele.get('displayname', filename) locked = policy_ele.get('locked', False) mime_type = policy_ele.get('contentType') # Check extracted contentType in list of all valid mimetypes if not mime_type or mime_type not in mimetypes_list: mime_type = mimetypes.guess_type(filename)[0] # Assign guessed mimetype content = StaticContent( content_loc, displayname, mime_type, data, import_path=fullname_with_subpath, locked=locked ) # first let's save a thumbnail so we can get back a thumbnail location thumbnail_content, thumbnail_location = static_content_store.generate_thumbnail(content) if thumbnail_content is not None: content.thumbnail_location = thumbnail_location # then commit the content try: static_content_store.save(content) except Exception as err: log.exception('Error importing {0}, error={1}'.format( fullname_with_subpath, err )) # store the remapping information which will be needed # to subsitute in the module data remap_dict[fullname_with_subpath] = content_loc.name return remap_dict
def upload_asset(request, org, course, coursename): """ cdodge: this method allows for POST uploading of files into the course asset library, which will be supported by GridFS in MongoDB. """ if request.method != "POST": # (cdodge) @todo: Is there a way to do a - say - 'raise Http400'? return HttpResponseBadRequest() # construct a location from the passed in path location = get_location_and_verify_access(request, org, course, coursename) # Does the course actually exist?!? Get anything from it to prove its existance try: modulestore().get_item(location) except: # no return it as a Bad Request response logging.error("Could not find course" + location) return HttpResponseBadRequest() # compute a 'filename' which is similar to the location formatting, we're using the 'filename' # nomenclature since we're using a FileSystem paradigm here. We're just imposing # the Location string formatting expectations to keep things a bit more consistent filename = request.FILES["file"].name mime_type = request.FILES["file"].content_type filedata = request.FILES["file"].read() content_loc = StaticContent.compute_location(org, course, filename) content = StaticContent(content_loc, filename, mime_type, filedata) # first let's see if a thumbnail can be created (thumbnail_content, thumbnail_location) = contentstore().generate_thumbnail(content) # delete cached thumbnail even if one couldn't be created this time (else the old thumbnail will continue to show) del_cached_content(thumbnail_location) # now store thumbnail location only if we could create it if thumbnail_content is not None: content.thumbnail_location = thumbnail_location # then commit the content contentstore().save(content) del_cached_content(content.location) # readback the saved content - we need the database timestamp readback = contentstore().find(content.location) response_payload = { "displayname": content.name, "uploadDate": get_default_time_display(readback.last_modified_at.timetuple()), "url": StaticContent.get_url_path_from_location(content.location), "thumb_url": StaticContent.get_url_path_from_location(thumbnail_location) if thumbnail_content is not None else None, "msg": "Upload completed", } response = HttpResponse(json.dumps(response_payload)) response["asset_url"] = StaticContent.get_url_path_from_location(content.location) return response
def upload_asset(request, org, course, coursename): ''' This method allows for POST uploading of files into the course asset library, which will be supported by GridFS in MongoDB. ''' # construct a location from the passed in path location = get_location_and_verify_access(request, org, course, coursename) # Does the course actually exist?!? Get anything from it to prove its existance try: modulestore().get_item(location) except: # no return it as a Bad Request response logging.error('Could not find course' + location) return HttpResponseBadRequest() if 'file' not in request.FILES: return HttpResponseBadRequest() # compute a 'filename' which is similar to the location formatting, we're using the 'filename' # nomenclature since we're using a FileSystem paradigm here. We're just imposing # the Location string formatting expectations to keep things a bit more consistent upload_file = request.FILES['file'] filename = upload_file.name mime_type = upload_file.content_type content_loc = StaticContent.compute_location(org, course, filename) chunked = upload_file.multiple_chunks() if chunked: content = StaticContent(content_loc, filename, mime_type, upload_file.chunks()) else: content = StaticContent(content_loc, filename, mime_type, upload_file.read()) thumbnail_content = None thumbnail_location = None # first let's see if a thumbnail can be created (thumbnail_content, thumbnail_location) = contentstore().generate_thumbnail(content, tempfile_path=None if not chunked else upload_file.temporary_file_path()) # delete cached thumbnail even if one couldn't be created this time (else the old thumbnail will continue to show) del_cached_content(thumbnail_location) # now store thumbnail location only if we could create it if thumbnail_content is not None: content.thumbnail_location = thumbnail_location # then commit the content contentstore().save(content) del_cached_content(content.location) # readback the saved content - we need the database timestamp readback = contentstore().find(content.location) response_payload = {'displayname': content.name, 'uploadDate': get_default_time_display(readback.last_modified_at), 'url': StaticContent.get_url_path_from_location(content.location), 'thumb_url': StaticContent.get_url_path_from_location(thumbnail_location) if thumbnail_content is not None else None, 'msg': 'Upload completed' } response = JsonResponse(response_payload) response['asset_url'] = StaticContent.get_url_path_from_location(content.location) return response