class CommentToMail(db.Model): __tablename__ = 'comment_to_mail' id = db.Column(db.Integer, primary_key=True) comment_id = db.Column(db.Integer, db.ForeignKey('comments.id')) timestamp = db.Column(db.DateTime, default=datetime.utcnow) is_sent = db.Column(db.Boolean, default=False) log = db.Column(db.Text) comment = db.relationship('Comment', backref='comment_to_mail')
class Article(db.Model): __tablename__ = 'articles' __searchable__ = ['title', 'body'] __analyzer__ = ChineseAnalyzer() id = db.Column(db.Integer, primary_key=True) number = db.Column(db.Integer, default=random_number, unique=True) title = db.Column(db.String(200), default='') body = db.Column(LONGTEXT, default='') body_html = db.Column(LONGTEXT) body_abstract = db.Column(db.Text) timestamp = db.Column(db.DateTime, index=True, default=datetime.utcnow) author_id = db.Column(db.Integer, db.ForeignKey('users.id')) author = db.relationship('User', backref='articles') repository_id = db.Column(db.String(36)) status = db.Column(db.String(200), default='') version_remark = db.Column(db.TEXT, default='') version_timestamp = db.Column(db.DateTime, index=True, default=datetime.utcnow) @staticmethod def query_published(): return Article.query.filter_by(status='published') def to_json(self, level='brief'): json = { 'id': self.id, 'number': self.number, 'title': self.title, 'timestamp': self.timestamp.replace(tzinfo=timezone.utc).isoformat(), 'author': self.author.to_json(level) } json['plugin'] = Signal.send('to_json', article=self, level=level) if level.startswith('admin_'): json['repositoryId'] = self.repository_id json['status'] = self.status json['versionTimestamp'] = self.version_timestamp if level == 'admin_brief': return json json['bodyAbstract'] = self.body_abstract if level == 'admin_basic': return json json['body'] = self.body if level == 'admin_full': return json else: if level == 'brief': return json json['bodyAbstract'] = self.body_abstract if level == 'basic': return json json['body'] = self.body json['bodyHtml'] = self.body_html if level == 'full': return json
class Message(db.Model): __tablename__ = 'comment_to_mail_messages' id = db.Column(db.Integer, primary_key=True) comment_id = db.Column(db.Integer, db.ForeignKey('comments.id')) status = db.Column(db.Text) job_id = db.Column(db.String(255)) message_id = db.Column(db.Text) sent_date_time = db.Column(db.DateTime) recipient = db.Column(db.Text) web_link = db.Column(db.Text) comment = db.relationship('Comment', backref='message')
class Page(db.Model): __tablename__ = 'pages' id = db.Column(db.Integer, primary_key=True) number = db.Column(db.Integer, default=random_number, unique=True) title = db.Column(db.String(200), default='') _slug = db.Column('slug', db.String(200), default='') body = db.Column(db.Text, default='') body_html = db.Column(db.Text) body_abstract = db.Column(db.Text) timestamp = db.Column(db.DateTime, index=True, default=datetime.utcnow) author_id = db.Column(db.Integer, db.ForeignKey('users.id')) author = db.relationship(User, backref='pages') repository_id = db.Column(db.String(36)) status = db.Column(db.String(200), default='') version_remark = db.Column(db.TEXT, default='') version_timestamp = db.Column(db.DateTime, index=True, default=datetime.utcnow) @hybrid_property def slug(self): return self._slug @slug.setter def slug(self, slug): self._slug = slugify(slug) @staticmethod def query_published(): return Page.query.filter_by(status='published') def to_json(self, level='basic'): json = { 'id': self.id, 'number': self.number, 'title': self.title, 'timestamp': self.timestamp, 'author': self.author.to_json() } json['plugin'] = Signal.send('to_json', page=self, level=level) if level.startswith('admin_'): json['repositoryId'] = self.repository_id json['status'] = self.status json['versionTimestamp'] = self.version_timestamp if level == 'admin_brief': return json json['bodyAbstract'] = self.body_abstract if level == 'admin_basic': return json json['body'] = self.body if level == 'admin_full': return json else: if level == 'brief': return json json['bodyAbstract'] = self.body_abstract if level == 'basic': return json json['body'] = self.body json['bodyHtml'] = self.body_html if level == 'full': return json if level == 'basic': return json json['body'] = self.body json['bodyHtml'] = self.body_html if level == 'full': return json
class Toc(db.Model): __tablename__ = 'toc' article_id = db.Column(db.Integer, db.ForeignKey('articles.id'), primary_key=True) toc_html = db.Column(db.Text) article = db.relationship('Article', backref=db.backref('toc', uselist=False, cascade="all, delete-orphan"))
class Comment(db.Model): __tablename__ = 'comments' id = db.Column(db.Integer, primary_key=True) body = db.Column(db.Text) body_html = db.Column(db.Text) timestamp = db.Column(db.DateTime, index=True, default=datetime.utcnow) author_id = db.Column(db.Integer, db.ForeignKey('users.id')) ip = db.Column(db.String(64)) agent = db.Column(db.String(200)) parent = db.Column(db.Integer) author = db.relationship('User', backref='comments') article_id = db.Column(db.Integer, db.ForeignKey('articles.id')) page_id = db.Column(db.Integer, db.ForeignKey('pages.id')) article = db.relationship('Article', backref='comments') page = db.relationship('Page', backref='comments') @staticmethod def create(id=None, body=None, body_html=None, timestamp=None, ip=None, agent=None, parent=None, author=None): filter_kwargs = {} for param in ['id', 'body', 'body_html', 'timestamp', 'ip', 'agent', 'parent', 'author']: if eval(param) is not None: filter_kwargs[param] = eval(param) return Comment(**filter_kwargs) @staticmethod def on_changed_body(target, value, oldvalue, initiator): class Renderer(mistune.Renderer): def __init__(self): super().__init__() self.toc_count = 0 def header(self, text, level, raw=None): rv = '<h%d id="toc-%d">%s</h%d>\n' % ( level, self.toc_count, text, level ) self.toc_count += 1 return rv renderer = Renderer() markdown = mistune.Markdown(renderer=renderer) target.body_html = markdown(value) def to_json(self, level='brief'): def get_comment_to(comment): if comment.article is not None: return comment.article.to_json('admin_brief') if comment.page is not None: return comment.page.to_json('admin_brief') json = { 'id': self.id } if level.startswith('admin_'): json['body'] = self.body json['timestamp'] = self.timestamp json['author'] = self.author.to_json('admin_brief') json['ip'] = self.ip json['to'] = get_comment_to(self) if level == 'admin_full': return json else: json['body'] = self.body json['timestamp'] = self.timestamp json['author'] = self.author.to_json('basic') if level == 'basic': return json