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 +6 -2
- cbh/api/account/schemas.py +2 -0
- cbh/api/account/views.py +7 -22
- cbh/api/calls/services/daily.py +1 -1
- cbh/api/events/db_requests.py +29 -1
- cbh/api/events/schemas.py +11 -1
- cbh/api/events/views.py +38 -2
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 |
-
|
| 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,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
|
| 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 |
-
|
| 37 |
) -> CbhResponseWrapper[AllObjectsResponse[AccountModel]]:
|
| 38 |
"""
|
| 39 |
Filter accounts.
|
| 40 |
"""
|
| 41 |
-
accounts, total_count = await filter_accounts_objs(
|
| 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 |
-
|
| 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()
|