Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
69 commits
Select commit Hold shift + click to select a range
d91c665
Basic setup for drf-spectacular
dheeru0198 May 29, 2025
48f0cf4
Updated to only handle /api/v1 endpoints
dheeru0198 May 29, 2025
5d01843
feat: add asset and user endpoints with URL routing
pablohashescobar May 29, 2025
7e174d1
Group endpoints by tags
dheeru0198 May 29, 2025
c317a1c
Detailed schema definitions and examples for asset endpoints
dheeru0198 May 29, 2025
b44a6d0
Removed unnecessary extension
dheeru0198 May 29, 2025
3890ccf
Specify avatar_url field separately
dheeru0198 May 29, 2025
0139ee8
chore: add project docs
pablohashescobar May 29, 2025
1999deb
Merge branch 'openapi-specification' of github.com:makeplane/plane in…
pablohashescobar May 29, 2025
527c610
chore: correct all errors
pablohashescobar May 29, 2025
e096faf
chore: added open spec in work items
NarayanBavisetti May 29, 2025
23d0da9
Merge branch 'openapi-specification' of github.com:makeplane/plane in…
NarayanBavisetti May 29, 2025
e9c5ba0
feat: enhance cycle API endpoints with detailed OpenAPI specifications
pablohashescobar May 29, 2025
b5eafb6
Merge branch 'openapi-specification' of github.com:makeplane/plane in…
pablohashescobar May 29, 2025
713f4ab
chore: added open spec in labels
NarayanBavisetti May 29, 2025
ec7d15e
chore: work item properties
NarayanBavisetti May 29, 2025
9eac76e
feat: enhance API endpoints with OpenAPI specifications and HTTP meth…
pablohashescobar May 29, 2025
ba8db40
chore: run formatter
pablohashescobar May 29, 2025
c1e836f
Merge branch 'openapi-specification' of github.com:makeplane/plane in…
pablohashescobar May 29, 2025
f555d7a
Removed unnecessary settings for authentication
dheeru0198 May 30, 2025
e54b528
Refactors OpenAPI documentation structure
dheeru0198 May 30, 2025
e47509a
Merge branch 'preview' of github.com:makeplane/plane into openapi-spe…
pablohashescobar May 30, 2025
0287930
Merge branch 'openapi-specification' of github.com:makeplane/plane in…
pablohashescobar May 30, 2025
05d4c51
Refactor OpenAPI endpoint specifications
pablohashescobar May 30, 2025
7df62ae
Enhance API documentation with detailed endpoint descriptions
dheeru0198 May 30, 2025
e4c27ae
Enhance API serializers and views with new request structures
dheeru0198 May 30, 2025
3ca5ba9
Refactor OpenAPI documentation and endpoint specifications
dheeru0198 May 30, 2025
2008996
chore: correct formatting
pablohashescobar May 30, 2025
d9ef52d
chore: correct formatting for all api folder files
pablohashescobar May 30, 2025
6373201
refactor: clean up serializer imports and test setup
pablohashescobar May 30, 2025
91d1b4c
feat: add project creation and update serializers with validation
pablohashescobar May 30, 2025
84a3d51
feat: update serializers to include additional read-only fields
pablohashescobar May 30, 2025
473de6b
refactor: rename intake issue serializers and enhance structure
pablohashescobar May 30, 2025
4882c4c
refactor: rename issue serializer for intake and enhance API document…
dheeru0198 May 30, 2025
8a4aa99
chore: modules and cycles serializers
pablohashescobar Jun 2, 2025
861a981
feat: add new serializers for label and issue link management
pablohashescobar Jun 2, 2025
109bc9a
Don't consider read only fields as required
dheeru0198 Jun 2, 2025
2217b0e
Add setting to separate request and response definitions
dheeru0198 Jun 2, 2025
1f2739c
Merge branch 'preview' into openapi-specification
dheeru0198 Jun 2, 2025
3f341db
Fixed avatar_url warning on openapi spec generation
dheeru0198 Jun 3, 2025
71ee6dc
Made spectacular disabled by default
dheeru0198 Jun 5, 2025
c4f1059
Moved spectacular settings into separate file and added detailed desc…
dheeru0198 Jun 6, 2025
044de6e
Specify methods for asset urls
dheeru0198 Jun 6, 2025
9237984
Better server names
dheeru0198 Jun 6, 2025
b80df24
Enhance API documentation with summaries for various endpoints
pablohashescobar Jun 6, 2025
7138409
Add contact information to OpenAPI settings
pablohashescobar Jun 6, 2025
d71b74b
Reordered tags and improved description relavancy
dheeru0198 Jun 8, 2025
1baa442
Enhance OpenAPI documentation for cycle and issue endpoints
dheeru0198 Jun 8, 2025
29e45ab
Enhance serializer documentation across multiple files
dheeru0198 Jun 8, 2025
2878f0a
Refactor API endpoints for cycles, intake, modules, projects, and states
pablohashescobar Jun 10, 2025
470003d
Refactor issue and label API endpoints for clarity and functionality
pablohashescobar Jun 10, 2025
b203f69
Refactor asset API endpoint methods and introduce new status enums
pablohashescobar Jun 10, 2025
fd9765a
enforce naming convention
dheeru0198 Jun 10, 2025
7be89f7
Added LICENSE to openapi spec
dheeru0198 Jun 10, 2025
cfc632c
Merge branch 'preview' of github.com:makeplane/plane into openapi-spe…
pablohashescobar Jun 11, 2025
b2745eb
Merge branch 'openapi-specification' of github.com:makeplane/plane in…
pablohashescobar Jun 11, 2025
06ec33b
Enhance OpenAPI documentation for various API endpoints
pablohashescobar Jun 11, 2025
bf25c69
Enhance OpenAPI documentation for various API endpoints
pablohashescobar Jun 11, 2025
9749c87
Update OpenAPI examples and enhance project queryset logic
pablohashescobar Jun 12, 2025
9474c66
Enhance OpenAPI documentation and add response examples
dheeru0198 Jun 16, 2025
2547549
Merge branch 'preview' of github.com:makeplane/plane into openapi-spe…
pablohashescobar Jun 19, 2025
f1cc5c5
Merge branch 'openapi-specification' of github.com:makeplane/plane in…
pablohashescobar Jun 19, 2025
74ea37b
refactor: update terminology from 'issues' to 'work items' across mul…
pablohashescobar Jun 19, 2025
e60c153
use common timezones from pytz for choices
dheeru0198 Jun 19, 2025
0a20c8e
Merge branch 'preview' into openapi-specification-copy
dheeru0198 Jul 24, 2025
60daec3
Moved the openapi utils to the new folder structure
dheeru0198 Jul 24, 2025
4e4416b
Added exception logging in GenericAssetEndpoint to improve error hand…
dheeru0198 Jul 24, 2025
b15dda3
Fixed code rabbit suggestions
dheeru0198 Jul 24, 2025
c360850
Refactored IssueDetailAPIEndpoint to streamline issue retrieval and r…
dheeru0198 Jul 24, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions apps/api/plane/api/apps.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,10 @@

