Exemple #1
0
    def read(self, request, workspace_id, tab_id, iwidget_id):
        workspace = get_object_or_404(Workspace, pk=workspace_id)

        if not workspace.is_available_for(request.user):
            msg = _("You don't have permission to access this workspace")
            return build_error_response(request, 403, msg)

        iwidget = get_object_or_404(IWidget, pk=iwidget_id)
        if iwidget.tab_id != int(tab_id):
            raise Http404

        if iwidget.widget is None:
            return HttpResponse(json.dumps({}), content_type='application/json; charset=UTF-8')

        try:
            iwidget_info = iwidget.widget.resource.get_processed_info(translate=True, process_variables=True)
        except:
            return build_error_response(request, 403, _('Missing widget variables cannot be updated'))

        cache_manager = VariableValueCacheManager(workspace, request.user)
        prefs = iwidget_info['variables']['preferences']

        data = {}
        data = {var: cache_manager.get_variable_data("iwidget", iwidget_id, var) for var in prefs}

        return HttpResponse(json.dumps(data, sort_keys=True), content_type='application/json; charset=UTF-8')
Exemple #2
0
    def read(self, request, workspace_id, tab_id, iwidget_id):
        workspace = get_object_or_404(Workspace, pk=workspace_id)

        if not workspace.is_available_for(request.user):
            msg = _("You don't have permission to access this workspace")
            return build_error_response(request, 403, msg)

        iwidget = get_object_or_404(IWidget, pk=iwidget_id)
        if iwidget.tab_id != int(tab_id):
            raise Http404

        if iwidget.widget is None:
            return HttpResponse(json.dumps({}),
                                content_type='application/json; charset=UTF-8')

        iwidget_info = iwidget.widget.resource.get_processed_info(
            translate=True, process_variables=True)

        cache_manager = VariableValueCacheManager(workspace, request.user)
        props = iwidget_info['variables']['properties']

        data = {}
        data = {
            var: cache_manager.get_variable_data("iwidget", iwidget_id, var)
            for var in props
        }

        return HttpResponse(json.dumps(data, sort_keys=True),
                            content_type='application/json; charset=UTF-8')
Exemple #3
0
    def read(self, request, workspace_id, operator_id):

        workspace = get_object_or_404(Workspace, id=workspace_id)

        if not workspace.is_available_for(request.user):
            return build_error_response(
                request, 403,
                _("You don't have permission to access this workspace"))

        cache_manager = VariableValueCacheManager(workspace, request.user)

        try:
            operator = workspace.wiringStatus["operators"][operator_id]
            vendor, name, version = operator["name"].split("/")
        except:
            raise Http404

        # Check if operator resource exists
        try:
            resource = CatalogueResource.objects.get(vendor=vendor,
                                                     short_name=name,
                                                     version=version)
            # Check if the resource is available, if not, variables should not be retrieved
            if not resource.is_available_for(workspace.creator):
                raise CatalogueResource.DoesNotExist
        except CatalogueResource.DoesNotExist:
            return HttpResponse(json.dumps({
                "preferences": {},
                "properties": {}
            }),
                                content_type='application/json; charset=UTF-8')

        data = {
            "preferences": {},
            "properties": {},
        }

        for preference_name, preference in six.iteritems(
                operator.get('preferences', {})):
            data["preferences"][
                preference_name] = cache_manager.get_variable_data(
                    "ioperator", operator_id, preference_name)

        for property_name, prop in six.iteritems(operator.get(
                'properties', {})):
            data["properties"][
                property_name] = cache_manager.get_variable_data(
                    "ioperator", operator_id, property_name)

        return HttpResponse(json.dumps(data, sort_keys=True),
                            content_type='application/json; charset=UTF-8')
