Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore: update file uploads #3621

Draft
wants to merge 28 commits into
base: develop
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
42f3074
dev: update the response for assets
pablohashescobar Jan 31, 2024
94f445c
dev: update user assets with backend streaming
pablohashescobar Feb 1, 2024
e1f0da5
dev: update file image urls to backend apis
pablohashescobar Feb 2, 2024
6c97bce
dev: back migration for urls
pablohashescobar Feb 4, 2024
31cca8d
dev: back migration for assets in issue, comments and page
pablohashescobar Feb 5, 2024
cedc08b
dev: sync data for issue attachments
pablohashescobar Feb 5, 2024
02e5e0d
dev: update attachments for issues
pablohashescobar Feb 5, 2024
f95f242
dev: comment assets
pablohashescobar Feb 5, 2024
e19eb3f
dev: update the issue attachment default type
pablohashescobar Feb 5, 2024
6776c2d
dev: add nginx headers for request host
pablohashescobar Feb 7, 2024
2688e41
dev: update the default create bucket script to create private bucket
pablohashescobar Feb 7, 2024
16c7810
dev: docker variables upgrade and nginx template update
pablohashescobar Feb 8, 2024
e09d7f9
Merge branch 'develop' into chore/file-uploads
pablohashescobar Feb 8, 2024
ab5e698
feat: init working version of image blobs rendering
Palanikannan1437 Feb 9, 2024
c25ac3b
Merge branch 'develop' of github.com:makeplane/plane into update-file…
pablohashescobar Feb 12, 2024
9e31099
dev: add cycle snapshot migration file
pablohashescobar Feb 12, 2024
0f0e86f
dev: update migrations
pablohashescobar Feb 12, 2024
79685b3
dev: fix migrations and update nginx migration
pablohashescobar Feb 12, 2024
6719738
chore: issue attachment and description endpoint for space
NarayanBavisetti Feb 13, 2024
4e88854
Merge branch 'develop' of github.com:makeplane/plane into update-file…
pablohashescobar Mar 21, 2024
4165111
dev: remove unused imports
pablohashescobar Mar 21, 2024
6037321
dev: fix initial set of errora
pablohashescobar Mar 21, 2024
9bc1446
dev: fix conflicts and errors
pablohashescobar Mar 21, 2024
14c6cc1
Merge branch 'update-file-uploads' of github.com:makeplane/plane into…
pablohashescobar Mar 21, 2024
6cc29dc
Merge branch 'develop' of github.com:makeplane/plane into update-file…
pablohashescobar Mar 27, 2024
6a6d0d8
dev: fix imports
pablohashescobar Mar 27, 2024
d560d1f
Merge branch 'develop' of github.com:makeplane/plane into update-file…
pablohashescobar Apr 2, 2024
08ec379
dev: update migration to only use file asset name
pablohashescobar Apr 30, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 0 additions & 2 deletions apiserver/plane/api/serializers/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,7 @@
IssueSerializer,
LabelSerializer,
IssueLinkSerializer,
IssueAttachmentSerializer,
IssueCommentSerializer,
IssueAttachmentSerializer,
IssueActivitySerializer,
IssueExpandSerializer,
)
Expand Down
21 changes: 2 additions & 19 deletions apiserver/plane/api/serializers/issue.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
Issue,
IssueActivity,
IssueAssignee,
IssueAttachment,
IssueComment,
IssueLabel,
IssueLink,
Expand Down Expand Up @@ -79,7 +78,7 @@ def validate(self, data):
parsed_str = html.tostring(parsed, encoding="unicode")
data["description_html"] = parsed_str

except Exception as e:
except Exception:
raise serializers.ValidationError("Invalid HTML passed")

# Validate assignees are from project
Expand Down Expand Up @@ -323,22 +322,6 @@ def update(self, instance, validated_data):
return super().update(instance, validated_data)


class IssueAttachmentSerializer(BaseSerializer):
class Meta:
model = IssueAttachment
fields = "__all__"
read_only_fields = [
"id",
"workspace",
"project",
"issue",
"created_by",
"updated_by",
"created_at",
"updated_at",
]


class IssueCommentSerializer(BaseSerializer):
is_member = serializers.BooleanField(read_only=True)

Expand Down Expand Up @@ -366,7 +349,7 @@ def validate(self, data):
parsed_str = html.tostring(parsed, encoding="unicode")
data["comment_html"] = parsed_str

except Exception as e:
except Exception:
raise serializers.ValidationError("Invalid HTML passed")
return data

