Exemple #1
0
    def vote(self, upvote, id, remote_addr):
        """+1 a given comment. Returns the new like count (may not change because
        the creater can't vote on his/her own comment and multiple votes from the
        same ip address are ignored as well)."""

        rv = self.db.execute(
            'SELECT likes, dislikes, voters FROM comments WHERE id=?', (id, )) \
            .fetchone()

        if rv is None:
            return None

        likes, dislikes, voters = rv
        if likes + dislikes >= 142:
            return {'likes': likes, 'dislikes': dislikes}

        bf = Bloomfilter(bytearray(voters), likes + dislikes)
        if remote_addr in bf:
            return {'likes': likes, 'dislikes': dislikes}

        bf.add(remote_addr)
        self.db.execute([
            'UPDATE comments SET',
            '    likes = likes + 1,' if upvote else 'dislikes = dislikes + 1,',
            '    voters = ?'
            'WHERE id=?;'
        ], (buffer(bf.array), id))

        if upvote:
            return {'likes': likes + 1, 'dislikes': dislikes}
        return {'likes': likes, 'dislikes': dislikes + 1}
Exemple #2
0
    def vote(self, id, remote_addr):
        """+1 a given comment. Returns the new like count (may not change because
        the creater can't vote on his/her own comment and multiple votes from the
        same ip address are ignored as well)."""

        rv = self.db.execute(
            'SELECT likes, voters FROM comments WHERE id=?', (id, )) \
            .fetchone()

        if rv is None:
            return None

        likes, voters = rv
        if likes >= 142:
            return {'likes': likes}

        bf = Bloomfilter(bytearray(voters), likes)
        if remote_addr in bf:
            return {'likes': likes}

        bf.add(remote_addr)
        self.db.execute([
            'UPDATE comments SET',
            '    likes = likes + 1,',
            '    voters = ?'
            'WHERE id=?;'], (buffer(bf.array), id))

        return {'likes': likes + 1}
Exemple #3
0
    def vote(self, upvote, id, remote_addr):
        """+1 a given comment. Returns the new like count (may not change because
        the creater can't vote on his/her own comment and multiple votes from the
        same ip address are ignored as well)."""

        rv = self.db.execute("SELECT likes, dislikes, voters FROM comments WHERE id=?", (id,)).fetchone()

        if rv is None:
            return None

        likes, dislikes, voters = rv
        if likes + dislikes >= 142:
            return {"likes": likes, "dislikes": dislikes}

        bf = Bloomfilter(bytearray(voters), likes + dislikes)
        if remote_addr in bf:
            return {"likes": likes, "dislikes": dislikes}

        bf.add(remote_addr)
        self.db.execute(
            [
                "UPDATE comments SET",
                "    likes = likes + 1," if upvote else "dislikes = dislikes + 1,",
                "    voters = ?" "WHERE id=?;",
            ],
            (buffer(bf.array), id),
        )

        if upvote:
            return {"likes": likes + 1, "dislikes": dislikes}
        return {"likes": likes, "dislikes": dislikes + 1}
    def vote(self, upvote, id, remote_addr):
        """+1 a given comment. Returns the new like count (may not change because
        the creater can't vote on his/her own comment and multiple votes from the
        same ip address are ignored as well)."""

        rv = self.db.fetchone(
            'SELECT likes, dislikes, voters FROM comments WHERE id=%s', (id, ))

        if rv is None:
            return None

        likes, dislikes, votersPickle = rv
        voters = pickle.loads(votersPickle)
        if likes + dislikes >= 142:
            return {'likes': likes, 'dislikes': dislikes}

        bf = Bloomfilter(voters.array, likes + dislikes)
        if remote_addr in bf:
            return {'likes': likes, 'dislikes': dislikes}

        bf.add(remote_addr)
        self.db.commit([
            'UPDATE comments SET',
            '    likes = likes + 1,' if upvote else 'dislikes = dislikes + 1,',
            '    voters = %s'
            'WHERE id=%s;'], (pickle.dumps(bf.array), id))

        if upvote:
            return {'likes': likes + 1, 'dislikes': dislikes}
        return {'likes': likes, 'dislikes': dislikes + 1}
Exemple #5
0
    def vote(self, upvote, id, remote_addr):
        """+1 a given comment. Returns the new like count (may not change because
        the creater can't vote on his/her own comment and multiple votes from the
        same ip address are ignored as well)."""

        rv = self.db.execute(
            'SELECT likes, dislikes, voters FROM comments WHERE id=?', (id, )) \
            .fetchone()

        if rv is None:
            return None

        operation_name = 'Upvote' if upvote else 'Downvote'
        likes, dislikes, voters = rv
        if likes + dislikes >= MAX_LIKES_AND_DISLIKES:
            message = '{} denied due to a "likes + dislikes" total too high ({} >= {})'.format(
                operation_name, likes + dislikes, MAX_LIKES_AND_DISLIKES)
            logger.debug('Comments.vote(id=%s): %s', id, message)
            return {'likes': likes, 'dislikes': dislikes, 'message': message}

        bf = Bloomfilter(bytearray(voters), likes + dislikes)
        if remote_addr in bf:
            message = '{} denied because a vote has already been registered for this remote address: {}'.format(
                operation_name, remote_addr)
            logger.debug('Comments.vote(id=%s): %s', id, message)
            return {'likes': likes, 'dislikes': dislikes, 'message': message}

        bf.add(remote_addr)
        self.db.execute([
            'UPDATE comments SET',
            '    likes = likes + 1,' if upvote else 'dislikes = dislikes + 1,',
            '    voters = ?'
            'WHERE id=?;'
        ], (buffer(bf.array), id))

        if upvote:
            return {'likes': likes + 1, 'dislikes': dislikes}
        return {'likes': likes, 'dislikes': dislikes + 1}