arskom / spyne

A transport agnostic sync/async RPC library that focuses on exposing services with a well-defined API using popular protocols.
http://spyne.io
Other
1.13k stars 313 forks source link

I could not read data from wsdl file #691

Closed Shodiev-Shokhrukh closed 2 years ago

Shodiev-Shokhrukh commented 2 years ago
import logging
from datetime import datetime
from spyne import Application, rpc, ServiceBase, AnyDict
from spyne.protocol.soap import Soap11
from spyne.server.django import DjangoApplication

from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt

from invoice.api.russian_webservice.complex_models import Consignor, Request1Type, Request31Type, Request91Type, CertificateMaximumType, CertificateMinimumType, Response91Type

from exim.models import ExportFSS, ImportFSS

class RussianIntegrationApiView(ServiceBase):
    @rpc(Request91Type,
         _returns=AnyDict,
         _out_variable_name="Response91")
    def getResponse91(ctx, request91type):
        try:
            logging.info(
                f'Initialized objects {str(Request91Type).encode("utf-8")}')
            error_message = None
            error_code = None

            import_fss = ImportFSS.objects.create(
                number=request91type.certificate.number,
                given_date=datetime.strptime(
                    request91type.certificate.date, '%d.%m.%Y'),
                exporter_name=request91type.certificate.consignor.name,
                exporter_country=request91type.certificate.departure_country,
                exporter_address=request91type.certificate.consignor.place,
                importer_name=request91type.certificate.consignee.name,
                importer_country=request91type.certificate.destination_country,
                importer_address=request91type.certificate.consignee.place,
                transport_method=request91type.certificate.transport.declared_type,
                transport_number=request91type.certificate.transport.number,
                disinfected_date=datetime.strptime(
                    request91type.certificate.disinfection.date, '%d.%m.%Y'),
                treatment_method=request91type.certificate.disinfection.method,
                chemical=request91type.certificate.disinfection.chemical,
                duration_and_temperature=request91type.certificate.disinfection.temperature_times,
                concentration=request91type.certificate.disinfection.concentration,
                extra_info=request91type.certificate.additional_info,
            )
            return {
                "GUID": CertificateMinimumType.guid_generate(),
                "SendDateTime": "2022-04-11T19:50:11    ",  
                "Certificate": CertificateMinimumType.generate(),
                "Status": "Выдан",
                "StatusCode": "1601",
                "Inspector": ""
            }

        except Exception as e:
            logging.info(f'Exception occurred: {str(e)}')

def on_method_return_string(ctx):
    ctx.out_string[0] = ctx.out_string[0].replace(b'soap11env', b'soapenv')
    ctx.out_string[0] = ctx.out_string[0].replace(b'tns', b'mun')
    ctx.out_string[0] = ctx.out_string[0].replace(b'GUID', b'm:GUID')
    ctx.out_string[0] = ctx.out_string[0].replace(
        b'SendDateTime', b'm:SendDateTime')
    ctx.out_string[0] = ctx.out_string[0].replace(b'Act', b'm:Act')
    ctx.out_string[0] = ctx.out_string[0].replace(b'Date', b'm:Date')
    ctx.out_string[0] = ctx.out_string[0].replace(b'Number', b'm:Number')
    ctx.out_string[0] = ctx.out_string[0].replace(b'Blanc', b'm:Blanc')
    ctx.out_string[0] = ctx.out_string[0].replace(b'OldDate', b'm:OldDate')
    ctx.out_string[0] = ctx.out_string[0].replace(
        b'CountryCode', b'm:CountryCode')
    ctx.out_string[0] = ctx.out_string[0].replace(
        b'ExpirationDate', b'm:ExpirationDate')
    ctx.out_string[0] = ctx.out_string[0].replace(b'Canceled', b'm:Canceled')
    ctx.out_string[0] = ctx.out_string[0].replace(
        b'IssuePlace', b'm:IssuePlace')
    ctx.out_string[0] = ctx.out_string[0].replace(b'Inspector', b'm:Inspector')
    ctx.out_string[0] = ctx.out_string[0].replace(
        b'InspectionResult', b'm:InspectionResult')
    ctx.out_string[0] = ctx.out_string[0].replace(
        b'InspectionResultCode', b'm:InspectionResultCode')
    ctx.out_string[0] = ctx.out_string[0].replace(
        b'InspectionResultReport', b'm:InspectionResultReport')
    ctx.out_string[0] = ctx.out_string[0].replace(
        b'InspectionType', b'm:InspectionType')
    ctx.out_string[0] = ctx.out_string[0].replace(
        b'InspectionTypeCode', b'm:InspectionTypeCode')
    ctx.out_string[0] = ctx.out_string[0].replace(
        b'Certificates', b'm:Certificates')
    ctx.out_string[0] = ctx.out_string[0].replace(b'Status', b'm:Status')
    ctx.out_string[0] = ctx.out_string[0].replace(
        b'StatusCode', b'm:StatusCode')
    ctx.out_string[0] = ctx.out_string[0].replace(b'PDF', b'm:PDF')

    print("aaaa-------")
    print(ctx.out_string[0].decode('utf-8'))

RussianIntegrationApiView.event_manager.add_listener('method_return_string',
                                                     on_method_return_string)
application = Application([RussianIntegrationApiView],
                          'https://argusgate.fitorf.ru/srv/ws/uz3',
                          name='UzGosKarantinWSPortBinding',
                          in_protocol=Soap11(validator='soft'),
                          out_protocol=Soap11(),
                          )

russian_api_service = DjangoApplication(application)

def get_wsdl_file_russian(request):
    with open('apps/invoice/api/russian_webservice/russian.wsdl', 'r') as f:
        docs = f.read()
    return HttpResponse(docs, content_type='text/xml; charset=utf-8')

@csrf_exempt
def russian_service_dispatcher(request):

    if request.get_full_path() in ('/UzGosKarantinWebService/russian/?wsdl',
                                   '/UzGosKarantinWebService/russian?wsdl'):
        return get_wsdl_file_russian(request)
    return russian_api_service(request)

I created discussian about this