Exemple #1
0
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
Exemple #2
0
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]
Exemple #3
0
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)
Exemple #4
0
class Message(db.Document):
    user = db.ReferenceField('User')
    who = db.ReferenceField('User')
    content = db.StringField()
    created_at = db.DateTimeField(default=datetime.datetime.now)
Exemple #5
0
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)