예제 #1
0
def submit_comment():
    comment = Comment()

    content = request.form.get('content')
    slug = request.form.get('slug')
    user = User.get(User.id == current_user.id)
    root = request.form.get('parent') or None

    if not (content and slug and user):
        flash('Missing content or reference to Post')
        return redirect(url_for('feed', feed='new'))

    else:
        comment.post = Proposal.get(Proposal.slug == slug)

        if root is not None and not (Comment.get(Comment.id == root).post
                                     == comment.post):
            flash('Invalid comment reference')
            return redirect(
                url_for('post_details',
                        slug=slug,
                        community=comment.post.community.name))
        else:
            comment.content = content
            comment.user = user
            comment.root = root

            try:
                with database.atomic():
                    comment.save()

            except peewee.IntegrityError:
                flash('Unable to save comment', 'error')

            else:
                return redirect(
                    url_for('post_details',
                            slug=slug,
                            community=comment.post.community.name))

    return redirect(
        url_for('post_details', slug=slug, community=comment.post.community))
예제 #2
0
def proposal_intvote(slug):
    vote = request.form.get('vote') or None
    if not vote:
        return jsonify({"error": "invalid vote parameter"}), 400

    prop = Proposal.get(Proposal.slug == slug)

    if vote == '':  # Pull vote
        PostInternalVote.delete().where(
            PostInternalVote.user_id == current_user.id
            and PostInternalVote.post == prop.id).execute()

    else:
        (PostInternalVote.insert(
            post=prop, user=current_user.id, vote=vote).on_conflict(
                conflict_target=[PostInternalVote.user, PostInternalVote.post],
                preserve=[PostInternalVote.vote,
                          PostInternalVote.timestamp]).execute())

    return jsonify({"status": "ok"})
예제 #3
0
def proposal_downvote(slug):
    prop = Proposal.get(Proposal.slug == slug)

    result = {"diff": '0', "votes": str(prop.votes)}

    if current_user.id == prop.author_id or current_user.karma <= 0:
        return jsonify(result)

    if current_user.has_downvoted(prop):
        # current_user.karma += 1
        prop.author.karma += 1
        prop.downvotes -= 1
        PostVote.delete().where((PostVote.post == prop) & (
            PostVote.user_id == current_user.id)).execute()
        result["diff"] = '+1'

    else:
        # current_user.karma -= 1
        prop.author.karma -= 1
        score_mod = 1
        if current_user.has_upvoted(prop):
            score_mod = 2
        result["diff"] = str(-score_mod)
        prop.downvotes += score_mod

        (PostVote.insert(post=prop, user=current_user.id, vote=-1).on_conflict(
            conflict_target=[PostVote.user, PostVote.post],
            preserve=[PostVote.vote, PostVote.timestamp]).execute())

    Proposal.save(prop)

    # FIXME move karma to another table
    User.save(current_user)
    User.save(prop.author)

    result["votes"] = str(prop.votes)

    return jsonify(result)