PageRenderTime 47ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/june/account/models.py

https://github.com/yetone/june
Python | 125 lines | 109 code | 1 blank | 15 comment | 0 complexity | ca55d94bb8e63d9e50a2c254b2c4641b MD5 | raw file
Possible License(s): BSD-3-Clause
  1. """
  2. Member:
  3. only the basic info of a user
  4. role:
  5. staff > 6
  6. admin > 9
  7. active > 1
  8. not verified email = 1
  9. deactive < 1
  10. reputation:
  11. reputation means the value of a member, it affects in topic and
  12. everything
  13. 1. when user's topic is up voted, reputation increase:
  14. + n1 * log(user.reputation)
  15. 2. when user's topic is down voted, reputation decrease:
  16. - n2 * log(user.reputation)
  17. """
  18. import hashlib
  19. from random import choice
  20. from datetime import datetime
  21. from sqlalchemy import Column
  22. from sqlalchemy import Integer, String, DateTime, Text
  23. from tornado.options import options
  24. from july.database import db
  25. class Member(db.Model):
  26. id = Column(Integer, primary_key=True)
  27. username = Column(String(100), unique=True, index=True)
  28. email = Column(String(200), unique=True, nullable=False, index=True)
  29. password = Column(String(100), nullable=False)
  30. avatar = Column(String(400))
  31. website = Column(String(400))
  32. role = Column(Integer, default=1)
  33. # 0: registered, 1: username
  34. reputation = Column(Integer, default=20, index=True)
  35. token = Column(String(16))
  36. created = Column(DateTime, default=datetime.utcnow)
  37. city = Column(String(200))
  38. edit_username_count = Column(Integer, default=2)
  39. description = Column(Text)
  40. def __init__(self, email, **kwargs):
  41. self.email = email.lower()
  42. self.token = self.create_token(16)
  43. for k, v in kwargs.items():
  44. setattr(self, k, v)
  45. def get_avatar(self, size=48):
  46. if self.avatar:
  47. return self.avatar
  48. md5email = hashlib.md5(self.email).hexdigest()
  49. query = "%s?s=%s%s" % (md5email, size, options.gravatar_extra)
  50. return options.gravatar_base_url + query
  51. def get_notification(self):
  52. count = Notification.query.filter_by(readed='n')\
  53. .filter_by(receiver=self.id).count()
  54. return count
  55. def to_json(self):
  56. data = (
  57. '{"username":"%s", "avatar":"%s", "website":"%s",'
  58. '"reputation":%s, "role":%s}'
  59. ) % (self.username, self.get_avatar(), self.website or "",
  60. self.reputation, self.role)
  61. return data
  62. @staticmethod
  63. def create_password(raw):
  64. salt = Member.create_token(8)
  65. hsh = hashlib.sha1(salt + raw + options.password_secret).hexdigest()
  66. return "%s$%s" % (salt, hsh)
  67. @staticmethod
  68. def create_token(length=16):
  69. chars = ('0123456789'
  70. 'abcdefghijklmnopqrstuvwxyz'
  71. 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')
  72. salt = ''.join([choice(chars) for i in range(length)])
  73. return salt
  74. def check_password(self, raw):
  75. if '$' not in self.password:
  76. return False
  77. salt, hsh = self.password.split('$')
  78. verify = hashlib.sha1(salt + raw + options.password_secret).hexdigest()
  79. return verify == hsh
  80. @property
  81. def is_staff(self):
  82. return self.role > 6
  83. @property
  84. def is_admin(self):
  85. return self.role > 9
  86. class Notification(db.Model):
  87. id = Column(Integer, primary_key=True)
  88. sender = Column(Integer, nullable=False)
  89. receiver = Column(Integer, nullable=False, index=True)
  90. content = Column(String(400))
  91. refer = Column(String(600))
  92. type = Column(String(20), default='mention')
  93. created = Column(DateTime, default=datetime.utcnow)
  94. readed = Column(String(1), default='n')
  95. class Social(db.Model):
  96. id = Column(Integer, primary_key=True)
  97. user_id = Column(Integer, nullable=False, index=True)
  98. enabled = Column(String(1), default='y')
  99. service = Column(String(100)) # service name: twitter, douban
  100. token = Column(Text)