diff options
| author | Andrew Godwin | 2022-11-15 18:30:30 -0700 | 
|---|---|---|
| committer | Andrew Godwin | 2022-11-15 15:30:32 -0700 | 
| commit | 20e63023bb0d3c7e4cb36b91b73e79f51889cc90 (patch) | |
| tree | 96c99139f03550e35902440cd321290bc47f8f0f /activities/views/posts.py | |
| parent | 4aa92744aea6097ffb784ca7de6bd95cc599988d (diff) | |
| download | takahe-20e63023bb0d3c7e4cb36b91b73e79f51889cc90.tar.gz takahe-20e63023bb0d3c7e4cb36b91b73e79f51889cc90.tar.bz2 takahe-20e63023bb0d3c7e4cb36b91b73e79f51889cc90.zip | |
Get outbound likes/boosts and their undos working
Diffstat (limited to 'activities/views/posts.py')
| -rw-r--r-- | activities/views/posts.py | 102 | 
1 files changed, 102 insertions, 0 deletions
| diff --git a/activities/views/posts.py b/activities/views/posts.py new file mode 100644 index 0000000..ece7cf3 --- /dev/null +++ b/activities/views/posts.py @@ -0,0 +1,102 @@ +from django.shortcuts import get_object_or_404, redirect, render +from django.utils.decorators import method_decorator +from django.views.generic import TemplateView, View + +from activities.models import PostInteraction, PostInteractionStates +from users.decorators import identity_required +from users.shortcuts import by_handle_or_404 + + +class Post(TemplateView): + +    template_name = "activities/post.html" + +    def get_context_data(self, handle, post_id): +        identity = by_handle_or_404(self.request, handle, local=False) +        post = get_object_or_404(identity.posts, pk=post_id) +        return { +            "identity": identity, +            "post": post, +            "interactions": PostInteraction.get_post_interactions( +                [post], +                self.request.identity, +            ), +        } + + +@method_decorator(identity_required, name="dispatch") +class Like(View): +    """ +    Adds/removes a like from the current identity to the post +    """ + +    undo = False + +    def post(self, request, handle, post_id): +        identity = by_handle_or_404(self.request, handle, local=False) +        post = get_object_or_404(identity.posts, pk=post_id) +        if self.undo: +            # Undo any likes on the post +            for interaction in PostInteraction.objects.filter( +                type=PostInteraction.Types.like, +                identity=request.identity, +                post=post, +            ): +                interaction.transition_perform(PostInteractionStates.undone) +        else: +            # Make a like on this post if we didn't already +            PostInteraction.objects.get_or_create( +                type=PostInteraction.Types.like, +                identity=request.identity, +                post=post, +            ) +        # Return either a redirect or a HTMX snippet +        if request.htmx: +            return render( +                request, +                "activities/_like.html", +                { +                    "post": post, +                    "interactions": {"like": set() if self.undo else {post.pk}}, +                }, +            ) +        return redirect(post.urls.view) + + +@method_decorator(identity_required, name="dispatch") +class Boost(View): +    """ +    Adds/removes a boost from the current identity to the post +    """ + +    undo = False + +    def post(self, request, handle, post_id): +        identity = by_handle_or_404(self.request, handle, local=False) +        post = get_object_or_404(identity.posts, pk=post_id) +        if self.undo: +            # Undo any boosts on the post +            for interaction in PostInteraction.objects.filter( +                type=PostInteraction.Types.boost, +                identity=request.identity, +                post=post, +            ): +                interaction.transition_perform(PostInteractionStates.undone) +        else: +            # Make a boost on this post if we didn't already +            PostInteraction.objects.get_or_create( +                type=PostInteraction.Types.boost, +                identity=request.identity, +                post=post, +            ) +        # Return either a redirect or a HTMX snippet +        if request.htmx: +            return render( +                request, +                "activities/_boost.html", +                { +                    "post": post, +                    "interactions": {"boost": set() if self.undo else {post.pk}}, +                }, +            ) +        return redirect(post.urls.view) | 
