Skip to content

Commit bdb487b

Browse files
authored
Merge pull request #112 from pirogramming/refactor/#111
Refactor: 프로젝트 수정 폼/뷰 정리 및 related_links 마크다운 필드로 변경
2 parents 046394a + 6282536 commit bdb487b

10 files changed

Lines changed: 100 additions & 79 deletions

File tree

apps/projects/forms.py

Lines changed: 12 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,11 @@ class Meta:
3838
"placeholder": "팀 규칙을 마크다운 형식으로 작성해주세요\n\n예:\n# 회의 규칙\n- 주 1회 수요일 19시\n- 지각 3회 = 경고\n\n# 코드 리뷰\n- PR 생성 후 2시간 내 리뷰\n- 최소 2명 승인 필수",
3939
"rows": 6,
4040
}),
41+
"related_links": forms.Textarea(attrs={
42+
"class": "form-control",
43+
"placeholder": "관련 링크를 마크다운 형식으로 작성해주세요\n\n예:\n[Notion](https://notion.so/...)\n[Figma](https://figma.com/...)\n[GitHub](https://github.com/...)",
44+
"rows": 6,
45+
}),
4146
"is_favorite": forms.CheckboxInput(attrs={
4247
"class": "form-check-input",
4348
}),
@@ -50,58 +55,10 @@ def clean_title(self):
5055
raise forms.ValidationError("서비스명은 필수입니다.")
5156
return title
5257

53-
54-
class ProjectRelatedLinksForm(forms.Form):
55-
"""
56-
관련 링크 별도 폼 (AJAX 업데이트용)
57-
"""
58-
59-
notion_url = forms.URLField(
60-
required=False,
61-
label="Notion",
62-
widget=forms.URLInput(attrs={
63-
"class": "form-control",
64-
"placeholder": "Notion 링크를 입력하세요",
65-
}),
66-
)
67-
68-
figma_url = forms.URLField(
69-
required=False,
70-
label="Figma",
71-
widget=forms.URLInput(attrs={
72-
"class": "form-control",
73-
"placeholder": "Figma 링크를 입력하세요",
74-
}),
75-
)
76-
77-
github_url = forms.URLField(
78-
required=False,
79-
label="GitHub",
80-
widget=forms.URLInput(attrs={
81-
"class": "form-control",
82-
"placeholder": "GitHub 링크를 입력하세요",
83-
}),
84-
)
85-
86-
def clean(self):
87-
"""링크가 1개 이상 입력되는지 확인"""
88-
cleaned_data = super().clean()
89-
has_link = any([
90-
cleaned_data.get("notion_url"),
91-
cleaned_data.get("figma_url"),
92-
cleaned_data.get("github_url"),
93-
])
94-
if not has_link:
95-
raise forms.ValidationError("최소 1개 이상의 링크를 입력해주세요.")
96-
return cleaned_data
97-
98-
def to_dict(self):
99-
"""폼 데이터를 딕셔너리로 변환 (JSONField용)"""
100-
if not self.is_valid():
101-
return {}
102-
103-
return {
104-
"notion": self.cleaned_data.get("notion_url") or None,
105-
"figma": self.cleaned_data.get("figma_url") or None,
106-
"github": self.cleaned_data.get("github_url") or None,
107-
}
58+
def clean_related_links(self):
59+
"""관련 링크 정리 - "{}" 같은 빈 값 제거"""
60+
related_links = self.cleaned_data.get("related_links", "").strip()
61+
# "{}" 또는 빈 문자열이면 None 반환
62+
if not related_links or related_links == "{}":
63+
return None
64+
return related_links
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Generated by Django 5.2.10 on 2026-02-07 13:19
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('projects', '0005_add_season_fk'),
10+
]
11+
12+
operations = [
13+
migrations.AlterField(
14+
model_name='project',
15+
name='related_links',
16+
field=models.TextField(blank=True, help_text='관련 링크 (마크다운)', null=True),
17+
),
18+
]
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# Generated by Django 5.2.10 on 2026-02-07 13:23
2+
3+
from django.db import migrations
4+
5+
6+
def clean_related_links(apps, schema_editor):
7+
""""{}" 형식의 related_links를 None으로 변환"""
8+
Project = apps.get_model('projects', 'Project')
9+
Project.objects.filter(related_links='{}').update(related_links=None)
10+
11+
12+
class Migration(migrations.Migration):
13+
14+
dependencies = [
15+
('projects', '0006_alter_project_related_links'),
16+
]
17+
18+
operations = [
19+
migrations.RunPython(clean_related_links),
20+
]

apps/projects/models.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -166,10 +166,10 @@ class Status(models.TextChoices):
166166
help_text="팀 규칙 (마크다운)",
167167
)
168168

