예제 #1
0
    def process_inputs(self, process, decoder):
        """ Iterates over all input options stated in the process and parses 
            all given inputs. This also includes resolving references
        """
        input_params = process.inputs
        inputs = decoder.inputs

        kwargs = {}
        for key, parameter in input_params.items():

            if is_literal_type(parameter):
                parameter = LiteralData(key, parameter)

            try:
                # get the "raw" input value
                raw_value = inputs.pop(key)

                if isinstance(raw_value, Reference):
                    value = self.resolve_reference(raw_value, request)
                else:
                    value = parameter.parse_value(raw_value)

            except KeyError:
                if parameter.default is None:  # TODO: maybe an extra optional flag to allow None as a default value?
                    raise Exception("Parameter '%s' is required." % key)
                value = parameter.default

            kwargs[key] = value

        return kwargs
예제 #2
0
    def encode_parameter(self, name, parameter, is_input):
        # support for the shorthand
        if is_literal_type(parameter):
            parameter = LiteralData(name, parameter)

        # TODO: minOccurs/maxOccurs correct
        elem = WPS("Input" if is_input else "Output",
            OWS("Identifier", parameter.identifier or name)
        )

        if parameter.title:
            elem.append(OWS("Title", parameter.title))
        if parameter.description:
            elem.append(OWS("Abstract", parameter.description))

        if isinstance(parameter, LiteralData):
            data_elem = WPS("LiteralData" if is_input else "LiteralOutput")

            literal_type_name = parameter.type_name
            if literal_type_name:
                data_elem.append(
                    OWS("DataType", literal_type_name, **{
                        ns_ows("reference"): "http://www.w3.org/TR/xmlschema-2/#%s" % literal_type_name
                    })
                )

            if parameter.uoms:
                data_elem.append(
                    WPS("UOMs",
                        WPS("Default",
                            OWS("UOM", parameter.uoms[0])
                        ),
                        WPS("Supported", *[
                            OWS("UOM", uom) for uom in parameter.uoms
                        ])
                    )
                )

            if is_input and parameter.allowed_values:
                data_elem.append(
                    OWS("AllowedValues", *[
                        OWS("AllowedValue", str(allowed_value))
                        for allowed_value in parameter.allowed_values
                    ])
                )
            elif is_input and parameter.values_reference:
                data_elem.append(
                    WPS("ValuesReference", **{
                        ns_ows("reference"): parameter.values_reference,
                        "valuesForm": parameter.values_reference
                    })
                )
            elif is_input:
                data_elem.append(OWS("AnyValue"))

            if is_input and parameter.default is not None:
                elem.attrib["minOccurs"] = "0"
                data_elem.append(
                    WPS("Default", str(parameter.default))
                )

        elif isinstance(parameter, ComplexData):
            formats = parameter.formats
            if isinstance(formats, Format):
                formats = (formats,)

            data_elem = WPS("ComplexData" if is_input else "ComplexOutput",
                WPS("Default",
                    self.encode_format(formats[0])
                ),
                WPS("Supported", *[
                    self.encode_format(frmt) for frmt in formats
                ])
            )

        elif isinstance(parameter, BoundingBoxData):
            # TODO: implement
            data_elem = WPS("BoundingBoxData" if is_input else "BoundingBoxOutput")

        elem.append(data_elem)
        return elem