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
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