Expand Down
7 changes: 4 additions & 3 deletions apiserver/plane/api/views/cycle.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
Issue,
CycleIssue,
IssueLink,
IssueAttachment,
FileAsset,
)
from plane.app.permissions import ProjectEntityPermission
from plane.api.serializers import (
Expand Down Expand Up @@ -580,8 +580,9 @@ def get(self, request, slug, project_id, cycle_id):
.values("count")
)
.annotate(
attachment_count=IssueAttachment.objects.filter(
issue=OuterRef("id")
attachment_count=FileAsset.objects.filter(
entity_identifier=OuterRef("id"),
entity_type="issue_attachment",
)
.order_by()
.annotate(count=Func(F("id"), function="Count"))
Expand Down
12 changes: 6 additions & 6 deletions apiserver/plane/api/views/issue.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
# Python imports
import json

from django.core.serializers.json import DjangoJSONEncoder

# Django imports
from django.core.serializers.json import DjangoJSONEncoder
from django.db import IntegrityError
from django.db.models import (
Case,
Expand All @@ -23,7 +22,6 @@
from rest_framework import status
from rest_framework.response import Response

# Module imports
from plane.api.serializers import (
IssueActivitySerializer,
IssueCommentSerializer,
Expand All @@ -38,16 +36,17 @@
)
from plane.bgtasks.issue_activites_task import issue_activity
from plane.db.models import (
FileAsset,
Issue,
IssueActivity,
IssueAttachment,
IssueComment,
IssueLink,
Label,
Project,
ProjectMember,
)

# Module imports
from .base import BaseAPIView, WebhookMixin


Expand Down Expand Up @@ -128,8 +127,9 @@ def get(self, request, slug, project_id, pk=None):
.values("count")
)
.annotate(
attachment_count=IssueAttachment.objects.filter(
issue=OuterRef("id")
attachment_count=FileAsset.objects.filter(
entity_identifier=OuterRef("id"),
entity_type="issue_attachment",
)
.order_by()
.annotate(count=Func(F("id"), function="Count"))
Expand Down
7 changes: 4 additions & 3 deletions apiserver/plane/api/views/module.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@
ModuleLink,
Issue,
ModuleIssue,
IssueAttachment,
IssueLink,
FileAsset,
)
from plane.api.serializers import (
ModuleSerializer,
Expand Down Expand Up @@ -332,8 +332,9 @@ def get(self, request, slug, project_id, module_id):
.values("count")
)
.annotate(
attachment_count=IssueAttachment.objects.filter(
issue=OuterRef("id")
attachment_count=FileAsset.objects.filter(
entity_identifier=OuterRef("id"),
entity_type="issue_attachment",
)
.order_by()
.annotate(count=Func(F("id"), function="Count"))
Expand Down
2 changes: 0 additions & 2 deletions apiserver/plane/app/serializers/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,6 @@
IssueStateSerializer,
IssueLinkSerializer,
IssueLiteSerializer,
IssueAttachmentSerializer,
IssueSubscriberSerializer,
IssueReactionSerializer,
CommentReactionSerializer,
Expand All @@ -70,7 +69,6 @@
IssuePublicSerializer,
IssueDetailSerializer,
IssueReactionLiteSerializer,
IssueAttachmentLiteSerializer,
IssueLinkLiteSerializer,
)

Expand Down
5 changes: 3 additions & 2 deletions apiserver/plane/app/serializers/asset.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
from .base import BaseSerializer
from .base import BaseFileSerializer
from plane.db.models import FileAsset


class FileAssetSerializer(BaseSerializer):
class FileAssetSerializer(BaseFileSerializer):

class Meta:
model = FileAsset
fields = "__all__"
Expand Down
55 changes: 34 additions & 21 deletions apiserver/plane/app/serializers/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,19 +51,18 @@ def _filter_fields(self, fields):
for field in allowed:
if field not in self.fields:
from . import (
WorkspaceLiteSerializer,
ProjectLiteSerializer,
UserLiteSerializer,
StateLiteSerializer,
IssueSerializer,
LabelSerializer,
CycleIssueSerializer,
IssueLiteSerializer,
IssueRelationSerializer,
InboxIssueLiteSerializer,
IssueReactionLiteSerializer,
IssueAttachmentLiteSerializer,
IssueLinkLiteSerializer,
IssueLiteSerializer,
IssueReactionLiteSerializer,
IssueRelationSerializer,
IssueSerializer,
LabelSerializer,
ProjectLiteSerializer,
StateLiteSerializer,
UserLiteSerializer,
WorkspaceLiteSerializer,
)

# Expansion mapper
Expand All @@ -86,7 +85,6 @@ def _filter_fields(self, fields):
"issue_relation": IssueRelationSerializer,
"issue_inbox": InboxIssueLiteSerializer,
"issue_reactions": IssueReactionLiteSerializer,
"issue_attachment": IssueAttachmentLiteSerializer,
"issue_link": IssueLinkLiteSerializer,
"sub_issues": IssueLiteSerializer,
}
Expand Down Expand Up @@ -122,19 +120,18 @@ def to_representation(self, instance):
if expand in self.fields:
# Import all the expandable serializers
from . import (
WorkspaceLiteSerializer,
ProjectLiteSerializer,
UserLiteSerializer,
StateLiteSerializer,
IssueSerializer,
LabelSerializer,
CycleIssueSerializer,
IssueRelationSerializer,
InboxIssueLiteSerializer,
IssueLinkLiteSerializer,
IssueLiteSerializer,
IssueReactionLiteSerializer,
IssueAttachmentLiteSerializer,
IssueLinkLiteSerializer,
IssueRelationSerializer,
IssueSerializer,
LabelSerializer,
ProjectLiteSerializer,
StateLiteSerializer,
UserLiteSerializer,
WorkspaceLiteSerializer,
)

# Expansion mapper
Expand All @@ -157,7 +154,6 @@ def to_representation(self, instance):
"issue_relation": IssueRelationSerializer,
"issue_inbox": InboxIssueLiteSerializer,
"issue_reactions": IssueReactionLiteSerializer,
"issue_attachment": IssueAttachmentLiteSerializer,
"issue_link": IssueLinkLiteSerializer,
"sub_issues": IssueLiteSerializer,
}
Expand All @@ -179,3 +175,20 @@ def to_representation(self, instance):
)

return response


class BaseFileSerializer(DynamicBaseSerializer):

class Meta:
abstract = True # Make this serializer abstract

def to_representation(self, instance):
"""
Object instance -> Dict of primitive datatypes.
"""
response = super().to_representation(instance)
response["asset"] = (
instance.asset.name
) # Ensure 'asset' field is consistently serialized
# Apply custom method to get download URL
return response
69 changes: 20 additions & 49 deletions apiserver/plane/app/serializers/issue.py
Original file line number Diff line number Diff line change
@@ -1,40 +1,40 @@
# Django imports
from django.utils import timezone
from django.core.validators import URLValidator
from django.core.exceptions import ValidationError
from django.core.validators import URLValidator
from django.utils import timezone

# Third Party imports
from rest_framework import serializers

# Module imports
from .base import BaseSerializer, DynamicBaseSerializer
from .user import UserLiteSerializer
from .state import StateLiteSerializer
from .project import ProjectLiteSerializer
from .workspace import WorkspaceLiteSerializer
from plane.db.models import (
User,
CommentReaction,
Cycle,
CycleIssue,
Issue,
IssueActivity,
IssueAssignee,
IssueComment,
IssueLabel,
IssueLink,
IssueProperty,
IssueAssignee,
IssueReaction,
IssueRelation,
IssueSubscriber,
IssueLabel,
IssueVote,
Label,
CycleIssue,
Cycle,
Module,
ModuleIssue,
IssueLink,
IssueAttachment,
IssueReaction,
CommentReaction,
IssueVote,
IssueRelation,
State,
User,
)

# Module imports
from .base import BaseSerializer, DynamicBaseSerializer
from .project import ProjectLiteSerializer
from .state import StateLiteSerializer
from .user import UserLiteSerializer
from .workspace import WorkspaceLiteSerializer


class IssueFlatSerializer(BaseSerializer):
## Contain only flat fields
Expand Down Expand Up @@ -442,7 +442,7 @@ def validate_url(self, value):
raise serializers.ValidationError("Invalid URL format.")

# Check URL scheme
if not value.startswith(('http://', 'https://')):
if not value.startswith(("http://", "https://")):
raise serializers.ValidationError("Invalid URL scheme.")

return value
Expand Down Expand Up @@ -485,35 +485,6 @@ class Meta:
read_only_fields = fields


class IssueAttachmentSerializer(BaseSerializer):
class Meta:
model = IssueAttachment
fields = "__all__"
read_only_fields = [
"created_by",
"updated_by",
"created_at",
"updated_at",
"workspace",
"project",
"issue",
]


class IssueAttachmentLiteSerializer(DynamicBaseSerializer):
class Meta:
model = IssueAttachment
fields = [
"id",
"asset",
"attributes",
"issue_id",
"updated_at",
"updated_by_id",
]
read_only_fields = fields


class IssueReactionSerializer(BaseSerializer):
actor_detail = UserLiteSerializer(read_only=True, source="actor")

Expand Down