Ejemplo n.º 1
0
 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 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
Ejemplo n.º 3
0
 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)
Ejemplo n.º 4
0
 def open_binary(ctx, server_relative_url):
     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.Get
     response = ctx.execute_query_direct(request)
     return response
Ejemplo n.º 5
0
def checkout_file(target_url, ctx, l):
    url = "{0}web/getfilebyserverrelativeurl('{1}')/" \
          "CheckOut()".format(ctx.service_root_url, target_url)
    try:
        request = RequestOptions(url)
        request.method = HttpMethod.Post
        ctx.execute_request_direct(request)
    except Exception as e:
        l.error(e)
Ejemplo n.º 6
0
def checkin_file(target_url, ctx, checkin_type, l):
    url = "{0}web/getfilebyserverrelativeurl('{1}')/" \
          "CheckIn(comment='',checkintype={2})".format(ctx.service_root_url, target_url, checkin_type)
    try:
        request = RequestOptions(url)
        request.method = HttpMethod.Post
        ctx.execute_request_direct(request)
    except Exception as e:
        l.error(e)
Ejemplo n.º 7
0
    def upload(self, fileobj, remote_path, buffer_size=None, log=False, progress_obj=False):
        iid = uuid.uuid1()

        if progress_obj:
            log = True

        if log:
            logger = logging.getLogger('cloud.backup')
            try:
                size = os.path.getsize(fileobj.name)
            except:
                size = None

        offset = -1
        if not buffer_size:
            buffer_size = 10* 1024 * 1024
        x = ""
        webUri = '%s%s' % (self.path, remote_path)
        while True:
            if offset == -1:
                request_url = "%s/_api/web/GetFolderByServerRelativeUrl('%s')/Files/add(url='%s',overwrite=true)" % (self.baseurl, self.path, remote_path)
                offset = 0
            elif not offset:
                if len(x) == buffer_size:
                    request_url="%s/_api/web/getfilebyserverrelativeurl('%s')/startupload(uploadId=guid'%s')" % (self.baseurl, webUri, iid)
                else:
                    request_url = "%s/_api/web/GetFolderByServerRelativeUrl('%s')/Files/add(url='%s',overwrite=true)" % (self.baseurl, self.path, remote_path)
            elif len(x) == buffer_size:
                request_url = "%s/_api/web/getfilebyserverrelativeurl('%s')/continueupload(uploadId=guid'%s',fileOffset=%s)" % (self.baseurl, webUri, iid, offset)
            else:
                request_url = "%s/_api/web/getfilebyserverrelativeurl('%s')/finishupload(uploadId=guid'%s',fileOffset=%s)" % (self.baseurl, webUri, iid, offset)

            offset += len(x)
            options = RequestOptions(request_url)
            options.method = HttpMethod.Post

            self.request.context.authenticate_request(options)
            self.request.context.ensure_form_digest(options)
            result = requests.post(url=request_url, data=x, headers=options.headers, auth=options.auth)
            if result.status_code not in (200, 201):
                raise Exception(result.content)

            if log and offset and offset % buffer_size*10 == 0:
                percent_txt = ''
                if size:
                    percent = round(offset*100/size)
                    percent_txt = '%d%%' % percent
                    if progress_obj:
                        progress_obj.write({'name': percent})

                logger.info('OneDrive: %d bytes sent on %s bytes %s' % (offset, size or 'unknown', percent_txt))

            x = fileobj.read(buffer_size)
            if not x:
                break
        return True
Ejemplo n.º 8
0
 def request_form_digest(self):
     """Request Form Digest"""
     request = RequestOptions(self.serviceRootUrl + "contextinfo")
     request.method = HttpMethod.Post
     request.set_headers(self.json_format.build_http_headers())
     response = self.execute_request_direct(request)
     payload = response.json()
     if self.json_format.metadata == ODataMetadataLevel.Verbose:
         payload = payload['d']['GetContextWebInformation']
     self.contextWebInformation = ContextWebInformation()
     self.contextWebInformation.from_json(payload)
