Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
240 changes: 37 additions & 203 deletions api/views/models.py
Original file line number Diff line number Diff line change
@@ -1,21 +1,16 @@
from typing import Annotated, Any, Literal
from typing import Annotated, Any

from pydantic import Field

from ayon_server.types import OPModel
from ayon_server.utils import camelize
from ayon_server.views.models import (
FViewId,
FViewLabel,
FViewOwner,
FViewScope,
FViewVisibility,
FViewWorking,
ListsSettings,
OverviewSettings,
ReviewsSettings,
TaskProgressSettings,
VersionsSettings,
ViewSettingsModel,
)

#
Expand Down Expand Up @@ -45,102 +40,24 @@ class ViewListModel(OPModel):
#


class BaseViewModel(ViewListItemModel):
settings: ViewSettingsModel
access: dict[str, Any]


class OverviewViewModel(BaseViewModel):
"""Overview view model."""

view_type: Literal["overview"] = "overview"
settings: OverviewSettings


class TaskProgressViewModel(BaseViewModel):
"""Task progress view model."""

view_type: Literal["taskProgress"] = "taskProgress"
settings: TaskProgressSettings


class ListsViewModel(BaseViewModel):
"""Lists view model."""

view_type: Literal["lists"] = "lists"
settings: ListsSettings


class ReviewsViewModel(BaseViewModel):
"""Reviews view model."""

view_type: Literal["reviews"] = "reviews"
settings: ReviewsSettings


class VersionsViewModel(BaseViewModel):
"""Versions view model."""

view_type: Literal["versions"] = "versions"
settings: VersionsSettings


class GenericViewModel(BaseViewModel):
class GenericViewModel(ViewListItemModel):
"""Reports view model."""

view_type: str
settings: dict[str, Any]
access: dict[str, Any]


#
# POST REST API models
#


class BaseViewPostModel(OPModel):
class GenericViewPostModel(OPModel):
id: FViewId
label: FViewLabel
working: FViewWorking = True
settings: ViewSettingsModel


class OverviewViewPostModel(BaseViewPostModel):
"""Overview view post model."""

view_type: Literal["overview"] = "overview"
settings: OverviewSettings


class TaskProgressViewPostModel(BaseViewPostModel):
"""Task progress view post model."""

view_type: Literal["taskProgress"] = "taskProgress"
settings: TaskProgressSettings


class ListsViewPostModel(BaseViewPostModel):
"""Lists view post model."""

view_type: Literal["lists"] = "lists"
settings: ListsSettings


class ReviewsViewPostModel(BaseViewPostModel):
"""Reviews view post model."""

view_type: Literal["reviews"] = "reviews"
settings: ReviewsSettings


class VersionsViewPostModel(BaseViewPostModel):
"""Versions view post model."""

view_type: Literal["versions"] = "versions"
settings: VersionsSettings


class GenericViewPostModel(BaseViewPostModel):
view_type: str
view_type: str | None = None
settings: dict[str, Any]


Expand All @@ -149,51 +66,13 @@ class GenericViewPostModel(BaseViewPostModel):
#


class BaseViewPatchModel(OPModel):
class GenericViewPatchModel(OPModel):
"""Reports view post model."""

label: FViewLabel | None = None
owner: FViewOwner | None = None
settings: ViewSettingsModel | None = None


class OverviewViewPatchModel(BaseViewPatchModel):
"""Overview view post model."""

view_type: Literal["overview"] = "overview"
settings: OverviewSettings | None = None


class TaskProgressViewPatchModel(BaseViewPatchModel):
"""Task progress view post model."""

view_type: Literal["taskProgress"] = "taskProgress"
settings: TaskProgressSettings | None = None


class ListsViewPatchModel(BaseViewPatchModel):
"""Lists view post model."""

view_type: Literal["lists"] = "lists"
settings: ListsSettings | None = None


class ReviewsViewPatchModel(BaseViewPatchModel):
"""Reviews view post model."""

view_type: Literal["reviews"] = "reviews"
settings: ReviewsSettings | None = None


class VersionsViewPatchModel(BaseViewPatchModel):
"""Versions view post model."""

view_type: Literal["versions"] = "versions"
settings: VersionsSettings | None = None


class GenericViewPatchModel(BaseViewPatchModel):
"""Reports view post model."""

view_type: str
view_type: str | None = None
settings: dict[str, Any] | None = None


Expand All @@ -203,88 +82,42 @@ class GenericViewPatchModel(BaseViewPatchModel):


ViewModel = Annotated[
OverviewViewModel
| TaskProgressViewModel
| ListsViewModel
| ReviewsViewModel
| VersionsViewModel
| GenericViewModel,
GenericViewModel,
Field(
discriminator="view_type",
title="View model",
),
]

