Merge pull request #3283 from michael-genson/fix/recipe-favorite-slug-handling

fix: Allow UserOut to accept list of slugs for recipe favorites
This commit is contained in:
boc-the-git 2024-03-11 21:31:43 +11:00 committed by GitHub
commit 430e1d7d4e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -1,6 +1,6 @@
from datetime import datetime, timedelta from datetime import datetime, timedelta
from pathlib import Path from pathlib import Path
from typing import Annotated from typing import Annotated, Any
from uuid import UUID from uuid import UUID
from pydantic import UUID4, ConfigDict, Field, StringConstraints, field_validator from pydantic import UUID4, ConfigDict, Field, StringConstraints, field_validator
@ -107,7 +107,7 @@ class UserOut(UserBase):
group_slug: str group_slug: str
tokens: list[LongLiveTokenOut] | None = None tokens: list[LongLiveTokenOut] | None = None
cache_key: str cache_key: str
favorite_recipes: Annotated[list[str] | None, Field(validate_default=True)] = [] favorite_recipes: Annotated[list[str], Field(validate_default=True)] = []
model_config = ConfigDict(from_attributes=True) model_config = ConfigDict(from_attributes=True)
@property @property
@ -119,8 +119,24 @@ class UserOut(UserBase):
return [joinedload(User.group), joinedload(User.favorite_recipes), joinedload(User.tokens)] return [joinedload(User.group), joinedload(User.favorite_recipes), joinedload(User.tokens)]
@field_validator("favorite_recipes", mode="before") @field_validator("favorite_recipes", mode="before")
def convert_favorite_recipes_to_slugs(cls, v): def convert_favorite_recipes_to_slugs(cls, v: Any):
return [recipe.slug for recipe in v] if v else v if not v:
return []
if not isinstance(v, list):
return v
slugs: list[str] = []
for recipe in v:
if isinstance(recipe, str):
slugs.append(recipe)
else:
try:
slugs.append(recipe.slug)
except AttributeError:
# this isn't a list of recipes, so we quit early and let Pydantic's typical validation handle it
return v
return slugs
class UserPagination(PaginationBase): class UserPagination(PaginationBase):