rookeries/rookeries/users/models.py

89 lines
2.4 KiB
Python

"""
Models for users.
:copyright: Copyright 2013-2017, Dorian Pula <dorian.pula@amber-penguin-software.ca>
:license: AGPL v3+
"""
import enum
from werkzeug import security
class UserRole(enum.Enum):
admin = 1
editor = 2
subscriber = 3
class User(object):
__tablename__ = 'user'
# id = db.Column(db.Integer, primary_key=True)
# username = db.Column(db.String(128), unique=True)
# password = db.Column(db.String, nullable=False)
# role = db.Column(db.Enum(UserRole))
# profile = db.relationship('UserProfile', uselist=False, back_populates='user')
def __init__(self, username, role=UserRole.subscriber):
self.username = username
self.role = role
def __repr__(self) -> str:
return f'<User {self.username}>'
@staticmethod
def from_json(json_dict: dict):
username = json_dict['username']
user = User(username=username)
password = json_dict['password']
user.password = security.generate_password_hash(password)
try:
user_role = UserRole[json_dict.get('role', UserRole.subscriber.name)]
except ValueError:
user_role = UserRole.subscriber
user.role = user_role
user_profile = UserProfile.from_json(json_dict.get('profile', {}))
user_profile.user = user
user.profile = user_profile
return user
def to_json(self) -> dict:
return {
'id': self.id,
'username': self.username,
'role': self.role.name,
'profile': self.profile.to_json(),
}
class UserProfile(object):
__tablename__ = 'user_profile'
# id = db.Column(db.Integer, primary_key=True)
# user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
# user = db.relationship('User')
# alias_name = db.Column(db.String)
# full_name = db.Column(db.String)
# email = db.Column(db_types.EmailType)
def __repr__(self) -> str:
return f'<UserProfile {self.user.username}>'
@staticmethod
def from_json(json_dict: dict):
user_profile = UserProfile()
user_profile.alias_name = json_dict.get('aliasName')
user_profile.full_name = json_dict.get('fullName')
user_profile.email = json_dict.get('email')
return user_profile
def to_json(self) -> dict:
return {
'fullName': self.full_name,
'aliasName': self.alias_name,
'email': self.email,
}