-
Notifications
You must be signed in to change notification settings - Fork 25
/
Copy pathschemas.py
152 lines (117 loc) · 3.08 KB
/
schemas.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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
from datetime import date, datetime
from typing import Any, Generic, List, Optional, Type, Union
from accounts.schemas import UserOut
from pydantic import BaseModel, validator
from blog.models import Category
def confirm_title(value: str) -> str:
"""
Validation to prevent empty title field.
Called by the helper function below;
"""
if not value:
raise ValueError("Please provide a title.")
return value
def confirm_slug(value: str) -> str:
"""
Validation to prevent empty slug field.
Called by the helperfunction below;
"""
if not value:
raise ValueError("Slug cannot be empty.")
return value
class CategoryBase(BaseModel):
"""
Base fields for blog post category.
"""
title: str
description: Optional[str] = None
_confirm_title = validator("title", allow_reuse=True)(confirm_title)
class CreateCategory(CategoryBase):
"""
Fields for creating blog post category.
"""
...
class UpdateCategory(CategoryBase):
"""
Fields for updating blog post category.
"""
# slug: str
active: bool
# _confirm_slug = validator("slug", allow_reuse=True)(confirm_slug)
class CategoryOut(CategoryBase):
"""
Response for blog post category.
"""
slug: str
active: bool
class Config:
orm_mode = True
class CategoryListOut(BaseModel):
"""
Response for list all categories.
We made a custom since we need just these two fields.
"""
title: str
slug: str
class Config:
orm_mode = True
class PostBase(BaseModel):
"""Base fields for blog posts."""
user: UserOut
title: str
# Validation for title and slug
_check_title = validator("title", allow_reuse=True)(confirm_title)
# @validator("title")
# def check_title_availability(cls, value):
# if not value:
# raise ValueError("Title cannot be empty.")
class CreatePost(PostBase):
"""
Fields for creating blog post.
"""
...
class UpdatePost(PostBase):
"""
Fields for updating blog post.
"""
# slug: Optional[str] = None
view_count: int
active: bool
# updated: datetime
# _check_slug = validator("slug", allow_reuse=True)(confirm_slug)
class SinglePost(PostBase):
"""
Response for blog post.
"""
id: int
slug: str
view_count: int
draft: bool = False
publish: date
description: Optional[str] = None
content: Optional[str] = ...
read_time: int
category: CategoryOut
class Config:
orm_mode = True
class AllPostList(PostBase):
"""
Response for listing all blog posts.
Custom for just these few fields
"""
id: int
slug: str
draft: bool = False
category: CategoryListOut
class Config:
orm_mode = True
class PostByCategoryList(PostBase):
"""
Response for listing all blog posts.
Custom for just these few fields.
"""
id: int
slug: str
draft: bool = False
class Config:
orm_mode = True