def download_file(context,
                  download_url,
                  file_object,
                  chunk_downloaded=None,
                  chunk_size=1024 * 1024):
    """

    :type context: office365.sharepoint.client_context.ClientContext
    :type download_url: str
    :type file_object: typing.IO
    :type chunk_downloaded: (int)->None or None
    :type chunk_size: int
    """

    request = RequestOptions(
        r"{0}web/getFileByServerRelativeUrl('{1}')/\$value".format(
            ctx.service_root_url(), download_url))
    request.stream = True
    response = context.execute_request_direct(request)
    response.raise_for_status()
    bytes_read = 0
    for chunk in response.iter_content(chunk_size=chunk_size):
        bytes_read += len(chunk)
        if callable(chunk_downloaded):
            chunk_downloaded(bytes_read)
        file_object.write(chunk)
 def open_binary(ctx, server_relative_url):
     url = r"{0}web/getfilebyserverrelativeurl('{1}')/\$value".format(
         ctx.serviceRootUrl, server_relative_url)
     request = RequestOptions(url)
     request.method = HttpMethod.Get
     response = ctx.execute_request_direct(request)
     return response
    def upload_file_to_sp(self, file_path, *remote_path):
        folder_url = "/".join(["Shared Documents", "beta_builds"] +
                              list(remote_path))
        target_folder = self.ctx.web.ensure_folder_path(folder_url)

        size_chunk = 100 * 1024 * 1024  # MB
        file_size = os.path.getsize(file_path)

        if file_size > size_chunk:
            result_file = target_folder.files.create_upload_session(
                file_path, size_chunk, self.print_upload_progress, file_size)
        else:
            with open(file_path, 'rb') as content_file:
                file_content = content_file.read()
            name = os.path.basename(file_path)
            result_file = target_folder.upload_file(name, file_content)
        self.ctx.execute_query()

        request = RequestOptions(
            r"{0}web/getFileByServerRelativeUrl('{1}')/\$value".format(
                self.ctx.service_root_url(), result_file.serverRelativeUrl))
        request.stream = True
        response = self.ctx.execute_request_direct(request)
        remote_size = int(response.headers['Content-Length'])
        if abs(file_size - remote_size) > 0.05 * file_size:
            raise UploaderError("File size difference is more than 5%")

        logging.info('File {0} has been uploaded successfully'.format(
            result_file.serverRelativeUrl))
        return folder_url
    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
Esempio n. 5
0
 def request_form_digest(self):
     """Request Form Digest"""
     request = RequestOptions("contextInfo")
     request.method = HttpMethod.Post
     response = self.execute_request_direct(request)
     json = response.json()
     json_format = JsonLightFormat()
     json_format.function_tag_name = "GetContextWebInformation"
     self.pending_request().map_json(json, self._contextWebInformation, json_format)
Esempio n. 6
0
 def request_form_digest(self):
     """Request Form Digest"""
     request = RequestOptions(self.serviceRootUrl + "contextinfo")
     request.method = HttpMethod.Post
     response = self.execute_request_direct(request)
     payload = response.json()
     if self._pendingRequest.json_format.metadata == ODataMetadataLevel.Verbose:
         payload = payload['d']['GetContextWebInformation']
     self._contextWebInformation = ContextWebInformation()
     self._contextWebInformation.from_json(payload)
        def _create_doc_set():

            url = r"{0}/_vti_bin/listdata.svc/{1}".format(
                context.base_url,
                parentFolder.properties["Name"].replace(" ", ""))
            request = RequestOptions(url)
            request.method = HttpMethod.Post
            folder_url = parentFolder.serverRelativeUrl + '/' + name
            request.set_header('Slug', '{0}|{1}'.format(folder_url, ctid))
            response = context.execute_request_direct(request)
            json = response.json()
            context.pending_request().map_json(json, result)
Esempio n. 8
0
 def open_binary(ctx, server_relative_url):
     """
     Returns the file object located at the specified server-relative URL.
     :type ctx: ClientContext
     :type server_relative_url: str
     """
     url = r"{0}web/getfilebyserverrelativeurl('{1}')/\$value".format(
         ctx.service_root_url, server_relative_url)
     request = RequestOptions(url)
     request.method = HttpMethod.Get
     response = ctx.execute_request_direct(request)
     return response
 def _download_inner():
     request = RequestOptions(
         r"{0}web/getFileByServerRelativeUrl('{1}')/\$value".format(
             self.context.service_root_url(), self.serverRelativeUrl))
     request.stream = True
     response = self.context.execute_request_direct(request)
     response.raise_for_status()
     bytes_read = 0
     for chunk in response.iter_content(chunk_size=chunk_size):
         bytes_read += len(chunk)
         if callable(chunk_downloaded):
             chunk_downloaded(bytes_read)
         file_object.write(chunk)
    def open_binary(ctx, server_relative_url):
        """
        Returns the file object located at the specified server-relative URL.

        :type ctx: ClientContext
        :type server_relative_url: str
        :return Response
        """
        url = r"web/getFileByServerRelativePath(DecodedUrl='{0}')/\$value".format(
            server_relative_url)
        request = RequestOptions(url)
        request.method = HttpMethod.Get
        response = ctx.execute_request_direct(request)
        return response
