Python + suds: xsd_base64Бинарный тип? - PullRequest
       39

Python + suds: xsd_base64Бинарный тип?

1 голос
/ 17 февраля 2010

Я пытаюсь прикрепить некоторые файлы к Jira с помощью Soap API.У меня есть Python 2.6 и SOAPpy больше не работает, поэтому я использую suds.Все хорошо, кроме вложений ... Я не знаю, как переписать этот кусок кода: http://confluence.atlassian.com/display/JIRA/Creating+a+SOAP+Client?focusedCommentId=180943#comment-180943

Любая подсказка?Я не знаю, как бороться со сложным типом, как этот:

<complexType name="ArrayOf_xsd_base64Binary"><complexContent><restriction base="soapenc:Array"><attribute ref="soapenc:arrayType" wsdl:arrayType="xsd:byte[][]"/></restriction></complexContent></complexType>

большое спасибо

n.

Ответы [ 3 ]

1 голос
/ 16 марта 2011

Если вы не хотите использовать Java CLI, ниже описано, как добавлять и присоединять в Python.

from suds.client import Client
client = Client(url_to_wsdl_file)
auth = client.service.login(username, password)

client.service.addBase64EncodedAttachmentsToIssue(auth, issue_key, [filename.encode("utf-8")], [open(full_path_and_filename, "rb").read().encode('base64')])
0 голосов
/ 09 февраля 2011

Вы можете прикрепить файл к проблеме, используя Jira CLI (написанный на Python с использованием suds). Автономный код доступен по лицензии LGPL.

Команда, которую вы бы использовали, - "присоединить".

Обновление: Python CLI не работает.

У меня возникают ошибки при подключении файлов с этим CLI под python 2.7:

Traceback (most recent call last):
  File "./jira", line 1281, in <module>
    rc = com.run(command_name, logger, jira_env, args[1:])
  File "./jira", line 1080, in run
    return self.commands[command].dispatch(logger, jira_env, args)
  File "./jira", line 70, in dispatch
    results = self.run(logger, jira_env, args)
  File "./jira", line 140, in run
    logger.error(decode(e))
  File "./jira", line 1142, in decode
    str = e.faultstring
AttributeError: 'exceptions.NameError' object has no attribute 'faultstring'

Обновление 2: Java CLI работает.

Я просто вызываю Java CLI , и это работает!

# Run JAVA CLI attach script
args = [
    './jira.sh',
    '--action',
    'addAttachment',
    '--project',
    project_title,
    '--issue',
    issue_key,
    '--file',
    '%s/%s' % (path, filename),
    ]
output = subprocess.check_output(args, cwd = path_to_java_cli).decode("utf-8")
0 голосов
/ 20 мая 2010

Не знаю, поможет ли это, но когда я использовал python, дескриптор wsdls, я обнаружил явное отсутствие поддержки в большинстве пакетов для сложных типов. В конце концов я выбрал zsi с его wsdl2py --complexType wsdl_url. Это сработало отлично. У меня было много сложных типов в моем WSDL с массивами массивов, определенных в WSDL. wsdl2py генерирует 3 библиотеки, которые вы используете при доступе к wsdl. Вот пример вызова метода createSubscribeers, который принимает массивы значений.

import inspect, sys
from PolicyManagementService_client import *

class apiCheckSetup:
    def __init__(self, host="10.10.10.23", port="8080", log=None):
        """Setup to run wsdl operations"""
        self.loc=PolicyManagementServiceLocator(host, port)
        if log:
            logfile=log
        else:
            logfile=sys.stdout
        kw = { 'tracefile'    :    logfile}
        self.port=self.loc.getPolicyManagementPort(**kw)

    def createSubscribers(self, subList):
        req=createSubscribers()
        subscriberList=ns0.subscriberDetailsList_Def("subscriberList")
        subscriber=ns0.subscriberDetails_Def("subscriber")
        subUsers=subscriberList.pyclass()
        for element in subList:
            sub=subscriber.pyclass()
            sub.set_attribute_msisdn(element['msisdn'])
            sub.set_attribute_policyID(element['policyID'])
            sub.set_attribute_firstName(element['firstName'])
            sub.set_attribute_lastName(element['lastName'])
            subUsers._subscriber.append(sub)
        req._subscribers=subUsers
        self.port.createSubscribers(req)

Это можно назвать так:

subList=[{'msisdn' : '+445555555', 'policyID' :  pid, 'firstName' : 'M1', 'lastName' : 'D1'}, {'msisdn' : '+445555556', 'policyID' :  pid, 'firstName' : 'M2', 'lastName' : 'D2'}] 
    self.api=pmcApiMethods.apiCheckSetup(host=testConfig.pmcApiServer, port=testConfig.pmcApiPort)
    self.api.createSubscribers(subList)

Не знаю, поможет ли это

...