fix(project): 프로젝트 생성 시 세션 자동 추가 제거 (아사나처럼 직접 추가)
create_project 의 seed_stages 기본값을 True→False 로. 새 프로젝트는 이제 세션이 0개로 시작하고, 보드에서 "+ 세션 추가"로 직접 만든다. 세션이 하나도 없는 새 프로젝트의 보드 화면에는 안내 문구를 띄운다. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -87,7 +87,7 @@ class ProjectStore:
|
|||||||
start_date: str | None = None,
|
start_date: str | None = None,
|
||||||
due_date: str | None = None,
|
due_date: str | None = None,
|
||||||
created_by: str = "",
|
created_by: str = "",
|
||||||
seed_stages: bool = True,
|
seed_stages: bool = False,
|
||||||
) -> dict[str, Any]:
|
) -> dict[str, Any]:
|
||||||
nm = store.validate_project_name(name)
|
nm = store.validate_project_name(name)
|
||||||
col = store.validate_color(color)
|
col = store.validate_color(color)
|
||||||
|
|||||||
@@ -9,7 +9,9 @@ from __future__ import annotations
|
|||||||
from html.parser import HTMLParser
|
from html.parser import HTMLParser
|
||||||
from typing import Any
|
from typing import Any
|
||||||
|
|
||||||
# 프로젝트 생성 시 자동으로 깔리는 기본 진행 단계(칸반 컬럼).
|
# 참고용 기본 세션(칸반 컬럼) 이름 목록 — 프로젝트 생성 시 자동으로 만들지는
|
||||||
|
# 않는다(세션은 아사나처럼 사용자가 직접 추가한다). 보드 컬럼 정렬 시 이
|
||||||
|
# 이름들을 우선순위로만 쓴다(router.py `_order`).
|
||||||
# (name, is_done_stage) — 마지막 '완료' 단계로 옮기면 업무 완료 처리.
|
# (name, is_done_stage) — 마지막 '완료' 단계로 옮기면 업무 완료 처리.
|
||||||
DEFAULT_STAGES: tuple[tuple[str, bool], ...] = (
|
DEFAULT_STAGES: tuple[tuple[str, bool], ...] = (
|
||||||
("할 일", False),
|
("할 일", False),
|
||||||
|
|||||||
@@ -45,5 +45,5 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script src="/static/project.js?v=20260916b" defer></script>
|
<script src="/static/project.js?v=20260916c" defer></script>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|||||||
@@ -349,5 +349,5 @@
|
|||||||
<script>
|
<script>
|
||||||
window.PJ_COLORS = {{ ["#4573d2","#37a3a3","#62a420","#e8a33d","#e8384f","#aa62e3","#f06a6a","#5a6772"] | tojson }};
|
window.PJ_COLORS = {{ ["#4573d2","#37a3a3","#62a420","#e8a33d","#e8384f","#aa62e3","#f06a6a","#5a6772"] | tojson }};
|
||||||
</script>
|
</script>
|
||||||
<script src="/static/project.js?v=20260916b" defer></script>
|
<script src="/static/project.js?v=20260916c" defer></script>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|||||||
@@ -331,5 +331,5 @@
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script src="/static/vendor/vis-timeline/vis-timeline-graph2d.min.js"></script>
|
<script src="/static/vendor/vis-timeline/vis-timeline-graph2d.min.js"></script>
|
||||||
<script src="/static/project.js?v=20260916b" defer></script>
|
<script src="/static/project.js?v=20260916c" defer></script>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|||||||
@@ -1101,6 +1101,15 @@
|
|||||||
function renderBoardByStage(board, vis) {
|
function renderBoardByStage(board, vis) {
|
||||||
const list = (stagesByProject[projectId] || []).slice()
|
const list = (stagesByProject[projectId] || []).slice()
|
||||||
.sort(function (a, b) { return a.sort_order - b.sort_order; });
|
.sort(function (a, b) { return a.sort_order - b.sort_order; });
|
||||||
|
// 세션은 프로젝트를 만들 때 자동으로 생기지 않는다(아사나처럼 직접 추가) —
|
||||||
|
// 아직 하나도 없으면 안내만 보여준다.
|
||||||
|
if (!list.length && !vis.length) {
|
||||||
|
const empty = document.createElement("div");
|
||||||
|
empty.className = "pj-empty";
|
||||||
|
empty.style.flex = "1 1 auto";
|
||||||
|
empty.textContent = "세션이 없습니다. 아래 \"+ 세션 추가\"로 만들어 보세요.";
|
||||||
|
board.appendChild(empty);
|
||||||
|
}
|
||||||
list.forEach(function (s) {
|
list.forEach(function (s) {
|
||||||
const col = document.createElement("div");
|
const col = document.createElement("div");
|
||||||
col.className = "pj-col";
|
col.className = "pj-col";
|
||||||
|
|||||||
@@ -67,7 +67,10 @@
|
|||||||
|
|
||||||
- `projects` — `parent_id`(self-FK, NULL=최상위 / NOT NULL=서브프로젝트, `ON DELETE CASCADE`), name, description, color, owner_email, start/due_date, status(active|archived).
|
- `projects` — `parent_id`(self-FK, NULL=최상위 / NOT NULL=서브프로젝트, `ON DELETE CASCADE`), name, description, color, owner_email, start/due_date, status(active|archived).
|
||||||
- `project_members` — 프로젝트↔사용자 배정. role(manager|member), `UNIQUE(project_id, user_email)`.
|
- `project_members` — 프로젝트↔사용자 배정. role(manager|member), `UNIQUE(project_id, user_email)`.
|
||||||
- `project_stages`(="세션") — 진행단계(칸반 컬럼). 프로젝트 생성 시 기본 4단계 seed(할 일/진행 중/검토/완료). `is_done_stage`=TRUE 단계로 옮기면 업무 완료 처리. `created_by`(003) — 삭제를 "만든 사람만"으로 제한하기 위함.
|
- `project_stages`(="세션") — 진행단계(칸반 컬럼). **프로젝트 생성 시 자동으로
|
||||||
|
만들지 않는다**(아사나처럼 직접 "+ 세션 추가"로 만든다 — `create_project`
|
||||||
|
의 `seed_stages` 기본값은 `False`). `is_done_stage`=TRUE 단계로 옮기면 업무
|
||||||
|
완료 처리. `created_by`(003) — 삭제를 "만든 사람만"으로 제한하기 위함.
|
||||||
- `tasks` — 업무. stage_id, title, description(HTML — 이미지 삽입 지원), assignee_email/name, priority(low|normal|high), start/due_date, completed_at, `parent_task_id`(003, self-FK `ON DELETE CASCADE`, NULL=최상위 업무).
|
- `tasks` — 업무. stage_id, title, description(HTML — 이미지 삽입 지원), assignee_email/name, priority(low|normal|high), start/due_date, completed_at, `parent_task_id`(003, self-FK `ON DELETE CASCADE`, NULL=최상위 업무).
|
||||||
- `task_project_links`(003) — 멀티호밍. `(task_id, project_id)` UNIQUE, `stage_id` nullable(그 프로젝트 안에서의 세션).
|
- `task_project_links`(003) — 멀티호밍. `(task_id, project_id)` UNIQUE, `stage_id` nullable(그 프로젝트 안에서의 세션).
|
||||||
- `task_comments` — 댓글.
|
- `task_comments` — 댓글.
|
||||||
|
|||||||
Reference in New Issue
Block a user