Esempio n. 11
0
    def _normalize_request(self, request):
        """
        :type request: office365.runtime.http.request_options.RequestOptions or str
        """
        if not isinstance(request, RequestOptions):
            request = RequestOptions(request)

        if not is_absolute_url(request.url):
            url_parts = [self.service_root_url()]
            if not request.url.startswith("/"):
                url_parts.append("/")
            url_parts.append(request.url)
            request.url = "".join(url_parts)
        return request
Esempio n. 12
0
 def get_context_web_information(self, request_options=None):
     """Returns an ContextWebInformation object that specifies metadata about the site"""
     request = RequestOptions("contextInfo")
     request.method = HttpMethod.Post
     if request_options:
         request.proxies = request_options.proxies
         request.verify = request_options.verify
     response = self.execute_request_direct(request)
     json = response.json()
     json_format = JsonLightFormat()
     json_format.function_tag_name = "GetContextWebInformation"
     return_value = ContextWebInformation()
     self.pending_request().map_json(json, return_value, json_format)
     return return_value
Esempio n. 13
0
 def _create_doc_set(target_list):
     list_name = target_list.title.replace(" ", "")
     request_url = r"{0}/_vti_bin/listdata.svc/{1}".format(
         context.base_url, list_name)
     request = RequestOptions(request_url)
     request.method = HttpMethod.Post
     folder_url = parent_folder.serverRelativeUrl + '/' + name
     return_type._resource_path = ResourcePathServiceOperation(
         "getFolderByServerRelativeUrl", [folder_url],
         ResourcePath("Web"))
     request.set_header('Slug', '{0}|{1}'.format(folder_url, ct_id))
     response = context.execute_request_direct(request)
     response.raise_for_status()
     json = response.json()
     context.pending_request().map_json(json, return_type)
Esempio n. 14
0
 def build_request(self):
     url = "{0}/$batch".format(self.context.service_root_url())
     request = RequestOptions(url)
     request.method = HttpMethod.Post
     request.ensure_header('Content-Type', "application/json")
     request.ensure_header('Accept', "application/json")
     request.data = self._prepare_payload()
     return request
Esempio n. 15
0
    def getWebTitle(self):
        request = RequestOptions("{0}/_api/files".format(self.__site_url))
        response = self.__ctx.execute_request_direct(request)
        js = json.loads(response.content)
        web_title = js['d']['results']

        return web_title
Esempio n. 16
0
def load_web_by_absolute_url(client):
    """
    :type client: ClientContext
    """
    request = RequestOptions("{0}/_api/web/".format(test_site_url))
    response = client.execute_request_direct(request)
    response.raise_for_status()
    return json.loads(response.content)
 def _load_next_items(self):
     request = RequestOptions(self.next_request_url)
     response = self.context.execute_request_direct(request)
     response.raise_for_status()
     self.next_request_url = None
     self.context.pending_request().map_json(response.json(), self)
     self.page_loaded.notify(len(self._data))
     self._page_index += 1
     return self._data[self._page_size * self._page_index:]
Esempio n. 18
0
 def build_request(self, query):
     """
     :type query: office365.runtime.queries.client_query.ClientQuery
     """
     url = "{0}/$batch".format(self.context.service_root_url())
     request = RequestOptions(url)
     request.method = HttpMethod.Post
     request.ensure_header('Content-Type', "application/json")
     request.ensure_header('Accept', "application/json")
     request.data = self._prepare_payload()
     return request
    def execute_request(self, url_or_options):
        """
        Constructs and submits request directly

        :type url_or_options: str or RequestOptions
        """
        if not isinstance(url_or_options, RequestOptions):
            url_or_options = RequestOptions("{0}/{1}".format(
                self.__service_root_url, url_or_options))
        return self.execute_request_direct(url_or_options)
 def _load_next_items(self):
     if self.next_request_url and not self.query_options.top:
         items = ClientObjectCollection(self.context, self._item_type,
                                        self.resource_path)
         request = RequestOptions(self.next_request_url)
         response = self.context.execute_request_direct(request)
         json = response.json()
         self.context.get_pending_request().map_json(json, items)
         self.next_request_url = None
         for item in items:
             yield item
