def load_module_from_dict(d): required = ['name', 'id_name', 'category'] for x in required: if not x in d: raise ValueError("Module specification missing field " + x) id_name = d['id_name'] # If we can find an existing module with the same id_name, use that matches = Module.objects.filter(id_name=id_name) if len(matches)>0: assert (len(matches) == 1) # no duplicates please module = matches[0] else: module = Module() # save module data module.name=d['name'] module.category=d['category'] module.id_name=id_name module.dispatch=id_name module.source=d['source'] if 'source' in d else "" module.save() #add module.last_updated here. source_version = d['source_version'] if 'source_version' in d else '1.0' version_matches = ModuleVersion.objects.filter(module=module, source_version_hash = source_version) if len(version_matches) > 0: assert (len(version_matches) == 1) # no duplicates please module_version = version_matches[0] else: module_version = ModuleVersion() module_version.source_version_hash = source_version #the last_update_time should automatically be added based on _now_. #possible todo: should this be driven based on the last_commit time or the last system time? module_version.module = module module_version.save() # load params if 'parameters' in d: pspecs = [ load_parameter_spec(p, module_version, order) for (order,p) in enumerate(d['parameters']) ] else: pspecs = [] # delete all ParameterSpecs (and hence ParameterVals) for this module that were not in the new module description for ps in ParameterSpec.objects.filter(module_version=module_version): if ps not in pspecs: # relies on model == comparing id field ps.delete() return module_version
def load_module_from_dict(d): with transaction.atomic(): required = ['name', 'id_name', 'category'] for x in required: if not x in d: raise ValueError("Module specification missing field " + x) id_name = d['id_name'] # If we can find an existing module with the same id_name, use that try: module = Module.objects.get(id_name=id_name) except Module.DoesNotExist: module = Module() # save module data module.name = d['name'] module.category = d['category'] module.id_name = id_name module.dispatch = id_name module.source = d.get('source', '') module.description = d.get('description', '') module.author = d.get('author', 'Workbench') module.link = d.get('link', '') module.icon = d.get('icon', 'settings') module.loads_data = d.get('loads_data', False) module.help_url = d.get('help_url', '') module.has_zen_mode = d.get('has_zen_mode', False) module.row_action_menu_entry_title = d.get( 'row_action_menu_entry_title', '') module.save() source_version = d.get( 'source_version', '1.0') # if no source_version, internal module, version 1.0 always try: # if we are loading the same version again, re-use existing module_version module_version = ModuleVersion.objects.get( module=module, source_version_hash=source_version) reusing_version = True except ModuleVersion.DoesNotExist: module_version = ModuleVersion(module=module, source_version_hash=source_version) reusing_version = False module_version.html_output = d.get('html_output', False) module_version.save() # load params if 'parameters' in d: pspecs = [ load_parameter_spec(p, module_version, order) for (order, p) in enumerate(d['parameters']) ] else: pspecs = [] # Migrate parameters, if we're updating an existing module_version if reusing_version: # Deleted parameters new_id_names = [p.id_name for p in pspecs] for old_spec in ParameterSpec.objects.filter( module_version=module_version): if old_spec.id_name not in new_id_names: old_spec.delete( ) # also deletes old ParameterVals via cascade for new_spec in pspecs: try: # Changed parameters old_spec = ParameterSpec.objects.\ exclude(id=new_spec.id).\ get(id_name=new_spec.id_name, module_version=module_version) for pv in ParameterVal.objects.filter( parameter_spec=old_spec): migrate_parameter_val(pv, old_spec, new_spec) old_spec.delete() except ParameterSpec.DoesNotExist: # Added parameters for wfm in WfModule.objects.filter( module_version=module_version): create_parameter_val(wfm, new_spec) return module_version