Примеры использования

Подключение к серверу Docsvision

Практически каждый метод веб-сервиса требует идентификатор пользовательской сессии, поэтому первоначальной задачей является создание сессии пользователя. Для этого предназначен метод SessionLogin.

Код для открытия пользовательской сессии может выглядеть следующим образом:
import xml.etree.ElementTree as ElementTree
import requests
from requests_ntlm import HttpNtlmAuth

url = 'http://DOCSVISION_SERVER.COM/DocsVision/StorageServer/StorageServerService.asmx'
username = 'Domain\User.Name'
password = 'User.Password' (1)

session = requests.Session()
session.auth = HttpNtlmAuth(username, password, session)
session.headers['Content-Type'] = 'text/xml; charset=utf-8'

session.headers['SOAPAction'] = 'http://schemas.docsvision.com/Platform/2009-02-03/StorageServer/SessionLogin' (2)

body = """<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <SessionLogin xmlns="http://schemas.docsvision.com/Platform/2009-02-03/StorageServer/">
      <baseName></baseName>
      <sessionSettings>&lt;Settings&gt;&lt;Setting Name=&quot;ComputerAddress&quot; Type=&quot;string&quot; ReadOnly=&quot;1&quot;&gt;192.168.0.2&lt;/Setting&gt;&lt;Setting Name=&quot;ComputerName&quot; Type=&quot;string&quot;&gt;connectedComputer&lt;/Setting&gt;&lt;Setting Name=&quot;LocaleID&quot; Type=&quot;int&quot;&gt;1049&lt;/Setting&gt;&lt;/Settings&gt;</sessionSettings>
    </SessionLogin>
  </soap:Body>
</soap:Envelope>""" (3)

response = session.post(url, data=body) (4)

responseParsed = ElementTree.fromstring(response.content)
sessionId = responseParsed.findtext('.//{http://schemas.docsvision.com/Platform/2009-02-03/StorageServer/}sessionId') (5)
1 Адрес и учетные данные пользователя для подключения к Docsvision.
2 Устанавливаем цель запроса в заголовке запроса.
3 SOAP-сообщение, в котором передаем адрес и сетевое имя клиента.
4 Отправляем SOAP-сообщение.
5 Разбираем ответ и получаем идентификатор сессии.

Добавление файла в базу данных

После открытия сессии можно, к примеру, добавить файл (не путать с версионным файлом — карточка файла с версиями) в базу данных.

Чтобы добавить файл в базу данных:
  1. Создать объект-файл в базе данных, используя метод FileCreate.

  2. Открыть созданный объект для записи, используя метод FileOpen.

  3. Записать содержимое файла с файловой системы в открытый объект-файл, используя метод FileWrite.

  4. Закрыть с сохранением открытый объект, используя метод FileClose

Итоговый код может выглядеть следующим образом:
(1)

session.headers['SOAPAction'] = "http://schemas.docsvision.com/Platform/2009-02-03/StorageServer/FileCreate" (2)

body = """<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <FileCreate xmlns="http://schemas.docsvision.com/Platform/2009-02-03/StorageServer/">
      <sessionId>%s</sessionId>
      <name>Document_Order.docx</name>
    </FileCreate>
  </soap:Body>
</soap:Envelope>""" % sessionId (3)

response = session.post(url, data=body) (4)

responseParsed = ElementTree.fromstring(response.content)
fileId = responseParsed.findtext(".//{http://schemas.docsvision.com/Platform/2009-02-03/StorageServer/}fileId") (5)


(6)

session.headers['SOAPAction'] = "http://schemas.docsvision.com/Platform/2009-02-03/StorageServer/FileOpen" (7)

body = """<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <FileOpen xmlns="http://schemas.docsvision.com/Platform/2009-02-03/StorageServer/">
      <sessionId>%s</sessionId>
      <fileId>%s</fileId>
      <modify>true</modify>
    </FileOpen>
  </soap:Body>
</soap:Envelope>""" % (sessionId, fileId) (8)

response = session.post(url, data=body) (9)

responseParsed = ElementTree.fromstring(response.content)
fileHandleId = responseParsed.findtext(".//{http://schemas.docsvision.com/Platform/2009-02-03/StorageServer/}fileHandleId") (10)


(11)

session.headers['SOAPAction'] = "http://schemas.docsvision.com/Platform/2009-02-03/StorageServer/FileWrite" (12)