Exemple #4
0
def process_secure_data(text, request):

    definitions = text.split('&')
    cache_manager = VariableValueCacheManager(request['workspace'],
                                              request['user'])
    for definition in definitions:
        params = definition.split(',')
        if len(params) == 1 and params[0].strip() == '':
            continue

        options = {}
        for pair in params:
            tokens = pair.split('=')
            option_name = unquote(tokens[0].strip())
            options[option_name] = unquote(tokens[1].strip())

        action = options.get('action', 'data')
        if action == 'data':
            substr = options.get('substr', '')
            var_ref = options.get('var_ref', '')
            check_empty_params(substr=substr, var_ref=var_ref)

            value = get_variable_value_by_ref(var_ref, cache_manager)
            check_invalid_refs(var_ref=value)

            encoding = options.get('encoding', 'none')
            substr = substr.encode('utf8')
            if encoding == 'url':
                value = urlquote(value).encode('utf8')
            elif encoding == 'base64':
                value = base64.b64encode(value.encode('utf8'))[:-1]
            else:
                value = value.encode('utf8')

            new_body = request['data'].read().replace(substr, value)
            request['headers']['content-length'] = "%s" % len(new_body)
            request['data'] = BytesIO(new_body)

        elif action == 'basic_auth':
            user_ref = options.get('user_ref', '')
            password_ref = options.get('pass_ref', '')
            check_empty_params(user_ref=user_ref, password_ref=password_ref)

            user_value = get_variable_value_by_ref(user_ref, cache_manager)
            password_value = get_variable_value_by_ref(password_ref,
                                                       cache_manager)
            check_invalid_refs(user_ref=user_value,
                               password_ref=password_value)

            token = base64.b64encode(
                (user_value + ':' + password_value).encode('utf8'))[:-1]
            request['headers']['Authorization'] = 'Basic ' + token.decode(
                'ascii')
        else:
            raise ValidationError('Unsupported action: %s' % action)
Exemple #5
0
    def read(self, request, workspace_id, operator_id):

        workspace = get_object_or_404(Workspace, id=workspace_id)

        if not workspace.is_available_for(request.user):
            return build_error_response(request, 403, _("You don't have permission to access this workspace"))

        cache_manager = VariableValueCacheManager(workspace, request.user)

        try:
            operator = workspace.wiringStatus["operators"][operator_id]
            vendor, name, version = operator["name"].split("/")
        except:
            raise Http404

        # Check if operator resource exists
        try:
            resource = CatalogueResource.objects.get(vendor=vendor, short_name=name, version=version)
            # Check if the resource is available, if not, variables should not be retrieved
            if not resource.is_available_for(workspace.creator):
                raise CatalogueResource.DoesNotExist
        except CatalogueResource.DoesNotExist:
            return HttpResponse(json.dumps({"preferences": {}, "properties": {}}), content_type='application/json; charset=UTF-8')

        data = {
            "preferences": {},
            "properties": {},
        }

        for preference_name, preference in six.iteritems(operator.get('preferences', {})):
            data["preferences"][preference_name] = cache_manager.get_variable_data("ioperator", operator_id, preference_name)

        for property_name, prop in six.iteritems(operator.get('properties', {})):
            data["properties"][property_name] = cache_manager.get_variable_data("ioperator", operator_id, property_name)

        return HttpResponse(json.dumps(data, sort_keys=True), content_type='application/json; charset=UTF-8')
Exemple #6
0
    def read(self, request, workspace_id, tab_id):

        tab = get_object_or_404(Tab.objects.select_related('workspace'),
                                workspace__pk=workspace_id,
                                pk=tab_id)
        if not tab.workspace.is_available_for(request.user):
            return build_error_response(
                request, 403,
                _("You don't have permission to access this workspace"))

        cache_manager = VariableValueCacheManager(tab.workspace, request.user)
        iwidgets = tab.iwidget_set.all()
        data = [
            get_iwidget_data(iwidget, tab.workspace, cache_manager)
            for iwidget in iwidgets
        ]

        return HttpResponse(json.dumps(data, sort_keys=True),
                            content_type='application/json; charset=UTF-8')
