Files
classquiz-ai/classquiz/db/models.py
T
2022-06-11 16:48:24 +02:00

150 lines
3.6 KiB
Python

import uuid
from datetime import datetime
from typing import Optional
import ormar
from pydantic import BaseModel, Json
from enum import Enum
from . import metadata, database
class UserAuthTypes(Enum):
LOCAL = "LOCAL"
GOOGLE = "GOOGLE"
GITHUB = "GITHUB"
class User(ormar.Model):
"""
The user model in the database
"""
id: uuid.UUID = ormar.UUID(primary_key=True, default=uuid.uuid4())
email: str = ormar.String(unique=True, max_length=100)
username: str = ormar.String(unique=True, max_length=100)
password: Optional[str] = ormar.String(max_length=100, nullable=True)
verified: bool = ormar.Boolean(default=False)
verify_key: str = ormar.String(unique=True, max_length=100, nullable=True)
created_at: datetime = ormar.DateTime(default=datetime.now())
auth_type: UserAuthTypes = ormar.Enum(enum_class=UserAuthTypes, default=UserAuthTypes.LOCAL)
google_uid: Optional[str] = ormar.String(unique=True, max_length=255, nullable=True)
class Meta:
tablename = "users"
metadata = metadata
database = database
class Config:
use_enum_values = True
class UserSession(ormar.Model):
"""
The user session model for user-sessions
"""
id: uuid.UUID = ormar.UUID(primary_key=True, default=uuid.uuid4())
user: Optional[User] = ormar.ForeignKey(User)
session_key: str = ormar.String(unique=True, max_length=64)
created_at: datetime = ormar.DateTime(default=datetime.now())
ip_address: str = ormar.String(max_length=100, nullable=True)
user_agent: str = ormar.String(max_length=255, nullable=True)
last_seen: datetime = ormar.DateTime(default=datetime.now())
class Meta:
tablename = "user_sessions"
metadata = metadata
database = database
class QuizAnswer(BaseModel):
right: bool
answer: str
class QuizQuestion(BaseModel):
question: str
time: str # in Secs
answers: list[QuizAnswer]
image: str | None = None
class QuizInput(BaseModel):
public: bool = False
title: str
description: str
questions: list[QuizQuestion]
class Quiz(ormar.Model):
id: uuid.UUID = ormar.UUID(primary_key=True, default=uuid.uuid4(), nullable=False, unique=True)
public: bool = ormar.Boolean(default=False)
title: str = ormar.String(max_length=100)
description: str = ormar.String(max_length=300, nullable=True)
created_at: datetime = ormar.DateTime(default=datetime.now())
updated_at: datetime = ormar.DateTime(default=datetime.now())
user_id: uuid.UUID = ormar.ForeignKey(User)
questions: Json[list[QuizQuestion]] = ormar.JSON(nullable=False)
imported_from_kahoot: Optional[bool] = ormar.Boolean(default=False, nullable=True)
class Meta:
tablename = "quiz"
metadata = metadata
database = database
class Token(BaseModel):
"""
For JWT
"""
access_token: str
token_type: str
class TokenData(BaseModel):
"""
For JWT
"""
email: str | None = None
class PlayGame(BaseModel):
quiz_id: uuid.UUID | str
description: str
title: str
questions: list[QuizQuestion]
game_id: uuid.UUID
game_pin: str
started: bool = False
captcha_enabled: bool = False
class GamePlayer(BaseModel):
username: str
sid: str
class GameAnser2(BaseModel):
username: str
right: bool
answer: str
class GameAnser1(BaseModel):
id: int
answers: list[GameAnser2]
class GameSession(BaseModel):
admin: str
game_id: str
players: list[GamePlayer | None]
answers: list[GameAnser1 | None]
class UpdatePassword(BaseModel):
old_password: str
new_password: str