class ApiConfig(AppConfig):
name = "plane.api"

def ready(self):
# Import authentication extensions to register them with drf-spectacular
try:
import plane.utils.openapi.auth # noqa
except ImportError:
pass
45 changes: 41 additions & 4 deletions apps/api/plane/api/serializers/__init__.py
Original file line number Diff line number Diff line change
@@ -1,18 +1,55 @@
from .user import UserLiteSerializer
from .workspace import WorkspaceLiteSerializer
from .project import ProjectSerializer, ProjectLiteSerializer
from .project import (
ProjectSerializer,
ProjectLiteSerializer,
ProjectCreateSerializer,
ProjectUpdateSerializer,
)
from .issue import (
IssueSerializer,
LabelCreateUpdateSerializer,
LabelSerializer,
IssueLinkSerializer,
IssueCommentSerializer,
IssueAttachmentSerializer,
IssueActivitySerializer,
IssueExpandSerializer,
IssueLiteSerializer,
IssueAttachmentUploadSerializer,
IssueSearchSerializer,
IssueCommentCreateSerializer,
IssueLinkCreateSerializer,
IssueLinkUpdateSerializer,
)
from .state import StateLiteSerializer, StateSerializer
from .cycle import CycleSerializer, CycleIssueSerializer, CycleLiteSerializer
from .module import ModuleSerializer, ModuleIssueSerializer, ModuleLiteSerializer
from .intake import IntakeIssueSerializer
from .cycle import (
CycleSerializer,
CycleIssueSerializer,
CycleLiteSerializer,
CycleIssueRequestSerializer,
TransferCycleIssueRequestSerializer,
CycleCreateSerializer,
CycleUpdateSerializer,
)
from .module import (
ModuleSerializer,
ModuleIssueSerializer,
ModuleLiteSerializer,
ModuleIssueRequestSerializer,
ModuleCreateSerializer,
ModuleUpdateSerializer,
)
from .intake import (
IntakeIssueSerializer,
IntakeIssueCreateSerializer,
IntakeIssueUpdateSerializer,
)
from .estimate import EstimatePointSerializer
from .asset import (
UserAssetUploadSerializer,
AssetUpdateSerializer,
GenericAssetUploadSerializer,
GenericAssetUpdateSerializer,
FileAssetSerializer,
)
123 changes: 123 additions & 0 deletions apps/api/plane/api/serializers/asset.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
# Third party imports
from rest_framework import serializers