def process_iwidget(workspace, iwidget, wiring, parametrization,
                    readOnlyWidgets):

    widget = iwidget.widget
    widget_description = widget.resource.get_template().get_resource_info()
    iwidget_id = str(iwidget.id)
    iwidget_params = {}
    if iwidget_id in parametrization:
        iwidget_params = parametrization[iwidget_id]

    cache_manager = VariableValueCacheManager(workspace, workspace.creator)

    # input and output endpoints
    for output_endpoint in widget_description['wiring']['outputs']:
        wiring['outputs'].append({
            'name': output_endpoint['name'],
            'type': output_endpoint['type'],
            'label': output_endpoint['label'],
            'description': output_endpoint['description'],
            'friendcode': output_endpoint['friendcode'],
        })

    for input_endpoint in widget_description['wiring']['inputs']:
        wiring['inputs'].append({
            'name': input_endpoint['name'],
            'type': input_endpoint['type'],
            'label': input_endpoint['label'],
            'description': input_endpoint['description'],
            'friendcode': input_endpoint['friendcode'],
            'actionlabel': input_endpoint['actionlabel'],
        })

    # preferences
    widget_preferences = widget_description['preferences']
    preferences = {}
    for pref in widget_preferences:
        status = 'normal'
        if pref['name'] in iwidget_params:
            iwidget_param_desc = iwidget_params[pref['name']]
            status = iwidget_param_desc.get('status', 'normal')
            source = iwidget_param_desc.get('source', 'current')
            if source == 'default':
                if status == 'normal':
                    # Do not issue a Preference element for this preference
                    continue
                value = None
            elif source == 'current':
                value = cache_manager.get_variable_value_from_varname(
                    iwidget, pref['name'])
            elif source == 'custom':
                value = iwidget_param_desc['value']
            else:
                raise Exception('Invalid preference value source: %s' % source)

        else:
            value = cache_manager.get_variable_value_from_varname(
                iwidget, pref['name'])

        preferences[pref['name']] = {
            'readonly': status != 'normal',
            'hidden': status == 'hidden',
        }

        if value is not None:
            if pref['type'] == 'boolean':
                value = str(value).lower()
            elif pref['type'] == 'number':
                value = str(value)

            preferences[pref['name']]['value'] = value

    # iWidget properties
    widget_properties = widget_description['properties']
    properties = {}
    for prop in widget_properties:
        status = 'normal'
        if prop['name'] in iwidget_params:
            iwidget_param_desc = iwidget_params[prop['name']]
            status = iwidget_param_desc.get('status', 'normal')
            source = iwidget_param_desc.get('source', 'current')
            if source == 'default':
                if status == 'normal':
                    # Do not issue a Property element for this property
                    continue
                else:
                    value = None
            elif source == 'current':
                value = cache_manager.get_variable_value_from_varname(
                    iwidget, prop['name'])
            elif source == 'custom':
                value = iwidget_param_desc['value']
            else:
                raise Exception('Invalid property value source: %s' % source)
        else:
            value = cache_manager.get_variable_value_from_varname(
                iwidget, prop['name'])

        properties[prop['name']] = {
            'readonly': status != 'normal',
            'value': value,
        }

    return {
        'id': iwidget_id,
        'vendor': iwidget.widget.resource.vendor,
        'name': iwidget.widget.resource.short_name,
        'version': iwidget.widget.resource.version,
        'title': iwidget.name,
        'readonly': readOnlyWidgets,
        'properties': properties,
        'preferences': preferences,
        'position': {
            'x': str(iwidget.positions['widget']['left']),
            'y': str(iwidget.positions['widget']['top']),
            'z': str(iwidget.positions['widget']['zIndex']),
        },
        'rendering': {
            'width': str(iwidget.positions['widget']['width']),
            'height': str(iwidget.positions['widget']['height']),
            'layout': str(iwidget.layout),
            'fulldragboard':
            bool(iwidget.positions['widget']['fulldragboard']),
            'minimized': bool(iwidget.positions['widget']['minimized']),
        },
    }
