Skip to content

Commit 224bd7a

Browse files
committed
Add complete CRUD procedure for Blog Posts and Category.
1 parent c3b3c11 commit 224bd7a

File tree

1 file changed

+63
-66
lines changed

1 file changed

+63
-66
lines changed

blog/api_crud.py

Lines changed: 63 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from typing import Generic, List, Optional, Type, TypeVar
2+
from unicodedata import category
23

34
from core.base_crud import SLUGTYPE, BaseCRUD
45
from core.utils import unique_slug_generator
@@ -16,114 +17,110 @@ class PostCRUD(BaseCRUD[Post, CreatePost, UpdatePost, SLUGTYPE]):
1617
CRUD Operation for blog posts
1718
"""
1819

19-
# >>> voted_choices = Choice.objects.filter(votes__gt=0)
20-
# >>> voted_choices
21-
# <QuerySet [<Choice: The sky>]>
22-
# >>> prefetch = Prefetch('choice_set', queryset=voted_choices)
23-
# >>> Question.objects.prefetch_related(prefetch).get().choice_set.all()
24-
# <QuerySet [<Choice: The sky>]>
25-
26-
27-
# prefetch = Prefetch('choice_set', queryset=voted_choices, to_attr='voted_choices')
28-
# >>> Question.objects.prefetch_related(prefetch).get().voted_choices
29-
# [<Choice: The sky>]
30-
# >>> Question.objects.prefetch_related(prefetch).get().choice_set.all()
31-
32-
33-
3420
def get(self, slug: SLUGTYPE) -> Optional[Post]:
3521
"""
3622
Get single blog post.
3723
"""
38-
user_query = Post.objects.select_related("user").filter(slug=slug)
39-
prefetch = Prefetch("category", queryset=user_query)
40-
query = Post.objects.prefetch_related(prefetch).all()
41-
return query
24+
try:
25+
query = Post.objects.select_related("user", "category").get(slug=slug)
26+
return query
27+
except ObjectDoesNotExist:
28+
raise HTTPException(status_code=404, detail="This post does not exists.")
4229

30+
def get_multiple(self, limit:int = 100, offset: int = 0) -> List[Post]:
31+
"""
32+
Get multiple posts using a query limit and offset flag.
33+
"""
34+
query = Post.objects.select_related("user", "category").all()[offset:offset+limit]
35+
if not query:
36+
raise HTTPException(status_code=404, detail="There are no posts.")
37+
return list(query)
4338

44-
def get_multiple(self, limit=100, offset=0) -> List[Post]:
39+
def get_posts_by_category(self, slug: SLUGTYPE) -> List[Post]:
4540
"""
46-
get multiple items using a query limiting flag.
41+
Get all posts belonging to a particular category.
4742
"""
48-
user_query = Post.objects.select_related("user")
49-
prefetch = Prefetch("category", queryset=user_query)
50-
query = Post.objects.prefetch_related(prefetch).all()
43+
query_category = Category.objects.filter(slug=slug)
44+
if not query_category:
45+
raise HTTPException(status_code=404, detail="This category does not exist.")
46+
query = Post.objects.filter(category__slug=slug).select_related("user").all()
5147
return list(query)
5248

5349
def create(self, obj_in: CreatePost) -> Post:
5450
"""
55-
Create an item.
51+
Create an post.
5652
"""
5753
slug = unique_slug_generator(obj_in.title)
58-
post = self.get(slug=slug)
59-
if post:
54+
post = Post.objects.filter(slug=slug)
55+
if not post:
6056
slug = unique_slug_generator(obj_in.title, new_slug=True)
6157
obj_in = jsonable_encoder(obj_in)
6258
query = Post.objects.create(**obj_in)
6359
return query
6460

65-
# def update(self, obj_in: UpdateSchema, slug: SLUGTYPE) -> ModelType:
66-
# """
67-
# Update an item.
68-
# """
69-
# if not isinstance(obj_in, list):
70-
# obj_in = jsonable_encoder(obj_in)
71-
# return self.model.objects.filter(slug=slug).update(**obj_in)
61+
def update(self, obj_in: UpdatePost, slug: SLUGTYPE) -> Post:
62+
"""
63+
Update an item.
64+
"""
65+
self.get(slug=slug)
66+
if not isinstance(obj_in, list):
67+
obj_in = jsonable_encoder(obj_in)
68+
return Post.objects.filter(slug=slug).update(**obj_in)
7269