# Module imports
from .base import BaseSerializer
from plane.db.models import FileAsset


class UserAssetUploadSerializer(serializers.Serializer):
"""
Serializer for user asset upload requests.
This serializer validates the metadata required to generate a presigned URL
for uploading user profile assets (avatar or cover image) directly to S3 storage.
Supports JPEG, PNG, WebP, JPG, and GIF image formats with size validation.
"""

name = serializers.CharField(help_text="Original filename of the asset")
type = serializers.ChoiceField(
choices=[
("image/jpeg", "JPEG"),
("image/png", "PNG"),
("image/webp", "WebP"),
("image/jpg", "JPG"),
("image/gif", "GIF"),
],
default="image/jpeg",
help_text="MIME type of the file",
style={"placeholder": "image/jpeg"},
)
size = serializers.IntegerField(help_text="File size in bytes")
entity_type = serializers.ChoiceField(
choices=[
(FileAsset.EntityTypeContext.USER_AVATAR, "User Avatar"),
(FileAsset.EntityTypeContext.USER_COVER, "User Cover"),
],
help_text="Type of user asset",
)


class AssetUpdateSerializer(serializers.Serializer):
"""
Serializer for asset status updates after successful upload completion.
Handles post-upload asset metadata updates including attribute modifications
and upload confirmation for S3-based file storage workflows.
"""

attributes = serializers.JSONField(
required=False, help_text="Additional attributes to update for the asset"
)


class GenericAssetUploadSerializer(serializers.Serializer):
"""
Serializer for generic asset upload requests with project association.
Validates metadata for generating presigned URLs for workspace assets including
project association, external system tracking, and file validation for
document management and content storage workflows.
"""

name = serializers.CharField(help_text="Original filename of the asset")
type = serializers.CharField(required=False, help_text="MIME type of the file")
size = serializers.IntegerField(help_text="File size in bytes")
project_id = serializers.UUIDField(
required=False,
help_text="UUID of the project to associate with the asset",
style={"placeholder": "123e4567-e89b-12d3-a456-426614174000"},
)
external_id = serializers.CharField(
required=False,
help_text="External identifier for the asset (for integration tracking)",
)
external_source = serializers.CharField(
required=False, help_text="External source system (for integration tracking)"
)


class GenericAssetUpdateSerializer(serializers.Serializer):
"""
Serializer for generic asset upload confirmation and status management.
Handles post-upload status updates for workspace assets including
upload completion marking and metadata finalization.
"""

is_uploaded = serializers.BooleanField(
default=True, help_text="Whether the asset has been successfully uploaded"
)


class FileAssetSerializer(BaseSerializer):
"""
Comprehensive file asset serializer with complete metadata and URL generation.
Provides full file asset information including storage metadata, access URLs,
relationship data, and upload status for complete asset management workflows.
"""

asset_url = serializers.CharField(read_only=True)

class Meta:
model = FileAsset
fields = "__all__"
read_only_fields = [
"id",
"created_by",
"updated_by",
"created_at",
"updated_at",
"workspace",
"project",
"issue",
"comment",
"page",
"draft_issue",
"user",
"is_deleted",
"deleted_at",
"storage_metadata",
"asset_url",
]
7 changes: 7 additions & 0 deletions apps/api/plane/api/serializers/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,13 @@


class BaseSerializer(serializers.ModelSerializer):
"""
Base serializer providing common functionality for all model serializers.

Features field filtering, dynamic expansion of related fields, and standardized
primary key handling for consistent API responses across the application.
"""

id = serializers.PrimaryKeyRelatedField(read_only=True)

def __init__(self, *args, **kwargs):
Expand Down
114 changes: 104 additions & 10 deletions apps/api/plane/api/serializers/cycle.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,13 @@
from plane.utils.timezone_converter import convert_to_utc


