Exemplo n.º 1
0
    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
Exemplo n.º 2
0
 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
Exemplo n.º 3
0
 def test_post_request(self):
     request_doc = WPS.GetCapabilities()
     resp = self.client.post_xml(doc=request_doc)
     self.check_capabilities_response(resp)
Exemplo n.º 4
0
 def _process_accepted(self):
     return WPS.Status(WPS.ProcessAccepted(self.message),
                       creationTime=time.strftime('%Y-%m-%dT%H:%M:%SZ',
                                                  time.localtime()))
Exemplo n.º 5
0
    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
Exemplo n.º 6
0
 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()))
Exemplo n.º 7
0
 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']
Exemplo n.º 8
0
 def test_post_request_zero_args(self):
     request_doc = WPS.DescribeProcess()
     resp = self.client.post_xml(doc=request_doc)
     assert resp.status_code == 400