from datetime import date, datetime from app import db, login from flask_login import UserMixin from werkzeug.security import generate_password_hash, check_password_hash from app.models.contents import Content class User(UserMixin, db.Model): __tablename__ = 'user' id = db.Column(db.Integer, primary_key=True) type = db.Column(db.String(20)) __mapper_args__ = { 'polymorphic_identity': __tablename__, 'polymorphic_on': type } contents = db.relationship('Content', back_populates="author") # TODO: add good relation def __repr__(self): return f'' class Member(User, db.Model): __tablename__ = 'member' id = db.Column(db.Integer, db.ForeignKey('user.id'), primary_key=True) __mapper_args__ = { 'polymorphic_identity': __tablename__ } # Standalone properties username = db.Column(db.Unicode(64), index=True, unique=True) email = db.Column(db.String(120), index=True, unique=True) password_hash = db.Column(db.String(255)) xp_points = db.Column(db.Integer) innovation_points = db.Column(db.Integer) biography = db.Column(db.Text(convert_unicode=True)) signature = db.Column(db.Text(convert_unicode=True)) birthday = db.Column(db.Date) register_date = db.Column(db.Date, default=date.today) # Relations #trophies = db.relationship('Trophy') # TODO: add good relation #tests = db.relationship('Test') # TODO: add good relation # Privacy assets receive_newsletter = db.Column(db.Boolean, default=False) def __init__(self, username, email, password): self.username = username self.email = email self.set_password(password) def update(self, username=None, email=None, password=None, biography=None, signature=None, birthday=None, receive_newsletter=None): # TODO: verify good type of those args, think about the password mgt if username: self.username = username if email: self.email = email if password: self.set_password(password) if biography: self.biography = biography if signature: self.signature = signature if birthday: self.birthday = birthday if receive_newsletter: self.receive_newsletter = receive_newsletter def get_public_data(self, username=False, xp_points=False, innovation_points=False, biography=None, signature=None, birthday=None, register_date=False): out = {} if username: out['username'] = username if xp_points: out['xp_points'] = xp_points if innovation_points: out['innovation_points'] = innovation_points if biography: out['biography'] = biography if signature: out['signature'] = signature if birthday: out['birthday'] = birthday if register_date: out['register_date'] = register_date def add_xp(self, n): self.xp_points += n def add_innovation(self, n): self.innovation_points += n def set_password(self, password): self.password_hash = generate_password_hash(password, method='pbkdf2:sha512', salt_length=10) def check_password(self, password): return check_password_hash(self.password_hash, password) def __repr__(self): return f'' @login.user_loader def load_user(id): return User.query.get(int(id)) class Guest(User, db.Model): __tablename__ = 'guest' id = db.Column(db.Integer, db.ForeignKey('user.id'), primary_key=True) __mapper_args__ = { 'polymorphic_identity': __tablename__ } # Standalone propeties username = db.Column(db.Unicode(64), index=True) ip = db.column(db.String(47)) # Max IPv6 adress length last_post = db.Column(db.DateTime, default=datetime.now) def __repr__(self): return f'' # Can be implemented if needed # class Organization(User, db.Model): # pass