diff --git a/app/database/models.py b/app/database/models.py index a9885d37..816e7c8b 100644 --- a/app/database/models.py +++ b/app/database/models.py @@ -72,6 +72,7 @@ class Event(Base): is_google_event = Column(Boolean, default=False) vc_link = Column(String) color = Column(String, nullable=True) + all_day = Column(Boolean, default=False) invitees = Column(String) emotion = Column(String, nullable=True) availability = Column(Boolean, default=True, nullable=False) diff --git a/app/locales/en/LC_MESSAGES/base.mo b/app/locales/en/LC_MESSAGES/base.mo index cabeb8c0..a2af11c0 100644 Binary files a/app/locales/en/LC_MESSAGES/base.mo and b/app/locales/en/LC_MESSAGES/base.mo differ diff --git a/app/locales/he/LC_MESSAGES/base.mo b/app/locales/he/LC_MESSAGES/base.mo index 40170b4a..2233662f 100644 Binary files a/app/locales/he/LC_MESSAGES/base.mo and b/app/locales/he/LC_MESSAGES/base.mo differ diff --git a/app/routers/dayview.py b/app/routers/dayview.py index 23157df1..7887a151 100644 --- a/app/routers/dayview.py +++ b/app/routers/dayview.py @@ -104,11 +104,27 @@ def _check_multiday_event(self) -> Tuple[bool]: return (start_multiday, end_multiday) -def event_in_day(event: Event, day: datetime, day_end: datetime) -> bool: +def is_specific_time_event_in_day( + event: Event, day: datetime, day_end: datetime +) -> bool: + if event.all_day: + return False return ( - (event.start >= day and event.start < day_end) or - (event.end >= day and event.end < day_end) or - (event.start < day_end < event.end) + (event.start >= day and event.start < day_end) + or (event.end >= day and event.end < day_end) + or (event.start < day_end < event.end) + ) + + +def is_all_day_event_in_day( + event: Event, day: datetime, day_end: datetime +) -> bool: + if not event.all_day: + return False + return ( + (event.start >= day and event.start < day_end) + or (event.end >= day and event.end < day_end) + or (event.start < day_end < event.end) ) @@ -118,16 +134,28 @@ def get_events_and_attributes( events = get_all_user_events(session, user_id) day_end = day + timedelta(hours=24) for event in events: - if event_in_day(event=event, day=day, day_end=day_end): + if is_specific_time_event_in_day( + event=event, day=day, day_end=day_end + ): yield (event, DivAttributes(event, day)) +def get_all_day_events( + day: datetime, session, user_id: int, +) -> Event: + events = get_all_user_events(session, user_id) + day_end = day + timedelta(hours=24) + for event in events: + if is_all_day_event_in_day(event=event, day=day, day_end=day_end): + yield (event) + + @router.get('/day/{date}', include_in_schema=False) async def dayview( request: Request, date: str, session=Depends(get_db), view='day', ): # TODO: add a login session - user = session.query(User).filter_by(username='test_username').first() + user = session.query(User).first() try: day = datetime.strptime(date, '%Y-%m-%d') except ValueError as err: @@ -136,10 +164,14 @@ async def dayview( events_n_attrs = get_events_and_attributes( day=day, session=session, user_id=user.id, ) + all_day_events = get_all_day_events( + day=day, session=session, user_id=user.id, + ) month = day.strftime("%B").upper() return templates.TemplateResponse("dayview.html", { "request": request, "events": events_n_attrs, + "all_day_events": all_day_events, "month": month, "day": day.day, "zodiac": zodiac_obj, diff --git a/app/routers/event.py b/app/routers/event.py index 00303f9d..b7bc1a9a 100644 --- a/app/routers/event.py +++ b/app/routers/event.py @@ -31,6 +31,7 @@ 'start': dt, 'end': dt, 'availability': bool, + 'all_day': bool, 'is_google_event': bool, 'content': (str, type(None)), 'location': (str, type(None)), @@ -94,6 +95,8 @@ async def create_new_event(request: Request, owner_id = get_current_user(session).id availability = data.get('availability', 'True') == 'True' location = data['location'] + all_day = data['event_type'] and data['event_type'] == 'on' + vc_link = data['vc_link'] category_id = data.get('category_id') is_google_event = data.get('is_google_event', 'True') == 'True' @@ -106,7 +109,7 @@ async def create_new_event(request: Request, raise_if_zoom_link_invalid(vc_link) event = create_event(db=session, title=title, start=start, end=end, - owner_id=owner_id, content=content, + owner_id=owner_id, all_day=all_day, content=content, location=location, vc_link=vc_link, invitees=invited_emails, category_id=category_id, @@ -123,12 +126,16 @@ async def create_new_event(request: Request, async def eventview(request: Request, event_id: int, db: Session = Depends(get_db)) -> Response: event, comments, end_format = get_event_data(db, event_id) + start_format = START_FORMAT + if event.all_day: + start_format = '%A, %d/%m/%Y' + end_format = "" messages = request.query_params.get('messages', '').split("---") return templates.TemplateResponse("event/eventview.html", {"request": request, "event": event, "comments": comments, - "start_format": START_FORMAT, + "start_format": start_format, "end_format": end_format, "messages": messages}) @@ -267,6 +274,7 @@ def update_event(event_id: int, event: Dict, db: Session def create_event(db: Session, title: str, start, end, owner_id: int, + all_day: bool = False, content: Optional[str] = None, location: Optional[str] = None, vc_link: str = None, @@ -292,6 +300,7 @@ def create_event(db: Session, title: str, start, end, owner_id: int, color=color, emotion=get_emotion(title, content), invitees=invitees_concatenated, + all_day=all_day, category_id=category_id, availability=availability, is_google_event=is_google_event diff --git a/app/templates/dayview.html b/app/templates/dayview.html index b8eefd73..8270c9f9 100644 --- a/app/templates/dayview.html +++ b/app/templates/dayview.html @@ -23,6 +23,11 @@ {{day}} / {{month}} {% endif %} +
{{ event.title }}
+ {% endfor %} +