def get_capabilities(self, wps_request, accesspolicy=None): """ Handle getcapbabilities request """ process_elements = [ p.capabilities_xml() for p in self.processes if accesspolicy.allow(p.identifier) ] doc = WPS.Capabilities() doc.attrib['service'] = 'WPS' doc.attrib['version'] = '1.0.0' doc.attrib['{http://www.w3.org/XML/1998/namespace}lang'] = 'en-US' doc.attrib['{http://www.w3.org/2001/XMLSchema-instance}schemaLocation'] = \ 'http://www.opengis.net/wps/1.0.0 http://schemas.opengis.net/wps/1.0.0/wpsGetCapabilities_response.xsd' # TODO: check Table 7 in OGC 05-007r7 doc.attrib['updateSequence'] = '1' metadata = confservice['metadata:main'] # Service Identification service_ident_doc = OWS.ServiceIdentification( OWS.Title(metadata.get('identification_title'))) if metadata.get('identification_abstract'): service_ident_doc.append( OWS.Abstract(metadata.get('identification_abstract'))) if metadata.get('identification_keywords'): keywords_doc = OWS.Keywords() for k in metadata.get('identification_keywords').split(','): if k: keywords_doc.append(OWS.Keyword(k)) service_ident_doc.append(keywords_doc) if metadata.get('identification_keywords_type'): keywords_type = OWS.Type( metadata.get('identification_keywords_type')) keywords_type.attrib['codeSpace'] = 'ISOTC211/19115' keywords_doc.append(keywords_type) service_ident_doc.append(OWS.ServiceType('WPS')) # TODO: set proper version support service_ident_doc.append(OWS.ServiceTypeVersion('1.0.0')) service_ident_doc.append(OWS.Fees(metadata.get('identification_fees'))) for con in metadata.get('identification_accessconstraints').split(','): service_ident_doc.append(OWS.AccessConstraints(con)) if metadata.get('identification_profile'): service_ident_doc.append( OWS.Profile(metadata.get('identification_profile'))) doc.append(service_ident_doc) # Service Provider service_prov_doc = OWS.ServiceProvider( OWS.ProviderName(metadata.get('provider_name'))) if metadata.get('provider_url'): service_prov_doc.append( OWS.ProviderSite({ '{http://www.w3.org/1999/xlink}href': metadata.get('provider_url') })) # Service Contact service_contact_doc = OWS.ServiceContact() # Add Contact information only if a name is set if metadata.get('contact_name'): service_contact_doc.append( OWS.IndividualName(metadata.get('contact_name'))) if metadata.get('contact_position'): service_contact_doc.append( OWS.PositionName(metadata.get('contact_position'))) contact_info_doc = OWS.ContactInfo() phone_doc = OWS.Phone() if metadata.get('contact_phone'): phone_doc.append(OWS.Voice(metadata.get('contact_phone'))) # Add Phone if not empty if len(phone_doc): contact_info_doc.append(phone_doc) address_doc = OWS.Address() if metadata.get('deliveryPoint'): address_doc.append( OWS.DeliveryPoint(metadata.get('contact_address'))) if metadata.get('city'): address_doc.append(OWS.City(metadata.get('contact_city'))) if metadata.get('contact_stateorprovince'): address_doc.append( OWS.AdministrativeArea( metadata.get('contact_stateorprovince'))) if metadata.get('contact_postalcode'): address_doc.append( OWS.PostalCode(metadata.get('contact_postalcode'))) if metadata.get('contact_country'): address_doc.append(OWS.Country( metadata.get('contact_country'))) if metadata.get('contact_email'): address_doc.append( OWS.ElectronicMailAddress(metadata.get('contact_email'))) # Add Address if not empty if len(address_doc): contact_info_doc.append(address_doc) if metadata.get('contact_url'): contact_info_doc.append( OWS.OnlineResource({ '{http://www.w3.org/1999/xlink}href': metadata.get('contact_url') })) if metadata.get('contact_hours'): contact_info_doc.append( OWS.HoursOfService(metadata.get('contact_hours'))) if metadata.get('contact_instructions'): contact_info_doc.append( OWS.ContactInstructions( metadata.get('contact_instructions'))) # Add Contact information if not empty if len(contact_info_doc): service_contact_doc.append(contact_info_doc) if metadata.get('contact_role'): service_contact_doc.append( OWS.Role(metadata.get('contact_role'))) # Add Service Contact only if ProviderName and PositionName are set if len(service_contact_doc): service_prov_doc.append(service_contact_doc) doc.append(service_prov_doc) server_href = { '{http://www.w3.org/1999/xlink}href': confservice.get('server', 'url').format(host_url=wps_request.host_url) } # Operations Metadata operations_metadata_doc = OWS.OperationsMetadata( OWS.Operation(OWS.DCP( OWS.HTTP(OWS.Get(server_href), OWS.Post(server_href))), name="GetCapabilities"), OWS.Operation(OWS.DCP( OWS.HTTP(OWS.Get(server_href), OWS.Post(server_href))), name="DescribeProcess"), OWS.Operation(OWS.DCP( OWS.HTTP(OWS.Get(server_href), OWS.Post(server_href))), name="Execute")) doc.append(operations_metadata_doc) doc.append(WPS.ProcessOfferings(*process_elements)) languages = confservice.get('server', 'language').split(',') languages_doc = WPS.Languages(WPS.Default(OWS.Language(languages[0]))) lang_supported_doc = WPS.Supported() for l in languages: lang_supported_doc.append(OWS.Language(l)) languages_doc.append(lang_supported_doc) doc.append(languages_doc) return doc
def test_bad_request_type_with_post(self): request_doc = WPS.Foo() resp = self.client.post_xml(doc=request_doc) assert resp.status_code == 400
def test_post_request(self): request_doc = WPS.GetCapabilities() resp = self.client.post_xml(doc=request_doc) self.check_capabilities_response(resp)
def _process_accepted(self): return WPS.Status(WPS.ProcessAccepted(self.message), creationTime=time.strftime('%Y-%m-%dT%H:%M:%SZ', time.localtime()))
def _construct_doc(self): doc = WPS.ExecuteResponse() doc.attrib['{http://www.w3.org/2001/XMLSchema-instance}schemaLocation'] = \ 'http://www.opengis.net/wps/1.0.0 http://schemas.opengis.net/wps/1.0.0/wpsExecute_response.xsd' doc.attrib['service'] = 'WPS' doc.attrib['version'] = '1.0.0' doc.attrib['{http://www.w3.org/XML/1998/namespace}lang'] = 'en-US' doc.attrib['serviceInstance'] = '%s%s' % ( config.get_config('server').get('url').format( host_url=self.wps_request.host_url), '?service=WPS&request=GetCapabilities') if self.status >= STATUS.STORE_STATUS: doc.attrib['statusLocation'] = self.status_url # Process XML process_doc = WPS.Process(OWS.Identifier(self.process.identifier), OWS.Title(self.process.title)) if self.process.abstract: process_doc.append(OWS.Abstract(self.process.abstract)) # TODO: See Table 32 Metadata in OGC 06-121r3 # for m in self.process.metadata: # process_doc.append(OWS.Metadata(m)) if self.process.profile: process_doc.append(OWS.Profile(self.process.profile)) process_doc.attrib[ '{http://www.opengis.net/wps/1.0.0}processVersion'] = self.process.version doc.append(process_doc) # Status XML # return the correct response depending on the progress of the process if self.status == STATUS.STORE_AND_UPDATE_STATUS: if self.status_percentage == -1: status_doc = self._process_accepted() doc.append(status_doc) return doc elif self.status_percentage >= 0: status_doc = self._process_started() doc.append(status_doc) return doc # check if process failed and display fail message if self.status == STATUS.ERROR_STATUS: status_doc = self._process_failed() doc.append(status_doc) return doc # TODO: add paused status if self.status == STATUS.DONE_STATUS: status_doc = self._process_succeeded() doc.append(status_doc) # DataInputs and DataOutputs definition XML if lineage=true if self.wps_request.lineage == 'true': data_inputs = [ self.wps_request.inputs[i][0].execute_xml() for i in self.wps_request.inputs ] doc.append(WPS.DataInputs(*data_inputs)) output_definitions = [ self.outputs[o].execute_xml_lineage() for o in self.outputs ] doc.append(WPS.OutputDefinitions(*output_definitions)) # Process outputs XML output_elements = [ self.outputs[o].execute_xml() for o in self.outputs ] doc.append(WPS.ProcessOutputs(*output_elements)) return doc
def _process_paused(self): return WPS.Status(WPS.ProcessPaused(self.message, percentCompleted=str( self.status_percentage)), creationTime=time.strftime('%Y-%m-%dT%H:%M:%SZ', time.localtime()))
def test_post_one_arg(self): request_doc = WPS.DescribeProcess(OWS.Identifier('hello'), version='1.0.0') resp = self.client.post_xml(doc=request_doc) assert [pr.identifier for pr in get_describe_result(self, resp)] == ['hello']
def test_post_request_zero_args(self): request_doc = WPS.DescribeProcess() resp = self.client.post_xml(doc=request_doc) assert resp.status_code == 400