108 lines
3.6 KiB
Python
108 lines
3.6 KiB
Python
import requests
|
|
from django.conf import settings
|
|
import dropbox
|
|
from dropbox.exceptions import ApiError
|
|
|
|
from app_be.services.StorageServiceInterface import StorageServiceInterface
|
|
|
|
|
|
class DropboxService(StorageServiceInterface):
|
|
name = "Dropbox"
|
|
|
|
@staticmethod
|
|
def check() -> bool:
|
|
try:
|
|
dbx = dropbox.Dropbox(settings.DROPBOX_OAUTH2_ACCESS_TOKEN)
|
|
result = dbx.check_user(query=u'Hello')
|
|
if not result.result == 'Hello':
|
|
print("String does not match")
|
|
return False
|
|
except:
|
|
return False
|
|
return True
|
|
|
|
@staticmethod
|
|
def create_file(filename: str, file: bytes) -> bool:
|
|
"""Create / save (or overwrite) an file on the dropbox storage.
|
|
|
|
:param filename: filename
|
|
:param file: bytes representation of the file
|
|
:return: Whether file was successfully uploaded
|
|
"""
|
|
try:
|
|
dbx = dropbox.Dropbox(settings.DROPBOX_OAUTH2_ACCESS_TOKEN)
|
|
dbx.files_upload(file, settings.DROPBOX_IMAGE_FOLDER + filename)
|
|
except:
|
|
return False
|
|
return True
|
|
|
|
@staticmethod
|
|
def read_file(filename: str) -> bytes:
|
|
"""Read file on the dropbox storage.
|
|
|
|
:param filename: filename
|
|
:return: bytes representation of the file or None on error
|
|
"""
|
|
file_bytes: bytes
|
|
try:
|
|
dbx = dropbox.Dropbox(settings.DROPBOX_OAUTH2_ACCESS_TOKEN)
|
|
f: requests.models.Response
|
|
metadata, f = dbx.files_download(settings.DROPBOX_IMAGE_FOLDER + filename)
|
|
file_bytes = f.content
|
|
if f is not None:
|
|
f.close()
|
|
except:
|
|
print("Error downloading file from dropbox")
|
|
return file_bytes
|
|
|
|
@staticmethod
|
|
def move_file(identifier_from: str, identifier_to: str) -> bool:
|
|
"""Move/Rename a file on the dropbox storage.
|
|
|
|
:param identifier_from: Location of the file to be moved
|
|
:param identifier_to: Location the file should be moved to
|
|
:return True on success, False otherwise
|
|
"""
|
|
print("DropboxService: Trying to move/rename file with identifier {} to identifier {}".format(identifier_from,
|
|
identifier_to))
|
|
|
|
dbx = dropbox.Dropbox(settings.DROPBOX_OAUTH2_ACCESS_TOKEN)
|
|
url_from = settings.DROPBOX_IMAGE_FOLDER + identifier_from + '.jpg'
|
|
url_to = settings.DROPBOX_IMAGE_FOLDER + identifier_to + '.jpg'
|
|
|
|
try:
|
|
dbx.files_move_v2(url_from, url_to)
|
|
except ApiError:
|
|
return False
|
|
|
|
return True
|
|
|
|
@staticmethod
|
|
def delete_file(filename: str) -> bool:
|
|
"""Delete an file from the dropbox storage.
|
|
|
|
:param filename: filename of the file
|
|
:return: Whether file was successfully deleted
|
|
"""
|
|
try:
|
|
dbx = dropbox.Dropbox(settings.DROPBOX_OAUTH2_ACCESS_TOKEN)
|
|
dbx.files_delete_v2(settings.DROPBOX_IMAGE_FOLDER + filename)
|
|
except:
|
|
return False
|
|
return True
|
|
|
|
@staticmethod
|
|
def delete_all() -> bool:
|
|
"""Delete every file from the dropbox storage.
|
|
|
|
:return: Whether the storage was successfully emptied
|
|
"""
|
|
try:
|
|
dbx = dropbox.Dropbox(settings.DROPBOX_OAUTH2_ACCESS_TOKEN)
|
|
dbx.files_delete_v2(settings.DROPBOX_IMAGE_FOLDER[:-1])
|
|
dbx.files_create_folder_v2(settings.DROPBOX_IMAGE_FOLDER[:-1])
|
|
except dropbox.exceptions.ApiError as e:
|
|
print(e)
|
|
return False
|
|
return True
|