169-
related_links = models.JSONField(
170-
default=dict,
169+
related_links = models.TextField(
170+
null=True,
171171
blank=True,
172-
help_text="관련 링크 (Notion, Figma, GitHub 등)",
172+
help_text="관련 링크 (마크다운)",
173173
)
174174

175175
is_favorite = models.BooleanField(

apps/projects/views.py

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from django.views.decorators.http import require_POST, require_http_methods
77

88
from apps.projects.models import Season, Project
9-
from apps.projects.forms import ProjectDashboardEditForm, ProjectRelatedLinksForm
9+
from apps.projects.forms import ProjectDashboardEditForm
1010
from apps.projects.services import TeamMatchingService
1111
from apps.teams.models import Team, TeamMember
1212

@@ -155,30 +155,20 @@ def dashboard_update(request, project_id):
155155

156156
if request.method == "POST":
157157
form = ProjectDashboardEditForm(request.POST, request.FILES, instance=project)
158-
links_form = ProjectRelatedLinksForm(request.POST)
159158

160-
if form.is_valid() and links_form.is_valid():
161-
project = form.save(commit=False)
162-
project.related_links = links_form.to_dict()
163-
project.save()
159+
if form.is_valid():
160+
form.save()
164161

165162
messages.success(request, "✅ 프로젝트 정보가 수정되었습니다.")
166163
return redirect("projects:dashboard_detail", project_id=project_id)
167164
else:
168165
messages.error(request, "❌ 입력 오류가 있습니다. 다시 확인해주세요.")
169166
else:
170167
form = ProjectDashboardEditForm(instance=project)
171-
related_links = project.related_links or {}
172-
links_form = ProjectRelatedLinksForm(initial={
173-
"notion_url": related_links.get("notion"),
174-
"figma_url": related_links.get("figma"),
175-
"github_url": related_links.get("github"),
176-
})
177168

178169
context = {
179170
"project": project,
180171
"form": form,
181-
"links_form": links_form,
182172
}
183173

184174
return render(request, "projects/dashboard_update.html", context)

static/css/team.css

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,38 @@ body {
4949
transition: 0.3s ease;
5050
}
5151

52+
/* 매칭 취소 */
53+
.matching_actions {
54+
margin-top: 30px;
55+
display: flex;
56+
justify-content: center;
57+
}
58+
59+
.cancel_form {
60+
width: 100%;
61+
display: flex;
62+
justify-content: center;
63+
}
64+
65+
.cancel_button {
66+
width: 150px;
67+
height: 40px;
68+
padding: 10px 20px;
69+
background: #FF6B6B;
70+
color: #fff;
71+
border: none;
72+
border-radius: 20px;
73+
font-size: 15px;
74+
font-weight: 500;
75+
cursor: pointer;
76+
transition: 0.3s ease;
77+
}
78+
79+
.cancel_button:hover {
80+
background: #E63946;
81+
transition: 0.3s ease;
82+
}
83+
5284
/* 매칭 성공 */
5385
.team_success {
5486
margin-top: 50px;

templates/account/mypage.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,8 @@
5252
<section class="tech-stack-box">
5353
<h3 class="side-title">기술 스택</h3>
5454
<div class="tags">
55-
{% for rl in role_levels %}
56-
<span class="tag-item tag-{{ rl.role.code }}"># {{ rl.role.name }}</span>
55+
{% for tech in user_obj.tech_stacks.all %}
56+
<span class="tag-item"># {{ tech.name }}</span>
5757
{% empty %}
5858
<p class="empty-msg">등록된 스택이 없습니다.</p>
5959
{% endfor %}

templates/account/profile_edit.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,9 @@
6666
<section class="tech-stack-box">
6767
<h3 class="side-title">기술 스택</h3>
6868
<div class="tags">
69-
{% for role_level in user.role_levels.all %}
70-
<div class="tag-item tag-{{ role_level.role.code|lower }}">
71-
# {{ role_level.role.name }}
69+
{% for tech in user.tech_stacks.all %}
70+
<div class="tag-item">
71+
# {{ tech.name }}
7272
</div>
7373
{% empty %}
7474
<p class="empty-msg">등록된 기술 스택이 없습니다.</p>

templates/projects/dashboard_update.html

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -117,9 +117,7 @@ <h3>팀 규칙</h3>
117117
<h3>관련 링크</h3>
118118
</div>
119119
<div class="l_content">
120-
<p>Notion : {{ links_form.notion_url }}</p>
121-
<p>Figma : {{ links_form.figma_url }}</p>
122-
<p>Github : {{ links_form.github_url }}</p>
120+
{{ form.related_links }}
123121
</div>
124122
</div>
125123

templates/teams/team.html

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,12 @@ <h3>
1212
<input type="text" placeholder="이메일을 입력해주세요" />
1313
<button>알림받기</button>
1414
</form>
15+
<div class="matching_actions">
16+
<form method="post" action="{% url 'teams:team_matching_cancel' %}" class="cancel_form">
17+
{% csrf_token %}
18+
<button type="submit" class="cancel_button">매칭 취소</button>
19+
</form>
20+
</div>
1521
</div>
1622

1723
<!-- 매칭 성공 -->

0 commit comments

Comments
 (0)