73-
# def delete(self, slug: SLUGTYPE) -> ModelType:
74-
# """Delete an item."""
75-
# self.model.objects.filter(slug=slug).delete()
76-
# return {"detail": "Successfully deleted!"}
77-
78-
70+
def delete(self, slug: SLUGTYPE) -> Post:
71+
"""Delete an item."""
72+
self.model.objects.filter(slug=slug).delete()
73+
return {"detail": "Successfully deleted!"}
7974

8075

8176
class CategoryCRUD(BaseCRUD[Category, CreateCategory, UpdateCategory, SLUGTYPE]):
8277
"""
8378
CRUD Operation for blog categories.
8479
"""
85-
86-
80+
8781
def get(self, slug: SLUGTYPE) -> Optional[Category]:
8882
"""
89-
Get single blogcCategory.
90-
"""
91-
query = Category.objects.filter(slug=slug).all()
92-
return query
83+
Get a single category.
84+
"""
85+
try:
86+
query = Category.objects.get(slug=slug)
87+
return query
88+
except ObjectDoesNotExist:
89+
raise HTTPException(status_code=404, detail="This post does not exists.")
9390

94-
95-
def get_multiple(self, limit=100, offset=0) -> List[Category]:
91+
def get_multiple(self, limit:int = 100, offset: int = 0) -> List[Category]:
9692
"""
97-
get multiple items using a query limiting flag.
93+
Get multiple categories using a query limiting flag.
9894
"""
99-
posts = super().get_multiple(limit=limit, offset=offset)
100-
return list(posts)
101-
102-
95+
query = Category.objects.all()[offset:offset+limit]
96+
if not query:
97+
raise HTTPException(status_code=404, detail="There are no posts.")
98+
return list(query)
99+
103100
def create(self, obj_in: CreateCategory) -> Category:
104101
"""
105-
Create an item.
102+
Create a category.
106103
"""
107104
slug = unique_slug_generator(obj_in.title)
108-
category = self.get(slug=slug)
105+
category = Category.objects.filter(slug=slug)
109106
if category:
110107
raise HTTPException(status_code=404, detail="Category exists already.")
111108
obj_in = jsonable_encoder(obj_in)
112109
query = Category.objects.create(**obj_in)
113110
return query
114111

115-
# def update(self, obj_in: UpdateSchema, slug: SLUGTYPE) -> ModelType:
116-
# """
117-
# Update an item.
118-
# """
119-
# if not isinstance(obj_in, list):
120-
# obj_in = jsonable_encoder(obj_in)
121-
# return self.model.objects.filter(slug=slug).update(**obj_in)
112+
def update(self, obj_in: UpdateCategory, slug: SLUGTYPE) -> Category:
113+
"""
114+
Update a category.
115+
"""
116+
if not isinstance(obj_in, list):
117+
obj_in = jsonable_encoder(obj_in)
118+
return self.model.objects.filter(slug=slug).update(**obj_in)
122119

123-
# def delete(self, slug: SLUGTYPE) -> ModelType:
124-
# """Delete an item."""
125-
# self.model.objects.filter(slug=slug).delete()
126-
# return {"detail": "Successfully deleted!"}
120+
def delete(self, slug: SLUGTYPE) -> Post:
121+
"""Delete a category."""
122+
Post.objects.filter(slug=slug).delete()
123+
return {"detail": "Successfully deleted!"}
127124

128125

129126
post = PostCRUD(Post)

0 commit comments

Comments
 (0)