class Login(db.Model): """ Represents a login by a user (either creating a new session, or refreshing a stale session) """ __tablename__ = 'logins' __table_args__ = {'extend_existing': True} id = db.Column(db.Integer, primary_key=True, autoincrement=True) time = db.Column(db.DateTime, default=datetime.datetime.now) ip_address = db.Column(db.String(40), nullable=False) user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=True) user = db.relationship('User', backref='logins', lazy=True) def to_json(self): return { 'id': self.id, 'time': self.time, 'ip_address': self.ip_address, 'user_id': self.user_id } def __repr__(self): return "<Login by {} ({}) at {}>".format( self.user_id or 'anonymous user', self.ip_address, self.time)
class Post(db.Model): """ Represnts a post (e.g. challenge) """ __tablename__ = 'posts' __table_args__ = {'extend_existing': True} id = db.Column(db.Integer, primary_key=True, autoincrement=True) title = db.Column(db.String(posts['max_title']), nullable=False) body = db.Column(LONGTEXT, nullable=False) date_created = db.Column(db.DateTime, default=datetime.datetime.utcnow) user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False) def to_json(self): return { 'title': self.title, 'body': self.body, 'owner': self.user.to_json() } def __repr__(self): return '<Post(%r) by %r>' % (self.id, self.user.name)
class AnswerVote(db.Model): __tablename__ = 'answer_votes' __table_args__ = {'extend_existing': True} user_id = db.Column(db.Integer, db.ForeignKey('users.id'), primary_key=True) answer_id = db.Column(db.Integer, db.ForeignKey('answers.id'), primary_key=True) vote = db.Column(TINYINT, default=0) user = db.relationship('User', backref='answer_votes') answer = db.relationship('Answer', backref='votes') def to_json(self): data = {} data['vote'] = self.vote data['user'] = self.user_id data['answer'] = self.answer_id return data def __repr__(self): return '<AnswerVote(%+d) on (%r) by (%r)>' % (self.vote, self.answer, self.user)
class UserOAuthToken(db.Model): """ Represents an OAuth login token based on an ID the OAuth provider can provide which uniquely identifies the user, along with a unique id. """ __tablename__ = 'user_oauth_token' provider_id = db.Column(db.String(15), primary_key=True, nullable=False) identity = db.Column(db.String(255), primary_key=True, nullable=False) user_id = db.Column(db.Integer, db.ForeignKey(User.id), nullable=False) user = db.relationship(User, backref=db.backref('oauth_tokens', lazy=True))
class UserJWTToken(db.Model): """ Represents an authentication scheme for a user based on a JWT-key style with an issuer and an identity. You **must** validate the key before inserting it here. """ __tablename__ = 'user_jwt_tokens' identity = db.Column(db.String(255), primary_key=True) issuer = db.Column(db.String(255), nullable=False) user_id = db.Column(db.Integer, db.ForeignKey(User.id), nullable=False) user = db.relationship(User, backref=db.backref('jwt_tokens', lazy=True)) def __repr__(self): return '<UserToken for {!r}>'.format(self.user_id)
class User(db.Model): """ Self-explanatory, a user. """ __tablename__ = 'users' id = db.Column(db.Integer, primary_key=True, unique=True, autoincrement=True) name = db.Column(db.String(config.users['max_name_len']), nullable=False) email = db.Column(db.String(320)) avatar = db.Column(db.String(256), nullable=True) posts = db.relationship('Post', backref='user') theme = db.Column(db.Integer, db.ForeignKey('themes.id'), nullable=True) def avatar_url(self): if self.avatar is not None: return self.avatar else: return gravatar(self.email) def to_json(self, own=False, bio=False): data = { 'id': self.id, 'name': self.name, 'avatar': self.avatar_url() } if own: data['email'] = self.email if bio: data['post_count'] = len(self.posts) data['answer_count'] = len(self.answers) return data def __repr__(self): return '<User({!r}) "{!r}">'.format(self.id, self.name)
class Category(db.Model): """ A category of a post. """ __tablename__ = 'categories' name = db.Column(db.String(15), primary_key=True) def to_json(self): return {'name': self.name} def __repr__(self): return '<Tag \'{!r}\'>'.format(self.name)
class User(db.Model): """ Self-explanatory, a user. """ __tablename__ = 'users' id = db.Column(db.Integer, primary_key=True, unique=True, autoincrement=True) name = db.Column(db.String(45), nullable=False) email = db.Column(db.String(320)) posts = db.relationship('Post', backref='user') def avatar_url(self): return gravatar(self.email) def to_json(self): return {'id': self.id, 'name': self.name, 'email': self.email} def __repr__(self): return '<User({!r}) "{!r}">'.format(self.id, self.name)
class Answer(db.Model): """ An answer posted to a post by a user. """ __tablename__ = 'answers' __table_args__ = {'extend_existing': True} id = db.Column(db.Integer, primary_key=True, autoincrement=True) post_id = db.Column(db.Integer, db.ForeignKey('posts.id'), nullable=False) language_id = db.Column(db.String(answers['lang_len']), nullable=True) language_name = db.Column(db.String(answers['lang_len']), nullable=True) code = db.Column(db.Text, default=db.null) commentary = db.Column(db.Text, default=db.null) user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False) date_created = db.Column(db.DateTime, default=datetime.datetime.utcnow) user = db.relationship('User', backref='answers') post = db.relationship('Post', backref='answers') def to_json(self): data = {} data['code'] = self.code language = self.get_language() if language is not None: data['lang'] = language.to_json() data['commentary'] = self.commentary data['owner'] = self.user.to_json() return data def get_language(self): if self.language_id is None: return None return app.models.Language.Language(self.language_id) def __repr__(self): return '<Answer(%r) by %r>' % (self.id, self.user.name)
class PostComment(db.Model): __tablename__ = 'post_comments' __table_args__ = {'extend_existing': True} id = db.Column(db.Integer, primary_key=True, autoincrement=True) post_id = db.Column(db.Integer, db.ForeignKey('posts.id'), nullable=False) parent_id = db.Column(db.Integer, db.ForeignKey('post_comments.id'), nullable=True) text = db.Column(db.String(140), nullable=False) user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False) date_created = db.Column(db.DateTime, default=datetime.datetime.utcnow) user = db.relationship('User', backref='post_comments') post = db.relationship('Post', backref='comments') parent = db.relationship('PostComment', backref='children', remote_side=[id]) def type(self): return 'post' def to_json(self): data = { 'id': self.id, 'text': self.text, 'date': self.date_created.isoformat(), 'owner': self.user.to_json(), 'parent': self.parent, 'children': self.children } return data def comment_tree(self, nest_depth=None): if len(self.children) == 0: return self if nest_depth is None: return [self, [child.comment_tree() for child in self.children]] else: if nest_depth > 1: return [ self, [ child.comment_tree(nest_depth - 1) for child in self.children ] ] def __repr__(self): return '<PostComment(%r) by %r>' % (self.id, self.user.name)
class AnswerComment(db.Model): __tablename__ = 'answer_comments' __table_args__ = {'extend_existing': True} id = db.Column(db.Integer, primary_key=True, autoincrement=True) answer_id = db.Column(db.Integer, db.ForeignKey('answers.id'), nullable=False) parent_id = db.Column(db.Integer, db.ForeignKey('answer_comments.id'), nullable=True) text = db.Column(db.String(comments['max_len']), nullable=False) user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False) date_created = db.Column(db.DateTime, default=datetime.datetime.now) user = db.relationship('User', backref='answer_comments') answer = db.relationship('Answer', backref='comments') parent = db.relationship('AnswerComment', backref='children', remote_side=[id]) def to_json(self, show_children=True, show_parent=False): data = { 'id': self.id, 'ty': 'answer', 'source_id': self.answer_id, 'text': self.text, 'date': self.date_created.isoformat(), 'owner': self.user.to_json(), 'parent': self.parent and show_parent and self.parent.to_json(show_children=show_children), 'children': show_children and [child.to_json(show_parent=show_parent) for child in self.children] } return data def comment_tree(self, nest_depth=None): if len(self.children) == 0: return self if nest_depth is None: return [self, [child.comment_tree() for child in self.children]] else: if nest_depth > 1: return [self, [child.comment_tree(nest_depth-1) for child in self.children]] def __repr__(self): return '<AnswerComment(%r) by %r>' % (self.id, self.user.name)
class Answer(db.Model): """ An answer posted to a post by a user. """ __tablename__ = 'answers' __table_args__ = {'extend_existing': True} id = db.Column(db.Integer, primary_key=True, autoincrement=True) post_id = db.Column(db.Integer, db.ForeignKey('posts.id'), nullable=False) language_id = db.Column(db.String(answers['lang_len']), nullable=True, default=None) language_name = db.Column(db.String(answers['lang_len']), nullable=True, default=None) code = db.Column(db.Text, default=None, nullable=True) commentary = db.Column(db.Text, default=None, nullable=True) encoding = db.Column(db.String(30), default='utf8') user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False) date_created = db.Column(db.DateTime, default=datetime.datetime.now) user = db.relationship('User', backref='answers') post = db.relationship('Post', backref='answers', lazy=True) @hybrid_property def byte_len(self): return len(self.code.encode(self.encoding or 'utf8')) @byte_len.expression def byte_len(cls): return func.length(cls.code) def to_json(self, no_code=False): data = {} if not no_code: data['code'] = self.code data['commentary'] = self.commentary data['id'] = self.id data['encoding'] = self.encoding data['byte_len'] = self.byte_len language = self.get_language() if language is not None: data['lang'] = language.to_json() data['owner'] = self.user.to_json() data['date_created'] = self.date_created.isoformat() return data def get_language(self): if self.language_id is None: return None return app.models.Language.Language(self.language_id) def __repr__(self): return '<Answer(%r) by %r>' % (self.id, self.user.name)
from app.instances.db import db from app.models.Post import Post from app.models.Category import Category PostCategory = db.Table( 'post_categories', db.metadata, db.Column('category_name', db.Integer, db.ForeignKey(Category.name), primary_key=True), db.Column('post_id', db.Integer, db.ForeignKey(Post.id), primary_key=True)) Post.categories = db.relationship('Category', secondary=PostCategory, backref='posts', lazy='dynamic')