Skip to content

Commit 9408e92

Browse files
authored
Revert "[WEB-1435] dev: conflict free issue descriptions (#5912)" (#6000)
This reverts commit e9680ca.
1 parent e9680ca commit 9408e92

File tree

65 files changed

+357
-1465
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

65 files changed

+357
-1465
lines changed

apiserver/plane/app/serializers/draft.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -284,11 +284,9 @@ class Meta:
284284

285285
class DraftIssueDetailSerializer(DraftIssueSerializer):
286286
description_html = serializers.CharField()
287-
description_binary = serializers.CharField()
288287

289288
class Meta(DraftIssueSerializer.Meta):
290289
fields = DraftIssueSerializer.Meta.fields + [
291290
"description_html",
292-
"description_binary",
293291
]
294292
read_only_fields = fields

apiserver/plane/app/serializers/issue.py

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
1-
# Python imports
2-
import base64
3-
41
# Django imports
52
from django.utils import timezone
63
from django.core.validators import URLValidator
@@ -735,31 +732,14 @@ class Meta:
735732
read_only_fields = fields
736733

737734

738-
class Base64BinaryField(serializers.CharField):
739-
def to_representation(self, value):
740-
# Encode the binary data to base64 string for JSON response
741-
if value:
742-
return base64.b64encode(value).decode("utf-8")
743-
return None
744-
745-
def to_internal_value(self, data):
746-
# Decode the base64 string to binary data when saving
747-
try:
748-
return base64.b64decode(data)
749-
except (TypeError, ValueError):
750-
raise serializers.ValidationError("Invalid base64-encoded data")
751-
752-
753735
class IssueDetailSerializer(IssueSerializer):
754736
description_html = serializers.CharField()
755-
description_binary = Base64BinaryField()
756737
is_subscribed = serializers.BooleanField(read_only=True)
757738

758739
class Meta(IssueSerializer.Meta):
759740
fields = IssueSerializer.Meta.fields + [
760741
"description_html",
761742
"is_subscribed",
762-
"description_binary",
763743
]
764744
read_only_fields = fields
765745

apiserver/plane/app/serializers/workspace.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,6 @@ class Meta:
6666

6767
class WorkspaceMemberMeSerializer(BaseSerializer):
6868
draft_issue_count = serializers.IntegerField(read_only=True)
69-
7069
class Meta:
7170
model = WorkspaceMember
7271
fields = "__all__"

apiserver/plane/app/urls/intake.py

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -92,14 +92,4 @@
9292
),
9393
name="inbox-issue",
9494
),
95-
path(
96-
"workspaces/<str:slug>/projects/<uuid:project_id>/inbox-issues/<uuid:pk>/description/",
97-
IntakeIssueViewSet.as_view(
98-
{
99-
"get": "retrieve_description",
100-
"post": "update_description",
101-
}
102-
),
103-
name="inbox-issue-description",
104-
),
10595
]

