def post(self, request, *args, **kwargs): handle = request.FILES['bulk_upload_file'] extension = os.path.splitext(handle.name)[1][1:].strip().lower() if extension not in valid_extensions: messages.error(request, _("Please choose a file with one of the following extensions: " "{}").format(", ".join(valid_extensions))) return self.get(request, *args, **kwargs) meta = transient_file_store.write_file(handle, handle.name, self.domain) file_id = meta.identifier f = transient_file_store.get_tempfile_ref_for_contents(file_id) try: open_spreadsheet_download_ref(f) except SpreadsheetFileExtError: messages.error(request, _("File does not appear to be an Excel file. Please choose another file.")) return self.get(request, *args, **kwargs) from corehq.apps.app_manager.views.media_utils import interpolate_media_path from corehq.apps.hqmedia.view_helpers import validate_multimedia_paths_rows, update_multimedia_paths # Get rows, filtering out header, no-ops, and any extra "Usages" columns rows = [] with get_spreadsheet(f) as spreadsheet: for row in list(spreadsheet.iter_rows())[1:]: if row[1]: rows.append(row[:2]) (errors, warnings) = validate_multimedia_paths_rows(self.app, rows) if len(errors): for msg in errors: messages.error(request, msg, extra_tags='html') return self.get(request, *args, **kwargs) paths = { row[0]: interpolate_media_path(row[1]) for row in rows if row[1] } successes = update_multimedia_paths(self.app, paths) self.app.save() # Force all_media to reset self.app.all_media.reset_cache(self.app) self.app.all_media_paths.reset_cache(self.app) # Warn if any old paths remain in app (because they're used in a place this function doesn't know about) warnings = [] self.app.remove_unused_mappings() app_paths = {m.path: True for m in self.app.all_media()} for old_path, new_path in paths.items(): if old_path in app_paths: warnings.append(_("Could not completely update path <code>{}</code>, " "please check app for remaining references.").format(old_path)) for msg in successes: messages.success(request, msg, extra_tags='html') for msg in warnings: messages.warning(request, msg, extra_tags='html') return self.get(request, *args, **kwargs)
def update_multimedia_paths(request, domain, app_id): if not request.FILES: return json_response( {'error': _("Please choose an Excel file to import.")}) handle = request.FILES['file'] extension = os.path.splitext(handle.name)[1][1:].strip().lower() if extension not in ALLOWED_EXTENSIONS: return json_response({ 'error': _("Please choose a file with one of the following extensions: " "{}").format(", ".join(ALLOWED_EXTENSIONS)) }) meta = transient_file_store.write_file(handle, handle.name, domain) file_id = meta.identifier f = transient_file_store.get_tempfile_ref_for_contents(file_id) try: open_spreadsheet_download_ref(f) except SpreadsheetFileExtError: return json_response({ 'error': _("File does not appear to be an Excel file. Please choose another file." ) }) app = get_app(domain, app_id) from corehq.apps.app_manager.views.media_utils import interpolate_media_path from corehq.apps.hqmedia.view_helpers import validate_multimedia_paths_rows, update_multimedia_paths # Get rows, filtering out header, no-ops, and any extra "Usages" columns rows = [] with get_spreadsheet(f) as spreadsheet: for row in list(spreadsheet.iter_rows())[1:]: if row[1]: rows.append(row[:2]) (errors, warnings) = validate_multimedia_paths_rows(app, rows) if len(errors): return json_response({ 'complete': 1, 'errors': errors, }) paths = {row[0]: interpolate_media_path(row[1]) for row in rows if row[1]} successes = update_multimedia_paths(app, paths) app.save() # Force all_media to reset app.all_media.reset_cache(app) app.all_media_paths.reset_cache(app) # Warn if any old paths remain in app (because they're used in a place this function doesn't know about) warnings = [] app.remove_unused_mappings() app_paths = {m.path: True for m in app.all_media()} for old_path, new_path in paths.items(): if old_path in app_paths: warnings.append( _("Could not completely update path <code>{}</code>, " "please check app for remaining references.").format( old_path)) return json_response({ 'complete': 1, 'successes': successes, 'warnings': warnings, })
def test_paths_upload(self, validate_xform, get_db): paths = { 'jr://file/commcare/image/data/undefined-86sshg.jpg': 'jr://file/commcare/nin/ghosts.jpg', 'jr://file/commcare/audio/module0_form0_en.mp3': 'jr://file/commcare/en/audio/laundry.mp3', 'jr://file/commcare/image/data/la_la_la-zvj1k3.jpg': 'jr://file/commcare/nin/sin.jpg', 'jr://file/commcare/audio/module0_en.mp3': 'jr://file/commcare/en/audio/dream.mp3', 'jr://file/commcare/image/module1_case_list_menu_item_en.png': 'jr://file/commcare/image/lemonade.jpg', 'jr://file/commcare/image/module0_form0_fra.jpg': 'jr://file/commcare/aff/pines.jpg', 'jr://file/commcare/audio/module0_form0_fra.mp3': 'jr://file/commcare/fra/audio/souled.mp3', 'jr://file/commcare/image/module0_form0_en.jpg': 'jr://file/commcare/aff/one_cell.jpg', 'jr://file/commcare/image/module1_list_icon_name_1480.jpg': 'jr://file/commcare/image/le_monde.jpg', 'jr://file/commcare/image/module0_en.jpg': 'jr://file/commcare/image/chime.jpg', 'jr://file/commcare/image/module1_case_list_form_en.png': 'jr://file/commcare/image/trip.jpg', 'jr://file/commcare/image/module1_case_list_lookup.jpg': 'jr://file/commcare/debut.jpg', } with open(os.path.join(os.path.dirname(__file__), 'data', 'manage-multimedia.json')) as f: source = json.load(f) app = Application.wrap(source) update_multimedia_paths(app, paths) self.assertEquals(len(app.all_media()), len(paths)) # Module and form menu media self.assertEquals( app.modules[0].forms[0].icon_by_language('en'), 'jr://file/commcare/aff/pines.jpg' ) self.assertEquals( app.modules[0].forms[0].icon_by_language('fra'), 'jr://file/commcare/aff/one_cell.jpg' ) self.assertEquals( app.modules[0].icon_by_language('en'), 'jr://file/commcare/image/chime.jpg' ) self.assertEquals( app.modules[0].audio_by_language('en'), 'jr://file/commcare/en/audio/dream.mp3' ) self.assertEquals( app.modules[0].forms[0].audio_by_language('en'), 'jr://file/commcare/fra/audio/souled.mp3' ) self.assertEquals( app.modules[0].forms[0].audio_by_language('fra'), 'jr://file/commcare/en/audio/laundry.mp3' ) self.assertEquals( app.modules[0].forms[0].audio_by_language('en'), 'jr://file/commcare/fra/audio/souled.mp3' ) # Form media form_images = app.modules[1].forms[0].wrapped_xform().image_references() self.assertTrue('jr://file/commcare/nin/ghosts.jpg' in form_images) self.assertTrue('jr://file/commcare/nin/sin.jpg' in form_images) # Case list lookup self.assertEquals( app.modules[1].get_details()[0][1].lookup_image, 'jr://file/commcare/debut.jpg' ) # Case list icons self.assertEquals( app.modules[1].get_details()[0][1].columns[2].enum[0].value['en'], 'jr://file/commcare/image/le_monde.jpg' ) # Case list menu item self.assertEquals( app.modules[1].case_list.icon_by_language('en'), 'jr://file/commcare/image/lemonade.jpg' ) self.assertEquals( app.modules[1].case_list.icon_by_language('fra'), 'jr://file/commcare/image/lemonade.jpg' ) # Reg from cast list self.assertEquals( app.modules[1].case_list_form.icon_by_language('en'), 'jr://file/commcare/image/trip.jpg' ) self.assertEquals( app.modules[1].case_list_form.icon_by_language('fra'), 'jr://file/commcare/image/trip.jpg' )
def update_multimedia_paths(request, domain, app_id): if not request.FILES: return json_response({ 'error': _("Please choose an Excel file to import.") }) handle = request.FILES['file'] extension = os.path.splitext(handle.name)[1][1:].strip().lower() if extension not in ALLOWED_EXTENSIONS: return json_response({ 'error': _("Please choose a file with one of the following extensions: " "{}").format(", ".join(ALLOWED_EXTENSIONS)) }) meta = transient_file_store.write_file(handle, handle.name, domain) file_id = meta.identifier f = transient_file_store.get_tempfile_ref_for_contents(file_id) try: open_spreadsheet_download_ref(f) except SpreadsheetFileExtError: return json_response({ 'error': _("File does not appear to be an Excel file. Please choose another file.") }) app = get_app(domain, app_id) from corehq.apps.app_manager.views.media_utils import interpolate_media_path from corehq.apps.hqmedia.view_helpers import validate_multimedia_paths_rows, update_multimedia_paths # Get rows, filtering out header, no-ops, and any extra "Usages" columns rows = [] with get_spreadsheet(f) as spreadsheet: for row in list(spreadsheet.iter_rows())[1:]: if row[1]: rows.append(row[:2]) (errors, warnings) = validate_multimedia_paths_rows(app, rows) if len(errors): return json_response({ 'complete': 1, 'errors': errors, }) paths = { row[0]: interpolate_media_path(row[1]) for row in rows if row[1] } successes = update_multimedia_paths(app, paths) app.save() # Force all_media to reset app.all_media.reset_cache(app) app.all_media_paths.reset_cache(app) # Warn if any old paths remain in app (because they're used in a place this function doesn't know about) warnings = [] app.remove_unused_mappings() app_paths = {m.path: True for m in app.all_media()} for old_path, new_path in six.iteritems(paths): if old_path in app_paths: warnings.append(_("Could not completely update path <code>{}</code>, " "please check app for remaining references.").format(old_path)) return json_response({ 'complete': 1, 'successes': successes, 'warnings': warnings, })