|
1 | 1 | from datetime import datetime |
2 | | -from typing import Annotated, Any |
| 2 | +from typing import Any |
3 | 3 | from uuid import NAMESPACE_DNS, UUID, uuid5 |
4 | 4 |
|
5 | | -from pydantic import AliasChoices, PlainSerializer, PlainValidator, ValidationInfo, model_validator |
| 5 | +from pydantic import AliasChoices, ValidationInfo, model_validator |
6 | 6 | from sqlalchemy.dialects import postgresql |
7 | | -from sqlalchemy.ext.mutable import MutableDict |
| 7 | +from sqlalchemy.ext.mutable import MutableDict, MutableList |
8 | 8 | from sqlalchemy.types import PickleType |
9 | | -from sqlmodel import Column, Enum, Field, SQLModel, String |
| 9 | +from sqlmodel import Column, Enum, Field, MetaData, SQLModel, String |
10 | 10 |
|
11 | 11 | from ..common.enums import ManifestKind, StatusEnum |
| 12 | +from ..common.types import KindField, StatusField |
12 | 13 | from ..config import config |
13 | 14 |
|
14 | 15 | _default_campaign_namespace = uuid5(namespace=NAMESPACE_DNS, name="io.lsst.cmservice") |
15 | 16 | """Default UUID5 namespace for campaigns""" |
16 | 17 |
|
| 18 | +metadata: MetaData = MetaData(schema=config.db.table_schema) |
| 19 | +"""SQLModel metadata for table models""" |
| 20 | + |
17 | 21 |
|
18 | 22 | def jsonb_column(name: str, aliases: list[str] | None = None) -> Any: |
19 | 23 | """Constructor for a Field based on a JSONB database column. |
@@ -47,34 +51,10 @@ def jsonb_column(name: str, aliases: list[str] | None = None) -> Any: |
47 | 51 | # 3. the model of the manifest when updating an object |
48 | 52 | # 4. a response model for APIs related to the object |
49 | 53 |
|
50 | | -EnumSerializer = PlainSerializer( |
51 | | - lambda x: x.name, |
52 | | - return_type="str", |
53 | | - when_used="always", |
54 | | -) |
55 | | -"""A serializer for enums that produces its name, not the value.""" |
56 | | - |
57 | | - |
58 | | -StatusEnumValidator = PlainValidator(lambda x: StatusEnum[x] if isinstance(x, str) else StatusEnum(x)) |
59 | | -"""A validator for the StatusEnum that can parse the enum from either a name |
60 | | -or a value. |
61 | | -""" |
62 | | - |
63 | | - |
64 | | -ManifestKindEnumValidator = PlainValidator( |
65 | | - lambda x: ManifestKind[x] if isinstance(x, str) else ManifestKind(x) |
66 | | -) |
67 | | -"""A validator for the ManifestKindEnum that can parse the enum from a name |
68 | | -or a value. |
69 | | -""" |
70 | | - |
71 | | - |
72 | | -type StatusField = Annotated[StatusEnum, StatusEnumValidator, EnumSerializer] |
73 | | -type KindField = Annotated[ManifestKind, ManifestKindEnumValidator, EnumSerializer] |
74 | | - |
75 | 54 |
|
76 | 55 | class BaseSQLModel(SQLModel): |
77 | 56 | __table_args__ = {"schema": config.db.table_schema} |
| 57 | + metadata = metadata |
78 | 58 |
|
79 | 59 |
|
80 | 60 | class CampaignBase(BaseSQLModel): |
@@ -116,10 +96,10 @@ class Campaign(CampaignModel, table=True): |
116 | 96 |
|
117 | 97 | __tablename__: str = "campaigns_v2" # type: ignore[misc] |
118 | 98 |
|
119 | | - machine: UUID | None |
| 99 | + machine: UUID | None = None |
120 | 100 |
|
121 | 101 |
|
122 | | -class CampaignUpdate(SQLModel): |
| 102 | +class CampaignUpdate(BaseSQLModel): |
123 | 103 | """Model representing updatable fields for a PATCH operation on a Campaign |
124 | 104 | using RFC7396. |
125 | 105 | """ |
@@ -215,6 +195,12 @@ class MachineBase(BaseSQLModel): |
215 | 195 | state: Any | None = Field(sa_column=Column("state", PickleType)) |
216 | 196 |
|
217 | 197 |
|
| 198 | +class Machine(MachineBase, table=True): |
| 199 | + """machines_v2 db table.""" |
| 200 | + |
| 201 | + __tablename__: str = "machiness_v2" # type: ignore[misc] |
| 202 | + |
| 203 | + |
218 | 204 | class ManifestBase(BaseSQLModel): |
219 | 205 | """manifests_v2 db table""" |
220 | 206 |
|
@@ -252,7 +238,7 @@ class Manifest(ManifestBase, table=True): |
252 | 238 | __tablename__: str = "manifests_v2" # type: ignore[misc] |
253 | 239 |
|
254 | 240 |
|
255 | | -class Task(SQLModel, table=True): |
| 241 | +class Task(BaseSQLModel, table=True): |
256 | 242 | """tasks_v2 db table""" |
257 | 243 |
|
258 | 244 | __tablename__: str = "tasks_v2" # type: ignore[misc] |
|
0 commit comments