Ejemplo n.º 9
0
def read_list_items(context, list_title, url):
    """Read list items example"""
    request = ClientRequest(context)
    options = RequestOptions("{0}/web/lists/getbyTitle('{1}')/items".format(url, list_title))
    options.set_header('Accept', 'application/json; odata=nometadata')

    print("Retrieving list items from List {0}".format(list_title))
    response = request.execute_request_direct(options)
    data = json.loads(response.content)
    for item in data['value']:
        print("Item title: {0}".format(item["Title"]))
Ejemplo n.º 10
0
 def open_binary(ctx, server_relative_url):
     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.Get
     response = ctx.execute_query_direct(request)
     return response
Ejemplo n.º 11
0
 def delete(self, remote_path):
     webUri = '%s%s' % (self.path, remote_path)
     request_url = "%s/_api/web/getfilebyserverrelativeurl('%s')" % (self.baseurl, webUri)
     options = RequestOptions(request_url)
     options.method = HttpMethod.Delete
     options.set_header("X-HTTP-Method", "DELETE")
     self.request.context.authenticate_request(options)
     self.request.context.ensure_form_digest(options)
     result = requests.post(url=request_url, data="", headers=options.headers, auth=options.auth)
     if result.status_code not in (200, 201):
         raise Exception(result.content)
     return True
Ejemplo n.º 12
0
 def request_form_digest(self):
     """Request Form Digest"""
     request = RequestOptions(self.service_root_url + "contextinfo")
     self.authenticate_request(request)
     request.set_headers(self.json_format.build_http_headers())
     response = requests.post(url=request.url,
                              headers=request.headers,
                              auth=request.auth)
     payload = response.json()
     if self.json_format.metadata == ODataMetadataLevel.Verbose:
         payload = payload['d']['GetContextWebInformation']
     self.contextWebInformation = ContextWebInformation()
     self.contextWebInformation.from_json(payload)