ViewPostModel = Annotated[
OverviewViewPostModel
| TaskProgressViewPostModel
| ListsViewPostModel
| ReviewsViewPostModel
| VersionsViewPostModel
| GenericViewPostModel,
Field(
discriminator="view_type",
title="View post model",
),
]
ViewPostModel = GenericViewPostModel

ViewPatchModel = Annotated[
OverviewViewPatchModel
| TaskProgressViewPatchModel
| ListsViewPatchModel
| ReviewsViewPatchModel
| VersionsViewPatchModel
| GenericViewPatchModel,
Field(
discriminator="view_type",
title="View model",
),
]
ViewPatchModel = GenericViewPatchModel
Comment thread
github-code-quality[bot] marked this conversation as resolved.
Fixed


def construct_view_model(**data: Any) -> ViewModel:
if data.get("view_type") == "overview":
return OverviewViewModel(**data)
elif data.get("view_type") == "taskProgress":
return TaskProgressViewModel(**data)
elif data.get("view_type") == "lists":
return ListsViewModel(**data)
elif data.get("view_type") == "reviews":
return ReviewsViewModel(**data)
elif data.get("view_type") == "versions":
return VersionsViewModel(**data)
else:
return GenericViewModel(**data)


def get_post_model_class(view_type: str) -> type[ViewPostModel]:
if view_type == "overview":
return OverviewViewPostModel
elif view_type == "taskProgress":
return TaskProgressViewPostModel
elif view_type == "lists":
return ListsViewPostModel
elif view_type == "reviews":
return ReviewsViewPostModel
elif view_type == "versions":
return VersionsViewPostModel
else:
return GenericViewPostModel


def get_patch_model_class(view_type: str) -> type[ViewPatchModel]:
if view_type == "overview":
return OverviewViewPatchModel
elif view_type == "taskProgress":
return TaskProgressViewPatchModel
elif view_type == "lists":
return ListsViewPatchModel
elif view_type == "reviews":
return ReviewsViewPatchModel
elif view_type == "versions":
return VersionsViewPatchModel
else:
return GenericViewPatchModel
"""Temporary patching of stored views in typed format.

Introduced by PR #974 TODO remove in next release.
"""
view_type = data["view_type"]
settings = data["settings"]
if view_type in ["overview", "taskProgress", "lists", "reviews", "versions"]:
patched_settings = {}
for key, val in settings.items():
if "_" in key:
patched_settings[camelize(key)] = val
else:
patched_settings[key] = val
data["settings"] = patched_settings
return GenericViewModel(**data)


def get_post_model_class() -> type[ViewPostModel]:
return GenericViewPostModel


def get_patch_model_class() -> type[ViewPatchModel]:
return GenericViewPatchModel


def row_to_list_item(row: dict[str, Any], access_level: int) -> ViewListItemModel:
Expand All @@ -303,6 +136,7 @@ def row_to_list_item(row: dict[str, Any], access_level: int) -> ViewListItemMode

def row_to_model(row: dict[str, Any], access_level: int) -> ViewModel:
"""Convert a database row to a ViewModel."""
print(f"row: {row}")
return construct_view_model(
id=row["id"],
view_type=row["view_type"],
Expand Down
10 changes: 5 additions & 5 deletions api/views/views.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import uuid
from typing import Annotated

from fastapi import Path, Query, Request
from fastapi import Body, Path, Query, Request

from ayon_server.api.dependencies import CurrentUser
from ayon_server.api.responses import EntityIdResponse
Expand Down Expand Up @@ -268,7 +268,7 @@ async def create_view(
request: Request,
current_user: CurrentUser,
view_type: PViewType,
payload: ViewPostModel,
payload: Annotated[ViewPostModel, Body(title="Payload")],
project_name: QProjectName = None,
) -> EntityIdResponse:
"""Create a new view for current user."""
Expand All @@ -282,7 +282,7 @@ async def create_view(
raise ForbiddenException("The '__base__' view label is reserved.")

_json = await request.json()
payload_class = get_post_model_class(view_type)
payload_class = get_post_model_class()
if "view_type" not in _json:
_json["view_type"] = view_type
payload = payload_class(**_json)
Expand Down Expand Up @@ -333,15 +333,15 @@ async def update_view(
user: CurrentUser,
view_type: PViewType,
view_id: PViewId,
payload: ViewPatchModel,
payload: Annotated[ViewPatchModel, Body(title="Payload")],
project_name: QProjectName = None,
) -> None:
"""Update a view in the database."""

_json = await request.json()
if "view_type" not in _json:
_json["view_type"] = view_type
payload_class = get_patch_model_class(view_type)
payload_class = get_patch_model_class()
payload = payload_class(**_json)

if payload.label == "__base__":
Expand Down
Loading