PageRenderTime 45ms CodeModel.GetById 15ms RepoModel.GetById 0ms app.codeStats 0ms

/pypress/models/users.py

https://github.com/laoqiu/pypress-tornado
Python | 194 lines | 127 code | 59 blank | 8 comment | 6 complexity | a002c54f391c646bccd897384472a395 MD5 | raw file
  1. #!/usr/bin/env python
  2. #coding=utf-8
  3. """
  4. models: users.py
  5. ~~~~~~~~~~~~~
  6. :author: laoqiu.com@gmail.com
  7. """
  8. import hashlib
  9. from datetime import datetime
  10. import tornado.web
  11. from pypress.extensions.sqlalchemy import BaseQuery
  12. from pypress.extensions.permission import Permission, RoleNeed, UserNeed
  13. from pypress.extensions.cache import cached_property
  14. from pypress.permissions import admin
  15. from pypress.database import db
  16. __all__ = ['User', 'UserCode', 'Tweet', ]
  17. class UserQuery(BaseQuery):
  18. def authenticate(self, login, password):
  19. user = self.filter(db.or_(User.username==login,
  20. User.email==login)).first()
  21. if user:
  22. authenticated = user.check_password(password)
  23. else:
  24. authenticated = False
  25. return user, authenticated
  26. def search(self, key):
  27. query = self.filter(db.or_(User.email==key,
  28. User.nickname.ilike('%'+key+'%'),
  29. User.username.ilike('%'+key+'%')))
  30. return query
  31. def get_by_username(self, username):
  32. user = self.filter(User.username==username).first()
  33. if user is None:
  34. raise tornado.web.HTTPError(404)
  35. return user
  36. class User(db.Model):
  37. __tablename__ = 'users'
  38. query_class = UserQuery
  39. PER_PAGE = 50
  40. TWEET_PER_PAGE = 30
  41. MEMBER = 100
  42. MODERATOR = 200
  43. ADMIN = 300
  44. id = db.Column(db.Integer, primary_key=True)
  45. username = db.Column(db.String(20), unique=True)
  46. nickname = db.Column(db.String(20))
  47. email = db.Column(db.String(100), unique=True, nullable=False)
  48. _password = db.Column("password", db.String(80), nullable=False)
  49. role = db.Column(db.Integer, default=MEMBER)
  50. activation_key = db.Column(db.String(40))
  51. date_joined = db.Column(db.DateTime, default=datetime.utcnow)
  52. last_login = db.Column(db.DateTime, default=datetime.utcnow)
  53. block = db.Column(db.Boolean, default=False)
  54. class Permissions(object):
  55. def __init__(self, obj):
  56. self.obj = obj
  57. @cached_property
  58. def edit(self):
  59. return Permission(UserNeed(self.obj.id)) & admin
  60. def __init__(self, *args, **kwargs):
  61. super(User, self).__init__(*args, **kwargs)
  62. def __str__(self):
  63. return "User: %s" % self.nickname
  64. def __repr__(self):
  65. return "<%s>" % self
  66. @cached_property
  67. def permissions(self):
  68. return self.Permissions(self)
  69. @cached_property
  70. def provides(self):
  71. needs = [RoleNeed('authenticated'),
  72. UserNeed(self.id)]
  73. if self.is_moderator:
  74. needs.append(RoleNeed('moderator'))
  75. if self.is_admin:
  76. needs.append(RoleNeed('admin'))
  77. return needs
  78. def _get_password(self):
  79. return self._password
  80. def _set_password(self, password):
  81. self._password = hashlib.md5(password).hexdigest()
  82. password = db.synonym("_password",
  83. descriptor=property(_get_password,
  84. _set_password))
  85. def check_password(self,password):
  86. if self.password is None:
  87. return False
  88. return self.password == hashlib.md5(password).hexdigest()
  89. @property
  90. def is_moderator(self):
  91. return self.role >= self.MODERATOR
  92. @property
  93. def is_admin(self):
  94. return self.role >= self.ADMIN
  95. @property
  96. def json(self):
  97. return dict(id=self.id,
  98. username=self.username,
  99. nickname=self.nickname,
  100. email=self.email,
  101. is_admin=self.is_admin,
  102. is_moderator=self.is_moderator,
  103. last_login=self.last_login)
  104. class UserCode(db.Model):
  105. __tablename__ = 'usercode'
  106. id = db.Column(db.Integer, primary_key=True)
  107. code = db.Column(db.String(20), nullable=False)
  108. role = db.Column(db.Integer, default=User.MEMBER)
  109. def __init__(self, *args, **kwargs):
  110. super(UserCode, self).__init__(*args, **kwargs)
  111. def __str__(self):
  112. return self.code
  113. def __repr__(self):
  114. return "<%s>" % self
  115. class Tweet(db.Model):
  116. __tablename__ = 'tweets'
  117. id = db.Column(db.Integer, primary_key=True)
  118. user_id = db.Column(db.Integer,
  119. db.ForeignKey(User.id, ondelete='CASCADE'),
  120. nullable=False,
  121. unique=True)
  122. server = db.Column(db.String(50))
  123. token = db.Column(db.String(50))
  124. token_secret = db.Column(db.String(50))
  125. def __init__(self, *args, **kwargs):
  126. super(Tweet, self).__init__(*args, **kwargs)
  127. def __str__(self):
  128. return "Tweet: %s" % self.id
  129. def __repr__(self):
  130. return "<%s>" % self
  131. User.tweets = db.relation(Tweet, backref="user")
  132. # to do ...
  133. User.weibo = None
  134. User.douban = None
  135. User.qq = None