views:

349

answers:

4

Hi

I managed to upload a file (crud PUT khe khe :) from Linux to Sharepoint. The absolute path of the file is:

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

Now, I'm 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 happens. Am I missing anything? Is there any other way to do it?

Thanks

A: 

Found it! :)

Instead of a plain text XML one must 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)

Now it works perfect!

Dave
I shouldn't have posted an answer to my own question, should I? >:)
Dave
A: 

can you please share the code for uploading an item from linux server to sharepoint.

Thanks and Regards vishal

vishal
A: 

Yes, that would be great, and extremely useful for a lot of people....Share please :)

Daniel
A: 

As requested, a sample script that creates a new folder and uploads files into SharePoint site from 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 that helps :)

Dave