Skip to content

Commit 3d6f2dd

Browse files
authored
Merge pull request #703 from makeplane/stage-release
promote: stage-release to production
2 parents 7fed2ec + 8cbf75a commit 3d6f2dd

Some content is hidden

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

55 files changed

+2007
-473
lines changed

README.md

Lines changed: 104 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,50 +2,143 @@
22

33
<p align="center">
44
<a href="https://plane.so">
5-
<img src="https://res.cloudinary.com/dgxawjvpo/image/upload/v1673379660/Plane/plane-logo_0m83xue7R_f0v9r9.png" alt="Plane Logo" width="350">
5+
<img src="https://res.cloudinary.com/toolspacedev/image/upload/v1680596414/Plane/Plane_Icon_Blue_on_White_150x150_muysa3.jpg" alt="Plane Logo" width="70">
66
</a>
77
</p>
88

9+
<h3 align="center"><b>Plane</b></h3>
10+
<p align="center"><b>Open-source, self-hosted project planning tool</b></p>
11+
912
<p align="center">
1013
<a href="https://discord.com/invite/A92xrEGCge">
1114
<img alt="Discord" src="https://img.shields.io/discord/1031547764020084846?color=5865F2&label=Discord&style=for-the-badge" />
1215
</a>
1316
<img alt="Discord" src="https://img.shields.io/github/commit-activity/m/makeplane/plane?style=for-the-badge" />
1417
</p>
15-
1618
<br />
17-
Plane is an open-source project planning tool that is designed to help individuals and teams streamline their issues, sprints, and product roadmaps. It is easy to use and can be accessed by anyone, making it an ideal choice for a wide range of projects and organizations.
18-
<br /> <br />
19+
<p>
20+
<a href="https://app.plane.so/" target="_blank">
21+
<img
22+
src="https://res.cloudinary.com/toolspacedev/image/upload/v1680599798/Plane/plane_1_1_tnb32j.png"
23+
alt="Plane Screens"
24+
width="100%"
25+
/>
26+
</a>
27+
</p>
28+
29+
Meet Plane. An open-source software development tool to manage issues, sprints, and product roadmaps with peace of mind 🧘‍♀️.
30+
1931

2032
> 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.
2133
22-
## Getting Started
34+
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).
35+
36+
37+
## ⚡️ Quick start with Docker Compose
38+
39+
### Docker Compose Setup
40+
41+
- Clone the Repository
42+
43+
```bash
44+
git clone https://github.com/makeplane/plane
45+
```
46+
47+
- Change Directory
48+
49+
```bash
50+
cd plane
51+
```
52+
53+
- Run setup.sh
54+
55+
```bash
56+
./setup.sh localhost
57+
```
2358

24-
Visit https://app.plane.so to get started with Plane.
59+
> If running in a cloud env replace localhost with public facing IP address of the VM
2560
26-
## Documentation
61+
62+
- Run Docker compose up
63+
64+
```bash
65+
docker-compose up
66+
```
67+
68+
69+
## 🚀 Features
70+
71+
* **Issue Planning and Tracking**: Quickly create issues and add details using a powerful rich text editor that supports file uploads. Add sub-properties and references to issues for better organization and tracking.
72+
* **Issue Attachments**: Collaborate effectively by attaching files to issues, making it easy for your team to find and share important project-related documents.
73+
* **Layouts**: Customize your project view with your preferred layout - choose from List, Kanban, or Calendar to visualize your project in a way that makes sense to you.
74+
* **Cycles**: Plan sprints with Cycles to keep your team on track and productive. Gain insights into your project's progress with burn-down charts and other useful features.
75+
* **Modules**: Break down your large projects into smaller, more manageable modules. Assign modules between teams to easily track and plan your project's progress.
76+
* **Views**: Create custom filters to display only the issues that matter to you. Save and share your filters in just a few clicks.
77+
* **Pages**: Plane pages function as an AI-powered notepad, allowing you to easily document issues, cycle plans, and module details, and then synchronize them with your issues.
78+
* **Command K**: Enjoy a better user experience with the new Command + K menu. Easily manage and navigate through your projects from one convenient location.
79+
* **GitHub Sync**: Streamline your planning process by syncing your GitHub issues with Plane. Keep all your issues in one place for better tracking and collaboration.
80+
81+
## 📸 Screenshots
82+
83+
<p>
84+
<a href="https://app.plane.so/" target="_blank">
85+
<img
86+
src="https://res.cloudinary.com/toolspacedev/image/upload/v1680601719/Plane/plane_2_iqao52.png"
87+
alt="Plane Issue Details"
88+
width="100%"
89+
/>
90+
</a>
91+
</p>
92+
<p>
93+
<a href="https://app.plane.so/" target="_blank">
94+
<img
95+
src="https://res.cloudinary.com/toolspacedev/image/upload/v1680604273/Plane/plane_5_1_nwsl3a.png"
96+
alt="Plane Cycles and Modules"
97+
width="100%"
98+
/>
99+
</a>
100+
</p>
101+
<p>
102+
<a href="https://app.plane.so/" target="_blank">
103+
<img
104+
src="https://res.cloudinary.com/toolspacedev/image/upload/v1680601713/Plane/plane_4_cqm0g8.png"
105+
alt="Plane Quick Lists"
106+
width="100%"
107+
/>
108+
</a>
109+
</p>
110+
<p>
111+
<a href="https://app.plane.so/" target="_blank">
112+
<img
113+
src="https://res.cloudinary.com/toolspacedev/image/upload/v1680601712/Plane/plane_3_1_cu4fsc.png"
114+
alt="Plane Command K"
115+
width="100%"
116+
/>
117+
</a>
118+
</p>
119+
120+
## 📚Documentation
27121

