def post(self, user):
        # grab the form
        form = LikeForm(self.request.params)
        username = user

        # grab the user (for their key)
        user = User.query(User.username == username).get()

        if user is None:
            self.redirect('/user/login')
            return

        # grab the post via what should be it's key
        try:
            post = Key(urlsafe=form.key.data).get()
        except Exception as e:
            post = None

        if post is None:
            self.redirect('/')
            return

        if user.username == post.author:
            error = 'you can\'t like or unlike you own post'
            self.render("index.html", error=error)
            return

        # is the post liked by this user already?
        try:
            liked = Like.query(Like.owner == user.key,
                               Like.post == Key(urlsafe=form.key.data)).get()
        except Exception as e:
            print e.message
            liked = None

        # let's set the Like entity up and like the post
        try:
            if liked is None:  # hasn't been liked yet
                liked = Like(owner=user.key,
                             post=Key(urlsafe=form.key.data),
                             liked=True)
                liked.put()
            else:
                liked.liked = True if liked.liked is False else False
                liked.put()

            # inc/dec the post likes
            if liked.liked is True:
                post.likes += 1
            else:
                post.likes -= 1

            post.put()
            # go back to the post!
            self.redirect('/post/view?key=%s' % post.key.urlsafe())
            return
        except Exception as e:
            # go back to the post even if we fail to like it
            self.redirect('/post/view?key=%s' % post.key.urlsafe())
            return
    def post(self, user):
        # grab the form
        form = PostDeleteForm(self.request.params)

        # validate csrf
        if not self.validate_csrf(form.csrf_token.data):
            form.csrf_token.data = self.generate_csrf()
            self.r(form, flashes=flash('Please submit the form again.'))
            return

        # get the post please
        try:
            post = Key(urlsafe=form.key.data).get()
        except:
            post = None

        # as usual, this really shouldn't
        # be None unless unnatural navigation
        if post is None:
            self.redirect('/')
            return

        # the post exists, is it owned by the user?
        if post.author != user:
            self.redirect('/')
            return

        # check if the user is the owner or not
        if post.author != user:
            self.redirect('/')
            return

        # everything checks out so let's remove the post
        # first though, we need to remove the comments
        # assoc with the post and the likes
        # TODO query these entities to make sure they are removed
        comments = Comment.query(ancestor=post.key).fetch()
        ks = put_multi(comments)
        delete_multi(ks)

        likes = Like.query(Like.post == post.key).fetch()
        ks = put_multi(likes)
        delete_multi(ks)

        # got everything else removed, let's
        # remove the post
        try:
            post.key.delete()
            self.redirect('/')
            return
        except Exception as e:
            # let them try again
            form.csrf_token.data = self.generate_csrf()
            self.r(form, post, flashes=flash())
            return
Exemple #3
0
    def get(self):
        # get the user
        user = self.validate_user()
        # we have the user and need to access their key to see if they liked the post
        # if they are not signed in then we don't show if they liked or not
        if user is not None:
            user = User.query(User.username == user).get()
            if user is not None:
                user = user.key

        # get the post key
        k = self.request.get('key', None)
        if k is None:
            self.redirect('/')
            return

        # create our form data for likes/comments
        formData = {
            'key': k,
            'csrf_token': self.generate_csrf()
        }

        # create our comment form
        form = CommentForm(data=formData)
        # create our like form
        like_form = LikeForm(data=formData)

        # try to retrieve the post based on the key
        try:
            post = Key(urlsafe=k).get()
        except:
            post = None

        # don't have the comments yet, or likes
        comments = None
        liked = None
        if post is not None:
            # grab the comments please
            comments = Comment.query(ancestor=post.key).order(-Comment.created).fetch()
            # grab likes
            # we also need to see if this user has "liked" the post already
            liked = Like.query(Like.owner == user, Like.post == post.key).get()
        self.r(form, like_form, post, comments, liked)
    def get(self):
        # get the user
        user = self.validate_user()
        # we have the user and need to access their key to see if they liked the post
        # if they are not signed in then we don't show if they liked or not
        if user is not None:
            user = User.query(User.username == user).get()
            if user is not None:
                user = user.key

        # get the post key
        k = self.request.get('key', None)
        if k is None:
            self.redirect('/')
            return

        # create our form data for likes/comments
        formData = {'key': k, 'csrf_token': self.generate_csrf()}

        # create our comment form
        form = CommentForm(data=formData)
        # create our like form
        like_form = LikeForm(data=formData)

        # try to retrieve the post based on the key
        try:
            post = Key(urlsafe=k).get()
        except:
            post = None

        # don't have the comments yet, or likes
        comments = None
        liked = None
        if post is not None:
            # grab the comments please
            comments = Comment.query(
                ancestor=post.key).order(-Comment.created).fetch()
            # grab likes
            # we also need to see if this user has "liked" the post already
            liked = Like.query(Like.owner == user, Like.post == post.key).get()
        self.r(form, like_form, post, comments, liked)