How do I update document metadata in Sharepoint? (Linux & # 8594; WebServices & # 8594; Sharepoint)

I was able to download a file (crud PUT khe khe :) from Linux to Sharepoint. Absolute file path:

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

      

Now I am trying to add some metadata to the file:

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'))

      

The code returns:

soap:Server

      

... and nothing . Did I miss something? Is there any other way to do this?

thanks

+2


a source to share


2 answers


Found!:)

Instead of plain XML text, one should use DOM objects , something like this:



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)

      

It works great now!

+4


a source


As requested, a sample script that creates a new folder and uploads files to a SharePoint site from the linux command line. The full SharePoint path looks like this:

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()

      

Hope it helps :)

+3


a source







All Articles