models.py 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. # -*- encoding: utf-8 -*-
  2. """
  3. Copyright (c) 2019 - present AppSeed.us
  4. """
  5. from flask_login import UserMixin
  6. from sqlalchemy.orm import relationship
  7. from flask_dance.consumer.storage.sqla import OAuthConsumerMixin
  8. from apps import db, login_manager
  9. from apps.authentication.util import hash_pass
  10. class Users(db.Model, UserMixin):
  11. __tablename__ = 'Users'
  12. id = db.Column(db.Integer, primary_key=True)
  13. username = db.Column(db.String(64), unique=True)
  14. email = db.Column(db.String(64), unique=True)
  15. password = db.Column(db.LargeBinary)
  16. oauth_github = db.Column(db.String(100), nullable=True)
  17. def __init__(self, **kwargs):
  18. for property, value in kwargs.items():
  19. # depending on whether value is an iterable or not, we must
  20. # unpack it's value (when **kwargs is request.form, some values
  21. # will be a 1-element list)
  22. if hasattr(value, '__iter__') and not isinstance(value, str):
  23. # the ,= unpack of a singleton fails PEP8 (travis flake8 test)
  24. value = value[0]
  25. if property == 'password':
  26. value = hash_pass(value) # we need bytes here (not plain str)
  27. setattr(self, property, value)
  28. def __repr__(self):
  29. return str(self.username)
  30. @login_manager.user_loader
  31. def user_loader(id):
  32. return Users.query.filter_by(id=id).first()
  33. @login_manager.request_loader
  34. def request_loader(request):
  35. username = request.form.get('username')
  36. user = Users.query.filter_by(username=username).first()
  37. return user if user else None
  38. class OAuth(OAuthConsumerMixin, db.Model):
  39. user_id = db.Column(db.Integer, db.ForeignKey("Users.id", ondelete="cascade"), nullable=False)
  40. user = db.relationship(Users)