Ejemplo n.º 1
0
    def merge_workspaces(self, from_ws, to_ws, user):
        meta = from_ws._meta
        table_name = meta.object_name

        # Registering mapping between tuple and cloning tuple!
        self.mapping.add_mapping(table_name, from_ws.id, to_ws.id)

        self.final_tables = list(self.final_tables)
        self.extra_models['Variable'] += (
            ('workspace', 'variablevalue', 'variable', {'user': from_ws.creator}),
        )
        self.fields_to_overwrite['VariableValue'] = {
            'user': user,
        }

        # Continue iterating over data-model structure
        extra_models = self.extra_models.get(table_name, [])
        for model in extra_models:
            related_tuples = get_related_tuples(model[0],  # app_label
                                                model[1],  # module_name
                                                model[2],  # field.name
                                                from_ws.id)
            for related_tuple in related_tuples:
                self.clone_tuple(related_tuple)

        from commons.get_data import _invalidate_cached_variable_values
        _invalidate_cached_variable_values(to_ws)

        return to_ws
Ejemplo n.º 2
0
def set_variable_value(var_id, user, value):

    variables_to_notify = []
    variable_value = VariableValue.objects.select_related('variable__vardef').get(user=user, variable__id=var_id)

    new_value = unicode(value)
    if variable_value.variable.vardef.secure:
        new_value = encrypt_value(new_value)

    variable_value.value = new_value
    variable_value.save()

    from commons.get_data import _invalidate_cached_variable_values
    _invalidate_cached_variable_values(variable_value.variable.igadget.tab.workspace, user)

    return variables_to_notify
Ejemplo n.º 3
0
def SaveIGadget(igadget, user, tab, initial_variable_values):
    gadget_uri = igadget.get('gadget')
    igadget_name = igadget.get('name')
    width = igadget.get('width')
    height = igadget.get('height')
    top = igadget.get('top')
    left = igadget.get('left')
    icon_top = igadget.get('icon_top')
    icon_left = igadget.get('icon_left')
    zIndex = igadget.get('zIndex')
    layout = igadget.get('layout')
    menu_color = igadget.get('menu_color')

    # Creates IGadget position
    position = Position(posX=left, posY=top, posZ=zIndex, height=height, width=width, minimized=False, fulldragboard=False)
    position.save()

    # Creates IGadget icon position
    icon_position = Position(posX=icon_left, posY=icon_top)
    icon_position.save()

    # Gadget uri does not contain the prefix "/user" yet
    if gadget_uri.startswith("/user") or gadget_uri.startswith("user"):
        gadget_uri_parts = gadget_uri.split("/")
        gadget_uri = "/" + "/".join(gadget_uri_parts[gadget_uri_parts.index("gadgets"):])

    gadget = Gadget.objects.get(uri=gadget_uri, users=user)

    new_igadget = IGadget(name=igadget_name, gadget=gadget, tab=tab, layout=layout, position=position, icon_position=icon_position, transparency=False, menu_color=menu_color)
    new_igadget.save()

    variableDefs = VariableDef.objects.filter(gadget=gadget)
    for varDef in variableDefs:
        if initial_variable_values and varDef.name in initial_variable_values:
            initial_value = initial_variable_values[varDef.name]
        else:
            initial_value = None
        addIGadgetVariable(new_igadget, varDef, initial_value)

    from commons.get_data import _invalidate_cached_variable_values
    _invalidate_cached_variable_values(new_igadget.tab.workspace)

    return new_igadget