apiserver/plane/app/urls/issue.py

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -66,16 +66,6 @@
6666
),
6767
name="project-issue",
6868
),
69-
path(
70-
"workspaces/<str:slug>/projects/<uuid:project_id>/issues/<uuid:pk>/description/",
71-
IssueViewSet.as_view(
72-
{
73-
"get": "retrieve_description",
74-
"post": "update_description",
75-
}
76-
),
77-
name="project-issue-description",
78-
),
7969
path(
8070
"workspaces/<str:slug>/projects/<uuid:project_id>/issue-labels/",
8171
LabelViewSet.as_view(
@@ -298,15 +288,6 @@
298288
),
299289
name="project-issue-archive-unarchive",
300290
),
301-
path(
302-
"workspaces/<str:slug>/projects/<uuid:project_id>/archived-issues/<uuid:pk>/description/",
303-
IssueArchiveViewSet.as_view(
304-
{
305-
"get": "retrieve_description",
306-
}
307-
),
308-
name="archive-issue-description",
309-
),
310291
## End Issue Archives
311292
## Issue Relation
312293
path(

apiserver/plane/app/urls/workspace.py

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -276,16 +276,6 @@
276276
),
277277
name="workspace-drafts-issues",
278278
),
279-
path(
280-
"workspaces/<str:slug>/draft-issues/<uuid:pk>/description/",
281-
WorkspaceDraftIssueViewSet.as_view(
282-
{
283-
"get": "retrieve_description",
284-
"post": "update_description",
285-
}
286-
),
287-
name="workspace-drafts-issues",
288-
),
289279
path(
290280
"workspaces/<str:slug>/draft-to-issue/<uuid:draft_id>/",
291281
WorkspaceDraftIssueViewSet.as_view({"post": "create_draft_to_issue"}),

apiserver/plane/app/views/intake/base.py

Lines changed: 2 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
# Python imports
22
import json
3-
import requests
4-
import base64
53

64
# Django import
75
from django.utils import timezone
@@ -11,9 +9,6 @@
119
from django.contrib.postgres.fields import ArrayField
1210
from django.db.models import Value, UUIDField
1311
from django.db.models.functions import Coalesce
14-
from django.http import StreamingHttpResponse
15-
from django.conf import settings
16-
1712

1813
# Third party imports
1914
from rest_framework import status
@@ -45,6 +40,7 @@
4540

4641

4742
class IntakeViewSet(BaseViewSet):
43+
4844
serializer_class = IntakeSerializer
4945
model = Intake
5046

@@ -93,6 +89,7 @@ def destroy(self, request, slug, project_id, pk):
9389

9490

9591
class IntakeIssueViewSet(BaseViewSet):
92+
9693
serializer_class = IntakeIssueSerializer
9794
model = IntakeIssue
9895

@@ -643,82 +640,3 @@ def destroy(self, request, slug, project_id, pk):
643640

644641
intake_issue.delete()
645642
return Response(status=status.HTTP_204_NO_CONTENT)
646-
647-
@allow_permission([ROLE.ADMIN, ROLE.MEMBER, ROLE.GUEST])
648-
def retrieve_description(self, request, slug, project_id, pk):
649-
issue = Issue.objects.filter(
650-
pk=pk, workspace__slug=slug, project_id=project_id
651-
).first()
652-
if issue is None:
653-
return Response(
654-
{"error": "Issue not found"},
655-
status=404,
656-
)
657-
binary_data = issue.description_binary
658-
659-
def stream_data():
660-
if binary_data:
661-
yield binary_data
662-
else:
663-
yield b""
664-
665-
response = StreamingHttpResponse(
666-
stream_data(), content_type="application/octet-stream"
667-
)
668-
response["Content-Disposition"] = (
669-
'attachment; filename="issue_description.bin"'
670-
)
671-
return response
672-
673-
@allow_permission([ROLE.ADMIN, ROLE.MEMBER, ROLE.GUEST])
674-
def update_description(self, request, slug, project_id, pk):
675-
issue = Issue.objects.get(
676-
workspace__slug=slug, project_id=project_id, pk=pk
677-
)
678-
base64_description = issue.description_binary
679-
# convert to base64 string
680-
if base64_description:
681-
base64_description = base64.b64encode(base64_description).decode(
682-
"utf-8"
683-
)
684-
data = {
685-
"original_document": base64_description,
686-
"updates": request.data.get("description_binary"),
687-
}
688-
base_url = f"{settings.LIVE_BASE_URL}/resolve-document-conflicts/"
689-
try:
690-
response = requests.post(base_url, json=data, headers=None)
691-
except requests.RequestException:
692-
return Response(
693-
{"error": "Failed to connect to the external service"},
694-
status=status.HTTP_502_BAD_GATEWAY,
695-
)
696-
697-
if response.status_code == 200:
698-
issue.description = response.json().get(
699-
"description", issue.description
700-
)
701-
issue.description_html = response.json().get("description_html")
702-
response_description_binary = response.json().get(
703-
"description_binary"
704-
)
705-
issue.description_binary = base64.b64decode(
706-
response_description_binary
707-
)
708-
issue.save()
709-
710-
def stream_data():
711-
if issue.description_binary:
712-
yield issue.description_binary
713-
else:
714-
yield b""
715-
716-
response = StreamingHttpResponse(
717-
stream_data(), content_type="application/octet-stream"
718-
)
719-
response["Content-Disposition"] = (
720-
'attachment; filename="issue_description.bin"'
721-
)
722-
return response
723-
724-
return Response(status=status.HTTP_500_INTERNAL_SERVER_ERROR)

apiserver/plane/app/views/issue/archive.py

Lines changed: 1 addition & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@
77
from django.utils import timezone
88
from django.utils.decorators import method_decorator
99
from django.views.decorators.gzip import gzip_page
10-
from django.http import StreamingHttpResponse
11-
1210

1311
# Third Party imports
1412
from rest_framework import status
@@ -29,7 +27,7 @@
2927
IssueLink,
3028
IssueSubscriber,
3129
IssueReaction,
32-
CycleIssue,
30+
CycleIssue
3331
)
3432
from plane.utils.grouper import (
3533
issue_group_values,
@@ -329,32 +327,6 @@ def unarchive(self, request, slug, project_id, pk=None):
329327

330328
return Response(status=status.HTTP_204_NO_CONTENT)
331329

332-
@allow_permission([ROLE.ADMIN, ROLE.MEMBER, ROLE.GUEST])
333-
def retrieve_description(self, request, slug, project_id, pk):
334-
issue = Issue.objects.filter(
335-
pk=pk, workspace__slug=slug, project_id=project_id
336-
).first()
337-
if issue is None:
338-
return Response(
339-
{"error": "Issue not found"},
340-
status=404,
341-
)
342-
binary_data = issue.description_binary
343-
344-
def stream_data():
345-
if binary_data:
346-
yield binary_data
347-
else:
348-
yield b""
349-
350-
response = StreamingHttpResponse(
351-
stream_data(), content_type="application/octet-stream"
352-
)
353-
response["Content-Disposition"] = (
354-
'attachment; filename="issue_description.bin"'
355-
)
356-
return response
357-
358330

359331
class BulkArchiveIssuesEndpoint(BaseAPIView):
360332
permission_classes = [

apiserver/plane/app/views/issue/base.py

Lines changed: 0 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
# Python imports
22
import json
3-
import requests
4-
import base64
53

64
# Django imports
75
from django.contrib.postgres.aggregates import ArrayAgg
@@ -22,10 +20,8 @@
2220
)
2321
from django.db.models.functions import Coalesce
2422
from django.utils import timezone
25-
from django.http import StreamingHttpResponse
2623
from django.utils.decorators import method_decorator
2724
from django.views.decorators.gzip import gzip_page
28-
from django.conf import settings
2925

3026
# Third Party imports
3127
from rest_framework import status
@@ -729,84 +725,6 @@ def destroy(self, request, slug, project_id, pk=None):
729725
)
730726
return Response(status=status.HTTP_204_NO_CONTENT)
731727

