[REFORMAT] Ran black reformat
This commit is contained in:
@@ -6,50 +6,63 @@ from typing import List, Optional
|
||||
from modules.auth.dependencies import get_current_user
|
||||
from core.database import get_db
|
||||
from modules.auth.models import User
|
||||
from modules.calendar.schemas import CalendarEventCreate, CalendarEventUpdate, CalendarEventResponse
|
||||
from modules.calendar.service import create_calendar_event, get_calendar_event_by_id, get_calendar_events, update_calendar_event, delete_calendar_event
|
||||
from modules.calendar.schemas import (
|
||||
CalendarEventCreate,
|
||||
CalendarEventUpdate,
|
||||
CalendarEventResponse,
|
||||
)
|
||||
from modules.calendar.service import (
|
||||
create_calendar_event,
|
||||
get_calendar_event_by_id,
|
||||
get_calendar_events,
|
||||
update_calendar_event,
|
||||
delete_calendar_event,
|
||||
)
|
||||
|
||||
router = APIRouter(prefix="/calendar", tags=["calendar"])
|
||||
|
||||
@router.post("/events", response_model=CalendarEventResponse, status_code=status.HTTP_201_CREATED)
|
||||
|
||||
@router.post(
|
||||
"/events", response_model=CalendarEventResponse, status_code=status.HTTP_201_CREATED
|
||||
)
|
||||
def create_event(
|
||||
event: CalendarEventCreate,
|
||||
user: User = Depends(get_current_user),
|
||||
db: Session = Depends(get_db)
|
||||
db: Session = Depends(get_db),
|
||||
):
|
||||
return create_calendar_event(db, user.id, event)
|
||||
|
||||
|
||||
@router.get("/events", response_model=List[CalendarEventResponse])
|
||||
def get_events(
|
||||
user: User = Depends(get_current_user),
|
||||
db: Session = Depends(get_db),
|
||||
start: Optional[datetime] = None,
|
||||
end: Optional[datetime] = None
|
||||
end: Optional[datetime] = None,
|
||||
):
|
||||
return get_calendar_events(db, user.id, start, end)
|
||||
|
||||
|
||||
@router.get("/events/{event_id}", response_model=CalendarEventResponse)
|
||||
def get_event_by_id(
|
||||
event_id: int,
|
||||
user: User = Depends(get_current_user),
|
||||
db: Session = Depends(get_db)
|
||||
event_id: int, user: User = Depends(get_current_user), db: Session = Depends(get_db)
|
||||
):
|
||||
event = get_calendar_event_by_id(db, user.id, event_id)
|
||||
return event
|
||||
|
||||
|
||||
@router.patch("/events/{event_id}", response_model=CalendarEventResponse)
|
||||
def update_event(
|
||||
event_id: int,
|
||||
event: CalendarEventUpdate,
|
||||
user: User = Depends(get_current_user),
|
||||
db: Session = Depends(get_db)
|
||||
db: Session = Depends(get_db),
|
||||
):
|
||||
return update_calendar_event(db, user.id, event_id, event)
|
||||
|
||||
|
||||
@router.delete("/events/{event_id}", status_code=204)
|
||||
def delete_event(
|
||||
event_id: int,
|
||||
user: User = Depends(get_current_user),
|
||||
db: Session = Depends(get_db)
|
||||
event_id: int, user: User = Depends(get_current_user), db: Session = Depends(get_db)
|
||||
):
|
||||
delete_calendar_event(db, user.id, event_id)
|
||||
delete_calendar_event(db, user.id, event_id)
|
||||
|
||||
@@ -1,8 +1,17 @@
|
||||
# modules/calendar/models.py
|
||||
from sqlalchemy import Column, Integer, String, DateTime, ForeignKey, JSON, Boolean # Add Boolean
|
||||
from sqlalchemy import (
|
||||
Column,
|
||||
Integer,
|
||||
String,
|
||||
DateTime,
|
||||
ForeignKey,
|
||||
JSON,
|
||||
Boolean,
|
||||
) # Add Boolean
|
||||
from sqlalchemy.orm import relationship
|
||||
from core.database import Base
|
||||
|
||||
|
||||
class CalendarEvent(Base):
|
||||
__tablename__ = "calendar_events"
|
||||
|
||||
@@ -12,10 +21,12 @@ class CalendarEvent(Base):
|
||||
start = Column(DateTime, nullable=False)
|
||||
end = Column(DateTime)
|
||||
location = Column(String)
|
||||
all_day = Column(Boolean, default=False) # Add all_day column
|
||||
all_day = Column(Boolean, default=False) # Add all_day column
|
||||
tags = Column(JSON)
|
||||
color = Column(String) # hex code for color
|
||||
user_id = Column(Integer, ForeignKey("users.id"), nullable=False) # <-- Relationship
|
||||
color = Column(String) # hex code for color
|
||||
user_id = Column(
|
||||
Integer, ForeignKey("users.id"), nullable=False
|
||||
) # <-- Relationship
|
||||
|
||||
# Bi-directional relationship (for eager loading)
|
||||
user = relationship("User", back_populates="calendar_events")
|
||||
user = relationship("User", back_populates="calendar_events")
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
# modules/calendar/schemas.py
|
||||
from datetime import datetime
|
||||
from pydantic import BaseModel, field_validator # Add field_validator
|
||||
from typing import List, Optional # Add List and Optional
|
||||
from pydantic import BaseModel, field_validator # Add field_validator
|
||||
from typing import List, Optional # Add List and Optional
|
||||
|
||||
|
||||
# Base schema for common fields, including tags
|
||||
class CalendarEventBase(BaseModel):
|
||||
@@ -10,21 +11,23 @@ class CalendarEventBase(BaseModel):
|
||||
start: datetime
|
||||
end: Optional[datetime] = None
|
||||
location: Optional[str] = None
|
||||
color: Optional[str] = None # Assuming color exists
|
||||
all_day: Optional[bool] = None # Add all_day field
|
||||
tags: Optional[List[str]] = None # Add optional tags
|
||||
color: Optional[str] = None # Assuming color exists
|
||||
all_day: Optional[bool] = None # Add all_day field
|
||||
tags: Optional[List[str]] = None # Add optional tags
|
||||
|
||||
@field_validator('tags', mode='before')
|
||||
@field_validator("tags", mode="before")
|
||||
@classmethod
|
||||
def tags_validate_null_string(cls, v):
|
||||
if v == "Null":
|
||||
return None
|
||||
return v
|
||||
|
||||
|
||||
# Schema for creating an event (inherits from Base)
|
||||
class CalendarEventCreate(CalendarEventBase):
|
||||
pass
|
||||
|
||||
|
||||
# Schema for updating an event (all fields optional)
|
||||
class CalendarEventUpdate(BaseModel):
|
||||
title: Optional[str] = None
|
||||
@@ -33,23 +36,24 @@ class CalendarEventUpdate(BaseModel):
|
||||
end: Optional[datetime] = None
|
||||
location: Optional[str] = None
|
||||
color: Optional[str] = None
|
||||
all_day: Optional[bool] = None # Add all_day field
|
||||
tags: Optional[List[str]] = None # Add optional tags for update
|
||||
all_day: Optional[bool] = None # Add all_day field
|
||||
tags: Optional[List[str]] = None # Add optional tags for update
|
||||
|
||||
@field_validator('tags', mode='before')
|
||||
@field_validator("tags", mode="before")
|
||||
@classmethod
|
||||
def tags_validate_null_string(cls, v):
|
||||
if v == "Null":
|
||||
return None
|
||||
return v
|
||||
|
||||
|
||||
# Schema for the response (inherits from Base, adds ID and user_id)
|
||||
class CalendarEventResponse(CalendarEventBase):
|
||||
id: int
|
||||
user_id: int
|
||||
tags: List[str] # Keep as List[str], remove default []
|
||||
tags: List[str] # Keep as List[str], remove default []
|
||||
|
||||
@field_validator('tags', mode='before')
|
||||
@field_validator("tags", mode="before")
|
||||
@classmethod
|
||||
def tags_validate_none_to_list(cls, v):
|
||||
# If the value from the source object (e.g., ORM model) is None,
|
||||
@@ -59,4 +63,4 @@ class CalendarEventResponse(CalendarEventBase):
|
||||
return v
|
||||
|
||||
class Config:
|
||||
from_attributes = True
|
||||
from_attributes = True
|
||||
|
||||
@@ -1,25 +1,34 @@
|
||||
# modules/calendar/service.py
|
||||
from sqlalchemy.orm import Session
|
||||
from sqlalchemy import or_ # Import or_
|
||||
from sqlalchemy import or_ # Import or_
|
||||
from datetime import datetime
|
||||
from modules.calendar.models import CalendarEvent
|
||||
from core.exceptions import not_found_exception
|
||||
from modules.calendar.schemas import CalendarEventCreate, CalendarEventUpdate # Import schemas
|
||||
from modules.calendar.schemas import (
|
||||
CalendarEventCreate,
|
||||
CalendarEventUpdate,
|
||||
) # Import schemas
|
||||
|
||||
|
||||
def create_calendar_event(db: Session, user_id: int, event_data: CalendarEventCreate):
|
||||
# Ensure tags is None if not provided or empty list, matching model
|
||||
tags_to_store = event_data.tags if event_data.tags else None
|
||||
event = CalendarEvent(
|
||||
**event_data.model_dump(exclude={'tags'}), # Use model_dump and exclude tags initially
|
||||
tags=tags_to_store, # Set tags separately
|
||||
user_id=user_id
|
||||
**event_data.model_dump(
|
||||
exclude={"tags"}
|
||||
), # Use model_dump and exclude tags initially
|
||||
tags=tags_to_store, # Set tags separately
|
||||
user_id=user_id,
|
||||
)
|
||||
db.add(event)
|
||||
db.commit()
|
||||
db.refresh(event)
|
||||
return event
|
||||
|
||||
def get_calendar_events(db: Session, user_id: int, start: datetime | None, end: datetime | None):
|
||||
|
||||
def get_calendar_events(
|
||||
db: Session, user_id: int, start: datetime | None, end: datetime | None
|
||||
):
|
||||
"""
|
||||
Retrieves calendar events for a user, optionally filtered by a date range.
|
||||
|
||||
@@ -46,9 +55,13 @@ def get_calendar_events(db: Session, user_id: int, start: datetime | None, end:
|
||||
query = query.filter(
|
||||
or_(
|
||||
# Case 1: Event has duration and overlaps
|
||||
(CalendarEvent.end is not None) & (CalendarEvent.start < end) & (CalendarEvent.end > start),
|
||||
(CalendarEvent.end is not None)
|
||||
& (CalendarEvent.start < end)
|
||||
& (CalendarEvent.end > start),
|
||||
# Case 2: Event is a point event within the range
|
||||
(CalendarEvent.end is None) & (CalendarEvent.start >= start) & (CalendarEvent.start < end)
|
||||
(CalendarEvent.end is None)
|
||||
& (CalendarEvent.start >= start)
|
||||
& (CalendarEvent.start < end),
|
||||
)
|
||||
)
|
||||
# If only start is provided, filter events starting on or after start
|
||||
@@ -60,37 +73,41 @@ def get_calendar_events(db: Session, user_id: int, start: datetime | None, end:
|
||||
elif end:
|
||||
# Includes events with duration ending <= end (or starting before end if end is None)
|
||||
# Includes point events occurring < end
|
||||
query = query.filter(
|
||||
query = query.filter(
|
||||
or_(
|
||||
# Event ends before the specified end time
|
||||
(CalendarEvent.end is not None) & (CalendarEvent.end <= end),
|
||||
# Point event occurs before the specified end time
|
||||
(CalendarEvent.end is None) & (CalendarEvent.start < end)
|
||||
(CalendarEvent.end is None) & (CalendarEvent.start < end),
|
||||
)
|
||||
)
|
||||
# Alternative interpretation for "ending before end": include events that *start* before end
|
||||
# query = query.filter(CalendarEvent.start < end)
|
||||
# Alternative interpretation for "ending before end": include events that *start* before end
|
||||
# query = query.filter(CalendarEvent.start < end)
|
||||
|
||||
return query.order_by(CalendarEvent.start).all() # Order by start time
|
||||
|
||||
return query.order_by(CalendarEvent.start).all() # Order by start time
|
||||
|
||||
def get_calendar_event_by_id(db: Session, user_id: int, event_id: int):
|
||||
event = db.query(CalendarEvent).filter(
|
||||
CalendarEvent.id == event_id,
|
||||
CalendarEvent.user_id == user_id
|
||||
).first()
|
||||
event = (
|
||||
db.query(CalendarEvent)
|
||||
.filter(CalendarEvent.id == event_id, CalendarEvent.user_id == user_id)
|
||||
.first()
|
||||
)
|
||||
if not event:
|
||||
raise not_found_exception()
|
||||
return event
|
||||
|
||||
def update_calendar_event(db: Session, user_id: int, event_id: int, event_data: CalendarEventUpdate):
|
||||
event = get_calendar_event_by_id(db, user_id, event_id) # Reuse get_by_id for check
|
||||
|
||||
def update_calendar_event(
|
||||
db: Session, user_id: int, event_id: int, event_data: CalendarEventUpdate
|
||||
):
|
||||
event = get_calendar_event_by_id(db, user_id, event_id) # Reuse get_by_id for check
|
||||
# Use model_dump with exclude_unset=True to only update provided fields
|
||||
update_data = event_data.model_dump(exclude_unset=True)
|
||||
|
||||
for key, value in update_data.items():
|
||||
# Ensure tags is handled correctly (set to None if empty list provided)
|
||||
if key == 'tags' and isinstance(value, list) and not value:
|
||||
if key == "tags" and isinstance(value, list) and not value:
|
||||
setattr(event, key, None)
|
||||
else:
|
||||
setattr(event, key, value)
|
||||
@@ -99,7 +116,8 @@ def update_calendar_event(db: Session, user_id: int, event_id: int, event_data:
|
||||
db.refresh(event)
|
||||
return event
|
||||
|
||||
|
||||
def delete_calendar_event(db: Session, user_id: int, event_id: int):
|
||||
event = get_calendar_event_by_id(db, user_id, event_id) # Reuse get_by_id for check
|
||||
event = get_calendar_event_by_id(db, user_id, event_id) # Reuse get_by_id for check
|
||||
db.delete(event)
|
||||
db.commit()
|
||||
db.commit()
|
||||
|
||||
Reference in New Issue
Block a user