-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.py
57 lines (40 loc) · 1.72 KB
/
main.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
from dataclasses import dataclass
from typing import Annotated, ClassVar, Iterator
from annotated_types import SLOTS, BaseMetadata, GroupedMetadata
from fastapi import FastAPI
from pydantic import ConfigDict, Field
from pydantic_forms.core import FormPage, post_form
from pydantic_forms.types import State
from pydantic_forms.exception_handlers.fastapi import form_error_handler
from pydantic_forms.exceptions import FormException
from pydantic_forms.core import FormPage as PydanticFormsFormPage
from pydantic_forms.types import JSON
class FormPage(PydanticFormsFormPage):
meta__: ClassVar[JSON] = {"hasNext": True}
class SubmitFormPage(FormPage):
meta__: ClassVar[JSON] = {"hasNext": False}
app = FastAPI()
app.add_exception_handler(FormException, form_error_handler) # type: ignore[arg-type]
@app.get("/")
def read_root():
return {"Hello": "World"}
@dataclass(frozen=True, **SLOTS)
class ExtraData(GroupedMetadata):
props: dict
def __iter__(self) -> Iterator[BaseMetadata]:
yield Field(json_schema_extra=self.props)
@app.post("/form")
async def form(form_data: list[dict]=[]):
def form_generator(state: State):
class TestForm(FormPage):
model_config = ConfigDict(title="Form Title")
name: Annotated[str, Field(min_length=3)]
# input: Annotated[str, ExtraData(props={"prop1": "val", "prop2": "val"})]
form_data_1 = yield TestForm
class TestForm2(SubmitFormPage):
model_config = ConfigDict(title="Form 2 Title")
name_2: str | None = None
form_data_2 = yield TestForm2
return form_data_1.model_dump() | form_data_2.model_dump()
data = post_form(form_generator, state={}, user_inputs=form_data)
return data