def fillWorkspaceUsingTemplate(workspace, template, xml=None):

    if xml is None:
        if isinstance(template, unicode):
            # Work around: ValueError: Unicode strings with encoding
            # declaration are not supported.
            template = template.encode('utf-8')

        xml = etree.fromstring(template)

    user = workspace.creator
    concept_values = get_concept_values(user)
    processor = TemplateValueProcessor({'user': user, 'context': concept_values})

    workspace_structure = INCLUDED_RESOURCES_XPATH(xml)[0]
    read_only_workspace = workspace_structure.get('readonly') == 'true'

    preferences = PREFERENCE_XPATH(workspace_structure)
    new_values = {}
    igadget_id_mapping = {}
    for preference in preferences:
        new_values[preference.get('name')] = {
            'inherit': False,
            'value': preference.get('value'),
        }

    if len(new_values) > 0:
        update_workspace_preferences(workspace, new_values)

    forced_values = {
        'extra_prefs': {},
        'igadget': {},
    }
    params = PARAM_XPATH(workspace_structure)
    for param in params:
        forced_values['extra_prefs'][param.get('name')] = {
            'inheritable': False,
            'label': param.get('label'),
            'type': param.get('type')
        }

    tabs = TAB_XPATH(workspace_structure)
    tab_id_mapping = {}

    for tabElement in tabs:
        tab = createTab(tabElement.get('name'), user, workspace, allow_renaming=True)
        tab_id_mapping[tabElement.get('id')] = tab

        preferences = PREFERENCE_XPATH(tabElement)
        new_values = {}
        for preference in preferences:
            new_values[preference.get('name')] = {
                'inherit': False,
                'value': preference.get('value'),
            }

        if len(new_values) > 0:
            update_tab_preferences(tab, new_values)

        resources = RESOURCE_XPATH(tabElement)
        for resource in resources:
            igadget_uri = "/workspace/" + str(workspace.id) + "/tab/" + str(tab.id) + "/igadgets"

            position = POSITION_XPATH(resource)[0]
            rendering = RENDERING_XPATH(resource)[0]

            initial_variable_values = {}
            igadget_forced_values = {}
            properties = PROPERTIES_XPATH(resource)
            for prop in properties:
                read_only = prop.get('readonly')
                if read_only and read_only == 'true':
                    igadget_forced_values[prop.get('name')] = {'value': prop.get('value')}
                else:
                    initial_variable_values[prop.get('name')] = processor.process(prop.get('value'))

            preferences = PREFERENCE_XPATH(resource)
            for pref in preferences:
                read_only = pref.get('readonly')
                if read_only and read_only == 'true':
                    hidden = pref.get('hidden') == 'true'
                    igadget_forced_values[pref.get('name')] = {'value': pref.get('value'), 'hidden': hidden}
                else:
                    initial_variable_values[pref.get('name')] = processor.process(pref.get('value'))

            gadget = get_or_add_gadget_from_catalogue(resource.get('vendor'), resource.get('name'), resource.get('version'), user, None)

            igadget_data = {
                "left": int(position.get('x')),
                "top": int(position.get('y')),
                "icon_left": -1,
                "icon_top": -1,
                "zIndex": int(position.get('z')),
                "width": int(rendering.get('width')),
                "height": int(rendering.get('height')),
                "name": resource.get('title'),
                "menu_color": "FFFFFF",
                "layout": int(rendering.get('layout')),
                "uri": igadget_uri,
                "gadget": gadget.uri}

            igadget = SaveIGadget(igadget_data, user, tab, initial_variable_values)
            if read_only_workspace or resource.get('readonly') == 'true':
                igadget.readOnly = True
                igadget.save()

            forced_values['igadget'][str(igadget.id)] = igadget_forced_values
            igadget_id_mapping[resource.get('id')] = igadget

    if workspace.forcedValues != None and workspace.forcedValues != '':
        old_forced_values = simplejson.loads(workspace.forcedValues)
    else:
        old_forced_values = {
            'extra_preferences': {},
            'igadget': {},
        }

    forced_values['igadget'].update(old_forced_values['igadget'])
    workspace.forcedValues = simplejson.dumps(forced_values, ensure_ascii=False)
    workspace.save()

    # wiring
    wiring = WIRING_XPATH(xml)[0]
    channels = CHANNEL_XPATH(wiring)
    channel_connectables = {}
    for channel in channels:
        connectable = createChannel(workspace, channel.get('name'))

        save = False
        if read_only_workspace or channel.get('readonly') == 'true':
            connectable.readOnly = True
            save = True

        filter_name = channel.get('filter')
        if filter_name:
            save = True
            connectable.filter = Filter.objects.get(name=filter_name)
            connectable.filter_param_values = channel.get('filter_params')

        if save:
            connectable.save()

        channel_connectables[channel.get('id')] = {
            'connectable': connectable,
            'element': channel,
        }

    for key in channel_connectables:
        channel = channel_connectables[key]
        ins = IN_XPATH(channel['element'])
        for in_ in ins:
            igadget_id = in_.get('igadget')
            igadget = igadget_id_mapping[igadget_id]
            name = in_.get('name')

            connectable = In.objects.get(variable__vardef__name=name, variable__igadget=igadget)
            connectable.inouts.add(channel['connectable'])
            connectable.save()

        outs = OUT_XPATH(channel['element'])
        for out in outs:
            if 'igadget' in out.attrib:
                igadget_id = out.get('igadget')
                igadget = igadget_id_mapping[igadget_id]
                name = out.get('name')

                variable = Variable.objects.get(igadget=igadget, vardef__name=name)
                connectable = Out.objects.get(variable=variable)
            else:
                pass

            connectable.inouts.add(channel['connectable'])
            connectable.save()

        out_channels = CHANNEL_XPATH(channel['element'])
        for out_channel_element in out_channels:
            out_channel = channel_connectables[out_channel_element.get('id')]['connectable']
            relation = RelatedInOut(in_inout=channel['connectable'], out_inout=out_channel)
            relation.save()

    from commons.get_data import _invalidate_cached_variable_values
    _invalidate_cached_variable_values(workspace)