from datetime import datetime from .. import db from werkzeug.security import generate_password_hash, check_password_hash class User(db.Model): __tablename__ = "users" id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(64), unique=True, nullable=False) email = db.Column(db.String(120), unique=True, nullable=False) password_hash = db.Column(db.String(256), nullable=False) created_at = db.Column(db.DateTime, default=datetime.utcnow) # Profile fields avatar = db.Column(db.Text, nullable=True) # base64 data-url gender = db.Column(db.String(32), nullable=True) working_status = db.Column(db.String(64), nullable=True) dob = db.Column(db.String(10), nullable=True) # YYYY-MM-DD string bio = db.Column(db.String(500), nullable=True) is_anonymous = db.Column(db.Boolean, default=False) assessments = db.relationship("Assessment", backref="user", lazy=True) def set_password(self, password: str) -> None: self.password_hash = generate_password_hash(password) def check_password(self, password: str) -> bool: return check_password_hash(self.password_hash, password) def to_dict(self): return { "id": self.id, "username": self.username if not self.is_anonymous else "Anonymous", "email": self.email, "created_at": self.created_at.isoformat(), "avatar": self.avatar, "gender": self.gender, "working_status": self.working_status, "dob": self.dob, "bio": self.bio, "is_anonymous": self.is_anonymous, "display_name": self.username, # always the real name for the owner }