def append_file_as_asset_content(repo, asset_id, file_name, file_data, basics=None): asset_content_type_list = get_asset_content_records(repo) acfc = repo.get_asset_content_form_for_create(asset_id, asset_content_type_list) acfc.set_genus_type(get_asset_content_genus_type(file_name)) try: acfc.add_display_name(utilities.create_display_text(file_name)) except AttributeError: acfc.display_name = file_name data = DataInputStream(file_data) data.name = file_name acfc.set_data(data) if basics is not None: acfc = utilities.set_form_basics(acfc, basics) ac = repo.create_asset_content(acfc) # really stupid, but set the data again, because for filesystem impl # the ID above will be off by one-ish -- we need it to match the # AssetContent ID, so re-set it. # have to set it above so that the filesystem adapter kicks in on update data.seek(0) acfu = repo.get_asset_content_form_for_update(ac.ident) acfu.set_data(data) repo.update_asset_content(acfu) return repo.get_asset(asset_id), ac
def PUT(self, repository_id, asset_id, content_id): """ replace the asset content data ... keep the same name (ugh), but hacking this in for the Onyx workflow for CLIx. They want to author in Onyx with high-res images but then replace them with the right-sized images via a script. So we'll enable this endpoint and let the script find / replace the right asset content. """ try: x = web.input(inputFile={}) rm = rutils.get_repository_manager() als = rm.get_asset_lookup_session(proxy=rm._proxy) als.use_federated_repository_view() asset = als.get_asset(utilities.clean_id(asset_id)) asset_content = rutils.get_asset_content_by_id( asset, utilities.clean_id(content_id)) repository = rm.get_repository(utilities.clean_id(repository_id)) repository.use_isolated_repository_view() form = repository.get_asset_content_form_for_update( asset_content.ident) try: input_file = x['inputFile'].file except AttributeError: pass # no file included else: file_name = x['inputFile'].filename data = DataInputStream(input_file) data.name = file_name # default, but can be over-ridden by user params form.set_genus_type( rutils.get_asset_content_genus_type(file_name)) try: form.add_display_name( utilities.create_display_text(file_name)) except AttributeError: form.display_name = file_name form.set_data(data) params = self.data() form = utilities.set_form_basics(form, params) repository.update_asset_content(form) return utilities.convert_dl_object( repository.get_asset(asset.ident)) except Exception as ex: utilities.handle_exceptions(ex)
def PUT(self, repository_id): try: rm = rutils.get_repository_manager() data = self.data() form = rm.get_repository_form_for_update( utilities.clean_id(repository_id)) form = utilities.set_form_basics(form, data) updated_repository = rm.update_repository(form) if 'aliasId' in data: rm.alias_repository(updated_repository.ident, utilities.clean_id(data['aliasId'])) repository = utilities.convert_dl_object(updated_repository) return repository except Exception as ex: utilities.handle_exceptions(ex)
def POST(self): # get or find a default log genus type try: input_data = self.data() utilities.verify_keys_present(input_data, ['data']) log = self._get_log() form = log.get_log_entry_form_for_create([TEXT_BLOB_RECORD_TYPE]) if isinstance(input_data['data'], dict): blob = json.dumps(input_data['data']) else: blob = str(input_data['data']) form.set_text(blob) form = utilities.set_form_basics(form, input_data) entry = log.create_log_entry(form) return utilities.convert_dl_object(entry) except Exception as ex: utilities.handle_exceptions(ex)
def POST(self, repository_id, asset_id): try: x = web.input(inputFile={}) rm = rutils.get_repository_manager() repository = rm.get_repository(utilities.clean_id(repository_id)) repository.use_isolated_repository_view() asset = repository.get_asset(utilities.clean_id(asset_id)) # get each set of files individually, because # we are doing this in memory, so the file pointer changes # once we read in a file # https://docs.python.org/2/library/zipfile.html params = self.data() try: input_file = x['inputFile'].file except AttributeError: asset_content_type_list = rutils.get_asset_content_records( repository) form = repository.get_asset_content_form_for_create( asset.ident, asset_content_type_list) form = utilities.set_form_basics(form, params) asset_content = repository.create_asset_content(form) else: file_name = x['inputFile'].filename # now let's create an asset content for this asset, with the # right genus type and file data. Also set the form basics, if passed in updated_asset, asset_content = rutils.append_file_as_asset_content( repository, asset.ident, file_name, input_file, params) # need to get the updated asset with Contents asset_content_map = json.loads( utilities.convert_dl_object(asset_content)) if 'fullUrl' in params: asset_content_map = rutils.update_asset_map_with_content_url( rm, asset_content_map) return json.dumps(asset_content_map) except Exception as ex: utilities.handle_exceptions(ex)
def POST(self): """ Create a new repository, if authorized """ try: rm = rutils.get_repository_manager() form = rm.get_repository_form_for_create([]) data = self.data() form = utilities.set_form_basics(form, data) new_repository = utilities.convert_dl_object( rm.create_repository(form)) if 'aliasId' in data: rm.alias_repository( utilities.clean_id(json.loads(new_repository)['id']), utilities.clean_id(data['aliasId'])) return new_repository except Exception as ex: utilities.handle_exceptions(ex)
def PUT(self, repository_id, asset_id): try: main_input_file = web.input(inputFile={}) vtt_input_file = web.input(vttFile={}) transcript_input_file = web.input(transcriptFile={}) asset_id = utilities.clean_id(asset_id) rm = rutils.get_repository_manager() repo = rm.get_repository(utilities.clean_id(repository_id)) params = self.data() locale = 'en' if 'locale' in params: locale = params['locale'] # update the asset contents here, for convenience if 'clearAltTexts' in params and params['clearAltTexts']: rutils.clear_alt_texts(repo, asset_id) if 'altText' in params: # find the right asset content by genus type. Grab its ID # then get the asset content update form # call form.add_display_name(new alt text) # update form rutils.add_alt_text_to_asset( repo, asset_id, utilities.clean_json(params['altText'])) if 'removeAltTextLanguage' in params: rutils.remove_alt_text_language( repo, asset_id, params['removeAltTextLanguage']) if 'clearMediaDescriptions' in params and params[ 'clearMediaDescriptions']: rutils.clear_media_descriptions(repo, asset_id) if 'mediaDescription' in params: rutils.add_media_description_to_asset( repo, asset_id, utilities.clean_json(params['mediaDescription'])) if 'removeMediaDescriptionLanguage' in params: rutils.remove_media_description_language( repo, asset_id, params['removeMediaDescriptionLanguage']) # Now handle the vtt and transcript uploaded files if 'clearVTTFiles' in params and params['clearVTTFiles']: rutils.clear_vtt_files(repo, asset_id) try: vtt_file = vtt_input_file['vttFile'].file except AttributeError: pass else: file_name = vtt_input_file['vttFile'].filename rutils.add_vtt_file_to_asset(repo, asset_id, file_name, vtt_file, locale) if 'removeVTTFileLanguage' in params: rutils.remove_vtt_file_language( repo, asset_id, params['removeVTTFileLanguage']) if 'clearTranscriptFiles' in params and params[ 'clearTranscriptFiles']: rutils.clear_transcript_files(repo, asset_id) try: transcript_file = transcript_input_file['transcriptFile'].file except AttributeError: pass else: file_name = transcript_input_file['transcriptFile'].filename rutils.add_transcript_file_to_asset(repo, asset_id, file_name, transcript_file, locale) if 'removeTranscriptFileLanguage' in params: rutils.remove_transcript_file_language( repo, asset_id, params['removeTranscriptFileLanguage']) # also handle updating the main asset content (image or video or audio) try: main_file = main_input_file['inputFile'].file except AttributeError: pass else: file_name = main_input_file['inputFile'].filename rutils.replace_asset_main_content(repo, asset_id, file_name, main_file) form = repo.get_asset_form_for_update(asset_id) form = utilities.set_form_basics(form, params) if 'license' in params.keys(): form.set_license(params['license']) if 'copyright' in params.keys(): form.set_copyright(params['copyright']) if 'source' in params.keys(): resource_id = resource_utils.get_or_create_resource_id( repo, params['source']) form.set_source(resource_id) if 'provider' in params.keys(): resource_id = resource_utils.get_or_create_resource_id( repo, params['provider']) form.set_provider(resource_id) repo.update_asset(form) if 'createdDate' in params.keys(): rutils.set_asset_created_date( repo, asset_id, DateTime(**params['createdDate'])) data = utilities.convert_dl_object(repo.get_asset(asset_id)) # Update the source field with the displayName.text of the actual resource data = resource_utils.update_asset_map_with_resource(data) return data except Exception as ex: utilities.handle_exceptions(ex)
def POST(self, repository_id): try: main_input_file = web.input(inputFile={}) vtt_input_file = web.input(vttFile={}) transcript_input_file = web.input(transcriptFile={}) rm = rutils.get_repository_manager() repository = rm.get_repository(utilities.clean_id(repository_id)) repository.use_isolated_repository_view() # get each set of files individually, because # we are doing this in memory, so the file pointer changes # once we read in a file # https://docs.python.org/2/library/zipfile.html params = self.data() locale = 'en' if 'locale' in params: locale = params['locale'] if locale not in ['en', 'hi', 'te']: raise TypeError( "The 'locale' parameter must be one of: 'en', 'hi', or 'te'" ) try: input_file = main_input_file['inputFile'].file except AttributeError: form = repository.get_asset_form_for_create([]) form = utilities.set_form_basics(form, params) asset = repository.create_asset(form) else: # first, let's search the database to see if an asset exists with # the file name -- file name will be everything minus the # extension and language indicator. # for example, for one video there might be four files: # * ee_u1l01a01v01.mov # * ee_u1l01a01v01_en.vtt # * ee_u1l01a01v01_hi.vtt # * ee_u1l01a01v01_te.vtt # In this case, the "filename" / asset displayName.text is `ee_u1l01a01v01`. # If that already exists, add the input_file as an asset content. # If that asset does not exist, create it. file_name = main_input_file['inputFile'].filename if 'createNew' in params.keys() and params['createNew']: asset = rutils.create_asset(repository, file_name) else: try: querier = repository.get_asset_query() except (AttributeError, Unimplemented, PermissionDenied): assets = None else: querier.match_display_name( rutils.get_singular_filename(file_name), match=True) assets = repository.get_assets_by_query(querier) if assets is not None and assets.available() > 0: asset = assets.next() else: asset = rutils.create_asset(repository, file_name) # now let's create an asset content for this asset, with the # right genus type and file data rutils.append_file_as_asset_content(repository, asset.ident, file_name, input_file) # Check if transcripts or VTT files are included try: vtt_file = vtt_input_file['vttFile'].file except AttributeError: pass else: file_name = vtt_input_file['vttFile'].filename rutils.append_vtt_file_as_asset_content( repository, asset.ident, file_name, vtt_file, locale) try: transcript_file = transcript_input_file['transcriptFile'].file except AttributeError: pass else: file_name = transcript_input_file['transcriptFile'].filename rutils.append_transcript_file_as_asset_content( repository, asset.ident, file_name, transcript_file, locale) if any(term in params.keys() for term in ['license', 'copyright', 'source', 'provider']): form = repository.get_asset_form_for_update(asset.ident) if 'license' in params.keys(): form.set_license(params['license']) if 'copyright' in params.keys(): form.set_copyright(params['copyright']) if 'source' in params.keys(): resource_id = resource_utils.get_or_create_resource_id( repository, params['source']) form.set_source(resource_id) if 'provider' in params.keys(): resource_id = resource_utils.get_or_create_resource_id( repository, params['provider']) form.set_provider(resource_id) asset = repository.update_asset(form) # Handle the alt-text for images if 'altText' in params.keys(): rutils.append_text_as_asset_content( repository, asset.ident, utilities.clean_json(params['altText']), 'Alt text', 'alt-text') if 'mediaDescription' in params.keys(): rutils.append_text_as_asset_content( repository, asset.ident, utilities.clean_json(params['mediaDescription']), 'Description', 'mediaDescription') if 'createdDate' in params.keys(): # set the createdDate rutils.set_asset_created_date( repository, asset.ident, DateTime(**utilities.clean_json(params['createdDate']))) # need to get the updated asset with Contents asset = repository.get_asset(asset.ident) asset_map = json.loads(utilities.convert_dl_object(asset)) if 'returnUrl' in web.input().keys(): asset_map = rutils.update_asset_map_with_content_url( rm, asset_map) # Update the source field with the displayName.text of the actual resource asset_map = resource_utils.update_asset_map_with_resource( asset_map) return json.dumps(asset_map) except Exception as ex: utilities.handle_exceptions(ex)