Exemplo n.º 1
0
def upload_file_from_local(local_file_path, sharepoint_folder_path):
    """Upload a file to a folder give file name and folder path
       The sharepoint_folder_path is any subdirectory in Shared Documents/"""
    if ctx.acquire_token_for_user(username=USERNAME, password=PASSWORD):
        s_folder = sharepoint_folder_path
        fname = os.path.basename(os.path.normpath(local_file_path))
        files_url = "{0}/_api/web/GetFolderByServerRelativeUrl('{1}')/Files/add(url='{2}', overwrite=true)"
        full_url = files_url.format(BASE_URL, s_folder, fname)
        options = RequestOptions(BASE_URL)
        context = ClientContext(BASE_URL, ctx)
        context.request_form_digest()
        options.set_header('Accept', 'application/json; odata=verbose')
        options.set_header('Content-Type', 'application/octet-stream')
        options.set_header('Content-Length',
                           str(os.path.getsize(local_file_path)))
        options.set_header('X-RequestDigest',
                           context.contextWebInformation.form_digest_value)
        options.method = 'POST'

    with open(local_file_path, 'rb') as outfile:
        context.authenticate_request(options)
        data = requests.post(url=full_url,
                             data=outfile,
                             headers=options.headers,
                             auth=options.auth)
        if data.status_code == 200:
            print(data.ok)
        else:
            print(data.content)
Exemplo n.º 2
0
def upload_binary_file(file_path, base_url, folder_url, ctx_auth):
    """Attempt to upload a binary file to SharePoint"""

    file_name = basename(file_path)
    files_url = "{0}/_api/web/GetFolderByServerRelativeUrl('{1}')/Files/add(url='{2}', overwrite=true)"
    full_url = files_url.format(base_url, folder_url, file_name)

    options = RequestOptions(base_url)
    context = ClientContext(base_url, ctx_auth)
    context.request_form_digest()

    options.set_header('Accept', 'application/json; odata=verbose')
    options.set_header('Content-Type', 'application/octet-stream')
    options.set_header('Content-Length', str(os.path.getsize(file_path)))
    options.set_header('X-RequestDigest',
                       context.contextWebInformation.form_digest_value)
    options.method = 'POST'

    with open(file_path, 'rb') as outfile:

        # instead of executing the query directly, we'll try to go around
        # and set the json data explicitly

        context.authenticate_request(options)

        data = requests.post(url=full_url,
                             data=outfile,
                             headers=options.headers,
                             auth=options.auth)

        if data.status_code != 200:
            print("upload_binary_file error code: " + str(data.status_code))
Exemplo n.º 3
0
def download_file(uri):
    """Give the URI (returned from retrieve file query) 
    and the path you want to write to."""
    uriR = uri + '/$value'
    if ctx.acquire_token_for_user(username=USERNAME, password=PASSWORD):
        options = RequestOptions(BASE_URL)
        context = ClientContext(BASE_URL, ctx)
        context.request_form_digest()
        options.method = 'GET'
        context.authenticate_request(options)
        byte_doc = requests.get(url=uriR,
                                headers=options.headers,
                                auth=options.auth)
        hack_file_name = uri.split("/")
        hack_file = hack_file_name[len(hack_file_name) - 1]
        file_name = hack_file[0:len(hack_file) - 2]
        return file_name, byte_doc.content
    else:
        print('Incorrect login credentials')
Exemplo n.º 4
0
def retrieve_file_list(url):
    url = url + '/Files'
    if ctx.acquire_token_for_user(username=USERNAME, password=PASSWORD):
        options = RequestOptions(BASE_URL)
        context = ClientContext(BASE_URL, ctx)
        context.request_form_digest()
        options.set_header('Accept', 'application/json; odata=verbose')
        options.method = 'GET'
        context.authenticate_request(options)
        data = requests.get(url=url,
                            headers=options.headers,
                            auth=options.auth)
        if data.status_code == 200:
            file_list = []
            datam = json.loads(data.text)
            for f in range(len(datam['d']['results'])):
                uri = datam['d']['results'][f]['__metadata']['uri']
                file_list.append(uri)
            return file_list
        else:
            print(data.content)
