55from pydantic import BaseModel
66from util .get_class import get_activities_related_to_user
77
8- from utils import compulsory_temporary_token , get_current_user
8+ from utils import compulsory_temporary_token , get_current_user , validate_object_id
99
1010router = APIRouter ()
1111
@@ -33,32 +33,56 @@ async def create_group(payload: Group, user=Depends(get_current_user)):
3333
3434
3535@router .get ("" )
36- async def get_groups (page : int = - 1 , perpage : int = 10 , user = Depends (get_current_user )):
36+ async def get_groups (
37+ page : int = 1 ,
38+ perpage : int = 10 ,
39+ type = "all" ,
40+ search = "" ,
41+ user = Depends (get_current_user ),
42+ ):
3743 """
3844 Get all groups
3945 """
4046
4147 if len (user ["per" ]) == 0 :
4248 raise HTTPException (status_code = 403 , detail = "Permission denied" )
4349
44- count = await db .zvms .groups .count_documents ({})
50+ if type == "all" :
51+ target = ["permission" , "class" ]
52+ elif type == "permission" :
53+ target = ["permission" ]
54+ elif type == "class" :
55+ target = ["class" ]
56+ else :
57+ raise HTTPException (status_code = 400 , detail = "Invalid type" )
58+
59+ count = await db .zvms .groups .count_documents (
60+ {"name" : {"$regex" : search , "$options" : "i" }}
61+ )
4562
4663 pipeline = [
64+ {
65+ "$match" : {
66+ "type" : {"$in" : target },
67+ "name" : {"$regex" : search , "$options" : "i" },
68+ },
69+ },
70+ {"$project" : {"description" : 0 }},
4771 {"$sort" : {"name" : 1 }},
48- {"$skip" : (page - 1 ) * perpage },
49- {"$limit" : perpage },
72+ {"$skip" : 0 if page < 1 else (page - 1 ) * perpage },
73+ {"$limit" : count if page < 1 else perpage },
5074 ]
5175
5276 result = await db .zvms .groups .aggregate (pipeline ).to_list (None )
5377
54-
5578 for group in result :
5679 group ["_id" ] = str (group ["_id" ])
5780
5881 return {
5982 "status" : "ok" ,
6083 "code" : 200 ,
6184 "data" : result ,
85+ "metadata" : {"size" : count },
6286 }
6387
6488
@@ -98,7 +122,7 @@ async def update_group_name(
98122 raise HTTPException (status_code = 403 , detail = "Permission denied" )
99123
100124 await db .zvms .groups .update_one (
101- {"_id" : ObjectId (group_id )}, {"$set" : {"name" : payload .name }}
125+ {"_id" : validate_object_id (group_id )}, {"$set" : {"name" : payload .name }}
102126 )
103127
104128 return {
@@ -110,10 +134,11 @@ async def update_group_name(
110134@router .get ("/{group_id}/activity" )
111135async def get_class_activities (
112136 group_id : str ,
113- page : int = - 1 ,
137+ page : int = 1 ,
114138 perpage : int = 10 ,
115139 query : str = "" ,
116- user = Depends (get_current_user )):
140+ user = Depends (get_current_user ),
141+ ):
117142 """
118143 Get activities related to a group
119144 """
@@ -128,39 +153,48 @@ async def get_class_activities(
128153 }
129154
130155
131- @router .get ('/{group_id}/user' )
132- async def get_users_in_class (group_id : str , page : int = - 1 , perpage : int = 10 , query : str = '' , user = Depends (get_current_user )):
133- '''
156+ @router .get ("/{group_id}/user" )
157+ async def get_users_in_class (
158+ group_id : str ,
159+ page : int = 1 ,
160+ perpage : int = 10 ,
161+ search : str = "" ,
162+ user = Depends (get_current_user ),
163+ ):
164+ """
134165 Get users in a class
135- '''
166+ """
136167 same_class = False
137- if ' secretary' in user [' per' ]:
138- user = await db .zvms .users .find_one ({' _id' : ObjectId (user [' _id' ])})
168+ if " secretary" in user [" per" ]:
169+ user = await db .zvms .users .find_one ({" _id" : ObjectId (user [" _id" ])})
139170 if user is None :
140- raise HTTPException (status_code = 404 , detail = ' User not found' )
141- classid = user [' group' ]
171+ raise HTTPException (status_code = 404 , detail = " User not found" )
172+ classid = user [" group" ]
142173 if classid == group_id :
143174 same_class = True
144175 if user is None :
145- raise HTTPException (status_code = 404 , detail = 'User not found' )
146- if not 'admin' in user ['per' ] and not 'auditor' in user ['per' ] and not 'department' in user ['per' ] and (not 'secretary' in user ['per' ] or not same_class ):
147- raise HTTPException (status_code = 403 , detail = 'Permission denied' )
148- count = await db .zvms .users .count_documents ({'group' : group_id })
176+ raise HTTPException (status_code = 404 , detail = "User not found" )
177+ if (
178+ not "admin" in user ["per" ]
179+ and not "auditor" in user ["per" ]
180+ and not "department" in user ["per" ]
181+ and (not "secretary" in user ["per" ] or not same_class )
182+ ):
183+ raise HTTPException (status_code = 403 , detail = "Permission denied" )
184+ count = await db .zvms .users .count_documents (
185+ {"group" : group_id , "name" : {"$regex" : search , "$options" : "i" }}
186+ )
149187 pipeline = [
150- {"$match" : {"group" : group_id }},
151- {"$sort" : {"name " : 1 }},
188+ {"$match" : {"group" : group_id , "name" : { "$regex" : search , "$options" : "i" } }},
189+ {"$sort" : {"id " : 1 }},
152190 {"$skip" : (page - 1 ) * perpage },
153191 {"$limit" : perpage },
154192 ]
155193 result = await db .zvms .users .aggregate (pipeline ).to_list (None )
156194 for user in result :
157- user ['_id' ] = str (user ['_id' ])
158- return {
159- 'status' : 'ok' ,
160- 'code' : 200 ,
161- 'data' : result ,
162- 'metadata' : {'size' : count }
163- }
195+ user ["_id" ] = str (user ["_id" ])
196+ return {"status" : "ok" , "code" : 200 , "data" : result , "metadata" : {"size" : count }}
197+
164198
165199class PutGroupDescription (BaseModel ):
166200 description : str
0 commit comments