brestok commited on
Commit
6530a47
·
1 Parent(s): 8003251

Enhance account and event filtering capabilities

Browse files

- Updated `filter_accounts_objs` to include additional filters for `statuses` and `opportunities`.
- Modified `AccountFilter` schema to support new filter fields.
- Introduced `filter_events_objs` function to enable event filtering based on date range and search term.
- Added `EventFilter` schema for event filtering parameters.
- Implemented new endpoint for filtering events in the events router.

cbh/api/account/db_requests.py CHANGED
@@ -43,12 +43,12 @@ async def update_account_picture_obj(
43
 
44
 
45
  async def filter_accounts_objs(
46
- account: AccountModel, request: FilterRequest[AccountFilter]
47
  ) -> tuple[list[AccountModel], int]:
48
  """
49
  Filter accounts.
50
  """
51
- filters = prepare_additional_filter(account)
52
  if request.filter.accountTypes:
53
  filters["accountType"] = {"$in": request.filter.accountTypes}
54
  if request.filter.searchTerm:
@@ -57,6 +57,10 @@ async def filter_accounts_objs(
57
  {"name": {"$regex": content, "$options": "i"}},
58
  {"email": {"$regex": content, "$options": "i"}},
59
  ]
 
 
 
 
60
  if request.sortBy:
61
  sort = (request.sortBy.name, request.sortBy.order.value)
62
  else:
 
43
 
44
 
45
  async def filter_accounts_objs(
46
+ request: FilterRequest[AccountFilter],
47
  ) -> tuple[list[AccountModel], int]:
48
  """
49
  Filter accounts.
50
  """
51
+ filters = {}
52
  if request.filter.accountTypes:
53
  filters["accountType"] = {"$in": request.filter.accountTypes}
54
  if request.filter.searchTerm:
 
57
  {"name": {"$regex": content, "$options": "i"}},
58
  {"email": {"$regex": content, "$options": "i"}},
59
  ]
60
+ if request.filter.statuses:
61
+ filters["status"] = {"$in": request.filter.statuses}
62
+ if request.filter.opportunities:
63
+ filters["opportunity"] = {"$in": request.filter.opportunities}
64
  if request.sortBy:
65
  sort = (request.sortBy.name, request.sortBy.order.value)
66
  else:
cbh/api/account/schemas.py CHANGED
@@ -17,3 +17,5 @@ class AccountFilter(BaseModel):
17
 
18
  accountTypes: list[int] | None = None
19
  searchTerm: str | None = None
 
 
 
17
 
18
  accountTypes: list[int] | None = None
19
  searchTerm: str | None = None
20
+ statuses: list[int] | None = None
21
+ opportunities: list[int] | None = None
cbh/api/account/views.py CHANGED
@@ -2,12 +2,11 @@
2
  Account views module.
3
  """
4
 
5
- from fastapi import Depends, File, UploadFile
6
 
7
  from cbh.api.account import account_router
8
  from cbh.api.account.db_requests import (
9
  filter_accounts_objs,
10
- update_account_picture_obj,
11
  update_own_account_obj,
12
  )
13
  from cbh.api.account.dto import AccountType
@@ -16,14 +15,12 @@ from cbh.api.account.schemas import (
16
  AccountFilter,
17
  UpdateAccountRequest,
18
  )
19
- from cbh.api.account.utils import compress_image
20
  from cbh.api.common.db_requests import (
21
  get_obj_by_id,
22
  delete_obj,
23
  )
24
  from cbh.api.common.dto import Paging
25
  from cbh.api.common.schemas import AllObjectsResponse, FilterRequest
26
- from cbh.core.config import settings
27
  from cbh.core.security import PermissionDependency
28
  from cbh.core.wrappers import CbhResponseWrapper
29
 
@@ -33,12 +30,12 @@ from cbh.core.wrappers import CbhResponseWrapper
33
  )
34
  async def filter_accounts(
35
  request: FilterRequest[AccountFilter],
36
- account: AccountModel = Depends(PermissionDependency()),
37
  ) -> CbhResponseWrapper[AllObjectsResponse[AccountModel]]:
38
  """
39
  Filter accounts.
40
  """
41
- accounts, total_count = await filter_accounts_objs(account, request)
42
  return CbhResponseWrapper(
43
  data=AllObjectsResponse(
44
  data=accounts,
@@ -54,9 +51,7 @@ async def filter_accounts(
54
  @account_router.get("/{accountId}")
55
  async def get_account(
56
  accountId: str, # pylint: disable=C0103
57
- account: AccountModel = Depends(
58
- PermissionDependency()
59
- ),
60
  ) -> CbhResponseWrapper[AccountModel]:
61
  """
62
  Get an account by ID.