Exemplo n.º 5
0
def create_sharepoint_folder(new_folder_name):
    """THIS API CAN ONLY HANDLE 1 FOLDER CREATION AT A TIME"""
    if ctx.acquire_token_for_user(username=USERNAME, password=PASSWORD):
        create_folder_url = "{0}/_api/web/GetFolderByServerRelativeUrl('Shared Documents')/folders".format(
            BASE_URL)
        options = RequestOptions(BASE_URL)
        context = ClientContext(BASE_URL, ctx)
        context.request_form_digest()
        options.set_header('Accept', 'application/json; odata=verbose')
        options.set_header('Content-Type', 'application/json;odata=verbose')
        options.set_header('X-RequestDigest',
                           context.contextWebInformation.form_digest_value)
        options.method = 'POST'
        context.authenticate_request(options)
        body = {}
        body['__metadata'] = {'type': 'SP.Folder'}
        body['ServerRelativeUrl'] = new_folder_name
        string_body = json.dumps(body)
        data = requests.post(url=create_folder_url,
                             data=string_body,
                             headers=options.headers,
                             auth=options.auth)
        return data.ok
Exemplo n.º 6
0
def checkin_file(file_path, base_url, folder_url, ctx_auth):
    """Attempt to check in a file in SharePoint"""

    file_name = basename(file_path)
    files_url = "{0}/_api/web/GetFileByServerRelativeUrl('{1}/{2}')/CheckIn(comment='Comment',checkintype=0)"
    full_url = files_url.format(base_url, folder_url, file_name)

    options = RequestOptions(base_url)
    context = ClientContext(base_url, ctx_auth)
    context.request_form_digest()

    options.set_header('X-RequestDigest',
                       context.contextWebInformation.form_digest_value)
    options.method = 'POST'

    context.authenticate_request(options)

    data = requests.post(url=full_url,
                         headers=options.headers,
                         auth=options.auth)

    if data.status_code != 200:
        print("checkin_file error code: " + str(data.status_code))
Exemplo n.º 7
0
	def main(self, fcreate, fname, furl):
		file_to_create = fcreate
		file_name = fname
	#### --- Create Sharepoint Authorized Connection ---- ####
		ctx_auth = AuthenticationContext(url)
		if ctx_auth.acquire_token_for_user(username, password):
			ctx= ClientContext(url,ctx_auth)
			ctx.request_form_digest()
			request = ClientRequest(ctx)
			full_url = ("{0}/_api/web/GetFolderByServerRelativeUrl('{1}')/Files/add(url='{2}', overwrite=true)".format(url, furl, file_to_create))
			options = RequestOptions(full_url)
			options.set_header('Accept', 'application/json; odata=nometadata')
			options.set_header('Content-Type', 'application/octet-stream')
			options.set_header('Content-Length', str(os.path.getsize(file_name)))
			options.set_header('X-RequestDigest', ctx.contextWebInformation.form_digest_value)
			options.method = HttpMethod.Post
	### --- Upload File to Sharepoint Site ---- ####
			with open(file_name, 'rb') as outfile:
				ctx.authenticate_request(options)
				data = requests.post(url=full_url, data=outfile, headers=options.headers, auth=options.auth)
	### --- Verify succuess of upload ---- ###
				if data.status_code == 200:
					print("success")
				else:
					print(data.status_code)
					return data.json()['error']
			
		else:
			print(ctx_auth.get_last_error())

			
### --- Script Start ---- ####			
#fileOpenBackLogCreate()
#fileBillingsCreate()
#msdShipDate()

