def fillWorkspaceUsingTemplate(workspace, template): if not isinstance(template, TemplateParser): template = TemplateParser(template) if template.get_resource_type() != 'mashup': raise TypeError('Unsupported resource type: %s' % template.get_resource_type()) user = workspace.creator context_values = get_context_values(workspace, workspace.creator) processor = TemplateValueProcessor({'user': user, 'context': context_values}) mashup_description = template.get_resource_info() new_values = {} id_mapping = { 'operator': {}, 'widget': {}, } for preference_name in mashup_description['preferences']: # Filter public and sharelist preferences if preference_name in ("public", "sharelist"): continue new_values[preference_name] = { 'inherit': False, 'value': mashup_description['preferences'][preference_name], } if len(new_values) > 0: update_workspace_preferences(workspace, new_values) new_forced_values = { 'extra_prefs': [], 'iwidget': {}, 'ioperator': {}, } for param in mashup_description['params']: new_forced_values['extra_prefs'].append({ 'name': param['name'], 'inheritable': False, 'label': param.get('label'), 'type': param.get('type'), 'description': param.get('description'), 'required': param.get('required'), }) for tab_entry in mashup_description['tabs']: tab = createTab(tab_entry.get('title'), workspace, name=tab_entry['name'], allow_renaming=True) new_values = {} for preference_name in tab_entry['preferences']: new_values[preference_name] = { 'inherit': False, 'value': tab_entry['preferences'][preference_name], } if len(new_values) > 0: update_tab_preferences(tab, new_values) for resource in tab_entry['resources']: position = resource['position'] rendering = resource['rendering'] widget = get_or_add_widget_from_catalogue(resource.get('vendor'), resource.get('name'), resource.get('version'), user) iwidget_data = { "widget": widget.uri, "title": resource.get('title'), "left": float(position.get('x')), "top": float(position.get('y')), "icon_left": 0, "icon_top": 0, "zIndex": int(position.get('z')), "width": float(rendering.get('width')), "height": float(rendering.get('height')), "layout": int(rendering.get('layout')), "minimized": rendering['minimized'], "fulldragboard": rendering['fulldragboard'], "titlevisible": rendering['titlevisible'], } iwidget = SaveIWidget(iwidget_data, user, tab, commit=False) if resource.get('readonly'): iwidget.readOnly = True initial_variable_values = {} iwidget_forced_values = {} iwidget_info = widget.resource.get_processed_info(process_variables=True) for prop_name in resource['properties']: prop = resource['properties'][prop_name] read_only = prop.get('readonly') if prop.get('value', None) is not None: value = prop['value'] else: value = iwidget_info['variables']['properties'][prop_name]['default'] if read_only: iwidget_forced_values[prop_name] = {'value': value} else: initial_variable_values[prop_name] = processor.process(value) for pref_name in resource['preferences']: pref = resource['preferences'][pref_name] read_only = pref.get('readonly') if pref.get('value', None) is not None: value = pref['value'] if isinstance(value, dict): value = value["users"].get("%s" % workspace.creator.id, iwidget_info['variables']['preferences'][pref_name]['default']) else: value = iwidget_info['variables']['preferences'][pref_name]['default'] # Build multiuser structure if read_only: iwidget_forced_values[pref_name] = {'value': value, 'hidden': pref.get('hidden', False)} else: initial_variable_values[pref_name] = processor.process(value) set_initial_values(iwidget, initial_variable_values, iwidget_info, workspace.creator) iwidget.save() if len(iwidget_forced_values) > 0: new_forced_values['iwidget'][str(iwidget.id)] = iwidget_forced_values id_mapping['widget'][resource.get('id')] = { 'id': iwidget.id, 'name': resource.get('vendor') + "/" + resource.get('name') + "/" + resource.get('version') } # wiring if len(workspace.wiringStatus) == 0: workspace.wiringStatus = get_wiring_skeleton() max_id = 0 for id_ in workspace.wiringStatus['operators'].keys(): if int(id_) > max_id: max_id = int(id_) # Process operators info for operator_id, operator in mashup_description['wiring']['operators'].items(): max_id += 1 new_id = "%s" % max_id id_mapping['operator'][operator_id] = { 'id': new_id } workspace.wiringStatus['operators'][new_id] = { 'id': new_id, 'name': operator['name'], 'preferences': operator['preferences'], 'properties': {} } ioperator_forced_values = {} for pref_id, pref in operator['preferences'].items(): if pref.get('readonly', False): ioperator_forced_values[pref_id] = {'value': pref.get('value'), 'hidden': pref.get('hidden', False)} workspace.wiringStatus['operators'][new_id]["preferences"][pref_id]["value"] = {'users': {"%s" % workspace.creator.id: pref["value"]}} if len(ioperator_forced_values) > 0: new_forced_values['ioperator'][new_id] = ioperator_forced_values # Remap connection ids source_mapping = {} target_mapping = {} for connection in mashup_description['wiring']['connections']: if not is_valid_connection(connection, id_mapping): continue old_source_name = get_endpoint_name(connection['source']) old_target_name = get_endpoint_name(connection['target']) connection['source']['id'] = map_id(connection['source'], id_mapping) connection['target']['id'] = map_id(connection['target'], id_mapping) source_mapping[old_source_name] = get_endpoint_name(connection['source']) target_mapping[old_target_name] = get_endpoint_name(connection['target']) # Add new connection workspace.wiringStatus['connections'].append(connection) # Merging visual description... _remap_component_ids(id_mapping, mashup_description['wiring']['visualdescription']['components'], isGlobal=True) _remap_connection_endpoints(source_mapping, target_mapping, mashup_description['wiring']['visualdescription']) # Remap mashup description behaviours' ids if len(mashup_description['wiring']['visualdescription']['behaviours']) != 0: for behaviour in mashup_description['wiring']['visualdescription']['behaviours']: _remap_component_ids(id_mapping, behaviour['components']) _remap_connection_endpoints(source_mapping, target_mapping, behaviour) if len(workspace.wiringStatus['visualdescription']['behaviours']) != 0 or len(mashup_description['wiring']['visualdescription']['behaviours']) != 0: if len(workspace.wiringStatus['visualdescription']['behaviours']) == 0 and not is_empty_wiring(workspace.wiringStatus['visualdescription']): # *TODO* flag to check if the user really want to merge both workspaces. _create_new_behaviour(workspace.wiringStatus['visualdescription'], _("Original wiring"), _("This is the wiring description of the original workspace")) if len(mashup_description['wiring']['visualdescription']['behaviours']) == 0: _create_new_behaviour(mashup_description['wiring']['visualdescription'], _("Merged wiring"), _("This is the wiring description of the merged mashup.")) workspace.wiringStatus['visualdescription']['behaviours'] += mashup_description['wiring']['visualdescription']['behaviours'] # Merge global behaviour components and connections workspace.wiringStatus['visualdescription']['components']['operator'].update(mashup_description['wiring']['visualdescription']['components']['operator']) workspace.wiringStatus['visualdescription']['components']['widget'].update(mashup_description['wiring']['visualdescription']['components']['widget']) workspace.wiringStatus['visualdescription']['connections'] += mashup_description['wiring']['visualdescription']['connections'] # Forced values normalize_forced_values(workspace) workspace.forcedValues['extra_prefs'] += new_forced_values['extra_prefs'] workspace.forcedValues['iwidget'].update(new_forced_values['iwidget']) workspace.forcedValues['ioperator'].update(new_forced_values['ioperator']) workspace.save()