Skip to content

Commit

Permalink
Merge pull request #862 from makeplane/stage-release
Browse files Browse the repository at this point in the history
promote: staging to production v0.5
  • Loading branch information
vamsi authored Apr 17, 2023
2 parents 3817511 + c51407c commit d2a58bf
Show file tree
Hide file tree
Showing 275 changed files with 8,918 additions and 3,756 deletions.
9 changes: 9 additions & 0 deletions .github/ISSUE_TEMPLATE/--bug-report.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,15 @@ body:
- Deploy preview
validations:
required: true
type: dropdown
id: browser
attributes:
label: Browser
options:
- Google Chrome
- Mozilla Firefox
- Safari
- Other
- type: dropdown
id: version
attributes:
Expand Down
11 changes: 2 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
Meet Plane. An open-source software development tool to manage issues, sprints, and product roadmaps with peace of mind 🧘‍♀️.


> Plane is still in its early days, not everything will be perfect yet, and hiccups may happen. Please let us know of any suggestions, ideas, or bugs that you encounter on our [Discord](https://discord.com/invite/29tPNhaV) or GitHub issues, and we will use your feedback to improve on our upcoming releases.
> Plane is still in its early days, not everything will be perfect yet, and hiccups may happen. Please let us know of any suggestions, ideas, or bugs that you encounter on our [Discord](https://discord.com/invite/A92xrEGCge) or GitHub issues, and we will use your feedback to improve on our upcoming releases.
The easiest way to get started with Plane is by creating a [Plane Cloud](https://app.plane.so) account. Plane Cloud offers a hosted solution for Plane. If you prefer to self-host Plane, please refer to our [deployment documentation](https://docs.plane.so/self-hosting).

Expand Down Expand Up @@ -65,6 +65,7 @@ cd plane
docker-compose up
```

<strong>You can use the default email and password for your first login `captain@plane.so` and `password123`.</strong>

## 🚀 Features

Expand Down Expand Up @@ -123,14 +124,6 @@ For full documentation, visit [docs.plane.so](https://docs.plane.so/)

To see how to Contribute, visit [here](https://github.com/makeplane/plane/blob/master/CONTRIBUTING.md).

## 🔋 Status

- [x] Early Community Previews: We are open-sourcing and sharing the development version of Plane
- [ ] Alpha: We are testing Plane with a closed set of customers
- [ ] Public Alpha: Anyone can sign up over at [app.plane.so](https://app.plane.so). But go easy on us, there are a few hiccups
- [ ] Public Beta: Stable enough for most non-enterprise use-cases
- [ ] Public: Production-ready

## ❤️ Community

The Plane community can be found on GitHub Discussions, where you can ask questions, voice ideas, and share your projects.
Expand Down
2 changes: 1 addition & 1 deletion apiserver/Procfile
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
web: gunicorn -w 4 -k uvicorn.workers.UvicornWorker plane.asgi:application --bind 0.0.0.0:$PORT --config gunicorn.config.py --max-requests 10000 --max-requests-jitter 1000 --access-logfile -
worker: python manage.py rqworker
worker: celery -A plane worker -l info
6 changes: 3 additions & 3 deletions apiserver/back_migration.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,7 @@
import random
from django.contrib.auth.hashers import make_password
from plane.db.models import ProjectIdentifier
from plane.db.models import Issue, IssueComment, User, Project, ProjectMember

from plane.db.models import Issue, IssueComment, User, Project, ProjectMember, Label


# Update description and description html values for old descriptions
Expand Down Expand Up @@ -148,7 +147,7 @@ def update_user_view_property():
"collapsed": True,
"issueView": "list",
"filterIssue": None,
"groupByProperty": True,
"groupByProperty": None,
"showEmptyGroups": True,
}
updated_project_members.append(project_member)
Expand All @@ -161,6 +160,7 @@ def update_user_view_property():
print(e)
print("Failed")


def update_label_color():
try:
labels = Label.objects.filter(color="")
Expand Down
3 changes: 1 addition & 2 deletions apiserver/bin/worker
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,4 @@
set -e

python manage.py wait_for_db
python manage.py migrate
python manage.py rqworker
celery -A plane worker -l info
3 changes: 3 additions & 0 deletions apiserver/plane/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from .celery import app as celery_app

__all__ = ('celery_app',)
4 changes: 4 additions & 0 deletions apiserver/plane/api/serializers/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
TeamSerializer,
WorkSpaceMemberInviteSerializer,
WorkspaceLiteSerializer,
WorkspaceThemeSerializer,
)
from .project import (
ProjectSerializer,
Expand Down Expand Up @@ -41,6 +42,7 @@
IssueStateSerializer,
IssueLinkSerializer,
IssueLiteSerializer,
IssueAttachmentSerializer,
)

from .module import (
Expand All @@ -65,3 +67,5 @@
from .importer import ImporterSerializer

from .page import PageSerializer, PageBlockSerializer, PageFavoriteSerializer

from .estimate import EstimateSerializer, EstimatePointSerializer
25 changes: 25 additions & 0 deletions apiserver/plane/api/serializers/estimate.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# Module imports
from .base import BaseSerializer

from plane.db.models import Estimate, EstimatePoint


class EstimateSerializer(BaseSerializer):
class Meta:
model = Estimate
fields = "__all__"
read_only_fields = [
"workspace",
"project",
]


class EstimatePointSerializer(BaseSerializer):
class Meta:
model = EstimatePoint
fields = "__all__"
read_only_fields = [
"estimate",
"workspace",
"project",
]
2 changes: 2 additions & 0 deletions apiserver/plane/api/serializers/importer.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
# Module imports
from .base import BaseSerializer
from .user import UserLiteSerializer
from .project import ProjectLiteSerializer
from plane.db.models import Importer


class ImporterSerializer(BaseSerializer):
initiated_by_detail = UserLiteSerializer(source="initiated_by", read_only=True)
project_detail = ProjectLiteSerializer(source="project", read_only=True)

class Meta:
model = Importer
Expand Down
46 changes: 40 additions & 6 deletions apiserver/plane/api/serializers/issue.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
Module,
ModuleIssue,
IssueLink,
IssueAttachment,
)


Expand Down Expand Up @@ -99,7 +100,7 @@ def create(self, validated_data):
project = self.context["project"]
issue = Issue.objects.create(**validated_data, project=project)

if blockers is not None:
if blockers is not None and len(blockers):
IssueBlocker.objects.bulk_create(
[
IssueBlocker(
Expand All @@ -115,7 +116,7 @@ def create(self, validated_data):
batch_size=10,
)

if assignees is not None:
if assignees is not None and len(assignees):
IssueAssignee.objects.bulk_create(
[
IssueAssignee(
Expand All @@ -130,8 +131,19 @@ def create(self, validated_data):
],
batch_size=10,
)

if labels is not None:
else:
# Then assign it to default assignee
if project.default_assignee is not None:
IssueAssignee.objects.create(
assignee=project.default_assignee,
issue=issue,
project=project,
workspace=project.workspace,
created_by=issue.created_by,
updated_by=issue.updated_by,
)

if labels is not None and len(labels):
IssueLabel.objects.bulk_create(
[
IssueLabel(
Expand All @@ -147,7 +159,7 @@ def create(self, validated_data):
batch_size=10,
)

if blocks is not None:
if blocks is not None and len(blocks):
IssueBlocker.objects.bulk_create(
[
IssueBlocker(
Expand Down Expand Up @@ -254,7 +266,8 @@ class Meta:
class IssueCommentSerializer(BaseSerializer):
actor_detail = UserLiteSerializer(read_only=True, source="actor")
issue_detail = IssueFlatSerializer(read_only=True, source="issue")
project_detail = ProjectSerializer(read_only=True, source="project")
project_detail = ProjectLiteSerializer(read_only=True, source="project")
workspace_detail = WorkspaceLiteSerializer(read_only=True, source="workspace")

class Meta:
model = IssueComment
Expand Down Expand Up @@ -297,6 +310,9 @@ class Meta:


class LabelSerializer(BaseSerializer):
workspace_detail = WorkspaceLiteSerializer(source="workspace", read_only=True)
project_detail = ProjectLiteSerializer(source="project", read_only=True)

class Meta:
model = Label
fields = "__all__"
Expand Down Expand Up @@ -439,6 +455,21 @@ def create(self, validated_data):
return IssueLink.objects.create(**validated_data)


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


# Issue Serializer with state details
class IssueStateSerializer(BaseSerializer):
state_detail = StateSerializer(read_only=True, source="state")
Expand Down Expand Up @@ -466,6 +497,7 @@ class IssueSerializer(BaseSerializer):
issue_cycle = IssueCycleDetailSerializer(read_only=True)
issue_module = IssueModuleDetailSerializer(read_only=True)
issue_link = IssueLinkSerializer(read_only=True, many=True)
issue_attachment = IssueAttachmentSerializer(read_only=True, many=True)
sub_issues_count = serializers.IntegerField(read_only=True)

class Meta:
Expand All @@ -490,6 +522,8 @@ class IssueLiteSerializer(BaseSerializer):
sub_issues_count = serializers.IntegerField(read_only=True)
cycle_id = serializers.UUIDField(read_only=True)
module_id = serializers.UUIDField(read_only=True)
attachment_count = serializers.IntegerField(read_only=True)
link_count = serializers.IntegerField(read_only=True)

class Meta:
model = Issue
Expand Down
20 changes: 8 additions & 12 deletions apiserver/plane/api/serializers/view.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,22 +25,18 @@ class Meta:

def create(self, validated_data):
query_params = validated_data.get("query_data", {})

if not bool(query_params):
raise serializers.ValidationError(
{"query_data": ["Query data field cannot be empty"]}
)

validated_data["query"] = issue_filters(query_params, "POST")
if bool(query_params):
validated_data["query"] = issue_filters(query_params, "POST")
else:
validated_data["query"] = dict()
return IssueView.objects.create(**validated_data)

def update(self, instance, validated_data):
query_params = validated_data.get("query_data", {})
if not bool(query_params):
raise serializers.ValidationError(
{"query_data": ["Query data field cannot be empty"]}
)

if bool(query_params):
validated_data["query"] = issue_filters(query_params, "POST")
else:
validated_data["query"] = dict()
validated_data["query"] = issue_filters(query_params, "PATCH")
return super().update(instance, validated_data)

Expand Down
21 changes: 19 additions & 2 deletions apiserver/plane/api/serializers/workspace.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,15 @@
from .base import BaseSerializer
from .user import UserLiteSerializer

from plane.db.models import User, Workspace, WorkspaceMember, Team, TeamMember
from plane.db.models import Workspace, WorkspaceMember, Team, WorkspaceMemberInvite
from plane.db.models import (
User,
Workspace,
WorkspaceMember,
Team,
TeamMember,
WorkspaceMemberInvite,
WorkspaceTheme,
)


class WorkSpaceSerializer(BaseSerializer):
Expand Down Expand Up @@ -100,3 +107,13 @@ class Meta:
"id",
]
read_only_fields = fields


class WorkspaceThemeSerializer(BaseSerializer):
class Meta:
model = WorkspaceTheme
fields = "__all__"
read_only_fields = [
"workspace",
"actor",
]
Loading

1 comment on commit d2a58bf

@vercel
Copy link

@vercel vercel bot commented on d2a58bf Apr 17, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Successfully deployed to the following URLs:

plane – ./apps/app

plane-git-master-caravel.vercel.app
plane-caravel.vercel.app
app.plane.so
plane-theta.vercel.app

Please sign in to comment.