28122
For full documentation, visit [docs.plane.so](https://docs.plane.so/)
29123

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

32-
## Status
33-
126+
## 🔋 Status
34127

35128
- [x] Early Community Previews: We are open-sourcing and sharing the development version of Plane
36129
- [ ] Alpha: We are testing Plane with a closed set of customers
37130
- [ ] 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
38131
- [ ] Public Beta: Stable enough for most non-enterprise use-cases
39132
- [ ] Public: Production-ready
40133

41-
## Community
134+
## ❤️ Community
42135

43136
The Plane community can be found on GitHub Discussions, where you can ask questions, voice ideas, and share your projects.
44137

45138
To chat with other community members you can join the [Plane Discord](https://discord.com/invite/q9HKAdau).
46139

47140
Our [Code of Conduct](https://github.com/makeplane/plane/blob/master/CODE_OF_CONDUCT.md) applies to all Plane community channels.
48141

49-
## Security
142+
## ⛓️ Security
50143

51144
If you believe you have found a security vulnerability in Plane, we encourage you to responsibly disclose this and not open a public issue. We will investigate all legitimate reports. Email [email protected] to disclose any security vulnerabilities.

apiserver/.env.example

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,6 @@ GITHUB_CLIENT_SECRET=""
1919
# Flags
2020
DISABLE_COLLECTSTATIC=1
2121
DOCKERIZED=1
22+
# GPT Envs
23+
OPENAI_API_KEY=0
24+
GPT_ENGINE=0

apiserver/back_migration.py

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
import random
44
from django.contrib.auth.hashers import make_password
55
from plane.db.models import ProjectIdentifier
6-
from plane.db.models import Issue, IssueComment, User, Project
6+
from plane.db.models import Issue, IssueComment, User, Project, ProjectMember
7+
78

89

910
# Update description and description html values for old descriptions
@@ -134,3 +135,42 @@ def update_project_cover_images():
134135
except Exception as e:
135136
print(e)
136137
print("Failed")
138+
139+
140+
def update_user_view_property():
141+
try:
142+
project_members = ProjectMember.objects.all()
143+
updated_project_members = []
144+
for project_member in project_members:
145+
project_member.default_props = {
146+
"filters": {"type": None},
147+
"orderBy": "-created_at",
148+
"collapsed": True,
149+
"issueView": "list",
150+
"filterIssue": None,
151+
"groupByProperty": True,
152+
"showEmptyGroups": True,
153+
}
154+
updated_project_members.append(project_member)
155+
156+
ProjectMember.objects.bulk_update(
157+
updated_project_members, ["default_props"], batch_size=100
158+
)
159+
print("Success")
160+
except Exception as e:
161+
print(e)
162+
print("Failed")
163+
164+
def update_label_color():
165+
try:
166+
labels = Label.objects.filter(color="")
167+
updated_labels = []
168+
for label in labels:
169+
label.color = "#" + "%06x" % random.randint(0, 0xFFFFFF)
170+
updated_labels.append(label)
171+
172+
Label.objects.bulk_update(updated_labels, ["color"], batch_size=100)
173+
print("Success")
174+
except Exception as e:
175+
print(e)
176+
print("Failed")

apiserver/plane/api/serializers/module.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,16 @@ class Meta:
139139
"module",
140140
]
141141

142+
# Validation if url already exists
143+
def create(self, validated_data):
144+
if ModuleLink.objects.filter(
145+
url=validated_data.get("url"), module_id=validated_data.get("module_id")
146+
).exists():
147+
raise serializers.ValidationError(
148+
{"error": "URL already exists for this Issue"}
149+
)
150+
return ModuleLink.objects.create(**validated_data)
151+
142152

143153
class ModuleSerializer(BaseSerializer):
144154
project_detail = ProjectSerializer(read_only=True, source="project")

apiserver/plane/api/views/people.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
WorkspaceMemberInvite,
1818
Issue,
1919
IssueActivity,
20+
WorkspaceMember,
2021
)
2122
from plane.utils.paginator import BasePaginator
2223

@@ -72,6 +73,20 @@ def patch(self, request):
7273
user = User.objects.get(pk=request.user.id)
7374
user.is_onboarded = request.data.get("is_onboarded", False)
7475
user.save()
76+
77+
if user.last_workspace_id is not None:
78+
user_role = WorkspaceMember.objects.filter(
79+
workspace_id=user.last_workspace_id, member=request.user.id
80+
).first()
81+
return Response(
82+
{
83+
"message": "Updated successfully",
84+
"role": user_role.company_role
85+
if user_role is not None
86+
else None,
87+
},
88+
status=status.HTTP_200_OK,
89+
)
7590
return Response(
7691
{"message": "Updated successfully"}, status=status.HTTP_200_OK
7792
)

apiserver/plane/db/models/project.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,13 @@
2121

2222
def get_default_props():
2323
return {
24+
"filters": {"type": None},
25+
"orderBy": "-created_at",
26+
"collapsed": True,
2427
"issueView": "list",
25-
"groupByProperty": None,
26-
"orderBy": None,
2728
"filterIssue": None,
29+
"groupByProperty": True,
30+
"showEmptyGroups": True,
2831
}
2932

3033

apps/app/components/account/email-code-form.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ export const EmailCodeForm = ({ onSuccess }: any) => {
121121
) || "Email ID is not valid",
122122
}}
123123
error={errors.email}
124-
placeholder="Enter you email Id"
124+
placeholder="Enter your Email ID"
125125
/>
126126
</div>
127127

