Compare commits

...

37 Commits
1.1.0 ... 1.3.6

Author SHA1 Message Date
0f8a5b32b0 Merge pull request 'add fix tags' (#35) from hotfix/fix-tags into master
Reviewed-on: #35
2024-12-21 20:49:14 +01:00
c2c7b034b6 add fix tags 2024-12-21 20:47:33 +01:00
f880b1e6a4 Merge pull request 'fix list' (#34) from feature/tags-search into master
Reviewed-on: #34
2024-12-18 23:53:28 +01:00
32f571103d fix list 2024-12-18 23:52:42 +01:00
94d6db0866 Merge pull request 'fix list' (#33) from feature/tags-search into master
Reviewed-on: #33
2024-12-18 23:48:18 +01:00
be17ec9202 fix list 2024-12-18 23:47:40 +01:00
9cf1c64ef9 Merge pull request 'feature/tags-search' (#32) from feature/tags-search into master
Reviewed-on: #32
2024-12-18 22:11:35 +01:00
1d7ec61982 add in 2024-12-16 23:53:46 +01:00
3189b08b09 refactor code 2024-12-16 23:51:26 +01:00
81be2a08d1 Merge pull request 'add options i' (#31) from feature/options-case into master
Reviewed-on: #31
2024-11-28 23:19:15 +01:00
7f34e835e3 add options i 2024-11-28 23:17:19 +01:00
721d7a3a5d Merge pull request 'fix end_date' (#30) from feature/searchByDate into master
Reviewed-on: #30
2024-11-23 21:06:36 +01:00
f08bdd5f0a fix end_date 2024-11-23 21:03:44 +01:00
beff787801 Merge pull request 'add selected date' (#29) from feature/searchByDate into master
Reviewed-on: #29
2024-11-23 20:18:57 +01:00
c8bc3cc68a add selected date 2024-11-23 20:13:03 +01:00
f290ea9bd0 Merge pull request 'add parameter date event' (#28) from feature/searchByDate into master
Reviewed-on: #28
2024-11-23 16:25:26 +01:00
ea05db0d91 add parameter date event 2024-11-23 16:12:40 +01:00
36ae3504b8 Merge pull request 'add current_time in list all events' (#27) from feature/listEventDate into master
Reviewed-on: #27
2024-11-10 18:45:39 +01:00
b4e37a71d0 add current_time in list all events 2024-11-10 18:42:13 +01:00
53dc28a8e9 Merge pull request 'feature/listEventDate' (#26) from feature/listEventDate into master
Reviewed-on: #26
2024-11-09 18:20:25 +01:00
49a22bc567 add current_datetime in events 2024-11-09 16:19:52 +01:00
4a484bfb42 add current_time in search 2024-11-09 16:04:47 +01:00
f8805aa60b Merge pull request 'rollback city' (#25) from feature/search into master
Reviewed-on: #25
2024-11-07 18:05:03 +01:00
ef19ef00d5 rollback city 2024-11-07 17:54:12 +01:00
9574ce5aeb Merge pull request 'feature/search' (#24) from feature/search into master
Reviewed-on: #24
2024-11-04 23:06:10 +01:00
115a5acb6f add another object_search 2024-11-04 22:58:51 +01:00
4c2d4646ce add lat and long as parameter 2024-11-04 22:57:53 +01:00
4f0cda831f Merge pull request 'add event set status to 1' (#23) from feature/search into master
Reviewed-on: #23
2024-10-23 23:37:50 +02:00
360ac8771a add event set status to 1 2024-10-23 23:36:09 +02:00
df4a2bead6 Merge pull request 'fix object_search' (#22) from feature/search into master
Reviewed-on: #22
2024-10-23 23:22:59 +02:00
a1e135a03e fix object_search 2024-10-23 23:22:05 +02:00
8397d84ec5 Merge pull request 'fix endpoint search' (#21) from feature/search into master
Reviewed-on: #21
2024-10-23 23:08:46 +02:00
9108e15555 fix endpoint search 2024-10-23 23:07:28 +02:00
fcb11dd0d8 Merge pull request 'list events only enabled' (#20) from feature/search into master
Reviewed-on: #20
2024-10-23 23:02:24 +02:00
3f4173863c list events only enabled 2024-10-23 22:58:17 +02:00
6781789012 Merge pull request 'add search' (#19) from feature/search into master
Reviewed-on: #19
2024-10-23 22:04:08 +02:00
436e6d68dd add search 2024-10-23 21:44:33 +02:00
2 changed files with 199 additions and 40 deletions

View File

@@ -6,9 +6,6 @@ class Event(BaseModel):
id: ObjectIdField = None id: ObjectIdField = None
name: str name: str
place: str place: str
zip_code: str
city: str
country: str
description: str description: str
imgUrl: str | None = None imgUrl: str | None = None
status: int = 0 status: int = 0
@@ -27,9 +24,6 @@ class EventOut(BaseModel):
id: ObjectIdField = None id: ObjectIdField = None
name: str name: str
place: str place: str
zip_code: str
city: str
country: str
description: str description: str
imgUrl: str | None = None imgUrl: str | None = None
status: int = 0 status: int = 0
@@ -40,9 +34,6 @@ class EventOut(BaseModel):
class EventIn(BaseModel): class EventIn(BaseModel):
name: str name: str
place: str place: str
zip_code: str
city: str
country: str
description: str description: str
imgUrl: str | None = None imgUrl: str | None = None
status: int = 0 status: int = 0

View File

@@ -4,46 +4,219 @@ from datetime import datetime
from ..dependencies import users_token, permissions_checker, database from ..dependencies import users_token, permissions_checker, database
from ..models import events, users from ..models import events, users
from pydantic import EmailStr from pydantic import EmailStr
from typing import Annotated from typing import Annotated, Union
from bson import ObjectId from bson import ObjectId
from datetime import datetime
router = APIRouter() router = APIRouter()
def build_location_filter(min_lat, max_lat, min_lon, max_lon):
"""Build location-based query filters."""
if min_lat is not None and max_lat is not None and min_lon is not None and max_lon is not None:
return [
{"latitude": {"$gte": min_lat}},
{"latitude": {"$lte": max_lat}},
{"longitude": {"$gte": min_lon}},
{"longitude": {"$lte": max_lon}},
]
return []
def build_datetime_filter(current_datetime):
"""Build filters for current datetime."""
if current_datetime:
return {
"$or": [
{"start_date": {"$gte": current_datetime}}, # Upcoming events
{
"$and": [
{"start_date": {"$lte": current_datetime}}, # Already started
{"$or": [
{"end_date": {"$gte": current_datetime}}, # Ongoing
{"end_date": None}, # No end date
]},
],
},
],
}
return None
def build_date_filter(start_date, end_date):
"""Build date range filters."""
if start_date and end_date:
return [
{"start_date": {"$gte": datetime.combine(start_date, datetime.min.time())}},
{"start_date": {"$lte": datetime.combine(end_date, datetime.max.time())}},
]
return []
def build_text_filter(item):
"""Build text-based search filters."""
if item:
return {
"$or": [
{"name": {"$regex": item, "$options": "i"}},
{"tags": {"$regex": item, "$options": "i"}},
{"organizers": {"$regex": item, "$options": "i"}},
]
}
return None
@router.get("/events", tags=["events"], response_model=list[events.EventOut]) @router.get("/events", tags=["events"], response_model=list[events.EventOut])
async def read_events(authorize: Annotated[bool, Depends(permissions_checker.PermissionChecker(roles=["Admin", "User"]))], skip: int = 0, limit: int = 20, id_event: str | None = None, name: str | None = None, status: int | None = None, tags: str | None = None, organizers: str | None = None): async def read_events(
authorize: Annotated[bool, Depends(permissions_checker.PermissionChecker(roles=["Admin", "User"]))],
skip: int = 0,
limit: int = 20,
id_event: str | None = None,
name: str | None = None,
status: int = 1,
tags: str | None = None,
organizers: str | None = None,
current_datetime: datetime | None = None,
date_event: datetime | None = None,
start_date: datetime | None = None,
end_date: datetime | None = None,
):
# Validate `skip` and `limit`
if limit < 1 or skip < 0 or limit < skip: if limit < 1 or skip < 0 or limit < skip:
raise HTTPException( raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST, status_code=status.HTTP_400_BAD_REQUEST,
detail="skip should be greater than 0 and limit should be greater than 1. Limit should be greater than skip" detail="`skip` should be >= 0 and `limit` should be > 0 and greater than `skip`.",
) )
limit = limit + skip limit = limit + skip
listEvents = []
# Initialize filters
filters = []
# Add status filter
filters.append({"status": {"$eq": status}})
# Add date filters
if date_event:
start_of_day = datetime.combine(date_event, datetime.min.time())
end_of_day = datetime.combine(date_event, datetime.max.time())
filters.extend(build_date_filter(start_of_day, end_of_day))
elif start_date and end_date:
filters.extend(build_date_filter(start_date, end_date))
# Add current datetime filter
datetime_filter = build_datetime_filter(current_datetime)
if datetime_filter:
filters.append(datetime_filter)
# Add text-based filters
if name:
filters.append(build_text_filter(name))
if tags:
filters.append({"tags": {"$eq": tags}})
if organizers:
filters.append({"organizers": {"$eq": organizers}})
# Add ID filter
if id_event:
try:
event_id = ObjectId(id_event)
filters.append({"_id": {"$eq": event_id}})
except Exception:
raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="Invalid event ID format.")
# Combine all filters
object_search = {"$and": filters} if filters else {}
# Fetch and return results
event_repository = events.EventRepository(database=database.database) event_repository = events.EventRepository(database=database.database)
object_search = {} list_events = []
if status is not None: for event_index in event_repository.find_by(object_search, limit=limit, skip=skip):
object_search = {"status":{"$eq": status}} event = events.EventOut(
id=event_index.id,
tags=event_index.tags,
imgUrl=event_index.imgUrl,
name=event_index.name,
description=event_index.description,
place=event_index.place,
status=event_index.status,
start_date=event_index.start_date,
end_date=event_index.end_date,
)
list_events.append(event)
return list_events
@router.get("/events/search", tags=["events"], response_model=list[events.EventOut])
async def search_events(
authorize: Annotated[bool, Depends(permissions_checker.PermissionChecker(roles=["Admin", "User"]))],
skip: int = 0,
limit: int = 20,
item: Union[str, None] = None,
status: int = 1,
min_lat: Union[float, None] = None,
max_lat: Union[float, None] = None,
min_lon: Union[float, None] = None,
max_lon: Union[float, None] = None,
current_datetime: Union[datetime, None] = None,
date_event: Union[datetime, None] = None,
start_date: Union[datetime, None] = None,
end_date: Union[datetime, None] = None,
tags: Union[str, None] = None,
):
if limit < 1 or skip < 0 or limit < skip:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail="`skip` should be >= 0 and `limit` should be > 0 and greater than `skip`.",
)
limit = limit + skip
# Initialize filters
filters = [{"status": {"$eq": status}}]
# Date filters
if date_event:
start_of_day = datetime.combine(date_event, datetime.min.time())
end_of_day = datetime.combine(date_event, datetime.max.time())
filters.extend(build_date_filter(start_of_day, end_of_day))
else:
filters.extend(build_date_filter(start_date, end_date))
# Add location filter
filters.extend(build_location_filter(min_lat, max_lat, min_lon, max_lon))
# Add datetime filter
datetime_filter = build_datetime_filter(current_datetime)
if datetime_filter:
filters.append(datetime_filter)
# Add text filter
text_filter = build_text_filter(item)
if text_filter:
filters.append(text_filter)
if tags is not None: if tags is not None:
object_search = {"tags":{"$eq": tags}} filters.append({"tags": {"$eq": tags}})
if organizers is not None:
object_search = {"organizers":{"$eq": organizers}}
if id_event is not None:
eventid = ObjectId(id_event)
object_search = {"id": {"$regex": userid}}
if status is not None:
object_search = {"$and":[{"id":{"$regex": eventid}}, {"status":{"$eq":status}}]}
if name is not None:
object_search = {"name": {"$regex": name}}
if status is not None:
object_search = {"$and":[{"name":{"$regex": name}}, {"status":{"$eq":status}}]}
# Combine filters
object_search = {"$and": filters} if filters else {}
# Fetch and return results
event_repository = events.EventRepository(database=database.database)
list_events = []
for event_index in event_repository.find_by(object_search, limit=limit, skip=skip): for event_index in event_repository.find_by(object_search, limit=limit, skip=skip):
event = events.EventOut(id=event_index.id, tags=event_index.tags, imgUrl=event_index.imgUrl, name=event_index.name, description=event_index.description, place=event_index.place, zip_code=event_index.zip_code, city=event_index.city, country=event_index.country, status=event_index.status, start_date=event_index.start_date, end_date=event_index.end_date) event = events.EventOut(
listEvents.append(event) id=event_index.id,
return listEvents tags=event_index.tags,
imgUrl=event_index.imgUrl,
name=event_index.name,
description=event_index.description,
place=event_index.place,
status=event_index.status,
start_date=event_index.start_date,
end_date=event_index.end_date,
)
list_events.append(event)
return list_events
@router.get("/events/me",tags=["events"]) @router.get("/events/me",tags=["events"])
@@ -52,7 +225,7 @@ async def read_users_me(current_user: Annotated[users.User, Depends(users_token.
listOrganizers = [] listOrganizers = []
for event_index in event_repository.find_by({"organizers":{"$eq": current_user.username}}, limit=limit, skip=skip): for event_index in event_repository.find_by({"organizers":{"$eq": current_user.username}}, limit=limit, skip=skip):
event = events.EventOut(id=event_index.id, name=event_index.name, tags=event_index.tags, imgUrl=event_index.imgUrl, description=event_index.description, place=event_index.place, zip_code=event_index.zip_code, city=event_index.city, country=event_index.country, status=event_index.status, start_date=event_index.start_date, end_date=event_index.end_date) event = events.EventOut(id=event_index.id, name=event_index.name, tags=event_index.tags, imgUrl=event_index.imgUrl, description=event_index.description, place=event_index.place, status=event_index.status, start_date=event_index.start_date, end_date=event_index.end_date)
listOrganizers.append(event) listOrganizers.append(event)
content = {"organizers":listOrganizers} content = {"organizers":listOrganizers}
@@ -137,9 +310,6 @@ async def update_events_me(item_id: str, current_user: Annotated[users.User, Dep
event.name = eventSingle.name event.name = eventSingle.name
event.description = eventSingle.description event.description = eventSingle.description
event.place = eventSingle.place event.place = eventSingle.place
event.zip_code = eventSingle.zip_code
event.city = eventSingle.city
event.country = eventSingle.country
event.start_date = eventSingle.start_date event.start_date = eventSingle.start_date
event.tags = eventSingle.tags event.tags = eventSingle.tags
event.end_date = eventSingle.end_date event.end_date = eventSingle.end_date
@@ -169,7 +339,7 @@ async def update_events(authorize: Annotated[bool, Depends(permissions_checker.P
) )
event = events.Event(name=eventSingle.name, description=eventSingle.description, place=eventSingle.place, zip_code=eventSingle.zip_code, city=eventSingle.city, country=eventSingle.country) event = events.Event(name=eventSingle.name, description=eventSingle.description, place=eventSingle.place)
event.start_date = eventSingle.start_date event.start_date = eventSingle.start_date
event.end_date = eventSingle.end_date event.end_date = eventSingle.end_date
event.organizers = eventSingle.organizers event.organizers = eventSingle.organizers
@@ -177,6 +347,7 @@ async def update_events(authorize: Annotated[bool, Depends(permissions_checker.P
event.longitude = eventSingle.longitude event.longitude = eventSingle.longitude
event.imgUrl = eventSingle.imgUrl event.imgUrl = eventSingle.imgUrl
event.tags = eventSingle.tags event.tags = eventSingle.tags
event.status = 1
event.created_at = datetime.today() event.created_at = datetime.today()
event_repository.save(event) event_repository.save(event)
content = {"message": "event is created"} content = {"message": "event is created"}
@@ -203,9 +374,6 @@ async def update_events_id(item_id: str, authorize: Annotated[bool, Depends(perm
event.name = eventSingle.name event.name = eventSingle.name
event.place = eventSingle.place event.place = eventSingle.place
event.description = eventSingle.description event.description = eventSingle.description
event.zip_code = eventSingle.zip_code
event.city = eventSingle.city
event.country = eventSingle.country
event.start_date = eventSingle.start_date event.start_date = eventSingle.start_date
event.end_date = eventSingle.end_date event.end_date = eventSingle.end_date
event.organizers = eventSingle.organizers event.organizers = eventSingle.organizers