app-MAIL-temp/app/models.py

52 lines
1.6 KiB
Python

# <<< Models >>>
from datetime import datetime
import bcrypt
from flask_login import UserMixin
from app.extensions import db
class ModelMixin(object):
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
created_at = db.Column(db.DateTime, default=datetime.utcnow, nullable=False)
updated_at = db.Column(db.DateTime, default=None, onupdate=datetime.utcnow)
class Client(db.Model, ModelMixin):
client_id = db.Column(db.String(128), unique=True)
client_secret = db.Column(db.String(128))
redirect_uri = db.Column(db.String(1024))
name = db.Column(db.String(128))
class User(db.Model, ModelMixin, UserMixin):
email = db.Column(db.String(128), unique=True)
salt = db.Column(db.String(128), nullable=False)
password = db.Column(db.String(128), nullable=False)
name = db.Column(db.String(128))
def set_password(self, password):
salt = bcrypt.gensalt()
password_hash = bcrypt.hashpw(password.encode(), salt).decode()
self.salt = salt.decode()
self.password = password_hash
def check_password(self, password) -> bool:
password_hash = bcrypt.hashpw(password.encode(), self.salt.encode())
return self.password.encode() == password_hash
class AuthorizationCode(db.Model, ModelMixin):
code = db.Column(db.String(128), unique=True)
client_id = db.Column(db.ForeignKey(Client.id))
user_id = db.Column(db.ForeignKey(User.id))
class OauthToken(db.Model, ModelMixin):
access_token = db.Column(db.String(128), unique=True)
client_id = db.Column(db.ForeignKey(Client.id))
user_id = db.Column(db.ForeignKey(User.id))
user = db.relationship(User)