81 lines
3.1 KiB
Python
81 lines
3.1 KiB
Python
# Python imports
|
|
import json
|
|
|
|
# Django imports
|
|
from django.utils import timezone
|
|
from django.core.serializers.json import DjangoJSONEncoder
|
|
|
|
# Third Party imports
|
|
from rest_framework.response import Response
|
|
from rest_framework import status
|
|
|
|
# Module imports
|
|
from .. import BaseViewSet
|
|
from plane.app.serializers import IssueReactionSerializer
|
|
from plane.app.permissions import allow_permission, ROLE
|
|
from plane.db.models import IssueReaction
|
|
from plane.bgtasks.issue_activities_task import issue_activity
|
|
from plane.utils.host import base_host
|
|
|
|
|
|
class IssueReactionViewSet(BaseViewSet):
|
|
serializer_class = IssueReactionSerializer
|
|
model = IssueReaction
|
|
|
|
def get_queryset(self):
|
|
return (
|
|
super()
|
|
.get_queryset()
|
|
.filter(workspace__slug=self.kwargs.get("slug"))
|
|
.filter(project_id=self.kwargs.get("project_id"))
|
|
.filter(issue_id=self.kwargs.get("issue_id"))
|
|
.filter(
|
|
project__project_projectmember__member=self.request.user,
|
|
project__project_projectmember__is_active=True,
|
|
project__archived_at__isnull=True,
|
|
)
|
|
.order_by("-created_at")
|
|
.distinct()
|
|
)
|
|
|
|
@allow_permission([ROLE.ADMIN, ROLE.MEMBER, ROLE.GUEST])
|
|
def create(self, request, slug, project_id, issue_id):
|
|
serializer = IssueReactionSerializer(data=request.data)
|
|
if serializer.is_valid():
|
|
serializer.save(issue_id=issue_id, project_id=project_id, actor=request.user)
|
|
issue_activity.delay(
|
|
type="issue_reaction.activity.created",
|
|
requested_data=json.dumps(request.data, cls=DjangoJSONEncoder),
|
|
actor_id=str(request.user.id),
|
|
issue_id=str(issue_id),
|
|
project_id=str(project_id),
|
|
current_instance=None,
|
|
epoch=int(timezone.now().timestamp()),
|
|
notification=True,
|
|
origin=base_host(request=request, is_app=True),
|
|
)
|
|
return Response(serializer.data, status=status.HTTP_201_CREATED)
|
|
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
|
|
|
|
@allow_permission([ROLE.ADMIN, ROLE.MEMBER, ROLE.GUEST])
|
|
def destroy(self, request, slug, project_id, issue_id, reaction_code):
|
|
issue_reaction = IssueReaction.objects.get(
|
|
workspace__slug=slug,
|
|
project_id=project_id,
|
|
issue_id=issue_id,
|
|
reaction=reaction_code,
|
|
actor=request.user,
|
|
)
|
|
issue_activity.delay(
|
|
type="issue_reaction.activity.deleted",
|
|
requested_data=None,
|
|
actor_id=str(self.request.user.id),
|
|
issue_id=str(self.kwargs.get("issue_id", None)),
|
|
project_id=str(self.kwargs.get("project_id", None)),
|
|
current_instance=json.dumps({"reaction": str(reaction_code), "identifier": str(issue_reaction.id)}),
|
|
epoch=int(timezone.now().timestamp()),
|
|
notification=True,
|
|
origin=base_host(request=request, is_app=True),
|
|
)
|
|
issue_reaction.delete()
|
|
return Response(status=status.HTTP_204_NO_CONTENT)
|