feat: FileやFolderモデルにapiプロパティを追加

pull/69/head
yupix 1 year ago
parent 12d8cb94a2
commit f7eee766b3
No known key found for this signature in database
GPG Key ID: 2FF705F5C56D9C06

@ -8,6 +8,7 @@ from mipac.http import HTTPClient, Route
from mipac.models.drive import File, Folder
from mipac.types.drive import IDriveFile
from mipac.utils.format import bool_to_string, remove_dict_empty
from mipac.utils.util import deprecated
if TYPE_CHECKING:
from mipac.manager.client import ClientManager
@ -15,37 +16,43 @@ if TYPE_CHECKING:
__all__ = ('DriveActions', 'FileActions', 'FolderActions')
class FileActions(AbstractAction):
class ClientFileActions(AbstractAction):
def __init__(
self, file_id: str | None = None, *, session: HTTPClient, client: ClientManager
self,
file_id: str | None = None,
folder_id: str | None = None,
*,
session: HTTPClient,
client: ClientManager
) -> None:
self.__session: HTTPClient = session
self.__client: ClientManager = client
self.__file_id = file_id
self._session: HTTPClient = session
self._client: ClientManager = client
self._file_id = file_id
self._folder_id = folder_id
async def show_file(self, file_id: str | None = None, url: str | None = None) -> File:
async def remove(self, file_id: str | None = None) -> bool:
"""
ファイルの情報を取得します
指定したIDのファイルを削除します
Parameters
----------
file_id : str | None, default=None
ファイルのID
url : str | None, default=None
ファイルのURL
削除するファイルのID
Returns
-------
File
ファイルの情報
bool
削除に成功したかどうか
"""
data = remove_dict_empty({'fileId': file_id, 'url': url})
res: IDriveFile = await self.__session.request(
Route('POST', '/api/admin/drive/show-file'), json=data, auth=True, lower=True,
file_id = file_id or self._file_id
return bool(
await self._session.request(
Route('POST', '/api/drive/files/delete'), json={'fileId': file_id}, auth=True,
)
)
return File(res, client=self.__client)
@deprecated
async def remove_file(self, file_id: str | None = None) -> bool:
"""
指定したIDのファイルを削除します
@ -61,13 +68,48 @@ class FileActions(AbstractAction):
削除に成功したかどうか
"""
file_id = file_id or self.__file_id
file_id = file_id or self._file_id
return bool(
await self.__session.request(
await self._session.request(
Route('POST', '/api/drive/files/delete'), json={'fileId': file_id}, auth=True,
)
)
class FileActions(ClientFileActions):
def __init__(
self,
file_id: str | None = None,
folder_id: str | None = None,
*,
session: HTTPClient,
client: ClientManager
) -> None:
super().__init__(file_id=file_id, folder_id=folder_id, session=session, client=client)
async def show_file(self, file_id: str | None = None, url: str | None = None) -> File:
"""
ファイルの情報を取得します
Parameters
----------
file_id : str | None, default=None
ファイルのID
url : str | None, default=None
ファイルのURL
Returns
-------
File
ファイルの情報
"""
data = remove_dict_empty({'fileId': file_id, 'url': url})
res: IDriveFile = await self._session.request(
Route('POST', '/api/admin/drive/show-file'), json=data, auth=True, lower=True,
)
return File(res, client=self._client)
async def get_files(
self,
limit: int = 10,
@ -95,6 +137,8 @@ class FileActions(AbstractAction):
if limit > 100:
raise ParameterError('limit must be less than 100')
folder_id = self._folder_id or folder_id
data = {
'limit': limit,
'sinceId': since_id,
@ -102,10 +146,10 @@ class FileActions(AbstractAction):
'folderId': folder_id,
'Type': file_type,
}
res: list[IDriveFile] = await self.__session.request(
res: list[IDriveFile] = await self._session.request(
Route('POST', '/api/drive/files'), json=data, auth=True, lower=True
)
return [File(i, client=self.__client) for i in res]
return [File(i, client=self._client) for i in res]
async def upload_file(
self,
@ -140,6 +184,8 @@ class FileActions(AbstractAction):
アップロードしたファイルの情報
"""
file_byte = open(file, 'rb') if file else None
folder_id = self._folder_id or folder_id
data = {
'file': file_byte,
'name': file_name,
@ -148,19 +194,19 @@ class FileActions(AbstractAction):
'isSensitive': bool_to_string(is_sensitive),
'force': bool_to_string(force),
}
res: IDriveFile = await self.__session.request(
res: IDriveFile = await self._session.request(
Route('POST', '/api/drive/files/create'), data=data, auth=True, lower=True,
)
return File(res, client=self.__client)
return File(res, client=self._client)
class FolderActions(AbstractAction):
class ClientFolderActions(AbstractAction):
def __init__(
self, folder_id: str | None = None, *, session: HTTPClient, client: ClientManager
):
self.__folder_id = folder_id
self.__session: HTTPClient = session
self.__client: ClientManager = client
self._folder_id = folder_id
self._session: HTTPClient = session
self._client: ClientManager = client
async def create(self, name: str, parent_id: str | None = None) -> bool:
"""
@ -178,10 +224,10 @@ class FolderActions(AbstractAction):
bool
作成に成功したか否か
"""
parent_id = parent_id or self.__folder_id
parent_id = parent_id or self._folder_id
data = {'name': name, 'parent_id': parent_id}
res: bool = await self.__session.request(
res: bool = await self._session.request(
Route('POST', '/api/drive/folders/create'), json=data, lower=True, auth=True,
)
return bool(res)
@ -198,9 +244,9 @@ class FolderActions(AbstractAction):
bool
削除に成功したか否か
"""
folder_id = folder_id or self.__folder_id
folder_id = folder_id or self._folder_id
data = {'folderId': folder_id}
res: bool = await self.__session.request(
res: bool = await self._session.request(
Route('POST', '/api/drive/folders/delete'), json=data, lower=True, auth=True,
)
return bool(res)
@ -232,7 +278,7 @@ class FolderActions(AbstractAction):
if limit > 100:
raise ParameterError('limit must be less than 100')
folder_id = folder_id or self.__folder_id
folder_id = folder_id or self._folder_id
data = {
'limit': limit,
'sinceId': since_id,
@ -240,16 +286,23 @@ class FolderActions(AbstractAction):
'folderId': folder_id,
'Type': file_type,
}
res: list[IDriveFile] = await self.__session.request(
res: list[IDriveFile] = await self._session.request(
Route('POST', '/api/drive/files'), json=data, auth=True, lower=True
)
return [File(i, client=self.__client) for i in res]
return [File(i, client=self._client) for i in res]
class FolderActions(ClientFolderActions):
def __init__(
self, folder_id: str | None = None, *, session: HTTPClient, client: ClientManager
):
super().__init__(folder_id=folder_id, session=session, client=client)
class DriveActions(AbstractAction):
def __init__(self, session: HTTPClient, client: ClientManager):
self.__session: HTTPClient = session
self.__client: ClientManager = client
self._session: HTTPClient = session
self._client: ClientManager = client
async def get_folders(
self,
@ -279,7 +332,7 @@ class DriveActions(AbstractAction):
'untilId': until_id,
'folderId': folder_id,
}
data = await self.__session.request(
data = await self._session.request(
Route('POST', '/api/drive/folders'), json=data, lower=True, auth=True,
)
return [Folder(i, client=self.__client) for i in data]
return [Folder(i, client=self._client) for i in data]

@ -3,7 +3,13 @@ from __future__ import annotations
from typing import TYPE_CHECKING
from mipac.abstract.manager import AbstractManager
from mipac.actions.drive import DriveActions, FileActions, FolderActions
from mipac.actions.drive import (
ClientFileActions,
ClientFolderActions,
DriveActions,
FileActions,
FolderActions,
)
from mipac.http import HTTPClient
if TYPE_CHECKING:
@ -12,11 +18,43 @@ if TYPE_CHECKING:
__all__ = ['FolderManager', 'FileManager', 'DriveManager']
class ClientFileManager(AbstractManager):
def __init__(
self,
file_id: str | None = None,
folder_id: str | None = None,
*,
session: HTTPClient,
client: ClientManager
):
self.__session: HTTPClient = session
self.__client: ClientManager = client
self.__file_id: str | None = file_id
self.__folder_id: str | None = folder_id
@property
def action(self) -> ClientFileActions:
return ClientFileActions(
file_id=self.__file_id,
folder_id=self.__folder_id,
client=self.__client,
session=self.__session,
)
class FileManager(AbstractManager):
def __init__(self, file_id: str | None = None, *, session: HTTPClient, client: ClientManager):
def __init__(
self,
file_id: str | None = None,
folder_id: str | None = None,
*,
session: HTTPClient,
client: ClientManager
):
self.__session: HTTPClient = session
self.__client: ClientManager = client
self.__file_id = file_id
self.__folder_id: str | None = folder_id
@property
def action(self) -> FileActions:
@ -28,7 +66,36 @@ class FileManager(AbstractManager):
FileActions
ファイルに対するアクション
"""
return FileActions(file_id=self.__file_id, client=self.__client, session=self.__session,)
return FileActions(
file_id=self.__file_id,
folder_id=self.__folder_id,
client=self.__client,
session=self.__session,
)
class ClientFolderManager(AbstractManager):
def __init__(
self, folder_id: str | None = None, *, session: HTTPClient, client: ClientManager
):
self.__folder_id = folder_id
self.__session: HTTPClient = session
self.__client: ClientManager = client
self.file: FileManager = FileManager(folder_id=folder_id, session=session, client=client)
@property
def action(self) -> ClientFolderActions:
"""
フォルダーの操作を行うインスタンスを返します
Returns
-------
FolderActions
フォルダーに対するアクション
"""
return ClientFolderActions(
folder_id=self.__folder_id, session=self.__session, client=self.__client,
)
class FolderManager(AbstractManager):
@ -38,7 +105,7 @@ class FolderManager(AbstractManager):
self.__folder_id = folder_id
self.__session: HTTPClient = session
self.__client: ClientManager = client
self.file: FileManager = FileManager(session=session, client=client)
self.file: FileManager = FileManager(folder_id=folder_id, session=session, client=client)
@property
def action(self) -> FolderActions:
@ -55,7 +122,12 @@ class FolderManager(AbstractManager):
)
def _get_file_instance(self, file_id: str) -> FileManager:
return FileManager(file_id=file_id, session=self.__session, client=self.__client)
return FileManager(
file_id=file_id,
folder_id=self.__folder_id,
session=self.__session,
client=self.__client,
)
class DriveManager(AbstractManager):
@ -79,3 +151,15 @@ class DriveManager(AbstractManager):
def _get_folder_instance(self, folder_id: str) -> FolderManager:
return FolderManager(session=self.__session, client=self.__client, folder_id=folder_id)
def _get_client_folder_instance(self, folder_id: str) -> ClientFolderManager:
return ClientFolderManager(
folder_id=folder_id, session=self.__session, client=self.__client
)
def _get_client_file_instance(
self, file_id: str, folder_id: str | None = None
) -> ClientFileManager:
return ClientFileManager(
file_id=file_id, folder_id=folder_id, session=self.__session, client=self.__client
)

@ -2,9 +2,11 @@ from __future__ import annotations
from typing import TYPE_CHECKING, Any
if TYPE_CHECKING:
from mipac.manager.client import ClientManager
from mipac.types import FolderPayload, IDriveFile, IFileProperties
from mipac.manager.drive import ClientFileManager, ClientFolderManager
__all__ = ['FileProperties', 'File', 'Folder']
@ -64,6 +66,10 @@ class Folder:
def parent(self) -> dict[str, Any]:
return self.__folder['parent']
@property
def api(self) -> ClientFolderManager:
return self.__client.drive._get_client_folder_instance(folder_id=self.id)
class File:
def __init__(self, file: IDriveFile, *, client: ClientManager):
@ -113,3 +119,7 @@ class File:
@property
def properties(self) -> FileProperties:
return FileProperties(self.__file['properties'])
@property
def api(self) -> ClientFileManager:
return self.__client.drive._get_client_file_instance(file_id=self.id)

Loading…
Cancel
Save