Compare commits

..

15 Commits
1.2.5 ... 1.3.2

Author SHA1 Message Date
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
2 changed files with 312 additions and 29 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

@@ -6,12 +6,13 @@ from ..models import events, users
from pydantic import EmailStr from pydantic import EmailStr
from typing import Annotated from typing import Annotated
from bson import ObjectId from bson import ObjectId
from datetime import datetime
router = APIRouter() router = APIRouter()
@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 = 1, 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):
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,
@@ -21,28 +22,163 @@ async def read_events(authorize: Annotated[bool, Depends(permissions_checker.Per
listEvents = [] listEvents = []
event_repository = events.EventRepository(database=database.database) event_repository = events.EventRepository(database=database.database)
object_search = {} object_search = {}
date_selected: bool = False
if date_event is not None:
start_of_day = datetime.combine(date_event, datetime.min.time()) # 2024-11-23 00:00:00
end_of_day = datetime.combine(date_event, datetime.max.time())
date_selected = True
if start_date is not None and end_date is not None:
start_of_day = datetime.combine(start_date, datetime.min.time()) # 2024-11-23 00:00:00
end_of_day = datetime.combine(end_date, datetime.max.time())
date_selected = True
if current_datetime is not None:
object_search ={
"$or": [{"start_date": {"$gte": current_datetime}}, # Upcoming events
{"$and": [ # Ongoing events
{"start_date": {"$lte": current_datetime}}, # Already started
{"$or": [
{"end_date": {"$gte": current_datetime}}, # End date in the future
{"end_date": None} # No end date set
]}
]}
]
}
if date_selected is True:
object_search ={
"$and": [{"start_date": {"$gte": start_of_day}},
{"start_date": {"$lte": end_of_day}} # Upcoming events
]
}
if status is not 1: if status is not 1:
object_search = {"status":{"$eq": status}} object_search = {"status":{"$eq": status}}
if current_datetime is not None:
object_search = { "$and": [ {"status":{"$eq": status}},
{
"$or": [
{"start_date": {"$gte": current_datetime}}, # Upcoming events
{"$and": [ # Ongoing events
{"start_date": {"$lte": current_datetime}}, # Already started
{"$or": [
{"end_date": {"$gte": current_datetime}}, # End date in the future
{"end_date": None} # No end date set
]}
]}
]
}
]}
if date_selected is True:
object_search = { "$and": [ {"status":{"$eq": status}},
{"start_date": {"$gte": start_of_day}},
{"start_date": {"$lte": end_of_day}}
]}
if tags is not None: if tags is not None:
object_search = {"$and":[{"tags":{"$eq": tags}}, {"status":{"$eq":status}}]} object_search = {"$and":[{"tags":{"$eq": tags}}, {"status":{"$eq":status}}]}
if current_datetime is not None:
object_search = {"$and":[{"tags":{"$eq": tags}},
{"status":{"$eq":status}},
{
"$or": [
{"start_date": {"$gte": current_datetime}}, # Upcoming events
{"$and": [ # Ongoing events
{"start_date": {"$lte": current_datetime}}, # Already started
{"$or": [
{"end_date": {"$gte": current_datetime}}, # End date in the future
{"end_date": None} # No end date set
]}
]}
]
}
]
}
if date_selected is True:
object_search = {"$and":[{"tags":{"$eq": tags}},
{"status":{"$eq":status}},
{"start_date": {"$gte": start_of_day}},
{"start_date": {"$lte": end_of_day}}
]
}
if organizers is not None: if organizers is not None:
object_search = {"$and":[{"organizers":{"$eq": organizers}}, {"status":{"$eq":status}}]} object_search = {"$and":[{"organizers":{"$eq": organizers}}, {"status":{"$eq":status}}]}
if current_datetime is not None:
object_search = {"$and":[{"organizers":{"$eq": organizers}},
{"status":{"$eq":status}},
{
"$or": [
{"start_date": {"$gte": current_datetime}}, # Upcoming events
{"$and": [ # Ongoing events
{"start_date": {"$lte": current_datetime}}, # Already started
{"$or": [
{"end_date": {"$gte": current_datetime}}, # End date in the future
{"end_date": None} # No end date set
]}
]}
]
}
]}
if date_selected is True:
object_search = {"$and":[{"organizers":{"$eq": organizers}},
{"status":{"$eq":status}},
{"start_date": {"$gte": start_of_day}},
{"start_date": {"$lte": end_of_day}}
]}
if id_event is not None: if id_event is not None:
eventid = ObjectId(id_event) eventid = ObjectId(id_event)
object_search = {"$and":[{"id":{"$regex": eventid}}, {"status":{"$eq":status}}]} object_search = {"$and":[{"id":{"$regex": eventid}}, {"status":{"$eq":status}}]}
if current_datetime is not None:
object_search = {"$and":[{"id":{"$regex": eventid}},
{"status":{"$eq":status}},
{
"$or": [
{"start_date": {"$gte": current_datetime}}, # Upcoming events
{"$and": [ # Ongoing events
{"start_date": {"$lte": current_datetime}}, # Already started
{"$or": [
{"end_date": {"$gte": current_datetime}}, # End date in the future
{"end_date": None} # No end date set
]}
]}
]
}
]}
if date_selected is True:
object_search = {"$and":[{"id":{"$regex": eventid}},
{"status":{"$eq":status}},
{"start_date": {"$gte": start_of_day}},
{"start_date": {"$lte": end_of_day}}
]}
if name is not None: if name is not None:
object_search = {"$and":[{"name":{"$regex": name}}, {"status":{"$eq":status}}]} object_search = {"$and":[{"name":{"$regex": name, '$options': 'i'}}, {"status":{"$eq":status}}]}
if current_datetime is not None:
object_search = {"$and":[{"name":{"$regex": name, '$options': 'i'}},
{"status":{"$eq":status}},
{
"$or": [
{"start_date": {"$gte": current_datetime}}, # Upcoming events
{"$and": [ # Ongoing events
{"start_date": {"$lte": current_datetime}}, # Already started
{"$or": [
{"end_date": {"$gte": current_datetime}}, # End date in the future
{"end_date": None} # No end date set
]}
]}
]
}
]}
if date_selected is True:
object_search = {"$and":[{"name":{"$regex": name, '$options': 'i'}},
{"status":{"$eq":status}},
{"start_date": {"$gte": start_of_day}},
{"start_date": {"$lte": end_of_day}}
]}
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(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)
listEvents.append(event) listEvents.append(event)
return listEvents return listEvents
@router.get("/events/search", tags=["events"], response_model=list[events.EventOut]) @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: str | None = None, status: int = 1, min_lat: float | None = None, max_lat: float | None = None, min_lon: float | None = None, max_lon: float | None = None): async def search_events(authorize: Annotated[bool, Depends(permissions_checker.PermissionChecker(roles=["Admin", "User"]))], skip: int = 0, limit: int = 20, item: str | None = None, status: int = 1, min_lat: float | None = None, max_lat: float | None = None, min_lon: float | None = None, max_lon: float | None = None, current_datetime: datetime | None = None, date_event: datetime | None = None, start_date: datetime | None = None, end_date: datetime | None = None):
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,
@@ -52,6 +188,15 @@ async def search_events(authorize: Annotated[bool, Depends(permissions_checker.P
listEvents = [] listEvents = []
event_repository = events.EventRepository(database=database.database) event_repository = events.EventRepository(database=database.database)
object_search = {} object_search = {}
date_selected: bool = False
if date_event is not None:
start_of_day = datetime.combine(date_event, datetime.min.time()) # 2024-11-23 00:00:00
end_of_day = datetime.combine(date_event, datetime.max.time())
date_selected = True
if start_date is not None and end_date is not None:
start_of_day = datetime.combine(start_date, datetime.min.time()) # 2024-11-23 00:00:00
end_of_day = datetime.combine(end_date, datetime.max.time())
date_selected = True
if min_lat is not None and max_lat is not None and min_lon is not None and max_lon is not None: if min_lat is not None and max_lat is not None and min_lon is not None and max_lon is not None:
object_search = { object_search = {
"$and": [ "$and": [
@@ -70,27 +215,117 @@ async def search_events(authorize: Annotated[bool, Depends(permissions_checker.P
} }
] ]
} }
if current_datetime is not None:
object_search = {
"$and": [
{"status": {"$eq": status}},
{
"latitude": {"$gte": min_lat}, # Minimum latitude
},
{
"latitude": {"$lte": max_lat}, # Maximum latitude
},
{
"longitude": {"$gte": min_lon}, # Minimum longitude
},
{
"longitude": {"$lte": max_lon}, # Maximum longitude
},
{
"$or": [
{"start_date": {"$gte": current_datetime}}, # Upcoming events
{"$and": [ # Ongoing events
{"start_date": {"$lte": current_datetime}}, # Already started
{"$or": [
{"end_date": {"$gte": current_datetime}}, # End date in the future
{"end_date": None} # No end date set
]}
]}
]
}
]
}
if date_selected is True:
object_search = {
"$and": [
{"status": {"$eq": status}},
{
"latitude": {"$gte": min_lat}, # Minimum latitude
},
{
"latitude": {"$lte": max_lat}, # Maximum latitude
},
{
"longitude": {"$gte": min_lon}, # Minimum longitude
},
{
"longitude": {"$lte": max_lon}, # Maximum longitude
},
{"start_date": {"$gte": start_of_day}},
{"start_date": {"$lte": end_of_day}}
]
}
if item is not None: if item is not None:
object_search = { object_search = {
"$and": [ "$and": [
{ {
"$or": [ "$or": [
{"name": {"$regex": item}}, {"name": {"$regex": item, "$options": 'i'}},
{"tags": {"$regex": item}}, {"tags": {"$regex": item}},
{"organizers": {"$regex": item}} {"organizers": {"$regex": item, "$options": 'i'}}
] ]
}, },
{"status": {"$eq": status}} {"status": {"$eq": status}}
] ]
} }
if current_datetime is not None:
object_search = {
"$and": [
{
"$or": [
{"name": {"$regex": item, "$options": 'i'}},
{"tags": {"$regex": item}},
{"organizers": {"$regex": item, "$options": 'i'}}
]
},
{"status": {"$eq": status}},
{
"$or": [
{"start_date": {"$gte": current_datetime}}, # Upcoming events
{"$and": [ # Ongoing events
{"start_date": {"$lte": current_datetime}}, # Already started
{"$or": [
{"end_date": {"$gte": current_datetime}}, # End date in the future
{"end_date": None} # No end date set
]}
]}
]
}
]
}
if date_selected is True:
object_search = {
"$and": [
{
"$or": [
{"name": {"$regex": item, "$options": 'i'}},
{"tags": {"$regex": item}},
{"organizers": {"$regex": item, "$options": 'i'}}
]
},
{"status": {"$eq": status}},
{"start_date": {"$gte": start_of_day}},
{"start_date": {"$lte": end_of_day}}
]
}
if min_lat is not None and max_lat is not None and min_lon is not None and max_lon is not None: if min_lat is not None and max_lat is not None and min_lon is not None and max_lon is not None:
object_search = { object_search = {
"$and": [ "$and": [
{ {
"$or": [ "$or": [
{"name": {"$regex": item}}, {"name": {"$regex": item, "$options": 'i'}},
{"tags": {"$regex": item}}, {"tags": {"$regex": item}},
{"organizers": {"$regex": item}} {"organizers": {"$regex": item, "$options": 'i'}}
] ]
}, },
{"status": {"$eq": status}}, {"status": {"$eq": status}},
@@ -108,9 +343,72 @@ async def search_events(authorize: Annotated[bool, Depends(permissions_checker.P
} }
] ]
} }
if current_datetime is not None:
object_search = {
"$and": [
{
"$or": [
{"name": {"$regex": item, "$options": 'i'}},
{"tags": {"$regex": item}},
{"organizers": {"$regex": item, "$options": 'i'}}
]
},
{"status": {"$eq": status}},
{
"latitude": {"$gte": min_lat}, # Minimum latitude
},
{
"latitude": {"$lte": max_lat}, # Maximum latitude
},
{
"longitude": {"$gte": min_lon}, # Minimum longitude
},
{
"longitude": {"$lte": max_lon}, # Maximum longitude
},
{
"$or": [
{"start_date": {"$gte": current_datetime}}, # Upcoming events
{"$and": [ # Ongoing events
{"start_date": {"$lte": current_datetime}}, # Already started
{"$or": [
{"end_date": {"$gte": current_datetime}}, # End date in the future
{"end_date": None} # No end date set
]}
]}
]
}
]
}
if date_selected is True:
object_search = {
"$and": [
{
"$or": [
{"name": {"$regex": item, "$options": 'i'}},
{"tags": {"$regex": item}},
{"organizers": {"$regex": item, "$options": 'i'}}
]
},
{"status": {"$eq": status}},
{
"latitude": {"$gte": min_lat}, # Minimum latitude
},
{
"latitude": {"$lte": max_lat}, # Maximum latitude
},
{
"longitude": {"$gte": min_lon}, # Minimum longitude
},
{
"longitude": {"$lte": max_lon}, # Maximum longitude
},
{"start_date": {"$gte": start_of_day}},
{"start_date": {"$lte": end_of_day}}
]
}
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(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)
listEvents.append(event) listEvents.append(event)
return listEvents return listEvents
@@ -121,7 +419,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}
@@ -206,9 +504,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
@@ -238,7 +533,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
@@ -273,9 +568,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