Ejemplo n.º 1
0
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))
Ejemplo n.º 2
0
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)
Ejemplo n.º 3
0
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)
Ejemplo n.º 4
0
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)
Ejemplo n.º 5
0
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)
Ejemplo n.º 6
0
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)
Ejemplo n.º 7
0
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)
Ejemplo n.º 8
0
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)
Ejemplo n.º 9
0
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)
Ejemplo n.º 10
0
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)
Ejemplo n.º 11
0
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)