#read_file()
class ClientRequest(object):
    """Client request for Office365 ODATA/REST service"""

    def __init__(self, context):
        self.context = context
        self.__queries = []
        self.__resultObjects = {}

    def __int__(self, url, ctx_auth):
        from office365.sharepoint.client_context import ClientContext
        self.context = ClientContext(url, ctx_auth)

    def clear(self):
        self.__queries = []
        self.__resultObjects = {}

    def execute_query(self, query=None, result_object=None):
        """Submit pending request to the server"""
        if query:
            return self.execute_single_query(query, result_object)
        return self.execute_pending_queries()

    def execute_pending_queries(self):
        try:
            for query in self.__queries:
                request = self.build_request(query)
                response = self.execute_request_direct(request)
                self.process_payload_json(query, response)
        finally:
            self.clear()

    def execute_single_query(self, query, result_object=None):
        """Submit single query to the server"""
        request = self.build_request(query)
        response = self.execute_request_direct(request)
        return self.process_payload_json(query, response, result_object)

    def process_payload_json(self, query, response, result_object=None):
        self.validate_response(response)

        if not response.content or response.headers.get('Content-Type', '').lower().split(';')[0] != 'application/json':
            return

        if response.headers.get('Content-Type', '').lower().split(';')[0] == 'application/json':
            payload = response.json()
        else:
            payload = None

        result_object = result_object if result_object else self.__resultObjects.get(query)

        if payload and result_object is not None:
            json_format = self.context.json_format
            if isinstance(json_format, JsonLightFormat):
                if json_format.payload_root_entry:
                    payload = payload[json_format.payload_root_entry]
                if isinstance(result_object, ClientObjectCollection) \
                        and json_format.payload_root_entry_collection:
                    payload = payload[json_format.payload_root_entry_collection]
            else:
                if isinstance(result_object, ClientObjectCollection):
                    payload = payload[json_format.payload_root_entry_collection]
            result_object.map_json(payload)

        return payload

    def build_request(self, query):
        request = RequestOptions(query.url)
        "set json format headers"
        request.set_headers(self.context.json_format.build_http_headers())
        if isinstance(self.context.json_format, JsonLightFormat):
            "set custom method headers"
            if query.action_type == ActionType.DeleteEntry:
                request.set_header("X-HTTP-Method", "DELETE")
                request.set_header("IF-MATCH", '*')
            elif query.action_type == ActionType.UpdateEntry:
                request.set_header("X-HTTP-Method", "MERGE")
                request.set_header("IF-MATCH", '*')
            "set method"
            if not (query.action_type == ActionType.ReadEntry or query.action_type == ActionType.GetMethod):
                request.method = HttpMethod.Post
        else:
            if query.action_type == ActionType.CreateEntry:
                request.method = HttpMethod.Post
            elif query.action_type == ActionType.UpdateEntry:
                request.method = HttpMethod.Patch
            elif query.action_type == ActionType.DeleteEntry:
                request.method = HttpMethod.Delete
        "set request payload"
        request.data = query.payload
        return request

    def execute_request_direct(self, request_options):
        """Execute client request"""
        self.context.authenticate_request(request_options)
        if request_options.method == HttpMethod.Post:
            from office365.sharepoint.client_context import ClientContext
            if isinstance(self.context, ClientContext):
                self.context.ensure_form_digest(request_options)
            if hasattr(request_options.data, 'decode') and callable(request_options.data.decode):
                result = requests.post(url=request_options.url,
                                       headers=request_options.headers,
                                       data=request_options.data,
                                       auth=request_options.auth)
            elif hasattr(request_options.data, 'read') and callable(request_options.data.read):
                result = requests.post(url=request_options.url,
                                       headers=request_options.headers,
                                       data=request_options.data,
                                       auth=request_options.auth)
            else:
                result = requests.post(url=request_options.url,
                                       headers=request_options.headers,
                                       json=request_options.data,
                                       auth=request_options.auth)
        elif request_options.method == HttpMethod.Patch:
            result = requests.patch(url=request_options.url,
                                    headers=request_options.headers,
                                    json=request_options.data,
                                    auth=request_options.auth)
        elif request_options.method == HttpMethod.Delete:
            result = requests.delete(url=request_options.url,
                                     headers=request_options.headers,
                                     auth=request_options.auth)
        else:
            result = requests.get(url=request_options.url,
                                  headers=request_options.headers,
                                  auth=request_options.auth)
        return result

    def add_query(self, query, result_object=None):
        self.__queries.append(query)
        if result_object is not None:
            self.__resultObjects[query] = result_object

    def validate_response(self, response):
        try:
            response.raise_for_status()
        except HTTPError as e:
            raise ClientRequestException(*e.args, response=e.response)