apps/app/components/command-palette/change-issue-assignee.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,8 +98,7 @@ export const ChangeIssueAssignee: React.FC<Props> = ({ setIsPaletteOpen, issue }
9898
<Command.Item
9999
key={option.value}
100100
onSelect={() => handleIssueAssignees(option.value)}
101-
className="focus:bg-slate-200 focus:outline-none"
102-
tabIndex={0}
101+
className="focus:outline-none"
103102
>
104103
{option.content}
105104
</Command.Item>

apps/app/components/command-palette/change-issue-priority.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,7 @@ export const ChangeIssuePriority: React.FC<Props> = ({ setIsPaletteOpen, issue }
6060
<Command.Item
6161
key={priority}
6262
onSelect={() => handleIssueState(priority)}
63-
className="focus:bg-slate-200 focus:outline-none"
64-
tabIndex={0}
63+
className="focus:outline-none"
6564
>
6665
<div className="flex items-center space-x-3">
6766
{getPriorityIcon(priority)}

apps/app/components/command-palette/change-issue-state.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,7 @@ export const ChangeIssueState: React.FC<Props> = ({ setIsPaletteOpen, issue }) =
7575
<Command.Item
7676
key={state.id}
7777
onSelect={() => handleIssueState(state.id)}
78-
className="focus:bg-slate-200 focus:outline-none"
79-
tabIndex={0}
78+
className="focus:outline-none"
8079
>
8180
<div className="flex items-center space-x-3">
8281
{getStateGroupIcon(state.group, "16", "16", state.color)}

0 commit comments

Comments
 (0)