Как обновить метаданные документа в Sharepoint? (Linux -> Веб-сервисы -> Sharepoint) - PullRequest
2 голосов
/ 13 апреля 2010

Мне удалось загрузить файл (crud PUT khe khe :) из Linux в Sharepoint. Абсолютный путь к файлу:

http://myhost/mysite/reports/2010-04-13/file.txt

Теперь я пытаюсь добавить метаданные в файл:

from suds.transport.https import WindowsHttpAuthenticated
url='http://myhost/mysite/_vti_bin/lists.asmx?WSDL'
n=WindowsHttpAuthenticated(username='me',password='password')
from suds.client import Client
c=Client(url,transport=n)

xml="""<Batch OnError='Continue' PreCalc='' ListVersion='0'>
<Method ID='1' Cmd='Update'>
    <Field Name='ID'/>
    <Field Name='FileRef'>%s</Field>
    <Field Name='Jurisdiction'>%s</Field>
</Method>
</Batch>"""
fn = 'http://myhost/mysite/reports/2010-04-13/file.txt'
print c.service.UpdateListItems('reports',xml % (fn,'UK'))

Код возвращает:

soap:Server

... и ничего не происходит. Я что-то пропустил? Есть ли другой способ сделать это?

Спасибо

Ответы [ 2 ]

4 голосов
/ 20 апреля 2010

Нашли это! :)

Вместо простого текста XML необходимо использовать DOM объекты, что-то вроде этого:

b = Element("Batch")
b.append(Attribute("OnError","Continue")).append(Attribute("ListVersion","3"))
bm= Element("Method")
bm.append(Attribute("ID","1")).append(Attribute("Cmd","Update"))
bm.append(Element("Field").append(Attribute("Name","ID")).setText(''))
bm.append(Element('Field').append(Attribute('Name','FileRef')).setText('http://.....'))
bm.append(Element('Field').append(Attribute('Name','Jurisdiction')).setText('UK'))
bm.append(Element('Field').append(Attribute('Name','Desk')).setText('Structured Equity Derivatives'))
bm.append(Element('Field').append(Attribute('Name','Business Area')).setText('Back Office'))
bm.append(Element('Field').append(Attribute('Name','Title')).setText('whatever'))
b.append(bm)
u = Element("ns1:updates")
u.append(b)
c.service.UpdateListItems("Reports",u)

Теперь все работает отлично!

3 голосов
/ 13 июля 2010

По запросу, образец сценария, который создает новую папку и загружает файлы на сайт SharePoint из командной строки linux. Полный путь к SharePoint выглядит следующим образом:

http: // mysite / MyFirstSPSite / Reports / [current_iso_date] / [uploaded_file.txt]

#!/usr/bin/python2.4

import datetime as dt
import sys
from suds.transport.https import WindowsHttpAuthenticated
from suds.sax.element import Element
from suds.sax.element import Attribute
from suds import client
from ntlm import HTTPNtlmAuthHandler
import urllib2
import os.path

FOLDER = dt.date.today().strftime("%Y-%m-%d")  #folder name that will be created
FNAME = sys.argv[1]                            #file name to upload
SITE = "http://mysite/MyFirstSPSite"
FURL = "%s/Reports/%s/%s" % (SITE,FOLDER,os.path.basename(FNAME))
USER = "uk\\user_name_goes_here"   # AD user name
PASS = "password_goes_here"

def main():
  wss_lists = client.Client("%s/_vti_bin/lists.asmx?WSDL" %      SITE,transport=WindowsHttpAuthenticated(username=USER,password=PASS))
  wss_dws = client.Client("%s/_vti_bin/dws.asmx?WSDL" % SITE,transport=WindowsHttpAuthenticated(username=USER,password=PASS))
  wss_dws.service.CreateFolder("Reports/%s" % FOLDER)
  print uploadReport(FURL,sys.argv[1])
  wss_lists.service.UpdateListItems("Reports",getUpdatesElement(FURL,"Title goes here"))


def getUpdatesElement(furl,title = ''):
  b = Element("Batch")
  b.append(Attribute("OnError","Continue")).append(Attribute("ListVersion","3"))
  bm= Element("Method")
  bm.append(Attribute("ID","1")).append(Attribute("Cmd","Update"))
  bm.append(Element("Field").append(Attribute("Name","ID")).setText(''))
  bm.append(Element('Field').append(Attribute('Name','FileRef')).setText(furl))
  bm.append(Element('Field').append(Attribute('Name','CustomProperty1')).setText('Value1'))
  bm.append(Element('Field').append(Attribute('Name','CustomProperty2')).setText('Value2'))
  bm.append(Element('Field').append(Attribute('Name','Title')).setText(title))
  b.append(bm)
  u = Element("ns1:updates")
  u.append(b)
  return u


def uploadReport(furl,fname):
  pm = urllib2.HTTPPasswordMgrWithDefaultRealm()
  pm.add_password(None,'http://mysite',USER,PASS)
  op = urllib2.build_opener(HTTPNtlmAuthHandler.HTTPNtlmAuthHandler(pm))
  #import pdb;pdb.set_trace()
  fh = open(fname)
  data = fh.read()
  fh.close()
  req = urllib2.Request(furl,data=data)
  req.get_method = lambda: 'PUT'
  req.add_header('Content-Type','text/csv')
  r = op.open(req)
  return r.read()

if __name__=="__main__": main()

Надеюсь, это поможет :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...