Skip to content

Commit 0f38436

Browse files
authored
Hotfix/project api (#110)
- Project 테이블에 formed_at (팀 결성 날짜) 속성을 추가했고, 불러올 때 formed_at이 작은 순서대로 불러오게 수정했습니다 - 어드민 페이지에서 Project Url을 추가할 수 있도록 수정했습니다. - RecruitingInfo의 date_info의 자료형을 str으로 바꾸었습니다. - get_recruiting_infos_by_type에서 query 날릴 때 오류가 있어서 수정했습니다.
1 parent 2c211e5 commit 0f38436

12 files changed

Lines changed: 139 additions & 16 deletions

File tree

wacruit/src/admin/formatters.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,3 +38,11 @@ def timeline_category_formatter(
3838
) -> str | None:
3939
category = getattr(model, "category")
4040
return category and category.title
41+
42+
43+
def project_urls_formatter(model: type[DeclarativeBase], attribute: str):
44+
urls = getattr(model, "urls", None) or []
45+
return [
46+
getattr(getattr(u, "url_type", None), "name", str(getattr(u, "url_type", "")))
47+
for u in urls
48+
]

wacruit/src/admin/views.py

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from wtforms import TextAreaField
66

77
from wacruit.src.admin.formatters import member_formatter
8+
from wacruit.src.admin.formatters import project_urls_formatter
89
from wacruit.src.admin.formatters import recruiting_formatter
910
from wacruit.src.admin.formatters import shorten_column
1011
from wacruit.src.admin.formatters import timeline_category_formatter
@@ -18,6 +19,7 @@
1819
from wacruit.src.apps.problem.models import Problem
1920
from wacruit.src.apps.problem.models import Testcase
2021
from wacruit.src.apps.project.models import Project
22+
from wacruit.src.apps.project.models import ProjectURL
2123
from wacruit.src.apps.recruiting.models import Recruiting
2224
from wacruit.src.apps.recruiting.models import RecruitingApplication
2325
from wacruit.src.apps.recruiting_info.models import RecruitingInfo
@@ -310,13 +312,16 @@ class ProjectAdmin(ModelView, model=Project):
310312
Project.thumbnail_url,
311313
Project.project_type,
312314
Project.is_active,
313-
]
314-
315-
form_excluded_columns = [
316-
Project.images,
315+
Project.formed_at,
317316
Project.urls,
318317
]
319318

319+
form_excluded_columns = [Project.images, Project.urls]
320+
321+
column_formatters = {
322+
Project.urls: project_urls_formatter, # type: ignore
323+
}
324+
320325
column_searchable_list = [
321326
Project.name,
322327
Project.summary,
@@ -326,6 +331,25 @@ class ProjectAdmin(ModelView, model=Project):
326331
column_sortable_list = Project.__table__.columns.keys()
327332

328333

334+
class ProjectURLAdmin(ModelView, model=ProjectURL):
335+
column_list = [
336+
ProjectURL.id,
337+
ProjectURL.url,
338+
ProjectURL.url_type,
339+
ProjectURL.project_id,
340+
]
341+
342+
form_columns = [ProjectURL.url, ProjectURL.url_type, ProjectURL.source_project]
343+
344+
form_ajax_refs = {
345+
"source_project": {
346+
"fields": (Project.name,),
347+
}
348+
}
349+
350+
column_sortable_list = ProjectURL.__table__.columns.keys()
351+
352+
329353
class MemberAdmin(ModelView, model=Member):
330354
column_list = [
331355
Member.id,
@@ -502,6 +526,7 @@ class HistoryAdmin(ModelView, model=History):
502526
ResumeSubmissionAdmin,
503527
RecruitingApplicationAdmin,
504528
ProjectAdmin,
529+
ProjectURLAdmin,
505530
MemberAdmin,
506531
ReviewAdmin,
507532
SeminarAdmin,

wacruit/src/apps/project/models.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from datetime import datetime
12
from typing import TYPE_CHECKING
23

34
from sqlalchemy import Column
@@ -31,6 +32,7 @@ class Project(DeclarativeBase):
3132
thumbnail_url: Mapped[str255 | None]
3233
project_type: Mapped[ProjectType]
3334
is_active: Mapped[bool] = mapped_column(default=True)
35+
formed_at: Mapped[datetime | None] = mapped_column(default=None)
3436
urls: Mapped[list["ProjectURL"] | None] = relationship(
3537
back_populates="source_project"
3638
)

wacruit/src/apps/project/repositories.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,14 @@ def get_project_by_name(self, name: str) -> Project | None:
3434
return self.session.query(Project).filter(Project.name == name).first()
3535

3636
def get_projects(self, offset: int = 0, limit: int = 10) -> list[Project]:
37-
return self.session.query(Project).offset(offset).limit(limit).all()
37+
# formed_at이 작은 순서대로 정렬
38+
return (
39+
self.session.query(Project)
40+
.order_by(Project.formed_at)
41+
.offset(offset)
42+
.limit(limit)
43+
.all()
44+
)
3845

3946
def create_project(self, project: Project) -> Project:
4047
with self.transaction:

wacruit/src/apps/project/schemas.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
from __future__ import annotations
22

3+
from datetime import datetime
4+
35
from pydantic import BaseModel
46
from pydantic import Field
57

@@ -19,6 +21,7 @@ class ProjectCreateRequest(BaseModel):
1921
introduction: str | None = Field(None, max_length=255)
2022
thumbnail_url: str | None = Field(None, max_length=255)
2123
project_type: ProjectType
24+
formed_at: datetime | None
2225
is_active: bool
2326
urls: list[ProjectLinkDto] | None
2427

@@ -29,6 +32,7 @@ class ProjectUpdateRequest(BaseModel):
2932
introduction: str | None = Field(None, max_length=255)
3033
thumbnail_url: str | None = Field(None, max_length=255)
3134
project_type: ProjectType | None
35+
formed_at: datetime | None
3236
is_active: bool | None
3337
urls: list[ProjectLinkDto] | None
3438

@@ -54,6 +58,7 @@ class ProjectDetailResponse(OrmModel):
5458
introduction: str | None
5559
thumbnail_url: str | None
5660
project_type: ProjectType
61+
formed_at: datetime | None
5762
is_active: bool
5863
images: list[PresignedUrlWithIdResponse] | None
5964
urls: list[ProjectLinkDto] | None
@@ -66,6 +71,7 @@ class ProjectBriefResponse(OrmModel):
6671
thumbnail_url: str | None
6772
project_type: ProjectType
6873
is_active: bool
74+
formed_at: datetime | None
6975

7076
@classmethod
7177
def from_orm(cls, obj):
@@ -76,6 +82,7 @@ def from_orm(cls, obj):
7682
thumbnail_url=obj.thumbnail_url,
7783
project_type=obj.project_type.name,
7884
is_active=obj.is_active,
85+
formed_at=obj.formed_at,
7986
)
8087

8188

wacruit/src/apps/project/services.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ def create_project(self, request: ProjectCreateRequest):
5151
introduction=request.introduction,
5252
thumbnail_url=request.thumbnail_url,
5353
project_type=request.project_type,
54+
formed_at=request.formed_at,
5455
is_active=request.is_active,
5556
)
5657