Esempio n. 21
0
    def _execute_upload_session(self, resp):
        item = DriveItemUploadableProperties()
        item.name = self._file_name
        self._session_result = self._target_item.create_upload_session(item)
        self.context.execute_query()

        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(self._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
            self.context.execute_request_direct(req)
            f_pos += len(piece)
            if callable(self._chunk_uploaded):
                self._chunk_uploaded(f_pos)
Esempio n. 22
0
    def build_request(self, query):
        """
        :type query: office365.runtime.queries.client_query.ClientQuery
        """
        self._current_query = query

        if query.resource_path is not None:
            request_url = query.service_root_url + str(query.resource_path)
        else:
            request_url = query.service_root_url + "/"
        if isinstance(query,
                      ReadEntityQuery) and not query.query_options.is_empty:
            request_url += "?" + query.query_options.to_url()
        request = RequestOptions(request_url)
        self.ensure_media_type(request)
        # set method
        request.method = HttpMethod.Get
        if isinstance(query, DeleteEntityQuery):
            request.method = HttpMethod.Post
        elif isinstance(
                query,
            (CreateEntityQuery, UpdateEntityQuery, ServiceOperationQuery)):
            request.method = HttpMethod.Post
            if query.parameter_type is not None:
                request.data = self._normalize_payload(query)
        return request
    def build_request(self):
        qry = self.context.current_query
        self.json_format.function_tag_name = None
        if isinstance(qry, ServiceOperationQuery):
            self.json_format.function_tag_name = qry.method_name
            if qry.static:
                request_url = self.context.service_root_url + '.'.join(
                    [qry.binding_type.entity_type_name, qry.method_url])
            else:
                request_url = '/'.join(
                    [qry.binding_type.resource_url, qry.method_url])
        else:
            request_url = qry.binding_type.resource_url
        request = RequestOptions(request_url)

        # set method
        request.method = HttpMethod.Get
        if isinstance(qry, DeleteEntityQuery):
            request.method = HttpMethod.Post
        elif isinstance(
                qry,
            (CreateEntityQuery, UpdateEntityQuery, ServiceOperationQuery)):
            request.method = HttpMethod.Post
            if qry.parameter_type is not None:
                request.data = self._normalize_payload(qry.parameter_type)
        return request
 def build_request(self):
     request_url = "{0}$batch".format(self.context.service_root_url)
     request = RequestOptions(request_url)
     request.method = HttpMethod.Post
     request.ensure_header('Content-Type', self._content_type)
     request.data = self._prepare_payload().as_bytes()
     return request
    def build_request(self):
        qry = self._get_current_query()
        request = RequestOptions(qry.bindingType.resourceUrl)
        if isinstance(qry, ServiceOperationQuery):
            request.url = '/'.join([qry.bindingType.resourceUrl, qry.methodUrl])

        # set json format headers
        media_type = self.json_format.get_media_type()
        request.set_headers({'Content-Type': media_type, 'Accept': media_type})
        # set method
        request.method = HttpMethod.Get
        if isinstance(qry, DeleteEntityQuery):
            request.method = HttpMethod.Post
        elif isinstance(qry, CreateEntityQuery) \
            or isinstance(qry, UpdateEntityQuery) \
            or isinstance(qry, ServiceOperationQuery):
            request.method = HttpMethod.Post
            if qry.parameterType is not None:
                request.data = self._normalize_payload(qry.parameterType)
        return 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
Esempio n. 27
0
    def __iter__(self):
        for _object in self._data:
            yield _object
        while self.__next_query_url:
            # create a request with the __next_query_url
            request = RequestOptions(self.__next_query_url)
            response = self.context.execute_request_direct(request)
            payload = response.json()
            next_collection = ClientObjectCollection(self.context,
                                                     self._item_type)
            next_collection.map_json(payload["collection"], payload["next"])

            # add the new objects to the collection before yielding the results
            for item in next_collection:
                self.add_child(item)
                yield item
Esempio n. 28
0
 def build_request(self):
     url = "{0}$batch".format(self.context.service_root_url())
     request = RequestOptions(url)
     request.method = HttpMethod.Post
     media_type = "multipart/mixed"
     content_type = "; ".join([
         media_type,
         "boundary={0}".format(self._current_query.current_boundary)
     ])
     request.ensure_header('Content-Type', content_type)
     request.data = self._prepare_payload().as_bytes()
     return request
 def build_request(self):
     qry = self.current_query
     action_url = qry.build_url()
     request = RequestOptions(action_url)
     self.ensure_media_type(request)
     # set method
     request.method = HttpMethod.Get
     if isinstance(qry, DeleteEntityQuery):
         request.method = HttpMethod.Post
     elif isinstance(qry, (CreateEntityQuery, UpdateEntityQuery, ServiceOperationQuery)):
         request.method = HttpMethod.Post
         if qry.parameter_type is not None:
             request.data = self._normalize_payload(qry.parameter_type)
     return request
Esempio n. 30
0
    def save_binary(ctx, server_relative_url, content):
        """Uploads a file

        :type ctx: ClientContext
        :type server_relative_url: str
        :type content: str
        """
        url = r"{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
        response = ctx.execute_request_direct(request)
        return response