2018-12-17 10:33:33 -08:00
|
|
|
from datetime import datetime
|
2019-01-23 07:00:30 -08:00
|
|
|
from datetime import timedelta
|
|
|
|
|
2018-11-02 09:07:06 -07:00
|
|
|
from grant.extensions import ma, db
|
|
|
|
from grant.utils.misc import gen_random_code
|
|
|
|
|
2018-12-17 10:33:33 -08:00
|
|
|
RECOVERY_EXPIRATION = timedelta(hours=1)
|
|
|
|
|
|
|
|
|
|
|
|
# verification
|
2018-11-02 09:07:06 -07:00
|
|
|
class EmailVerification(db.Model):
|
|
|
|
__tablename__ = "email_verification"
|
|
|
|
|
|
|
|
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), primary_key=True)
|
|
|
|
code = db.Column(db.String(255), unique=True, nullable=False)
|
|
|
|
has_verified = db.Column(db.Boolean)
|
|
|
|
|
|
|
|
user = db.relationship("User", back_populates="email_verification")
|
|
|
|
|
|
|
|
def __init__(self, user_id: int):
|
|
|
|
self.user_id = user_id
|
|
|
|
self.code = gen_random_code(32)
|
|
|
|
self.has_verified = False
|
|
|
|
|
2018-12-17 10:33:33 -08:00
|
|
|
|
2018-11-02 09:07:06 -07:00
|
|
|
class EmailVerificationSchema(ma.Schema):
|
|
|
|
class Meta:
|
|
|
|
model = EmailVerification
|
|
|
|
# Fields to expose
|
|
|
|
fields = (
|
|
|
|
"user_id",
|
|
|
|
"code",
|
|
|
|
"has_verified"
|
|
|
|
)
|
|
|
|
|
2018-12-17 10:33:33 -08:00
|
|
|
|
|
|
|
email_verification_schema = EmailVerificationSchema()
|
|
|
|
|
|
|
|
|
|
|
|
# recovery
|
|
|
|
class EmailRecovery(db.Model):
|
|
|
|
__tablename__ = "email_recovery"
|
|
|
|
|
|
|
|
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), primary_key=True)
|
|
|
|
code = db.Column(db.String(255), unique=True, nullable=False)
|
|
|
|
date_created = db.Column(db.DateTime)
|
|
|
|
|
|
|
|
user = db.relationship("User", back_populates="email_recovery")
|
|
|
|
|
|
|
|
def __init__(self, user_id: int):
|
|
|
|
self.user_id = user_id
|
|
|
|
self.code = gen_random_code(32)
|
|
|
|
self.date_created = datetime.now()
|
|
|
|
|
|
|
|
def is_expired(self):
|
|
|
|
time_diff = datetime.now() - self.date_created
|
|
|
|
return time_diff > RECOVERY_EXPIRATION
|
|
|
|
|
|
|
|
|
|
|
|
class EmailRecoverySchema(ma.Schema):
|
|
|
|
class Meta:
|
|
|
|
model = EmailRecovery
|
|
|
|
# Fields to expose
|
|
|
|
fields = (
|
|
|
|
"user_id",
|
|
|
|
"code",
|
|
|
|
"date_created"
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
email_recovery_schema = EmailRecoverySchema()
|