class Comment(db.Model): __tablename__ = "comments" PER_PAGE = 40 id = db.Column(db.Integer, primary_key=True) email = db.Column(db.String(50)) nickname = db.Column(db.Unicode(50)) website = db.Column(db.String(100))
class Link(db.Model): __tablename__ = 'links' PER_PAGE = 80 id = db.Column(db.Integer, primary_key=True) name = db.Column(db.Unicode(50), nullable=False) link = db.Column(db.String(100), nullable=False) logo = db.Column(db.String(100)) description = db.Column(db.Unicode(100)) email = db.Column(db.String(50)) passed = db.Column(db.Boolean, default=False) create_date = db.Column(db.DateTime, default=datetime.utcnow) def __init__(self, *args, **kwargs): super(Link, self).__init__(*args, **kwargs) #TODO A def __str__(self): return self.name
class Twitter(db.Model): __tablename__ = 'twitter' id = db.Column(db.Integer, primary_key=True) user_id = db.Column(db.Integer, db.ForeignKey(User.id, ondelete='CASCADE'), nullable=False, unique=True) token = db.Column(db.String(50)) token_secret = db.Column(db.String(50)) def __init__(self, *args, **kwargs): super(Twitter, self).__init__(*args, **kwargs) def __str__(self): return self.user_id def __repr__(self): return "<%s>" % self
class Link(db.Model): __tablename__ = "links" PER_PAGE = 80 id = db.Column(db.Integer, primary_key=True) name = db.Column(db.Unicode(50), nullable=False) link = db.Column(db.String(100), nullable=False) logo = db.Column(db.String(100)) description = db.Column(db.Unicode(100)) email = db.Column(db.String(50)) passed = db.Column(db.Boolean, default=False) created_date = db.Column(db.DateTime, default=datetime.utcnow) class Permissions(object): def __init__(self, obj): self.obj = obj @cached_property def edit(self): return moderator @cached_property def delete(self): return moderator def __init__(self, *args, **kwargs): super(Link, self).__init__(*args, **kwargs) @cached_property def permissions(self): return self.Permissions(self) def __str__(self): return self.name
class UserCode(db.Model): __tablename__ = 'usercode' id = db.Column(db.Integer, primary_key=True) code = db.Column(db.String(20), nullable=False) role = db.Column(db.Integer, default=User.MEMBER) def __init__(self, *args, **kwargs): super(UserCode, self).__init__(*args, **kwargs) def __str__(self): return self.code def __repr__(self): return "<%s>" % self
class User(db.Model): __tablename__ = 'users' query_class = UserQuery PER_PAGE = 50 TWEET_PER_PAGE = 30 MEMBER = 100 MODERATOR = 200 ADMIN = 300 id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(20), unique=True) nickname = db.Column(db.String(20)) email = db.Column(db.String(100), unique=True, nullable=False) _password = db.Column("password", db.String(80), nullable=False) role = db.Column(db.Integer, default=MEMBER) activation_key = db.Column(db.String(40)) date_joined = db.Column(db.DateTime, default=datetime.utcnow) last_login = db.Column(db.DateTime, default=datetime.utcnow) last_request = db.Column(db.DateTime, default=datetime.utcnow) block = db.Column(db.Boolean, default=False) class Permissions(object): def __init__(self, obj): self.obj = obj @cached_property def edit(self): return Permission(UserNeed(self.obj.id)) & admin def __init__(self, *args, **kwargs): super(User, self).__init__(*args, **kwargs) def __str__(self): return self.nickname def __repr__(self): return "<%s>" % self @cached_property def permissions(self): return self.Permissions(self) def _get_password(self): return self._password def _set_password(self, password): self._password = hashlib.md5(password).hexdigest() password = db.synonym("_password", descriptor=property(_get_password, _set_password)) def check_password(self, password): if self.password is None: return False return self.password == hashlib.md5(password).hexdigest() @cached_property def provides(self): needs = [RoleNeed('authenticated'), UserNeed(self.id)] if self.is_moderator: needs.append(RoleNeed('moderator')) if self.is_admin: needs.append(RoleNeed('admin')) return needs @property def is_moderator(self): return self.role >= self.MODERATOR @property def is_admin(self): return self.role >= self.ADMIN @cached_property def twitter_api(self): if self.twitter and self.twitter.token \ and self.twitter.token_secret: api = twitter.Api(current_app.config['TWITTER_KEY'], current_app.config['TWITTER_SECRET'], self.twitter.token, self.twitter.token_secret) else: api = None return api @cached_property def tweets(self): api = self.twitter_api if api: info = api.VerifyCredentials() try: tweets = api.GetUserTimeline(screen_name=info.screen_name, count=self.TWEET_PER_PAGE) except: return [] else: return [] return tweets def post_twitter(self, content): api = self.twitter_api if api: status = api.PostUpdate(content) else: return False return True
class Comment(db.Model): __tablename__ = "comments" PER_PAGE = 40 id = db.Column(db.Integer, primary_key=True) post_id = db.Column(db.Integer, db.ForeignKey(Post.id, ondelete='CASCADE'), nullable=False) author_id = db.Column(db.Integer, db.ForeignKey(User.id, ondelete='CASCADE')) parent_id = db.Column(db.Integer, db.ForeignKey("comments.id", ondelete='CASCADE')) email = db.Column(db.String(50)) nickname = db.Column(db.Unicode(50)) website = db.Column(db.String(100)) comment = db.Column(db.UnicodeText) created_date = db.Column(db.DateTime, default=datetime.utcnow) ip = db.Column(db.Integer) _author = db.relation(User, backref="posts", lazy="joined") post = db.relation(Post, innerjoin=True, lazy="joined") parent = db.relation('Comment', remote_side=[id]) __mapper_args__ = {'order_by': id.asc()} class Permissions(object): def __init__(self, obj): self.obj = obj @cached_property def reply(self): return Permission(UserNeed(self.obj.post.author_id)) @cached_property def delete(self): return Permission(UserNeed(self.obj.author_id), UserNeed(self.obj.post.author_id)) & moderator def __init__(self, *args, **kwargs): super(Comment, self).__init__(*args, **kwargs) @cached_property def permissions(self): return self.Permissions(self) def _get_author(self): if self._author: return self._author return storage(email=self.email, nickname=self.nickname, website=self.website) def _set_author(self, author): self._author = author author = db.synonym("_author", descriptor=property(_get_author, _set_author)) def _url(self, _external=False): return '%s#comment-%d' % (self.post._url(_external), self.id) @cached_property def url(self): return self._url() @cached_property def permalink(self): return self._url(True) @cached_property def markdown(self): return Markup(markdown(self.comment or ''))