class User(BaseDocument): username = db.StringField(required=True) email = db.StringField(required=True) password = db.StringField() salt = db.StringField() is_email_confirmed = db.BooleanField(default=False) email_confirmed_on = db.DateTimeField(default=None) messages = db.ListField(db.EmbeddedDocumentField(Message)) oauths = db.ListField(db.ReferenceField(UserOauth)) likes = db.ListField(db.ReferenceField('Paste')) followers = db.ListField(db.ReferenceField('User')) @property def pastes(self): return Paste.objects(user=self) @property def pastes_count(self): return len(self.pastes) @property def private_pastes_count(self): return len(self.pastes(is_private=True)) @property def public_pastes_count(self): return len(self.pastes) - len(self.pastes(is_private=True)) def save(self, *args, **kwargs): if not self.salt: self.salt = hashlib.sha1(str(time.time())).hexdigest() self.password = self.generate_password(self.password) super(User, self).save(*args, **kwargs) def owns_record(self, record): return record.user == self def generate_password(self, string): return hashlib.sha1('%s%s' % (string, self.salt)).hexdigest() def check_login(self, password): return self.generate_password(password) == self.password def gravatar_url(self, width=80): return "https://cn.gravatar.com/avatar/%s?s=%d" % (hashlib.md5( self.email).hexdigest(), width) @classmethod def find_by_oauth(cls, provider, openid): """Find user that has oauth info with given provider and openid""" oauth = UserOauth.objects(provider=provider, openid=openid).first() if oauth and oauth.user: return oauth.user def is_followed_by(self, user): return user in self.followers
class Message(db.EmbeddedDocument): category = db.StringField(choices=CHOICES) content = db.StringField() is_read = db.BooleanField(default=False) created_at = db.DateTimeField(default=datetime.datetime.now) @property def title(self): return TITLES[self.category]
class BaseDocument(db.Document): meta = {'abstract': True, 'strict': False} # Increase specific counter by `count` def increase_counter(self, field, count=1): counter_field = '%s_count' % field counter_value = getattr(self, counter_field, 0) + count if counter_value <= 0: counter_value = 0 attributes = dict([(counter_field, counter_value)]) self.update(**attributes) @classmethod def find_or_create_by(cls, **attributes): record = cls.objects(**attributes).first() if record is None: record = cls(**attributes).save() return record @classmethod def find_and_delete_by(cls, **attributes): record = cls.objects(**attributes).first() if record: record.delete() def create_hash_id(self, salt, string): if not self.hash_id: def generate_hash_id(): return hashlib.sha1('%s%s%s' % (salt, string, str(time.time()))).hexdigest()[:11] self.hash_id = generate_hash_id() while(self.__class__.objects(hash_id=self.hash_id).first() is not None): self.hash_id = generate_hash_id() created_at = db.DateTimeField(default=datetime.datetime.now) updated_at = db.DateTimeField(default=datetime.datetime.now)
class Message(db.Document): user = db.ReferenceField('User') who = db.ReferenceField('User') content = db.StringField() created_at = db.DateTimeField(default=datetime.datetime.now)
class User(BaseDocument): username = db.StringField(required=True) email = db.StringField(required=True) password = db.StringField() salt = db.StringField() is_email_confirmed = db.BooleanField(default=False) email_confirmed_on = db.DateTimeField(default=None) number = db.IntField(default=0, unique=True) description = db.StringField(default=u"这个家伙很懒, TA什么都没写...") oauths = db.ListField(db.ReferenceField(UserOauth)) likes = db.ListField(db.ReferenceField('Paste')) followings = db.ListField(db.ReferenceField('User')) @property def pastes(self): return Paste.objects(user=self) @property def pastes_count(self): return len(self.pastes) @property def comments_count(self): return len(Comment.objects(user=self)) @property def private_pastes_count(self): return len(self.pastes(is_private=True)) @property def public_pastes_count(self): return len(self.pastes) - len(self.pastes(is_private=True)) @property def public_bookmarks(self): return Bookmark.objects(user=self, is_private=False) @property def public_bookmarks_count(self): return Bookmark.objects(user=self, is_private=False).count() @property def unread_messages_count(self): return Message.objects(user=self, is_read=False).count() def save(self, *args, **kwargs): if not self.salt: self.salt = hashlib.sha1(str(time.time())).hexdigest() self.password = self.generate_password(self.password) number = User.objects().count() + 1 while (User.objects(number=number).first()): number += 1 self.number = number super(User, self).save(*args, **kwargs) def owns_record(self, record): return record.user == self def generate_password(self, string): return hashlib.sha1('%s%s' % (string, self.salt)).hexdigest() def check_login(self, password): return self.generate_password(password) == self.password @classmethod def find_by_oauth(cls, provider, openid): """Find user that has oauth info with given provider and openid""" oauth = UserOauth.objects(provider=provider, openid=openid).first() if oauth and oauth.user: return oauth.user def is_following(self, user): return user in self.followings @property def followers(self): return User.objects(followings=self)