Exemplo n.º 1
0
    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)
            }
        }
Exemplo n.º 2
0
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))
Exemplo n.º 3
0
    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
Exemplo n.º 4
0
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)
Exemplo n.º 5
0
    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)
        }
Exemplo n.º 6
0
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})