Select Git revision
schemas.py 4.27 KiB
"""
Pydantic schemas for the magasin app
"""
from typing import List, Optional
from datetime import datetime, timedelta, time
from pydantic import BaseModel, Field
# Records data structure
class RecordBase(BaseModel):
"""Records base schema"""
place: str = Field(...,
title="Name of the RU corresponding the given record")
date: datetime = Field(..., title="Date of the record")
density: float = Field(..., title="Estimated density of people")
waiting_time: Optional[timedelta] = Field(
title="Estimated waiting time for people coming at this date")
class Record(RecordBase):
"""Database records base schema"""
id: int
class Config:
orm_mode = True
class RecordRead(BaseModel):
""" Data structure for record in graph """
name: int
time: int
class CollaborativeRecords(BaseModel):
"""CollaborativeRecords schema"""
user_id: Optional[int] = Field(default=None, title="Id of the user timed")
place: str = Field(..., title="Name of the RU corresponding the given record")
date: datetime = Field(..., title="Date of the record")
waiting_time: Optional[timedelta] = Field(default=None, title="Caculated waiting time for timed person")
# Comments Data structure
class CommentBase(BaseModel):
"""Comments base schema"""
content: str = Field(..., title="Content of the comment posted")
class Comment(CommentBase):
"""Comments reading schema"""
id: int
username: str = Field(..., title="Name of the user posting the comment")
published_at: datetime = Field(..., title="Publication date of the comment")
place: str = Field(..., title="Name of the RU corresponding the comment")
class Config:
orm_mode = True
# News data structure
class NewsBase(BaseModel):
"""News sql table model"""
title: str = Field(..., title="Title of the news")
content: str = Field(..., title="Content of the news")
end_date: datetime = Field(..., title="End date to display the news")
place: str = Field(..., title="Name of the RU corresponding the news")
class News(NewsBase):
"""Database news base schema"""
id: int
published_at: datetime = Field(..., title="Publication date of the news")
class Config:
orm_mode = True
# Stats data structure
class WaitingTime(BaseModel):
"""Waiting time schema for reading"""
status: bool = Field(default=False, title="Status of the restaurant for the current hour")
waiting_time: Optional[timedelta] = Field(default=None, title="Waiting time for the restaurant")
next_timetable: Optional[str] = Field(default=None, title="Next time the restaurant will be open")
class OpeningHoursBase(BaseModel):
"""Database opening_hours base schema"""
place: str = Field(...,
title="Name of the RU corresponding the given record")
day: int = Field(..., title="Day of the week")
open_time: time = Field(..., title="Opening time")
close_time: time = Field(..., title="Closing time")
class OpeningHours(OpeningHoursBase):
"""Database opening_hours base schema"""
id: int
class Config:
orm_mode = True
class ClosureBase(BaseModel):
""" Closure schema base """
place: str = Field(..., title="Name of the restaurant")
beginning_date: datetime = Field(..., title="Beginning date of closure")
end_date: datetime = Field(..., title="Ending date of closure")
class Closure(ClosureBase):
""" Closure schema """
id: int
class Config:
orm_mode = True
class Restaurant(BaseModel):
"""Restaurant schema for reading"""
name: str
status: bool
waiting_time: Optional[timedelta] = Field(default=None, title="Waiting time for the restaurant")
timetable: str
class Graph(BaseModel):
""" Data structure for current graph display """
data: List[RecordRead] = Field(title="Last records list for the restaurant")
start: Optional[int] = Field(default=None, title="Opening of the RU")
end: Optional[int] = Field(default=None, title="Closure of the RU")
# User data structure
class User(BaseModel):
"""Database user base schema"""
id: int
state: str
username: str
cookie: str
expiration_date: datetime
admin: Optional[bool] = Field(default=False, title="Set to true to allow access to the admin interface")