import time
import datetime
from sqlalchemy import Integer, Boolean, String, DateTime, UniqueConstraint
from passlib.apps import custom_app_context as pwd_context
from itsdangerous import (TimedJSONWebSignatureSerializer
as Serializer, BadSignature, SignatureExpired)
from sticky_pi_api.database.utils import Base, BaseCustomisations, DescribedColumn
[docs]class Users(BaseCustomisations):
__tablename__ = 'users'
__table_args__ = (UniqueConstraint('username'), UniqueConstraint('email'))
id = DescribedColumn(Integer, primary_key=True)
username = DescribedColumn(String(32), index=True, nullable=False)
email = DescribedColumn(String(64), index=True, nullable=True)
password_hash = DescribedColumn(String(128), nullable=False)
is_admin = DescribedColumn(Boolean, default=False)
can_write = DescribedColumn(Boolean, default=True)
def __init__(self, password, api_user=None, **kwargs):
my_dict = kwargs
my_dict['password_hash'] = pwd_context.encrypt(password)
my_dict['api_user'] = api_user
super().__init__(**my_dict)
[docs] def verify_password(self, password):
out = pwd_context.verify(password, self.password_hash)
return out
[docs] def generate_auth_token(self, api_secret_key, expiration=3600 * 24):
now = int(time.time())
exp_timestamp = now + expiration
s = Serializer(api_secret_key, expires_in=expiration)
token = s.dumps({'id': self.id})
return {'token': token.decode('ascii'), 'expiration': exp_timestamp}