Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
78ac406
feat: SSE 기본 ping 이벤트 사실 상 제거 / CodeSubmission 에러 조건 추가
minkyu97 Aug 12, 2024
657ead8
debug hodu api
minkyu97 Aug 13, 2024
5f7a94b
feat: db 모델 정의 (#73)
mjy926 Jul 3, 2025
375f4c9
fix: db model 수정 (#74)
mjy926 Jul 4, 2025
4882236
Feat/project api (#75)
deveroskp Jul 7, 2025
705f541
feat: seminar api 구현 (#76)
mjy926 Jul 10, 2025
360440f
fix/project-api (#77)
deveroskp Jul 10, 2025
14a849a
Feat/member api (#78)
deveroskp Jul 10, 2025
889583b
Feat/review api (#79)
deveroskp Jul 13, 2025
7917594
Feat/review api (#81)
deveroskp Jul 13, 2025
71ac91d
feat: history api 구현 (#80)
mjy926 Jul 13, 2025
03b2b70
URI 수정 (#82)
deveroskp Jul 14, 2025
9fea189
fix: project url enum type (#83)
mjy926 Jul 15, 2025
7b80696
sponsor api 구현 (#84)
deveroskp Jul 16, 2025
466ffdd
feat: question api 구현 (#85)
mjy926 Jul 16, 2025
89f9a93
Feat: timeline api 구현 (#86)
deveroskp Jul 17, 2025
0831af7
Fix: Project api, Recruiting api 수정 (#87)
deveroskp Jul 18, 2025
aa96a4b
fix: 빈 리스트 반환 (#88)
mjy926 Jul 18, 2025
217ceab
feat: preregistration api (#89)
mjy926 Jul 19, 2025
eab96b6
Fix/project image upload (#90)
deveroskp Jul 20, 2025
e57fc0b
Chore: 어드민 페이지 수정 (#91)
deveroskp Jul 21, 2025
49eef86
Hotfix: history response 수정 (#92)
deveroskp Jul 21, 2025
85fff39
fix: 라우터 중복 등록 수정 (#93)
mjy926 Jul 21, 2025
c67dcd1
fix: recruiting enum type (#94)
mjy926 Aug 1, 2025
60ff29d
fix: testcase 크기 수정 (#95)
mjy926 Aug 4, 2025
a1721bb
fix: testcase 입력 수정 (#96)
mjy926 Aug 5, 2025
e07579f
fix: submission result cascade 설정 (#97)
mjy926 Aug 7, 2025
b190ef5
chore: timeline 테스트 코드 작성 (#98)
mjy926 Aug 17, 2025
5979069
Feat: pre-registration 테스트 코드 작성 (#99)
deveroskp Aug 17, 2025
cfd69e8
Feat: sponsor test 코드 작성 & sponsor 코드 수정 (#100)
deveroskp Aug 26, 2025
566fe49
chore: 세미나 api 테스트 코드 작성 (#101)
mjy926 Aug 31, 2025
b7b9967
Feat: faq api 테스트 코드 구현 (#102)
deveroskp Sep 1, 2025
47dcc45
chore: 코드래빗 yaml 추가 (#103)
mjy926 Sep 4, 2025
664238e
feat: arm64 전환 (#104)
mjy926 Sep 7, 2025
c33697a
Fix: Review Response에 멤버 기수 포함 (#105)
deveroskp Sep 8, 2025
bfa4421
fix: merge conflict 수정 (#107)
mjy926 Sep 9, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions .coderabbit.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
language: "ko-KR"

reviews:
profile: "chill"
request_changes_workflow: false
high_level_summary: false
poem: false
review_status: true
auto_review:
enabled: true
drafts: false
2 changes: 1 addition & 1 deletion .github/workflows/deploy-dev.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ on:
jobs:
deploy:
name: deploy dev
runs-on: ubuntu-latest
runs-on: ubuntu-24.04-arm

env:
IMAGE_TAG: ${{ github.run_number }}
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/deploy-prod.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ on:
jobs:
deploy:
name: deploy prod
runs-on: ubuntu-latest
runs-on: ubuntu-24.04-arm

env:
IMAGE_TAG: ${{ github.run_number }}
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/test.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -30,13 +30,13 @@ jobs:
- name: change mysql charset
run: mysql -h 127.0.0.1 -P 3307 -u root -p'root-password' -e "ALTER DATABASE testdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci"

- name: Install poetry
run: pipx install poetry

- uses: actions/setup-python@v4
with:
python-version: 3.11

- name: Install poetry
run: pipx install poetry --python python3.11

- name: Set poetry environment & install dependencies
run: |
poetry config virtualenvs.in-project true
Expand Down
2 changes: 1 addition & 1 deletion .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ repos:
- id: pyright

- repo: https://github.com/hadialqattan/pycln
rev: v2.1.3
rev: v2.5.0
hooks:
- id: pycln
args: [--config=pyproject.toml]
Expand Down
4 changes: 2 additions & 2 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
FROM python:3.11-buster as builder
FROM python:3.11-bookworm as builder

RUN pip install poetry==1.5.0

Expand All @@ -13,7 +13,7 @@ COPY pyproject.toml poetry.lock ./

RUN --mount=type=cache,target=$POETRY_CACHE_DIR poetry install --without dev --no-root

FROM python:3.11-slim-buster as runtime
FROM python:3.11-slim-bookworm as runtime

ARG ENV

Expand Down
275 changes: 212 additions & 63 deletions poetry.lock

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ pyjwt = "^2.8.0"
pytest-mock = "3.8.2"
moto = {version = "4.2.7", extras = ["all", "ec2", "s3"]}
tenacity = "^9.0.0"
pyyaml = "6.0.2"


[tool.poetry.group.dev.dependencies]
Expand Down
12 changes: 12 additions & 0 deletions wacruit/src/admin/formatters.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,3 +26,15 @@ def formatter(model: type[DeclarativeBase], attribute: str):
)

return formatter


def member_formatter(model: type[DeclarativeBase], attribute: str) -> str | None:
member = getattr(model, "member")
return member and f"{member.last_name} {member.first_name}"


def timeline_category_formatter(
model: type[DeclarativeBase], attribute: str
) -> str | None:
category = getattr(model, "category")
return category and category.title
218 changes: 218 additions & 0 deletions wacruit/src/admin/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,32 @@

from sqladmin import ModelView
from sqlalchemy import Column
from wtforms import TextAreaField

from wacruit.src.admin.formatters import member_formatter
from wacruit.src.admin.formatters import recruiting_formatter
from wacruit.src.admin.formatters import shorten_column
from wacruit.src.admin.formatters import timeline_category_formatter
from wacruit.src.admin.formatters import user_formatter
from wacruit.src.apps.announcement.models import Announcement
from wacruit.src.apps.faq.models import FAQ
from wacruit.src.apps.history.models import History
from wacruit.src.apps.member.models import Member
from wacruit.src.apps.pre_registration.models import PreRegistration
from wacruit.src.apps.problem.models import CodeSubmission
from wacruit.src.apps.problem.models import Problem
from wacruit.src.apps.problem.models import Testcase
from wacruit.src.apps.project.models import Project
from wacruit.src.apps.recruiting.models import Recruiting
from wacruit.src.apps.recruiting.models import RecruitingApplication
from wacruit.src.apps.recruiting_info.models import RecruitingInfo
from wacruit.src.apps.resume.models import ResumeQuestion
from wacruit.src.apps.resume.models import ResumeSubmission
from wacruit.src.apps.review.models import Review
from wacruit.src.apps.seminar.models import Seminar
from wacruit.src.apps.sponsor.models import Sponsor
from wacruit.src.apps.timeline.models import Timeline
from wacruit.src.apps.timeline.models import TimelineCategory
from wacruit.src.apps.user.models import User


Expand Down Expand Up @@ -84,6 +98,7 @@ class RecruitingAdmin(ModelView, model=Recruiting):
Recruiting.to_date,
Recruiting.description,
Recruiting.short_description,
Recruiting.recruiting_info,
]

column_formatters = {
Expand Down Expand Up @@ -179,6 +194,8 @@ class TestcaseAdmin(ModelView, model=Testcase):
Testcase.expected_output: shorten_column(), # type: ignore
}

form_overrides = {"stdin": TextAreaField, "expected_output": TextAreaField}

form_excluded_columns = [
Testcase.submission_results,
]
Expand Down Expand Up @@ -284,6 +301,196 @@ class RecruitingApplicationAdmin(ModelView, model=RecruitingApplication):
column_sortable_list = RecruitingApplication.__table__.columns.keys()


class ProjectAdmin(ModelView, model=Project):
column_list = [
Project.id,
Project.name,
Project.summary,
Project.introduction,
Project.thumbnail_url,
Project.project_type,
Project.is_active,
]

form_excluded_columns = [
Project.images,
Project.urls,
]

column_searchable_list = [
Project.name,
Project.summary,
Project.introduction,
]

column_sortable_list = Project.__table__.columns.keys()


class MemberAdmin(ModelView, model=Member):
column_list = [
Member.id,
Member.first_name,
Member.last_name,
Member.introduction,
Member.department,
Member.college,
Member.phone_number,
Member.github_id,
Member.generation,
Member.is_active,
Member.created_at,
Member.position,
]

column_searchable_list = [Member.first_name, Member.last_name]

column_sortable_list = Member.__table__.columns.keys()


class ReviewAdmin(ModelView, model=Review):
column_list = [
Review.id,
Review.member,
Review.title,
Review.content,
]

column_formatters = {
Review.member: member_formatter, # type: ignore
}

column_searchable_list = [
Review.title,
]

column_sortable_list = Review.__table__.columns.keys()


class SeminarAdmin(ModelView, model=Seminar):
column_list = [
Seminar.id,
Seminar.seminar_type,
Seminar.curriculum_info,
Seminar.prerequisite_info,
Seminar.is_active,
]

column_searchable_list = [Seminar.seminar_type]

column_sortable_list = Seminar.__table__.columns.keys()


class PreRegistrationAdmin(ModelView, model=PreRegistration):
column_list = [
PreRegistration.id,
PreRegistration.url,
PreRegistration.generation,
PreRegistration.is_active,
]
column_searchable_list = [
PreRegistration.url,
PreRegistration.generation,
]

column_sortable_list = PreRegistration.__table__.columns.keys()


class SponsorAdmin(ModelView, model=Sponsor):
column_list = [
Sponsor.id,
Sponsor.name,
Sponsor.amount,
Sponsor.email,
Sponsor.phone_number,
Sponsor.sponsored_date,
]

column_searchable_list = [
Sponsor.name,
]

column_sortable_list = Sponsor.__table__.columns.keys()


class TimelineAdmin(ModelView, model=Timeline):
column_list = [
Timeline.id,
Timeline.title,
Timeline.category,
Timeline.group,
Timeline.start_date,
Timeline.end_date,
]
column_formatters = {
Timeline.category: timeline_category_formatter, # type: ignore
}
column_searchable_list = [
Timeline.title,
]

column_sortable_list = Timeline.__table__.columns.keys()


class TimelineCategoryAdmin(ModelView, model=TimelineCategory):
column_list = [
TimelineCategory.id,
TimelineCategory.title,
]

column_searchable_list = [
TimelineCategory.title,
]

column_sortable_list = TimelineCategory.__table__.columns.keys()


class FAQAdmin(ModelView, model=FAQ):
column_list = [
FAQ.id,
FAQ.question,
FAQ.answer,
]

column_searchable_list = [
FAQ.question,
]

column_sortable_list = FAQ.__table__.columns.keys()


class RecruitingInfoAdmin(ModelView, model=RecruitingInfo):
column_list = [
RecruitingInfo.id,
RecruitingInfo.recruiting,
RecruitingInfo.info_num,
]

column_formatters = {
RecruitingInfo.recruiting: recruiting_formatter # type: ignore
}

column_searchable_list = [
"recruiting.name",
RecruitingInfo.info_num,
]

column_sortable_list = RecruitingInfo.__table__.columns.keys()


class HistoryAdmin(ModelView, model=History):
column_list = [
History.id,
History.history_key,
History.history_value,
]

column_searchable_list = [
History.history_key,
]

column_sortable_list = History.__table__.columns.keys()


admin_views = [
UserAdmin,
RecruitingAdmin,
Expand All @@ -294,4 +501,15 @@ class RecruitingApplicationAdmin(ModelView, model=RecruitingApplication):
ResumeQuestionAdmin,
ResumeSubmissionAdmin,
RecruitingApplicationAdmin,
ProjectAdmin,
MemberAdmin,
ReviewAdmin,
SeminarAdmin,
PreRegistrationAdmin,
SponsorAdmin,
TimelineAdmin,
TimelineCategoryAdmin,
FAQAdmin,
RecruitingInfoAdmin,
HistoryAdmin,
]
Loading
Loading