def process_iwidget(workspace, iwidget, wiring, parametrization, readOnlyWidgets):

    widget = iwidget.widget
    widget_description = widget.resource.get_template().get_resource_info()
    iwidget_id = str(iwidget.id)
    iwidget_params = {}
    if iwidget_id in parametrization:
        iwidget_params = parametrization[iwidget_id]

    cache_manager = VariableValueCacheManager(workspace, workspace.creator)

    # input and output endpoints
    for output_endpoint in widget_description['wiring']['outputs']:
        wiring['outputs'].append({
            'name': output_endpoint['name'],
            'type': output_endpoint['type'],
            'label': output_endpoint['label'],
            'description': output_endpoint['description'],
            'friendcode': output_endpoint['friendcode'],
        })

    for input_endpoint in widget_description['wiring']['inputs']:
        wiring['inputs'].append({
            'name': input_endpoint['name'],
            'type': input_endpoint['type'],
            'label': input_endpoint['label'],
            'description': input_endpoint['description'],
            'friendcode': input_endpoint['friendcode'],
            'actionlabel': input_endpoint['actionlabel'],
        })

    # preferences
    widget_preferences = widget.get_related_preferences()
    preferences = {}
    for pref in widget_preferences:
        status = 'normal'
        if pref.name in iwidget_params:
            iwidget_param_desc = iwidget_params[pref.name]
            source = iwidget_param_desc['source']
            if source == 'default':
                # Do not issue a Preference element for this preference
                continue
            elif source == 'current':
                value = cache_manager.get_variable_value_from_varname(iwidget, pref.name)
            elif source == 'custom':
                value = iwidget_param_desc['value']
            else:
                raise Exception('Invalid preference value source: %s' % source)

            status = iwidget_param_desc['status']
        else:
            value = cache_manager.get_variable_value_from_varname(iwidget, pref.name)

        if pref.type == 'B':
            value = str(value).lower()
        elif pref.type == 'N':
            value = str(value)

        preferences[pref.name] = {
            'readonly': status != 'normal',
            'hidden': status == 'hidden',
            'value': value,
        }

    # iWidget properties
    widget_properties = widget.get_related_properties()
    properties = {}
    for prop in widget_properties:
        status = 'normal'
        if prop.name in iwidget_params:
            iwidget_param_desc = iwidget_params[prop.name]
            if iwidget_param_desc['source'] == 'default':
                # Do not issue a Property element for this property
                continue
            value = iwidget_param_desc['value']
            status = iwidget_param_desc['status']
        else:
            value = cache_manager.get_variable_value_from_varname(iwidget, prop.name)

        properties[prop.name] = {
            'readonly': status != 'normal',
            'value': value,
        }

    return {
        'id': iwidget_id,
        'vendor': iwidget.widget.resource.vendor,
        'name': iwidget.widget.resource.short_name,
        'version': iwidget.widget.resource.version,
        'title': iwidget.name,
        'readonly': readOnlyWidgets,
        'properties': properties,
        'preferences': preferences,
        'position': {
            'x': str(iwidget.position.posX),
            'y': str(iwidget.position.posY),
            'z': str(iwidget.position.posZ),
        },
        'rendering': {
            'width': str(iwidget.position.width),
            'height': str(iwidget.position.height),
            'layout': str(iwidget.layout),
            'fulldragboard': str(iwidget.position.fulldragboard),
            'minimized': str(iwidget.position.minimized),
        },
    }