732-
@allow_permission([ROLE.ADMIN, ROLE.MEMBER, ROLE.GUEST])
733-
def retrieve_description(self, request, slug, project_id, pk):
734-
issue = Issue.issue_objects.filter(
735-
pk=pk, workspace__slug=slug, project_id=project_id
736-
).first()
737-
if issue is None:
738-
return Response(
739-
{"error": "Issue not found"},
740-
status=404,
741-
)
742-
binary_data = issue.description_binary
743-
744-
def stream_data():
745-
if binary_data:
746-
yield binary_data
747-
else:
748-
yield b""
749-
750-
response = StreamingHttpResponse(
751-
stream_data(), content_type="application/octet-stream"
752-
)
753-
response["Content-Disposition"] = (
754-
'attachment; filename="issue_description.bin"'
755-
)
756-
return response
757-
758-
def update_description(self, request, slug, project_id, pk):
759-
issue = Issue.issue_objects.get(
760-
workspace__slug=slug, project_id=project_id, pk=pk
761-
)
762-
base64_description = issue.description_binary
763-
# convert to base64 string
764-
if base64_description:
765-
base64_description = base64.b64encode(base64_description).decode(
766-
"utf-8"
767-
)
768-
data = {
769-
"original_document": base64_description,
770-
"updates": request.data.get("description_binary"),
771-
}
772-
base_url = f"{settings.LIVE_BASE_URL}/resolve-document-conflicts/"
773-
try:
774-
response = requests.post(base_url, json=data, headers=None)
775-
except requests.RequestException:
776-
return Response(
777-
{"error": "Failed to connect to the external service"},
778-
status=status.HTTP_502_BAD_GATEWAY,
779-
)
780-
781-
if response.status_code == 200:
782-
issue.description = response.json().get(
783-
"description", issue.description
784-
)
785-
issue.description_html = response.json().get("description_html")
786-
response_description_binary = response.json().get(
787-
"description_binary"
788-
)
789-
issue.description_binary = base64.b64decode(
790-
response_description_binary
791-
)
792-
issue.save()
793-
794-
def stream_data():
795-
if issue.description_binary:
796-
yield issue.description_binary
797-
else:
798-
yield b""
799-
800-
response = StreamingHttpResponse(
801-
stream_data(), content_type="application/octet-stream"
802-
)
803-
response["Content-Disposition"] = (
804-
'attachment; filename="issue_description.bin"'
805-
)
806-
return response
807-
808-
return Response(status=status.HTTP_500_INTERNAL_SERVER_ERROR)
809-
810728

811729
class IssueUserDisplayPropertyEndpoint(BaseAPIView):
812730
@allow_permission([ROLE.ADMIN, ROLE.MEMBER, ROLE.GUEST])

0 commit comments

Comments
 (0)