File size: 1,881 Bytes
5121000
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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
        }