Exemple #9
0
def build_json_template_from_workspace(options, workspace, user):
    options['type'] = 'mashup'
    options['params'] = []
    options['embedmacs'] = options.get('embedmacs', False) is True
    options['embedded'] = set()
    options['translations'] = {}
    options['translation_index_usage'] = {}

    description = options.get('description', '').strip()
    if description == '':
        options['description'] = get_workspace_description(workspace)

    if 'authors' not in options:
        options['authors'] = ({'name': str(user)},)
    elif isinstance(options['authors'], str):
        options['authors'] = parse_contacts_info(options['authors'])

    if 'contributors' not in options:
        options['contributors'] = ()
    elif isinstance(options['contributors'], str):
        options['contributors'] = parse_contacts_info(options['contributors'])

    options['requirements'] = []

    readOnlyWidgets = options.get('readOnlyWidgets', False)
    parametrization = options.get('parametrization')
    if not parametrization:
        parametrization = {}
    if 'iwidgets' not in parametrization:
        parametrization['iwidgets'] = {}
    if 'ioperators' not in parametrization:
        parametrization['ioperators'] = {}

    cache_manager = VariableValueCacheManager(workspace, workspace.creator)

    # Workspace preferences
    options['preferences'] = {}
    for preference in workspace.workspacepreference_set.all():
        # Filter public and sharelist preferences
        if not preference.inherit and preference.name not in ("public", "sharelist"):
            options['preferences'][preference.name] = preference.value

    # Tabs and their preferences
    options['tabs'] = []
    options['wiring'] = {
        'inputs': [],
        'outputs': [],
    }
    for tab in workspace.tab_set.order_by('position'):
        preferences = {}
        for preference in tab.tabpreference_set.all():
            if not preference.inherit:
                preferences[preference.name] = preference.value

        resources = []
        for iwidget in tab.iwidget_set.select_related('widget__resource').all():
            resource_info = process_iwidget(workspace, iwidget, options['wiring'], parametrization['iwidgets'], readOnlyWidgets, cache_manager)
            resources.append(resource_info)
            if options['embedmacs']:
                options['embedded'].add('/'.join((resource_info['vendor'], resource_info['name'], resource_info['version'])))

        tab_info = {
            'name': tab.name,
            'resources': resources,
            'preferences': preferences,
        }
        if tab.title is not None and tab.title.strip() != "":
            tab_info['title'] = tab.title

        options['tabs'].append(tab_info)

    # wiring conections and operators
    readOnlyConnectables = options.get('readOnlyConnectables', False)
    wiring_status = workspace.wiringStatus
    if len(wiring_status) == 0:
        wiring_status = get_wiring_skeleton()

    # Set the wiring status' version
    if wiring_status.get('version', '1.0') == '1.0':
        wiring_status = parse_wiring_old_version(wiring_status)

    options['wiring']['version'] = '2.0'
    options['wiring']['operators'] = {}
    for operator_id, operator in wiring_status['operators'].items():
        operator_data = {
            'name': operator['name'],
            'preferences': {},
        }

        vendor, name, version = operator['name'].split('/')
        resource = CatalogueResource.objects.get(vendor=vendor, short_name=name, version=version)
        operator_info = resource.json_description
        operator_params = parametrization['ioperators'].get(operator_id, {})
        for pref_index, preference in enumerate(operator_info['preferences']):

            status = 'normal'
            if preference['name'] in operator_params:
                ioperator_param_desc = operator_params[preference['name']]
                status = ioperator_param_desc.get('status', 'normal')
                source = ioperator_param_desc.get('source', 'current')
                if source == 'default':
                    if status == 'normal':
                        # Do not issue a Preference element for this preference
                        continue
                    value = None
                elif source == 'current':
                    value = cache_manager.get_variable_value_from_varname("ioperator", operator_id, preference['name'])
                elif source == 'custom':
                    value = ioperator_param_desc['value']
                else:
                    raise Exception('Invalid preference value source: %s' % source)

            else:
                value = cache_manager.get_variable_value_from_varname("ioperator", operator_id, preference['name'])

            operator_data['preferences'][preference['name']] = {
                'readonly': status != 'normal',
                'hidden': status == 'hidden',
            }
            if value is not None:
                operator_data['preferences'][preference['name']]['value'] = value

        options['wiring']['operators'][operator_id] = operator_data
        if options['embedmacs']:
            options['embedded'].add(operator['name'])

    options['wiring']['connections'] = []
    for connection in wiring_status['connections']:
        options['wiring']['connections'].append({
            'source': connection['source'],
            'target': connection['target'],
            'readonly': readOnlyConnectables,
        })

    options['wiring']['visualdescription'] = wiring_status['visualdescription']

    embedded = options['embedded']
    options['embedded'] = []
    for resource in embedded:
        (vendor, name, version) = resource.split('/')
        options['embedded'].append({
            'vendor': vendor,
            'name': name,
            'version': version,
            'src': 'macs/%s_%s_%s.wgt' % (vendor, name, version)
        })
    del options['embedmacs']

    return options
