from typing import List, Optional from typing import TYPE_CHECKING, Optional from uuid import UUID import uuid from sqlmodel import Field, SQLModel, Relationship from pydantic import validator, BaseModel from services.password import validate_password from services.schema import as_form if TYPE_CHECKING: from database.exercices.models import Exercice, Tag from database.room.models import Member class UserBase(SQLModel): username: str = Field(max_length=20, index= True) firstname: Optional[str] name: Optional[str] email: Optional[str] class User(UserBase, table=True): id: Optional[int] = Field(default=None, primary_key=True) clientId: Optional[UUID] = Field(default=uuid.uuid4(), index=True) hashed_password: str exercices: List['Exercice'] = Relationship(back_populates='author') tags: List['Tag'] = Relationship(back_populates='author') members: List["Member"] = Relationship(back_populates='user') @as_form class UserEdit(UserBase): pass class UserRead(UserBase): id: int @as_form class UserRegister(BaseModel): username: str = Field(max_length=20) password: str password_confirm: str @validator('password') def password_validation(cls, v): is_valid = validate_password(v) if is_valid != True: raise ValueError(is_valid) return v @validator('password_confirm') def password_match(cls, v, values): if 'password' in values and v != values['password']: raise ValueError('Les mots de passe ne correspondent pas') return v @as_form class PasswordSet(BaseModel): old_password: str password: str password_confirm: str @validator('password') def password_validation(cls, v): is_valid = validate_password(v) if is_valid != True: raise ValueError(is_valid) return v @validator('password_confirm') def password_match(cls, v, values): if 'password' in values and v != values['password']: raise ValueError('Les mots de passe ne correspondent pas') return v