PCv5/app/models/users.py

121 lines
4.0 KiB
Python

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'<User #{self.id}>'
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'<Member {self.username}>'
@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'<Guest {self.username} ({self.ip})>'
# Can be implemented if needed
# class Organization(User, db.Model):
# pass