class CycleSerializer(BaseSerializer):
total_issues = serializers.IntegerField(read_only=True)
cancelled_issues = serializers.IntegerField(read_only=True)
completed_issues = serializers.IntegerField(read_only=True)
started_issues = serializers.IntegerField(read_only=True)
unstarted_issues = serializers.IntegerField(read_only=True)
backlog_issues = serializers.IntegerField(read_only=True)
total_estimates = serializers.FloatField(read_only=True)
completed_estimates = serializers.FloatField(read_only=True)
started_estimates = serializers.FloatField(read_only=True)
class CycleCreateSerializer(BaseSerializer):
"""
Serializer for creating cycles with timezone handling and date validation.

Manages cycle creation including project timezone conversion, date range validation,
and UTC normalization for time-bound iteration planning and sprint management.
"""

def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
Expand All @@ -27,6 +24,29 @@ def __init__(self, *args, **kwargs):
self.fields["start_date"].timezone = project_timezone
self.fields["end_date"].timezone = project_timezone

class Meta:
model = Cycle
fields = [
"name",
"description",
"start_date",
"end_date",
"owned_by",
"external_source",
"external_id",
"timezone",
]
read_only_fields = [
"id",
"workspace",
"project",
"created_by",
"updated_by",
"created_at",
"updated_at",
"deleted_at",
]

def validate(self, data):
if (
data.get("start_date", None) is not None
Expand Down Expand Up @@ -59,6 +79,40 @@ def validate(self, data):
)
return data


class CycleUpdateSerializer(CycleCreateSerializer):
"""
Serializer for updating cycles with enhanced ownership management.

Extends cycle creation with update-specific features including ownership
assignment and modification tracking for cycle lifecycle management.
"""

class Meta(CycleCreateSerializer.Meta):
model = Cycle
fields = CycleCreateSerializer.Meta.fields + [
"owned_by",
]


class CycleSerializer(BaseSerializer):
"""
Cycle serializer with comprehensive project metrics and time tracking.

Provides cycle details including work item counts by status, progress estimates,
and time-bound iteration data for project management and sprint planning.
"""

total_issues = serializers.IntegerField(read_only=True)
cancelled_issues = serializers.IntegerField(read_only=True)
completed_issues = serializers.IntegerField(read_only=True)
started_issues = serializers.IntegerField(read_only=True)
unstarted_issues = serializers.IntegerField(read_only=True)
backlog_issues = serializers.IntegerField(read_only=True)
total_estimates = serializers.FloatField(read_only=True)
completed_estimates = serializers.FloatField(read_only=True)
started_estimates = serializers.FloatField(read_only=True)

class Meta:
model = Cycle
fields = "__all__"
Expand All @@ -76,6 +130,13 @@ class Meta:


class CycleIssueSerializer(BaseSerializer):
"""
Serializer for cycle-issue relationships with sub-issue counting.

Manages the association between cycles and work items, including
hierarchical issue tracking for nested work item structures.
"""

sub_issues_count = serializers.IntegerField(read_only=True)

class Meta:
Expand All @@ -85,6 +146,39 @@ class Meta:


class CycleLiteSerializer(BaseSerializer):
"""
Lightweight cycle serializer for minimal data transfer.

Provides essential cycle information without computed metrics,
optimized for list views and reference lookups.
"""

class Meta:
model = Cycle
fields = "__all__"


class CycleIssueRequestSerializer(serializers.Serializer):
"""
Serializer for bulk work item assignment to cycles.

Validates work item ID lists for batch operations including
cycle assignment and sprint planning workflows.
"""

issues = serializers.ListField(
child=serializers.UUIDField(), help_text="List of issue IDs to add to the cycle"
)


class TransferCycleIssueRequestSerializer(serializers.Serializer):
"""
Serializer for transferring work items between cycles.

Handles work item migration between cycles including validation
and relationship updates for sprint reallocation workflows.
"""

new_cycle_id = serializers.UUIDField(
help_text="ID of the target cycle to transfer issues to"
)
7 changes: 7 additions & 0 deletions apps/api/plane/api/serializers/estimate.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,13 @@


class EstimatePointSerializer(BaseSerializer):
"""
Serializer for project estimation points and story point values.

Handles numeric estimation data for work item sizing and sprint planning,
providing standardized point values for project velocity calculations.
"""

class Meta:
model = EstimatePoint
fields = ["id", "value"]
Expand Down
Loading