@@ -73,21 +68,13 @@ async def delete_account(
73
  """
74
  Delete an account.
75
  """
76
- await delete_obj(
77
- AccountModel,
78
- accountId,
79
- additional_filter={
80
- "accountType": AccountType.USER.value,
81
- },
82
- )
83
  return CbhResponseWrapper()
84
 
85
 
86
  @account_router.get("")
87
  async def get_own_account(
88
- account: AccountModel = Depends(
89
- PermissionDependency()
90
- ),
91
  ) -> CbhResponseWrapper[AccountModel]:
92
  """
93
  Get own account.
@@ -98,9 +85,7 @@ async def get_own_account(
98
  @account_router.put("")
99
  async def update_own_account(
100
  request: UpdateAccountRequest,
101
- account: AccountModel = Depends(
102
- PermissionDependency()
103
- ),
104
  ) -> CbhResponseWrapper[AccountModel]:
105
  """
106
  Update own account.
 
2
  Account views module.
3
  """
4
 
5
+ from fastapi import Depends
6
 
7
  from cbh.api.account import account_router
8
  from cbh.api.account.db_requests import (
9
  filter_accounts_objs,
 
10
  update_own_account_obj,
11
  )
12
  from cbh.api.account.dto import AccountType
 
15
  AccountFilter,
16
  UpdateAccountRequest,
17
  )
 
18
  from cbh.api.common.db_requests import (
19
  get_obj_by_id,
20
  delete_obj,
21
  )
22
  from cbh.api.common.dto import Paging
23
  from cbh.api.common.schemas import AllObjectsResponse, FilterRequest
 
24
  from cbh.core.security import PermissionDependency
25
  from cbh.core.wrappers import CbhResponseWrapper
26
 
 
30
  )
31
  async def filter_accounts(
32
  request: FilterRequest[AccountFilter],
33
+ _: AccountModel = Depends(PermissionDependency([AccountType.ADMIN])),
34
  ) -> CbhResponseWrapper[AllObjectsResponse[AccountModel]]:
35
  """
36
  Filter accounts.
37
  """
38
+ accounts, total_count = await filter_accounts_objs(request)
39
  return CbhResponseWrapper(
40
  data=AllObjectsResponse(
41
  data=accounts,
 
51
  @account_router.get("/{accountId}")
52
  async def get_account(
53
  accountId: str, # pylint: disable=C0103
54
+ _: AccountModel = Depends(PermissionDependency(AccountType.ADMIN)),
 
 
55
  ) -> CbhResponseWrapper[AccountModel]:
56
  """
57
  Get an account by ID.
 
68
  """
69
  Delete an account.
70
  """
71
+ await delete_obj(AccountModel, accountId)
 
 
 
 
 
 
72
  return CbhResponseWrapper()
73
 
74
 
75
  @account_router.get("")
76
  async def get_own_account(
77
+ account: AccountModel = Depends(PermissionDependency()),
 
 
78
  ) -> CbhResponseWrapper[AccountModel]:
79
  """
80
  Get own account.
 
85
  @account_router.put("")
86
  async def update_own_account(
87
  request: UpdateAccountRequest,
88
+ account: AccountModel = Depends(PermissionDependency()),
 
 
89
  ) -> CbhResponseWrapper[AccountModel]:
90
  """
91
  Update own account.
cbh/api/calls/services/daily.py CHANGED
@@ -5,7 +5,7 @@ from cbh.core.config import settings
5
 
6
 
7
  async def create_meeting_room(event: EventModel | EventShorten) -> str:
8
- return ''
9
  payload = {
10
  "properties": {
11
  "exp": int(event.endDate.timestamp()) + 3600,
 
5
 
6
 
7
  async def create_meeting_room(event: EventModel | EventShorten) -> str:
8
+ # return ''
9
  payload = {
10
  "properties": {
11
  "exp": int(event.endDate.timestamp()) + 3600,
cbh/api/events/db_requests.py CHANGED
@@ -1,7 +1,10 @@
 
1
  from cbh.api.account.models import AccountModel, AccountShorten
 
 
2
  from cbh.api.events.dto import EventType
3
  from cbh.api.events.models import EventModel
4
- from cbh.api.events.schemas import CreateEventRequest
5
  from cbh.core.config import settings
6
 
7
 
@@ -20,3 +23,28 @@ async def create_event_obj(
20
  )
21
  await settings.DB_CLIENT.events.insert_one(event.to_mongo())
22
  return event
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from datetime import datetime
2
  from cbh.api.account.models import AccountModel, AccountShorten
3
+ from cbh.api.common.db_requests import get_all_objs
4
+ from cbh.api.common.schemas import FilterRequest
5
  from cbh.api.events.dto import EventType
6
  from cbh.api.events.models import EventModel
7
+ from cbh.api.events.schemas import CreateEventRequest, EventFilter
8
  from cbh.core.config import settings
9
 
10
 
 
23
  )
24
  await settings.DB_CLIENT.events.insert_one(event.to_mongo())
25
  return event
26
+
27
+
28
+ async def filter_events_objs(
29
+ request: FilterRequest[EventFilter],
30
+ account: AccountModel,
31
+ ) -> tuple[list[EventModel], int]:
32
+ filters = {"isActive": True, "coach.id": account.id, "type": EventType.CUSTOM.value}
33
+ if request.filter.startDate:
34
+ start_dt = datetime.combine(
35
+ request.filter.startDate, datetime.min.time()
36
+ ).isoformat()
37
+ filters["startDate"] = {"$gte": start_dt}
38
+ if request.filter.endDate:
39
+ end_dt = datetime.combine(
40
+ request.filter.endDate, datetime.max.time()
41
+ ).isoformat()
42
+ filters["endDate"] = {"$lte": end_dt}
43
+ if request.filter.searchTerm:
44
+ filters["$or"] = [
45
+ {"reason": {"$regex": request.filter.searchTerm, "$options": "i"}},
46
+ ]
47
+ events, total_count = await get_all_objs(
48
+ EventModel, request.pageSize, request.pageIndex, additional_filter=filters
49
+ )
50
+ return events, total_count
cbh/api/events/schemas.py CHANGED
@@ -1,4 +1,4 @@
1
- from datetime import datetime
2
  from pydantic import BaseModel
3
 
4
 
@@ -10,3 +10,13 @@ class CreateEventRequest(BaseModel):
10
  reason: str | None = None
11
  startDate: datetime
12
  endDate: datetime
 
 
 
 
 
 
 
 
 
 
 
1
+ from datetime import date, datetime
2
  from pydantic import BaseModel
3
 
4
 
 
10
  reason: str | None = None
11
  startDate: datetime
12
  endDate: datetime
13
+
14
+
15
+ class EventFilter(BaseModel):
16
+ """
17
+ Event filter.
18
+ """
19
+
20
+ startDate: date | None = None
21
+ endDate: date | None = None
22
+ searchTerm: str | None = None
cbh/api/events/views.py CHANGED
@@ -1,13 +1,37 @@
1
  from fastapi import Depends
2
 
 
 
 
3
  from cbh.api.events import events_router
4
  from cbh.api.events.models import EventModel
5
  from cbh.api.account.models import AccountModel
6
  from cbh.core.security import PermissionDependency
7
  from cbh.api.account.dto import AccountType
8
  from cbh.core.wrappers import CbhResponseWrapper
9
- from cbh.api.events.schemas import CreateEventRequest
10
- from cbh.api.events.db_requests import create_event_obj
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11
 
12
 
13
  @events_router.post("")
@@ -20,3 +44,15 @@ async def create_event(
20
  """
21
  event = await create_event_obj(event, account)
22
  return CbhResponseWrapper(data=event)
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  from fastapi import Depends
2
 
3
+ from cbh.api.common.db_requests import delete_obj
4
+ from cbh.api.common.dto import Paging
5
+ from cbh.api.common.schemas import AllObjectsResponse, FilterRequest
6
  from cbh.api.events import events_router
7
  from cbh.api.events.models import EventModel
8
  from cbh.api.account.models import AccountModel
9
  from cbh.core.security import PermissionDependency
10
  from cbh.api.account.dto import AccountType
11
  from cbh.core.wrappers import CbhResponseWrapper
12
+ from cbh.api.events.schemas import CreateEventRequest, EventFilter
13
+ from cbh.api.events.db_requests import create_event_obj, filter_events_objs
14
+
15
+
16
+ @events_router.post("/filter")
17
+ async def filter_events(
18
+ request: FilterRequest[EventFilter],
19
+ account: AccountModel = Depends(PermissionDependency([AccountType.COACH])),
20
+ ) -> CbhResponseWrapper[AllObjectsResponse[EventModel]]:
21
+ """
22
+ Filter events.
23
+ """
24
+ events, total_count = await filter_events_objs(request, account)
25
+ return CbhResponseWrapper(
26
+ data=AllObjectsResponse(
27
+ data=events,
28
+ paging=Paging(
29
+ pageSize=request.pageSize,
30
+ pageIndex=request.pageIndex,
31
+ totalCount=total_count,
32
+ ),
33
+ )
34
+ )
35
 
36
 
37
  @events_router.post("")
 
44
  """
45
  event = await create_event_obj(event, account)
46
  return CbhResponseWrapper(data=event)
47
+
48
+
49
+ @events_router.delete("/{eventId}")
50
+ async def delete_event(
51
+ eventId: str,
52
+ account: AccountModel = Depends(PermissionDependency([AccountType.COACH])),
53
+ ) -> CbhResponseWrapper:
54
+ """
55
+ Delete an event.
56
+ """
57
+ await delete_obj(EventModel, eventId, {"coach.id": account.id})
58
+ return CbhResponseWrapper()