def get_index_json(self): last_revision = AnswerRevision.query.filter_by( answer_id=self.id).order_by( AnswerRevision.revision_time.desc()).first() if isinstance(last_revision, AnswerRevision): last_modified = last_revision.revision_time else: last_modified = self.date_created language = self.get_language() return { 'objectID': f'answer-{self.id}', 'id': self.id, 'code': self.code, 'date_created': self.date_created.isoformat() + 'Z', 'last_modified': last_modified.isoformat() + 'Z', 'language': language.get_id(), 'language_name': language.get_display_name(), 'byte_count': self.byte_len, 'author': self.user.get_index_json(root_object=False), 'post': { 'id': self.post.id, 'name': self.post.title, 'slug': slugify(self.post.title) } }
def create_post(title, body, categories): if g.user is None: return abort(403) # We don't really need to provide too much data since this is # validated client-side if not posts['min_title'] <= len(title) <= posts['max_title']: return abort(400) if not posts['min_len'] <= len(body) <= posts['max_len']: return abort(400) if not len(categories) < posts['max_tags']: return abort(400) for category in categories: if not Category.query.filter_by(name=category).first(): # Category doesn't exist so error return abort(400) # TODO: insert categories when models support new_post = Post(title=title, body=body) g.user.posts.append(new_post) db.session.add(new_post) db.session.commit() return url_for('get_post', post_id=new_post.id, title=slugify(new_post.title))
def to_json(self, no_body=False): json = { 'id': self.id, 'title': self.title, 'owner': self.user.to_json(), 'slug': slugify(self.title), 'date_created': self.date_created.isoformat(), 'deleted': self.deleted } if not no_body: json['body'] = self.body return json
def get_post(post_id, title=None): # Locate post matched_post = post.get_post(post_id=post_id) if matched_post is None: return abort(404) if matched_post.deleted: return render_template('deleted.html'), 410 # Always redirect to canonical url slug = slugify(matched_post.title) # Redirect if slug is incorrect. add 'noredirect=1' flag to avoid infinite redirection in # exceptional circumstances if title != slug and request.args.get('noredirect', '0') != '1': canonical_url = url_for('get_post', p=request.args.get('p'), post_id=post_id, title=slug, noredirect=1) return redirect(canonical_url, code=301) # Render main post's markdown body = markdown.render_markdown.delay(matched_post.body).wait() if body is None: return abort(500) # Get answers try: page = int(request.args.get('p', 1)) except ValueError: return abort(400) answers = answer_controller.get_answers(post_id=post_id, page=page) leaderboard = Leaderboard(post_id=post_id) # Get respective comments answer_comments = [get_rendered_comments(AnswerComment, max_depth=2, answer_id=answer.id) for answer in answers.items] post_comments = get_rendered_comments(PostComment, max_depth=2, post_id=post_id) return \ render_template('post/view.html', post_id=post_id, post=matched_post, post_body=body, answers=answers, leaderboard=leaderboard, vote=vote, answer_comments=answer_comments, post_comments=post_comments)
def get_index_json(self): last_revision = PostRevision.query.filter_by(post_id=self.id).order_by( PostRevision.revision_time.desc()).first() if isinstance(last_revision, PostRevision): last_modified = last_revision.revision_time else: last_modified = self.date_created return { 'objectID': f'post-{self.id}', 'id': self.id, 'title': self.title, 'body': render_markdown(self.body, render_math=False), 'slug': slugify(self.title), 'date_created': self.date_created.isoformat() + 'Z', 'last_modified': last_modified.isoformat() + 'Z', 'score': self.score, 'author': self.user.get_index_json(root_object=False) }
def get_canonical_post_url(post_id): matched_post = post.get_post(post_id=post_id) if matched_post is None: return abort(404) url = canonical_host + url_for('get_post', post_id=post_id, title=slugify(matched_post.title)) return render_json({"url": url})