def build_json_template_from_workspace(options, workspace, user):
    options['type'] = 'mashup'
    options['params'] = []
    options['embedmacs'] = options.get('embedmacs', False) is True
    options['embedded'] = set()
    options['translations'] = {}
    options['translation_index_usage'] = {}

    description = options.get('description', '').strip()
    if description == '':
        options['description'] = get_workspace_description(workspace)

    if 'authors' not in options:
        options['authors'] = ({'name': six.text_type(user)},)
    elif isinstance(options['authors'], six.text_type):
        options['authors'] = parse_contacts_info(options['authors'])

    if 'contributors' not in options:
        options['contributors'] = ()
    elif isinstance(options['contributors'], six.text_type):
        options['contributors'] = parse_contacts_info(options['contributors'])

    options['requirements'] = []

    readOnlyWidgets = options.get('readOnlyWidgets', False)
    parametrization = options.get('parametrization')
    if not parametrization:
        parametrization = {}
    if 'iwidgets' not in parametrization:
        parametrization['iwidgets'] = {}
    if 'ioperators' not in parametrization:
        parametrization['ioperators'] = {}

    cache_manager = VariableValueCacheManager(workspace, workspace.creator)

    # Workspace preferences
    options['preferences'] = {}
    for preference in workspace.workspacepreference_set.all():
        # Filter public and sharelist preferences
        if not preference.inherit and preference.name not in ("public", "sharelist"):
            options['preferences'][preference.name] = preference.value

    # Tabs and their preferences
    options['tabs'] = []
    options['wiring'] = {
        'inputs': [],
        'outputs': [],
    }
    for tab in workspace.tab_set.order_by('position'):
        preferences = {}
        for preference in tab.tabpreference_set.all():
            if not preference.inherit:
                preferences[preference.name] = preference.value

        resources = []
        for iwidget in tab.iwidget_set.select_related('widget__resource').all():
            resource_info = process_iwidget(workspace, iwidget, options['wiring'], parametrization['iwidgets'], readOnlyWidgets, cache_manager)
            resources.append(resource_info)
            if options['embedmacs']:
                options['embedded'].add('/'.join((resource_info['vendor'], resource_info['name'], resource_info['version'])))

        tab_info = {
            'name': tab.name,
            'resources': resources,
            'preferences': preferences,
        }
        if tab.title is not None and tab.title.strip() != "":
            tab_info['title'] = tab.title

        options['tabs'].append(tab_info)

    # wiring conections and operators
    readOnlyConnectables = options.get('readOnlyConnectables', False)
    wiring_status = workspace.wiringStatus
    if len(wiring_status) == 0:
        wiring_status = get_wiring_skeleton()

    # Set the wiring status' version
    if wiring_status.get('version', '1.0') == '1.0':
        wiring_status = parse_wiring_old_version(wiring_status)

    options['wiring']['version'] = '2.0'
    options['wiring']['operators'] = {}
    for operator_id, operator in six.iteritems(wiring_status['operators']):
        operator_data = {
            'name': operator['name'],
            'preferences': {},
        }

        vendor, name, version = operator['name'].split('/')
        resource = CatalogueResource.objects.get(vendor=vendor, short_name=name, version=version)
        operator_info = resource.json_description
        operator_params = parametrization['ioperators'].get(operator_id, {})
        for pref_index, preference in enumerate(operator_info['preferences']):

            status = 'normal'
            if preference['name'] in operator_params:
                ioperator_param_desc = operator_params[preference['name']]
                status = ioperator_param_desc.get('status', 'normal')
                source = ioperator_param_desc.get('source', 'current')
                if source == 'default':
                    if status == 'normal':
                        # Do not issue a Preference element for this preference
                        continue
                    value = None
                elif source == 'current':
                    value = cache_manager.get_variable_value_from_varname("ioperator", operator_id, preference['name'])
                elif source == 'custom':
                    value = ioperator_param_desc['value']
                else:
                    raise Exception('Invalid preference value source: %s' % source)

            else:
                value = cache_manager.get_variable_value_from_varname("ioperator", operator_id, preference['name'])

            operator_data['preferences'][preference['name']] = {
                'readonly': status != 'normal',
                'hidden': status == 'hidden',
            }
            if value is not None:
                operator_data['preferences'][preference['name']]['value'] = value

        options['wiring']['operators'][operator_id] = operator_data
        if options['embedmacs']:
            options['embedded'].add(operator['name'])

    options['wiring']['connections'] = []
    for connection in wiring_status['connections']:
        options['wiring']['connections'].append({
            'source': connection['source'],
            'target': connection['target'],
            'readonly': readOnlyConnectables,
        })

    options['wiring']['visualdescription'] = wiring_status['visualdescription']

    embedded = options['embedded']
    options['embedded'] = []
    for resource in embedded:
        (vendor, name, version) = resource.split('/')
        options['embedded'].append({
            'vendor': vendor,
            'name': name,
            'version': version,
            'src': 'macs/%s_%s_%s.wgt' % (vendor, name, version)
        })
    del options['embedmacs']

    return options