with open("Z:\\Order.docx", "rb") as document:
    encoded_string = base64.b64encode(document.read()).decode('utf-8')

body = """<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <FileWrite xmlns="http://schemas.docsvision.com/Platform/2009-02-03/StorageServer/">
      <sessionId>%s</sessionId>
      <fileHandleId>%s</fileHandleId>
      <compressed>false</compressed>
      <fileData>%s</fileData>
    </FileWrite>
  </soap:Body>
</soap:Envelope>""" % (sessionId, fileHandleId, encoded_string) (13)

session.post(url, data=body) (14)


(15)

session.headers['SOAPAction'] = "http://schemas.docsvision.com/Platform/2009-02-03/StorageServer/FileClose" (16)

body = """<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <FileClose xmlns="http://schemas.docsvision.com/Platform/2009-02-03/StorageServer/">
      <sessionId>%s</sessionId>
      <fileHandleId>%s</fileHandleId>
      <commitWrite>true</commitWrite>
    </FileClose>
  </soap:Body>
</soap:Envelope>""" % (sessionId, fileHandleId) (17)

session.post(url, data=body) (18)

print(fileId) (19)
1 Создаем объект-файл.
2 Изменяем цель запроса в заголовке запроса.
3 SOAP-сообщение.
4 Отправляем SOAP-сообщение.
5 Разбираем ответ и получаем идентификатор объект-файла.
6 Открываем объект-файл.
7 Изменяем цель запроса в заголовке запроса.
8 SOAP-сообщение.
9 Отправляем SOAP-сообщение.
10 Разбираем ответ и выводим идентификатор новой карточки.
11 Запись данных в файл.
12 Изменяем цель запроса в заголовке запроса.
13 SOAP-сообщение.
14 Отправляем SOAP-сообщение.
15 Сохранение файла.
16 Изменяем цель запроса в заголовке запроса.
17 SOAP-сообщение.
18 Отправляем SOAP-сообщение.
19 Выводим идентификатор файла.

Приведенный пример может быть значительно упрощен, к примеру, с использованием soap-клиента, который может получить описание методов из WSDL.

Создание карточки файла с версиями

Чтобы создать карточки файла с версиями:
  1. Создать карточку типа "Файл с версиями", используя метод CardCreate.

  2. Создать строки в секциях "Версии" и "Общая информация", используя метод RowCreate.

  3. Добавить, используя метод RowSetData, в строку секции "Версии" значения полей (см. Описание полей стандартной карточки): FileId (используем идентификатор файла, полученный в предыдущем примере), Version и VersionNumber.

  4. Добавить, используя метод RowSetData, в строку секции "Общая информация" значения полей: CheckinDate, CurrentID (указывается идентификатор строки версии, созданной ранее), CurrentVersion, Name и NextVersion.

  5. Изменить описание карточки, используя CardSetInfo.

Итоговый код может выглядеть следующим образом:
(1)

session.headers['SOAPAction'] = "http://schemas.docsvision.com/Platform/2009-02-03/StorageServer/CardCreate" (2)

body = """<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <CardCreate xmlns="http://schemas.docsvision.com/Platform/2009-02-03/StorageServer/">
      <sessionId>%s</sessionId>
      <cardId>6E39AD2B-E930-4D20-AAFA-C2ECF812C2B3</cardId>
      <newInstanceId>00000000-0000-0000-0000-000000000000</newInstanceId>
    </CardCreate>
  </soap:Body>
</soap:Envelope>""" % sessionId (3)

response = session.post(url, data=body) (4)

responseParsed = ElementTree.fromstring(response.content)
newInstanceId = responseParsed.findtext(".//{http://schemas.docsvision.com/Platform/2009-02-03/StorageServer/}newInstanceId") (5)


(6)

versions_row_id = create_row(newInstanceId, 'F831372E-8A76-4ABC-AF15-D86DC5FFBE12')
update_row('F831372E-8A76-4ABC-AF15-D86DC5FFBE12', versions_row_id, '&lt;RowData&gt;&lt;row FileID=&quot;%s&quot; Version=&quot;1&quot; VersionNumber=&quot;2&quot;/&gt;&lt;/RowData&gt;' % fileId) (7)

