2023-05-01 20:00:32 +09:00
|
|
|
from typing import Final
|
|
|
|
|
|
|
|
from pydantic import parse_obj_as
|
|
|
|
from pydantic.dataclasses import dataclass
|
|
|
|
|
|
|
|
from mdrsclient.api.base import BaseApi
|
|
|
|
from mdrsclient.api.utils import token_check
|
|
|
|
from mdrsclient.exceptions import UnexpectedException
|
|
|
|
from mdrsclient.models import File
|
|
|
|
|
|
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
|
|
class FileCreateResponse:
|
|
|
|
id: str
|
|
|
|
|
|
|
|
|
|
|
|
class FileApi(BaseApi):
|
|
|
|
ENTRYPOINT: Final[str] = "v2/file/"
|
|
|
|
|
|
|
|
def retrieve(self, id: str) -> File:
|
2023-05-09 19:45:03 +09:00
|
|
|
# print(self.__class__.__name__ + "::" + sys._getframe().f_code.co_name)
|
2023-05-01 20:00:32 +09:00
|
|
|
url = self.ENTRYPOINT + id + "/"
|
2023-05-09 13:08:50 +09:00
|
|
|
token_check(self.connection)
|
2023-05-10 14:46:08 +09:00
|
|
|
response = self.connection.get(url)
|
2023-05-01 20:00:32 +09:00
|
|
|
self._raise_response_error(response)
|
|
|
|
return parse_obj_as(File, response.json())
|
|
|
|
|
|
|
|
def create(self, folder_id: str, path: str) -> str:
|
2023-05-09 19:45:03 +09:00
|
|
|
# print(self.__class__.__name__ + "::" + sys._getframe().f_code.co_name)
|
2023-05-01 20:00:32 +09:00
|
|
|
url = self.ENTRYPOINT
|
2023-05-09 13:08:50 +09:00
|
|
|
token_check(self.connection)
|
2023-05-01 20:00:32 +09:00
|
|
|
data = {"folder_id": folder_id}
|
|
|
|
try:
|
|
|
|
with open(path, mode="rb") as fp:
|
2023-05-10 14:46:08 +09:00
|
|
|
response = self.connection.post(url, data=data, files={"file": fp})
|
2023-05-01 20:00:32 +09:00
|
|
|
self._raise_response_error(response)
|
|
|
|
ret = parse_obj_as(FileCreateResponse, response.json())
|
|
|
|
except OSError:
|
|
|
|
raise UnexpectedException(f"Could not open `{path}` file.")
|
|
|
|
return ret.id
|
|
|
|
|
|
|
|
def update(self, file: File, path: str | None) -> bool:
|
2023-05-09 19:45:03 +09:00
|
|
|
# print(self.__class__.__name__ + "::" + sys._getframe().f_code.co_name)
|
2023-05-01 20:00:32 +09:00
|
|
|
url = self.ENTRYPOINT + file.id + "/"
|
2023-05-09 13:08:50 +09:00
|
|
|
token_check(self.connection)
|
2023-05-01 20:00:32 +09:00
|
|
|
if path is not None:
|
2023-05-09 18:38:58 +09:00
|
|
|
# update file body
|
2023-05-01 20:00:32 +09:00
|
|
|
try:
|
|
|
|
with open(path, mode="rb") as fp:
|
2023-05-10 14:46:08 +09:00
|
|
|
response = self.connection.put(url, files={"file": fp})
|
2023-05-01 20:00:32 +09:00
|
|
|
except OSError:
|
|
|
|
raise UnexpectedException(f"Could not open `{path}` file.")
|
|
|
|
else:
|
2023-05-09 18:38:58 +09:00
|
|
|
# update metadata
|
2023-05-01 20:00:32 +09:00
|
|
|
data = {"name": file.name, "description": file.description}
|
2023-05-10 14:46:08 +09:00
|
|
|
response = self.connection.put(url, data=data)
|
2023-05-01 20:00:32 +09:00
|
|
|
self._raise_response_error(response)
|
|
|
|
return True
|
|
|
|
|
|
|
|
def destroy(self, file: File) -> bool:
|
2023-05-09 19:45:03 +09:00
|
|
|
# print(self.__class__.__name__ + "::" + sys._getframe().f_code.co_name)
|
2023-05-01 20:00:32 +09:00
|
|
|
url = self.ENTRYPOINT + file.id + "/"
|
2023-05-09 13:08:50 +09:00
|
|
|
token_check(self.connection)
|
2023-05-10 14:46:08 +09:00
|
|
|
response = self.connection.delete(url)
|
2023-05-01 20:00:32 +09:00
|
|
|
self._raise_response_error(response)
|
|
|
|
return True
|
|
|
|
|
2023-05-09 18:38:58 +09:00
|
|
|
def move(self, file: File, folder_id: str) -> bool:
|
2023-05-09 19:45:03 +09:00
|
|
|
# print(self.__class__.__name__ + "::" + sys._getframe().f_code.co_name)
|
2023-05-01 20:00:32 +09:00
|
|
|
url = self.ENTRYPOINT + file.id + "/move/"
|
2023-07-19 13:46:23 +09:00
|
|
|
data = {"folder": folder_id, "name": file.name}
|
2023-05-09 13:08:50 +09:00
|
|
|
token_check(self.connection)
|
2023-05-10 14:46:08 +09:00
|
|
|
response = self.connection.post(url, data=data)
|
2023-05-01 20:00:32 +09:00
|
|
|
self._raise_response_error(response)
|
|
|
|
return True
|
|
|
|
|
|
|
|
def metadata(self, file: File) -> dict:
|
2023-05-09 19:45:03 +09:00
|
|
|
# print(self.__class__.__name__ + "::" + sys._getframe().f_code.co_name)
|
2023-05-01 20:00:32 +09:00
|
|
|
url = self.ENTRYPOINT + file.id + "/metadata/"
|
2023-05-09 13:08:50 +09:00
|
|
|
token_check(self.connection)
|
2023-05-10 14:46:08 +09:00
|
|
|
response = self.connection.get(url)
|
2023-05-01 20:00:32 +09:00
|
|
|
self._raise_response_error(response)
|
|
|
|
return response.json()
|
2023-05-09 14:38:13 +09:00
|
|
|
|
|
|
|
def download(self, file: File, path: str) -> bool:
|
2023-05-09 19:45:03 +09:00
|
|
|
# print(self.__class__.__name__ + "::" + sys._getframe().f_code.co_name)
|
2023-05-09 18:38:58 +09:00
|
|
|
url = "v2/" + file.download_url
|
2023-05-10 14:46:08 +09:00
|
|
|
response = self.connection.get(url, stream=True)
|
2023-05-09 18:38:58 +09:00
|
|
|
self._raise_response_error(response)
|
2023-05-09 14:38:13 +09:00
|
|
|
try:
|
|
|
|
with open(path, "wb") as f:
|
2023-05-09 18:38:58 +09:00
|
|
|
for chunk in response.iter_content(chunk_size=4096):
|
2023-05-09 14:38:13 +09:00
|
|
|
if chunk:
|
|
|
|
f.write(chunk)
|
|
|
|
f.flush()
|
|
|
|
except PermissionError:
|
|
|
|
print(f"Cannot create file `{path}`: Permission denied.")
|
|
|
|
return True
|