@@ -96,6 +97,7 @@ def get_project(self, project_id: int) -> ProjectDetailResponse:
9697
introduction=project.introduction,
9798
thumbnail_url=project.thumbnail_url,
9899
project_type=project.project_type,
100+
formed_at=project.formed_at,
99101
is_active=project.is_active,
100102
images=images,
101103
urls=[
@@ -163,6 +165,7 @@ def update_project(
163165
introduction=updated_project.introduction,
164166
thumbnail_url=updated_project.thumbnail_url,
165167
project_type=updated_project.project_type,
168+
formed_at=updated_project.formed_at,
166169
is_active=updated_project.is_active,
167170
images=images,
168171
urls=[

wacruit/src/apps/recruiting/schemas.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -121,17 +121,17 @@ class RecruitingInfoResponse(OrmModel):
121121
type: RecruitingType
122122
info_num: int
123123
title: str
124-
date_info: datetime
124+
date_info: str | None = None
125125

126126

127127
class RecruitingInfoCreateRequest(BaseModel):
128128
info_num: int
129129
title: str
130-
date_info: datetime
130+
date_info: str | None = None
131131
recruiting_id: int
132132

133133

134134
class RecruitingInfoUpdateRequest(BaseModel):
135135
info_num: int | None = None
136136
title: str | None = None
137-
date_info: datetime | None = None
137+
date_info: str | None = None

wacruit/src/apps/recruiting/services.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -145,16 +145,20 @@ def get_active_recruitings(self) -> ListResponse[RecruitingSummaryResponse]:
145145
return ListResponse(items=items)
146146

147147
def get_recruiting_infos_by_type(
148-
self, recruiting_type: RecruitingType
148+
self, recruiting_type: str
149149
) -> ListResponse[RecruitingInfoResponse] | None:
150-
info = self.recruiting_repository.get_recruiting_infos_by_type(recruiting_type)
150+
if isinstance(recruiting_type, str):
151+
if recruiting_type not in RecruitingType.__members__:
152+
raise InvalidRecruitTypeException(recruiting_type)
153+
rt = RecruitingType.ROOKIE
154+
for enum_type in RecruitingType:
155+
if enum_type.name == recruiting_type:
156+
rt = enum_type
157+
info = self.recruiting_repository.get_recruiting_infos_by_type(rt)
151158
if not info:
152159
return None
153160
return ListResponse(
154-
items=[
155-
RecruitingInfoResponse(**item.__dict__, type=recruiting_type)
156-
for item in info
157-
]
161+
items=[RecruitingInfoResponse(**item.__dict__, type=rt) for item in info]
158162
)
159163

160164
def create_recruiting(self, request: RecruitingCreateRequest) -> RecruitingResponse:

wacruit/src/apps/recruiting/views_v3.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ def get_active_recruitings(
3737

3838
@v3_router.get("/info")
3939
def get_recruiting_infos_by_type(
40-
recruiting_type: RecruitingType,
40+
recruiting_type: str,
4141
recruiting_service: Annotated[RecruitingService, Depends()],
4242
) -> ListResponse[RecruitingInfoResponse]:
4343
result = recruiting_service.get_recruiting_infos_by_type(recruiting_type)

wacruit/src/apps/recruiting_info/models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ class RecruitingInfo(DeclarativeBase):
2525
id: Mapped[intpk]
2626
info_num: Mapped[int]
2727
title: Mapped[str50]
28-
date_info: Mapped[datetime | None] = mapped_column(DateTime(timezone=True))
28+
date_info: Mapped[str50 | None] = mapped_column(default=None)
2929
recruiting_id: Mapped[int] = mapped_column(ForeignKey("recruiting.id"))
3030

3131
recruiting: Mapped["Recruiting"] = relationship(back_populates="recruiting_info")

0 commit comments

Comments
 (0)