def test7_upload_file_session(self): file_name = "big_buck_bunny.mp4" path = "{0}/data/{1}".format(os.path.dirname(__file__), file_name) # 1. create a file target_item = self.client.me.drive.root.upload(file_name, None) self.client.execute_query() self.assertIsNotNone(target_item.properties['id']) # 2. create upload session item = DriveItemUploadableProperties() item.name = file_name session_result = target_item.create_upload_session(item) self.client.execute_query() self.assertIsNotNone(session_result.value) # 3. start upload f = open(path, 'rb') st = os.stat(path) f_pos = 0 for piece in read_in_chunks(f, chunk_size=1000000): req = RequestOptions(session_result.value.uploadUrl) req.method = HttpMethod.Put req.set_header('Content-Length', str(len(piece))) req.set_header('Content-Range', 'bytes {0}-{1}/{2}'.format(f_pos, (f_pos + len(piece) - 1), st.st_size)) req.set_header('Accept', '*/*') req.data = piece resp = self.client.execute_request_direct(req) self.assertTrue(resp.ok) f_pos += len(piece)
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.DeleteEntity: request.set_header("X-HTTP-Method", "DELETE") request.set_header("IF-MATCH", '*') elif query.action_type == ActionType.UpdateEntity: request.set_header("X-HTTP-Method", "MERGE") request.set_header("IF-MATCH", '*') # set method if not (query.action_type == ActionType.ReadEntity or query.action_type == ActionType.GetMethod): request.method = HttpMethod.Post else: if query.action_type == ActionType.CreateEntity: request.method = HttpMethod.Post elif query.action_type == ActionType.UpdateEntity: request.method = HttpMethod.Patch elif query.action_type == ActionType.DeleteEntity: request.method = HttpMethod.Delete # set request payload if query.payload is not None: request.data = ODataEncoder(self.context.json_format).default( query.payload) return request
def execute(self, chunk_uploaded=None): ctx = self._target_folder.context file_name = os.path.basename(self._source_path) # 1. create an empty file target_item = self._target_folder.upload(file_name, None) ctx.execute_query() # 2. create upload session item = DriveItemUploadableProperties() item.name = file_name session_result = target_item.create_upload_session(item) ctx.execute_query() # 3. start upload fh = open(self._source_path, 'rb') st = os.stat(self._source_path) f_pos = 0 for piece in read_in_chunks(fh, chunk_size=self._chunk_size): req = RequestOptions(session_result.value.uploadUrl) req.method = HttpMethod.Put req.set_header('Content-Length', str(len(piece))) req.set_header( 'Content-Range', 'bytes {0}-{1}/{2}'.format(f_pos, (f_pos + len(piece) - 1), st.st_size)) req.set_header('Accept', '*/*') req.data = piece resp = ctx.execute_request_direct(req) f_pos += len(piece) if chunk_uploaded is not None: chunk_uploaded(f_pos) return target_item
def save_binary(ctx, server_relative_url, content): server_relative_url = urllib.quote(server_relative_url) url = "{0}web/getfilebyserverrelativeurl('{1}')/\$value".format( ctx.service_root_url, server_relative_url) request = RequestOptions(url) request.method = HttpMethod.Post request.set_header('X-HTTP-Method', 'PUT') request.data = content ctx.execute_query_direct(request)
def save_binary(ctx, server_relative_url, content): """Uploads a file""" url = r"{0}web/getfilebyserverrelativeurl('{1}')/\$value".format( ctx.serviceRootUrl, server_relative_url) request = RequestOptions(url) request.method = HttpMethod.Post request.set_header('X-HTTP-Method', 'PUT') request.data = content response = ctx.execute_request_direct(request) return response
def build_request(self, query): request = RequestOptions(query.url) # set json format headers request.set_headers(self.context.json_format.build_http_headers()) # set method request.method = query.method # set request payload if query.payload is not None: request.data = ODataEncoder(self.context.json_format).default(query.payload) return request
def save_binary(ctx, server_relative_url, content): try: from urllib import quote # Python 2.X except ImportError: from urllib.parse import quote # Python 3+ server_relative_url = quote(server_relative_url) url = "{0}web/getfilebyserverrelativeurl('{1}')/\$value".format(ctx.service_root_url, server_relative_url) request = RequestOptions(url) request.method = HttpMethod.Post request.set_header('X-HTTP-Method', 'PUT') request.data = content ctx.execute_query_direct(request)
def create_list_item(context, list_title, url): """Create list item example""" request = ClientRequest(context) options = RequestOptions("{0}/web/lists/getbyTitle('{1}')/items".format(url, list_title)) options.set_header('Accept', 'application/json; odata=nometadata') # JSON Light nometadata mode! options.data = {'Title': 'New Task'} options.method = HttpMethod.Post print("Creating list item...") response = request.execute_request_direct(options) item = json.loads(response.content) print("Task {0} has been successfully [created]".format(item['Title'])) return item
def delete_list_item(context, list_title, item_id, url): """Delete list item example""" request = ClientRequest(context) options = RequestOptions( "{0}/web/lists/getbyTitle('{1}')/items({2})".format(url, list_title, item_id)) options.set_header('Accept', 'application/json; odata=nometadata') # JSON Light nometadata mode! options.set_header('IF-MATCH', '*') options.set_header('X-HTTP-Method', 'DELETE') options.data = {'Title': 'New Task (updated)'} options.method = HttpMethod.Post print("Deleting list item...") request.execute_request_direct(options) print("Task has been successfully [deleted]")
def post(self, path, headers={}, data={}): # request = ClientRequest(self.ctx_auth) options = RequestOptions('{}_api/web/{}'.format(self.site_url, path)) options.method = HttpMethod.Post options.set_headers(headers) options.data = data data = self.request.execute_request_direct(options) if data.status_code == 403: import traceback traceback.print_tb() print(options.url) print(data.content) print(options.headers) return data
def update_list_item(context, list_title, item_id, values_to_send): """ Updates item with given id in given list with given properties :param context: auth context :param list_title: name of list :param item_id: :param values_to_send: dict with key-value pairs :return: requests/result object """ request = ClientRequest(context) options = RequestOptions( "{2}/_api/web/lists/getbyTitle('{0}')/items({1})".format( list_title, item_id, URL)) options.set_header('Accept', 'application/json; odata=nometadata') options.set_header('IF-MATCH', '*') options.set_header('X-HTTP-Method', 'MERGE') options.data = values_to_send options.method = HttpMethod.Post result = request.execute_request_direct(options) return result
def _build_request(self): for qry in self._queries: request = RequestOptions(qry.entity_type.resourceUrl) # set json format headers request.set_headers(self.context.json_format.build_http_headers()) # set method request.method = HttpMethod.Get if isinstance(qry, CreateEntityQuery) \ or isinstance(qry, UpdateEntityQuery) \ or isinstance(qry, DeleteEntityQuery): request.method = HttpMethod.Post elif isinstance(qry, ServiceOperationQuery): request.url = '/'.join( [qry.entity_type.resourceUrl, qry.method_path.segment]) request.method = HttpMethod.Post # set request payload if qry.parameters is not None: request.data = self._normalize_payload(qry.parameters) if 'before' in self._events: self._events['before'](request, qry) self.__current_query = qry yield request
def build_request(self, query): request = RequestOptions(query.url) # set json format headers request.set_headers(self.context.json_format.build_http_headers()) # set method request.method = query.method # set custom method headers if isinstance(self.context.json_format, JsonLightFormat): if isinstance(query, DeleteEntityQuery): request.set_header("X-HTTP-Method", "DELETE") request.set_header("IF-MATCH", '*') elif isinstance(query, UpdateEntityQuery): request.set_header("X-HTTP-Method", "MERGE") request.set_header("IF-MATCH", '*') else: if isinstance(query, UpdateEntityQuery): request.method = HttpMethod.Patch elif isinstance(query, DeleteEntityQuery): request.method = HttpMethod.Delete # set request payload if query.payload is not None: request.data = ODataEncoder(self.context.json_format).default( query.payload) return request
# If the script has reached this point, our session is authenticated # Run payload (your desired action) here # Note: our convention across this plugin is that destinationPath begins with "/", # and site_url, site_sourceSite, site_destinationSite do not end with / # Move or copy across sites # site_url must end with / options = RequestOptions(site_source_url + "/sites/" + site_sourceSite + "/_api/site/CreateCopyJobs") options.method = 'POST' options.set_header('Accept', 'application/json') options.set_header('Content-Type', 'application/json') options.set_header('X-RequestDigest',digest) options.data = '{ "destinationUri" : "' + site_dest_url + destinationPath + ', "exportObjectUris" : ["' + site_source_url + sourcePath + '"], "options" : {"IgnoreVersionHistory" : "true", "IsMoveMode" : "true"} }' # This can copy multiple items in exportObjectUris # options.data = '{ "destinationUri" : "' + site_dest_url + destinationPath + '", "exportObjectUris" : ["' + site_source_url + sourcePath + '"], "options" : {"IgnoreVersionHistory" : "true", "IsMoveMode" : "true"} }' print(data.content) # Execute options.method = 'POST' options.set_header('Accept', 'application/json') options.set_header('Content-Type', 'application/json') options.set_header('X-RequestDigest',digest) data = request.execute_request_direct(options) print("Server Response: ") print(data.content)