maininfo_row_id = create_row(newInstanceId, '2FDE03C2-FF87-4E42-A8C2-7CED181977FB')
update_row('2FDE03C2-FF87-4E42-A8C2-7CED181977FB', maininfo_row_id,
           '&lt;RowData&gt;&lt;row CheckinDate=&quot;%s&quot; CurrentID=&quot;%s&quot; CurrentVersion=&quot;1.1&quot; Name=&quot;Document_Order versionedFileCard&quot; NextVersion=&quot;2&quot; /&gt;&lt;/RowData&gt;' %(datetime.datetime.now().isoformat(), versions_row_id) )


(8)

session.headers['SOAPAction'] = "http://schemas.docsvision.com/Platform/2009-02-03/StorageServer/CardSetInfo" (9)

body = """<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <CardSetInfo xmlns="http://schemas.docsvision.com/Platform/2009-02-03/StorageServer/">
      <sessionId>%s</sessionId>
      <instanceID>%s</instanceID>
      <description>Document_Order versionedFileCard</description>
      <template>false</template>
      <topic></topic>
    </CardSetInfo>
  </soap:Body>
</soap:Envelope>""" % (sessionId, newInstanceId) (10)

response = session.post(url, data=body) (11)

print(newInstanceId) (12)
1 Создаём карточки типа "Файл" с версиями.
2 Изменяем цель запроса в заголовке запроса.
3 SOAP-сообщение.
4 Отправляем SOAP-сообщение.
5 Разбираем ответ для получения идентификатора созданной карточки.
6 Создаем строки для секций "Общая информация" и "Версии", а также заполняем их поля.
7 Для простоты используем дополнительные методы create_row (создание строки) и update_row (запись данных в строку).

Реализация методов create_row и update_row приведена далее.

8 Добавляем описание.
9 Изменяем цель запроса в заголовке запроса.
10 SOAP-сообщение.
11 Отправляем SOAP-сообщение.
12 Выводим идентификатор созданной карточки.

Идентификатор полученной карточки версионного файла можно, к примеру, записать в секцию "Файлы" карточки типа "Документ", что соответствует прикрепление файла к документу.

Дополнительные методы, использованные выше, реализованы следующим образом:

def create_row(card_id, section_id):
    session.headers['SOAPAction'] =  "http://schemas.docsvision.com/Platform/2009-02-03/StorageServer/RowCreate" (1)

body =  """<?xml version="1.0" encoding="utf-8"?>
     <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
     <soap:Body>
     <RowCreate xmlns="http://schemas.docsvision.com/Platform/2009-02-03/StorageServer/">
     <sessionId>%s</sessionId>
     <sectionId>%s</sectionId>
     <rowId>00000000-0000-0000-0000-000000000000</rowId>
     <instanceID>%s</instanceID>
     <parentRowId>00000000-0000-0000-0000-000000000000</parentRowId>
     <parentTreeRowId>00000000-0000-0000-0000-000000000000</parentTreeRowId>
     </RowCreate>
     </soap:Body>
     </soap:Envelope>""" % (sessionId, section_id, card_id) (2)

response = session.post(url,  data=body) (3)

responseParsed = ElementTree.fromstring(response.content)
    newRowId = responseParsed.findtext(".//{http://schemas.docsvision.com/Platform/2009-02-03/StorageServer/}newRowId")
return newRowId (4)

(5)

def update_row(sectionId, rowId, rowData):
session.headers[ 'SOAPAction'] =  "http://schemas.docsvision.com/Platform/2009-02-03/StorageServer/RowSetData" (6)

body =  """<?xml version="1.0" encoding="utf-8"?>
     <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
     <soap:Body>
     <RowSetData xmlns="http://schemas.docsvision.com/Platform/2009-02-03/StorageServer/">
     <sessionId>%s</sessionId>
     <sectionId>%s</sectionId>
     <rowId>%s</rowId>
     <rowData>%s</rowData>
     </RowSetData>
     </soap:Body>
     </soap:Envelope>""" % (sessionId, sectionId, rowId, rowData) (7)

session.post(url,  data=body) (8)
1 Добавление пустой строки в секцию section_id карточки card_id
2 SOAP-сообщение.
3 Отправляем SOAP-сообщение.
4 Разбираем ответ и выводим идентификатор новой строки.
5 Запись данных rowData в строку rowId секции sectionId.
6 Изменяем цель запроса в заголовке запроса.
7 SOAP-сообщение.
8 Отправляем SOAP-сообщение.