def capabilities_xml(self): doc = WPS.Process( OWS.Identifier(self.identifier), OWS.Title(self.title) ) if self.abstract: doc.append(OWS.Abstract(self.abstract)) for m in self.metadata: doc.append(OWS.Metadata(dict(m))) if self.profile: doc.append(OWS.Profile(self.profile)) if self.version != 'None': doc.attrib['{http://www.opengis.net/wps/1.0.0}processVersion'] = self.version else: doc.attrib['{http://www.opengis.net/wps/1.0.0}processVersion'] = 'undefined' return doc
def capabilities_xml(self): doc = WPS.Process(OWS.Identifier(self.identifier), OWS.Title(self.title)) if self.abstract: doc.append(OWS.Abstract(self.abstract)) # TODO: See Table 32 Metadata in OGC 06-121r3 #for m in self.metadata: # doc.append(OWS.Metadata(m)) if self.profile: doc.append(OWS.Profile(self.profile)) if self.wsdl: doc.append(OWS.WSDL(self.wsdl)) if self.version != 'None': doc.attrib[ '{http://www.opengis.net/wps/1.0.0}processVersion'] = self.version else: doc.attrib[ '{http://www.opengis.net/wps/1.0.0}processVersion'] = 'undefined' return doc
def get_capabilities(self): process_elements = [p.capabilities_xml() for p in self.processes.values()] doc = WPS.Capabilities() doc.attrib['service'] = 'WPS' doc.attrib['version'] = '1.0.0' doc.attrib['{http://www.w3.org/XML/1998/namespace}lang'] = 'en-CA' 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/wpsDescribeProcess_response.xsd' # TODO: check Table 7 in OGC 05-007r7 doc.attrib['updateSequence'] = '1' # Service Identification service_ident_doc = OWS.ServiceIdentification( OWS.Title(config.get_config_value('wps', 'title')) ) if config.get_config_value('wps', 'abstract'): service_ident_doc.append(OWS.Abstract(config.get_config_value('wps', 'abstract'))) if config.get_config_value('wps', 'keywords'): keywords_doc = OWS.Keywords() for k in config.get_config_value('wps', 'keywords').split(','): if k: keywords_doc.append(OWS.Keyword(k)) service_ident_doc.append(keywords_doc) service_ident_doc.append(OWS.ServiceType('WPS')) for v in config.get_config_value('wps', 'version').split(','): service_ident_doc.append(OWS.ServiceTypeVersion(v)) service_ident_doc.append(OWS.Fees(config.get_config_value('wps', 'fees'))) for con in config.get_config_value('wps', 'constraints').split(','): service_ident_doc.append(OWS.AccessConstraints(con)) if config.get_config_value('wps', 'profile'): service_ident_doc.append(OWS.Profile(config.get_config_value('wps', 'profile'))) doc.append(service_ident_doc) # Service Provider service_prov_doc = OWS.ServiceProvider(OWS.ProviderName(config.get_config_value('provider', 'providerName'))) if config.get_config_value('provider', 'providerSite'): service_prov_doc.append(OWS.ProviderSite( {'{http://www.w3.org/1999/xlink}href': config.get_config_value('provider', 'providerSite')}) ) # Service Contact service_contact_doc = OWS.ServiceContact() # Add Contact information only if a name is set if config.get_config_value('provider', 'individualName'): service_contact_doc.append(OWS.IndividualName(config.get_config_value('provider', 'individualName'))) if config.get_config_value('provider', 'positionName'): service_contact_doc.append(OWS.PositionName(config.get_config_value('provider', 'positionName'))) contact_info_doc = OWS.ContactInfo() phone_doc = OWS.Phone() if config.get_config_value('provider', 'phoneVoice'): phone_doc.append(OWS.Voice(config.get_config_value('provider', 'phoneVoice'))) if config.get_config_value('provider', 'phoneFacsimile'): phone_doc.append(OWS.Facsimile(config.get_config_value('provider', 'phoneFacsimile'))) # Add Phone if not empty if len(phone_doc): contact_info_doc.append(phone_doc) address_doc = OWS.Address() if config.get_config_value('provider', 'deliveryPoint'): address_doc.append(OWS.DeliveryPoint(config.get_config_value('provider', 'deliveryPoint'))) if config.get_config_value('provider', 'city'): address_doc.append(OWS.City(config.get_config_value('provider', 'city'))) if config.get_config_value('provider', 'postalCode'): address_doc.append(OWS.PostalCode(config.get_config_value('provider', 'postalCode'))) if config.get_config_value('provider', 'country'): address_doc.append(OWS.Country(config.get_config_value('provider', 'country'))) if config.get_config_value('provider', 'electronicalMailAddress'): address_doc.append( OWS.ElectronicMailAddress(config.get_config_value('provider', 'electronicalMailAddress')) ) # Add Address if not empty if len(address_doc): contact_info_doc.append(address_doc) if config.get_config_value('provider', 'onlineResource'): contact_info_doc.append(OWS.OnlineResource( {'{http://www.w3.org/1999/xlink}href': config.get_config_value('provider', 'onlineResource')}) ) if config.get_config_value('provider', 'hoursOfService'): contact_info_doc.append(OWS.HoursOfService(config.get_config_value('provider', 'hoursOfService'))) if config.get_config_value('provider', 'contactInstructions'): contact_info_doc.append(OWS.ContactInstructions(config.get_config_value('provider', 'contactInstructions'))) # Add Contact information if not empty if len(contact_info_doc): service_contact_doc.append(contact_info_doc) if config.get_config_value('provider', 'role'): service_contact_doc.append(OWS.Role(config.get_config_value('provider', '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) # Operations Metadata operations_metadata_doc = OWS.OperationsMetadata( OWS.Operation( OWS.DCP( OWS.HTTP( OWS.Get({'{http://www.w3.org/1999/xlink}href': '%s:%s%s' % ( config.get_config_value('wps', 'serveraddress'), config.get_config_value('wps', 'serverport'), '/wps?' )}), OWS.Post({'{http://www.w3.org/1999/xlink}href': '%s:%s%s' % ( config.get_config_value('wps', 'serveraddress'), config.get_config_value('wps', 'serverport'), '/wps' )}) ) ), name="GetCapabilities" ), OWS.Operation( OWS.DCP( OWS.HTTP( OWS.Get({'{http://www.w3.org/1999/xlink}href': '%s:%s%s' % ( config.get_config_value('wps', 'serveraddress'), config.get_config_value('wps', 'serverport'), '/wps?' )}), OWS.Post({'{http://www.w3.org/1999/xlink}href': '%s:%s%s' % ( config.get_config_value('wps', 'serveraddress'), config.get_config_value('wps', 'serverport'), '/wps' )}) ) ), name="DescribeProcess" ), OWS.Operation( OWS.DCP( OWS.HTTP( OWS.Get({'{http://www.w3.org/1999/xlink}href': '%s:%s%s' % ( config.get_config_value('wps', 'serveraddress'), config.get_config_value('wps', 'serverport'), '/wps?' )}), OWS.Post({'{http://www.w3.org/1999/xlink}href': '%s:%s%s' % ( config.get_config_value('wps', 'serveraddress'), config.get_config_value('wps', 'serverport'), '/wps' )}) ) ), name="Execute" ) ) doc.append(operations_metadata_doc) doc.append(WPS.ProcessOfferings(*process_elements)) languages = config.get_config_value('wps', 'lang').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) doc.append(WPS.WSDL({'{http://www.w3.org/1999/xlink}href': '%s:%s%s' % ( config.get_config_value('wps', 'serveraddress'), config.get_config_value('wps', 'serverport'), '/wps?WSDL') })) return xml_response(doc)
def _construct_doc(self): process_elements = [ p.capabilities_xml() for p in self.processes.values() ] 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' # Service Identification service_ident_doc = OWS.ServiceIdentification( OWS.Title( config.get_config_value('metadata:main', 'identification_title'))) if config.get_config_value('metadata:main', 'identification_abstract'): service_ident_doc.append( OWS.Abstract( config.get_config_value('metadata:main', 'identification_abstract'))) if config.get_config_value('metadata:main', 'identification_keywords'): keywords_doc = OWS.Keywords() for k in config.get_config_value( 'metadata:main', 'identification_keywords').split(','): if k: keywords_doc.append(OWS.Keyword(k)) service_ident_doc.append(keywords_doc) if config.get_config_value('metadata:main', 'identification_keywords_type'): keywords_type = OWS.Type( config.get_config_value('metadata:main', '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( config.get_config_value('metadata:main', 'identification_fees'))) for con in config.get_config_value( 'metadata:main', 'identification_accessconstraints').split(','): service_ident_doc.append(OWS.AccessConstraints(con)) if config.get_config_value('metadata:main', 'identification_profile'): service_ident_doc.append( OWS.Profile( config.get_config_value('metadata:main', 'identification_profile'))) doc.append(service_ident_doc) # Service Provider service_prov_doc = OWS.ServiceProvider( OWS.ProviderName( config.get_config_value('metadata:main', 'provider_name'))) if config.get_config_value('metadata:main', 'provider_url'): service_prov_doc.append( OWS.ProviderSite({ '{http://www.w3.org/1999/xlink}href': config.get_config_value('metadata:main', 'provider_url') })) # Service Contact service_contact_doc = OWS.ServiceContact() # Add Contact information only if a name is set if config.get_config_value('metadata:main', 'contact_name'): service_contact_doc.append( OWS.IndividualName( config.get_config_value('metadata:main', 'contact_name'))) if config.get_config_value('metadata:main', 'contact_position'): service_contact_doc.append( OWS.PositionName( config.get_config_value('metadata:main', 'contact_position'))) contact_info_doc = OWS.ContactInfo() phone_doc = OWS.Phone() if config.get_config_value('metadata:main', 'contact_phone'): phone_doc.append( OWS.Voice( config.get_config_value('metadata:main', 'contact_phone'))) if config.get_config_value('metadata:main', 'contaact_fax'): phone_doc.append( OWS.Facsimile( config.get_config_value('metadata:main', 'contact_fax'))) # Add Phone if not empty if len(phone_doc): contact_info_doc.append(phone_doc) address_doc = OWS.Address() if config.get_config_value('metadata:main', 'deliveryPoint'): address_doc.append( OWS.DeliveryPoint( config.get_config_value('metadata:main', 'contact_address'))) if config.get_config_value('metadata:main', 'city'): address_doc.append( OWS.City( config.get_config_value('metadata:main', 'contact_city'))) if config.get_config_value('metadata:main', 'contact_stateorprovince'): address_doc.append( OWS.AdministrativeArea( config.get_config_value('metadata:main', 'contact_stateorprovince'))) if config.get_config_value('metadata:main', 'contact_postalcode'): address_doc.append( OWS.PostalCode( config.get_config_value('metadata:main', 'contact_postalcode'))) if config.get_config_value('metadata:main', 'contact_country'): address_doc.append( OWS.Country( config.get_config_value('metadata:main', 'contact_country'))) if config.get_config_value('metadata:main', 'contact_email'): address_doc.append( OWS.ElectronicMailAddress( config.get_config_value('metadata:main', 'contact_email'))) # Add Address if not empty if len(address_doc): contact_info_doc.append(address_doc) if config.get_config_value('metadata:main', 'contact_url'): contact_info_doc.append( OWS.OnlineResource({ '{http://www.w3.org/1999/xlink}href': config.get_config_value('metadata:main', 'contact_url') })) if config.get_config_value('metadata:main', 'contact_hours'): contact_info_doc.append( OWS.HoursOfService( config.get_config_value('metadata:main', 'contact_hours'))) if config.get_config_value('metadata:main', 'contact_instructions'): contact_info_doc.append( OWS.ContactInstructions( config.get_config_value('metadata:main', 'contact_instructions'))) # Add Contact information if not empty if len(contact_info_doc): service_contact_doc.append(contact_info_doc) if config.get_config_value('metadata:main', 'contact_role'): service_contact_doc.append( OWS.Role( config.get_config_value('metadata:main', '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': config.get_config_value('server', '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 = config.get_config_value('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 _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_value( 'server', 'url'), '?service=WPS&request=GetCapabilities') if self.status >= STATUS.STORE_STATUS: if self.process.status_location: doc.attrib['statusLocation'] = self.process.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 == 0: self.message = 'PyWPS Process %s accepted' % self.process.identifier 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_percentage == -1: 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': try: # TODO: stored process has ``pywps.inout.basic.LiteralInput`` # instead of a ``pywps.inout.inputs.LiteralInput``. data_inputs = [ self.wps_request.inputs[i][0].execute_xml() for i in self.wps_request.inputs ] doc.append(WPS.DataInputs(*data_inputs)) except Exception as e: LOGGER.error( "Failed to update lineage for input parameter. %s", e) 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 _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/wpsDescribeProcess_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%s' % ( config.get_config_value('wps', 'serveraddress'), config.get_config_value('wps', 'serverport'), '/wps?service=wps&request=getcapabilities') if self.status >= self.STORE_STATUS: if self.process.status_location: doc.attrib['statusLocation'] = self.process.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)) if self.process.wsdl: process_doc.append(OWS.WSDL(self.process.wsdl)) 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 >= self.STORE_AND_UPDATE_STATUS: if self.status_percentage == 0: self.message = 'PyWPS Process %s accepted' % self.process.identifier status_doc = self._process_accepted() doc.append(status_doc) self.write_response_doc(doc) return doc elif 0 < self.status_percentage < 100: status_doc = self._process_started() doc.append(status_doc) return doc # check if process failed and display fail message if self.status_percentage == -1: status_doc = self._process_failed() doc.append(status_doc) return doc # TODO: add paused 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