diff --git a/cloudfile/__init__.py b/cloudfile/__init__.py index 06b20c9..d463516 100644 --- a/cloudfile/__init__.py +++ b/cloudfile/__init__.py @@ -1,3 +1,4 @@ from .save import save -from .restore import restore +from .restore import restore, download from .add_file import add_file +from .google_drive import upload_file, get_service diff --git a/cloudfile/add_file.py b/cloudfile/add_file.py index 74f0004..355f191 100644 --- a/cloudfile/add_file.py +++ b/cloudfile/add_file.py @@ -1,10 +1,11 @@ import os from .cloudfile import CloudFile +from .google_drive import upload_file def add_file(file: str, cloudf: CloudFile = None, hard=False): if cloudf is None: cloudf = CloudFile() assert os.path.isfile(file) - + return cloudf.upload_file(file) diff --git a/cloudfile/cloudfile.py b/cloudfile/cloudfile.py index f285d21..3e54ac3 100644 --- a/cloudfile/cloudfile.py +++ b/cloudfile/cloudfile.py @@ -1,7 +1,7 @@ import os import json -from .google_drive import get_service +from .google_drive import get_service, upload_file class CloudFile(object): @@ -17,7 +17,7 @@ def __init__(self, clouldfile="cloudfile.json", unit_test_link_dct=None): def get_service(self): if self.service is None: self.service = get_service() - return self.service() + return self.service def save_json(self): json.dump(self.dct, open(self._cloudfile, "w")) @@ -36,3 +36,9 @@ def __getitem__(self, item): def __setitem__(self, key, item): self.dct[key] = item + def upload_file(self, file): + link = upload_file(self.get_service(), file) + self.dct[file] = link + self.save_json() + return link + diff --git a/cloudfile/google_drive.py b/cloudfile/google_drive.py index 75c3629..0d1587e 100644 --- a/cloudfile/google_drive.py +++ b/cloudfile/google_drive.py @@ -1,11 +1,12 @@ import pickle import os.path +from googleapiclient.http import MediaFileUpload from googleapiclient.discovery import build from google_auth_oauthlib.flow import InstalledAppFlow from google.auth.transport.requests import Request # If modifying these scopes, delete the file token.pickle. -SCOPES = ["https://www.googleapis.com/auth/drive.appdata"] +SCOPES = ["https://www.googleapis.com/auth/drive"] def get_service(): @@ -37,15 +38,44 @@ def get_service(): return build("drive", "v3", credentials=creds) # service -def upload_file(drive_service): - file_metadata = {"name": "photo.jpg"} - media = MediaFileUpload("files/photo.jpg", mimetype="image/jpeg") - file = ( +def upload_file(drive_service, file): + # TODO add zip functionality + file_metadata = {"name": "cloudfile_" + file.split(os.sep)[-1]} # TODO parent + media = MediaFileUpload(file, mimetype="application/plain") + file = drive_service.files().create(body=file_metadata, media_body=media).execute() + file_id = file.get("id") + add_link_permision(drive_service, file_id) + url = ( drive_service.files() - .create(body=file_metadata, media_body=media, fields="id") - .execute() + .get(fileId=file_id, fields="webContentLink") + .execute()["webContentLink"] + ) + print(f"File ID: {file_id}, link:{url}") + + return url + + +def add_link_permision(drive_service, file_id): + def callback(request_id, response, exception): + if exception: + # Handle error + print(exception) + else: + print(f"Permission Id: {response.get('id')}") + + batch = drive_service.new_batch_http_request(callback=callback) + user_permission = { + "type": "anyone", + "role": "reader", + "Value": "", + "WithLink": True, + } + batch.add( + drive_service.permissions().create( + fileId=file_id, body=user_permission, fields="id" + ) ) - print("File ID: %s".format(file.get("id"))) + batch.execute() """ diff --git a/tests/add_file.py b/tests/add_file.py deleted file mode 100644 index a97d205..0000000 --- a/tests/add_file.py +++ /dev/null @@ -1,8 +0,0 @@ -import cloudfile - - -def test_add_file(): - filename = "foo/bar_new.txt" - with open(filename, "w") as f: - f.write("hello world") - cloudfile.add_file(filename) diff --git a/tests/test_add_file.py b/tests/test_add_file.py new file mode 100644 index 0000000..f2a3aa7 --- /dev/null +++ b/tests/test_add_file.py @@ -0,0 +1,17 @@ +import os +import cloudfile +from tests.utils import del_folder + + +def test_add_file(): + if not os.path.isdir("foo"): + os.mkdir("foo") + filename = "foo/bar_new.txt" + with open(filename, "w") as f: + f.write("hello world") + url = cloudfile.add_file(filename) + os.remove(filename) + cloudfile.download(filename, url) + assert os.path.isfile(filename) + del_folder("foo") +