mdrs-client-python/mdrsclient/api/file.py

108 lines
4.3 KiB
Python
Raw Normal View History

from typing import Any, Final
2023-05-01 20:00:32 +09:00
from pydantic import TypeAdapter
2023-05-01 20:00:32 +09:00
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 + "/"
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 TypeAdapter(File).validate_python(response.json())
2023-05-01 20:00:32 +09:00
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
token_check(self.connection)
data: dict[str, str | int] = {"folder_id": folder_id}
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.post(url, data=data, files={"file": fp})
2023-05-01 20:00:32 +09:00
self._raise_response_error(response)
ret = TypeAdapter(FileCreateResponse).validate_python(response.json())
2023-05-01 20:00:32 +09:00
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 + "/"
token_check(self.connection)
2023-05-01 20:00:32 +09:00
if path is not None:
# 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:
# update metadata
data: dict[str, str | int] = {"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 + "/"
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-07-20 11:43:07 +09:00
def move(self, file: File, folder_id: str, name: 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-20 11:43:07 +09:00
data: dict[str, str | int] = {"folder": folder_id, "name": name}
token_check(self.connection)
response = self.connection.post(url, data=data)
self._raise_response_error(response)
return True
def copy(self, file: File, folder_id: str, name: str) -> bool:
# print(self.__class__.__name__ + "::" + sys._getframe().f_code.co_name)
url = self.ENTRYPOINT + file.id + "/copy/"
data: dict[str, str | int] = {"folder": folder_id, "name": name}
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[str, Any]:
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/"
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)
url = "v2/" + file.download_url
2023-05-10 14:46:08 +09:00
response = self.connection.get(url, stream=True)
self._raise_response_error(response)
2023-05-09 14:38:13 +09:00
try:
with open(path, "wb") as f:
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