Ejemplo n.º 13
0
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]")
Ejemplo n.º 14
0
 def post_raw(self, path, headers={}, data={}):
     options = RequestOptions('{}{}'.format(self.site_url, path))
     options.method = HttpMethod.Post
     options.set_headers(headers)
     if isinstance(data, abc.Mapping):
         options.data.update(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
Ejemplo n.º 15
0
    def list(self, remote_path):
        #webUri = '%s%s' % (self.path, remote_path)
        #request_url = "%s_api/web/getfilebyserverrelativeurl('%s')/files" % (self.baseurl, webUri)
        request_url = "%s_api/web/getfolderbyserverrelativeurl('%s')/files" % (
            self.baseurl, remote_path)
        print request_url
        options = RequestOptions(request_url)
        options.method = HttpMethod.Get
        options.set_header("X-HTTP-Method", "GET")
        options.set_header('accept', 'application/json;odata=verbose')
        self.request.context.authenticate_request(options)
        self.request.context.ensure_form_digest(options)
        result = requests.get(url=request_url,
                              headers=options.headers,
                              auth=options.auth)
        #result = requests.post(url=request_url, data="", headers=options.headers, auth=options.auth)
        result = result.json()
        '''if result.status_code not in (200, 201):
            print 'Error code: '
            print result.status_code
            raise Exception(result.content)
            '''
        #return True

        files = []

        for i in range(len(result['d']['results'])):
            item = result['d']['results'][i]
            files.append(item)

        print files[0]['Name']
        return files
Ejemplo n.º 16
0
    def download(self, remote_path, filename):
        request_url = "%s_api/web/getfilebyserverrelativeurl('%s')/$value" % (self.baseurl, remote_path)
        options = RequestOptions(request_url)
        options.method = HttpMethod.Get
        options.set_header("X-HTTP-Method", "GET")
        options.set_header('accept', 'application/json;odata=verbose')
        self.request.context.authenticate_request(options)
        self.request.context.ensure_form_digest(options)
        retry = 5
        while retry:
            with requests.get(url=request_url, headers=options.headers, auth=options.auth, stream=True, timeout=120) as r:
                if r.status_code not in (200, 201):
                    error = self.parse_error(r)
                    if 'timed out' in error or '2130575252' in error:
                        time.sleep(2)
                        self.login()
                        retry -= 1
                        continue
                    raise Exception(error)

                with open(filename, 'wb') as file:
                    for chunk in r.iter_content(chunk_size=8192):
                        if chunk:
                            file.write(chunk)
                retry = 0

        return filename
Ejemplo n.º 17
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')
Ejemplo n.º 18
0
def GetAllData(auth_creds, request, uri):
    MSP_ROOT_URL = auth_creds[0]
    MSP_USERNAME = auth_creds[1]
    MSP_PASS = auth_creds[2]
    dList = []
    skip = 0
    options = RequestOptions(MSP_ROOT_URL + uri + "?$skip=" + str(skip))
    data = request.execute_request_direct(options)
    dList.append(data)
    dataLen = len(feedparser.parse(data.text)["entries"])

    while dataLen != 0:
        skip += dataLen
        options = RequestOptions(MSP_ROOT_URL + uri + "?$skip=" + str(skip))
        data = request.execute_request_direct(options)
        dList.append(data)
        dataLen = len(feedparser.parse(data.text)["entries"])

    return dList
Ejemplo n.º 19
0
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
Ejemplo n.º 20
0
def delete_list_item(context, list_title, item_id):
    """
    Deletes item with given id in given list
    :param context: auth context
    :param list_title: name of list
    :param item_id:
    :return: requests/response object
    """
    req = ClientRequest(context)
    options = RequestOptions(
        f"{URL}/_api/web/lists/getbyTitle('{list_title}')/items({item_id})")
    options.set_header('Accept', 'application/json; odata=nometadata')
    options.set_header('IF-MATCH', '*')
    options.set_header('X-HTTP-Method', 'DELETE')
    options.method = HttpMethod.Post
    res = req.execute_request_direct(options)
    return res
Ejemplo n.º 21
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)
    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)
            request.set_headers(self.context.json_format.build_http_headers())
            response = self.context.execute_request_direct(request)

            # process the response
            payload = self.context.pending_request.process_response(response)
            self.__next_query_url = payload["next"]
            child_client_objects = []
            # add the new objects to the collection before yielding the results
            for properties in payload["collection"]:
                child_client_object = self.create_typed_object(
                    properties, self._item_type)
                self.add_child(child_client_object)
                child_client_objects.append(child_client_object)

            for child_client_object in child_client_objects:
                yield child_client_object
Ejemplo n.º 23
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))
Ejemplo n.º 24
0
 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)
Ejemplo n.º 25
0
 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
Ejemplo n.º 26
0
 def get(self, path):
     #        request = ClientRequest(self.ctx_auth)
     options = RequestOptions('{}_api/web/{}'.format(self.site_url, path))
     options.set_header('Accept', 'application/json')
     options.set_header('Content-Type', 'application/json')
     data = self.request.execute_request_direct(options)
     if data.status_code == 404:
         raise ValueError('Site does not exist')
     s = json.loads(data.content)
     return s
Ejemplo n.º 27
0
 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
Ejemplo n.º 28
0
def FetchMSPAvailableFields(auth_creds):
    MSP_ROOT_URL = auth_creds[0]
    MSP_USERNAME = auth_creds[1]
    MSP_PASS = auth_creds[2]
    ctx_auth = AuthenticationContext(MSP_ROOT_URL)
    if ctx_auth.acquire_token_for_user(MSP_USERNAME, MSP_PASS):
        request = ClientRequest(ctx_auth)
        options = RequestOptions(MSP_ROOT_URL + "/sites/pwa/_api/projectdata")
        data = request.execute_request_direct(options)
        root = ET.fromstring(data.content)
        l = set()
        for elem in root.iter():
            if elem.text:
                if not (elem.text == "None" or elem.text == "Default"):
                    l.add(elem.text)
    return l
 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
Ejemplo n.º 30
0
 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)