11from typing import Generic , List , Optional , Type , TypeVar
2+ from unicodedata import category
23
34from core .base_crud import SLUGTYPE , BaseCRUD
45from 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
8176class 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
129126post = PostCRUD (Post )
0 commit comments