diff --git a/pocketbase/client.py b/pocketbase/client.py index 3cf3347..c0c24f1 100644 --- a/pocketbase/client.py +++ b/pocketbase/client.py @@ -1,18 +1,18 @@ from __future__ import annotations +from pocketbase.services.admins import Admins +from pocketbase.stores.base_auth_store import BaseAuthStore +from pocketbase.services.settings import Settings +from pocketbase.services.users import Users +from pocketbase.services.records import Records +from pocketbase.services.realtime import Realtime +from pocketbase.services.logs import Logs +from pocketbase.services.collections import Collections +from pocketbase.models import FileUpload from typing import Any import httpx -from pocketbase.services.admins import Admins -from pocketbase.services.collections import Collections -from pocketbase.services.logs import Logs -from pocketbase.services.realtime import Realtime -from pocketbase.services.records import Records -from pocketbase.services.users import Users -from pocketbase.services.settings import Settings -from pocketbase.stores.base_auth_store import BaseAuthStore - class ClientResponseError(Exception): url: str = "" @@ -82,6 +82,21 @@ class Client: params = config.get("params", None) headers = config.get("headers", None) body = config.get("body", None) + # handle requests including files as multipart: + data = {} + files = () + for k, v in (body if isinstance(body, dict) else {}).items(): + if isinstance(v, FileUpload): + files += v.get(k) + else: + data[k] = v + if len(files) > 0: + # discard body, switch to multipart encoding + body = None + else: + # discard files+data (do not use multipart encoding) + files = None + data = None try: response = httpx.request( method=method, @@ -89,6 +104,8 @@ class Client: params=params, headers=headers, json=body, + data=data, + files=files, timeout=120, ) except Exception as e: diff --git a/pocketbase/models/__init__.py b/pocketbase/models/__init__.py index f3795e9..e647289 100644 --- a/pocketbase/models/__init__.py +++ b/pocketbase/models/__init__.py @@ -4,3 +4,4 @@ from .external_auth import ExternalAuth from .log_request import LogRequest from .record import Record from .user import User +from .file_upload import FileUpload diff --git a/pocketbase/models/file_upload.py b/pocketbase/models/file_upload.py new file mode 100644 index 0000000..3e5eda7 --- /dev/null +++ b/pocketbase/models/file_upload.py @@ -0,0 +1,13 @@ +from httpx._types import FileTypes +from typing import Sequence, Union +FileUploadTypes = Union[FileTypes, Sequence[FileTypes]] + + +class FileUpload: + def __init__(self, *args): + self.files: FileUploadTypes = args + + def get(self, key: str): + if isinstance(self.files[0], Sequence): + return tuple((key, i) for i in self.files) + return ((key, self.files),)