64 lines
No EOL
1.6 KiB
Python
64 lines
No EOL
1.6 KiB
Python
from datetime import datetime, timedelta
|
|
from pydantic import BaseModel
|
|
from typing import Optional
|
|
from typing import List, Optional
|
|
from datetime import datetime, timedelta, timezone
|
|
|
|
class Config:
|
|
orm_mode = True
|
|
json_encoders = {
|
|
datetime: lambda v: v.astimezone(timezone.utc).isoformat(timespec='microseconds').replace('+00:00', 'Z')
|
|
}
|
|
|
|
class UserBase(BaseModel):
|
|
name: str
|
|
|
|
class UserCreate(UserBase):
|
|
name: str
|
|
password: Optional[str] = None # Make the password optional
|
|
|
|
class User(BaseModel):
|
|
name: str
|
|
|
|
class Config:
|
|
from_attributes = True
|
|
|
|
class TimeEntry(BaseModel):
|
|
clock_in: datetime | None
|
|
clock_out: datetime | None
|
|
clock_in_note: str | None
|
|
clock_out_note: str | None
|
|
|
|
class Config:
|
|
from_attributes = True
|
|
|
|
class DailyTime(BaseModel):
|
|
date: str
|
|
clock_in: TimeEntry
|
|
clock_out: TimeEntry
|
|
total_time: str # New field to represent the total time worked that day
|
|
|
|
class TimeEntryResponse(BaseModel):
|
|
date: str
|
|
clock_in: Optional[datetime]
|
|
clock_out: Optional[datetime]
|
|
total_time: str
|
|
|
|
class Config:
|
|
orm_mode = True
|
|
json_encoders = {
|
|
datetime: lambda v: v.isoformat()
|
|
}
|
|
|
|
class PeriodSummary(BaseModel):
|
|
total_hours: float
|
|
days_worked: int
|
|
entries: List[TimeEntryResponse]
|
|
|
|
class Message(BaseModel):
|
|
message: str
|
|
|
|
class EditClockTimes(BaseModel):
|
|
date: str # Keep as string since we're using it to query
|
|
clock_in_time: Optional[str] = None # Expect ISO datetime string
|
|
clock_out_time: Optional[str] = None |