Skip to content

Commit 1a6ddaf

Browse files
mjy926minkyu97deveroskp
authored
prod 배포 (#108)
* 병합 충돌이 있어 수정해주었습니다. --------- Co-authored-by: Minkyu Lee <whizkyu@snu.ac.kr> Co-authored-by: Kyeongpyo Lee <70705786+deveroskp@users.noreply.github.com> Co-authored-by: deveroskp <imsmile2004@naver.com>
1 parent de2211d commit 1a6ddaf

125 files changed

Lines changed: 5497 additions & 90 deletions

File tree

Some content is hidden

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

.coderabbit.yaml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
language: "ko-KR"
2+
3+
reviews:
4+
profile: "chill"
5+
request_changes_workflow: false
6+
high_level_summary: false
7+
poem: false
8+
review_status: true
9+
auto_review:
10+
enabled: true
11+
drafts: false

.github/workflows/deploy-dev.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ on:
77
jobs:
88
deploy:
99
name: deploy dev
10-
runs-on: ubuntu-latest
10+
runs-on: ubuntu-24.04-arm
1111

1212
env:
1313
IMAGE_TAG: ${{ github.run_number }}

.github/workflows/deploy-prod.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ on:
77
jobs:
88
deploy:
99
name: deploy prod
10-
runs-on: ubuntu-latest
10+
runs-on: ubuntu-24.04-arm
1111

1212
env:
1313
IMAGE_TAG: ${{ github.run_number }}

.github/workflows/test.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,13 @@ jobs:
3030
- name: change mysql charset
3131
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"
3232

33-
- name: Install poetry
34-
run: pipx install poetry
35-
3633
- uses: actions/setup-python@v4
3734
with:
3835
python-version: 3.11
3936

37+
- name: Install poetry
38+
run: pipx install poetry --python python3.11
39+
4040
- name: Set poetry environment & install dependencies
4141
run: |
4242
poetry config virtualenvs.in-project true

.pre-commit-config.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ repos:
2323
- id: pyright
2424

2525
- repo: https://github.com/hadialqattan/pycln
26-
rev: v2.1.3
26+
rev: v2.5.0
2727
hooks:
2828
- id: pycln
2929
args: [--config=pyproject.toml]

Dockerfile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
FROM python:3.11-buster as builder
1+
FROM python:3.11-bookworm as builder
22

33
RUN pip install poetry==1.5.0
44

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

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

16-
FROM python:3.11-slim-buster as runtime
16+
FROM python:3.11-slim-bookworm as runtime
1717

1818
ARG ENV
1919

poetry.lock

Lines changed: 212 additions & 63 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ pyjwt = "^2.8.0"
2727
pytest-mock = "3.8.2"
2828
moto = {version = "4.2.7", extras = ["all", "ec2", "s3"]}
2929
tenacity = "^9.0.0"
30+
pyyaml = "6.0.2"
3031

3132

3233
[tool.poetry.group.dev.dependencies]

wacruit/src/admin/formatters.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,3 +26,15 @@ def formatter(model: type[DeclarativeBase], attribute: str):
2626
)
2727

2828
return formatter
29+
30+
31+
def member_formatter(model: type[DeclarativeBase], attribute: str) -> str | None:
32+
member = getattr(model, "member")
33+
return member and f"{member.last_name} {member.first_name}"
34+
35+
36+
def timeline_category_formatter(
37+
model: type[DeclarativeBase], attribute: str
38+
) -> str | None:
39+
category = getattr(model, "category")
40+
return category and category.title

wacruit/src/admin/views.py

Lines changed: 218 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,32 @@
22

33
from sqladmin import ModelView
44
from sqlalchemy import Column
5+
from wtforms import TextAreaField
56

7+
from wacruit.src.admin.formatters import member_formatter
68
from wacruit.src.admin.formatters import recruiting_formatter
79
from wacruit.src.admin.formatters import shorten_column
10+
from wacruit.src.admin.formatters import timeline_category_formatter
811
from wacruit.src.admin.formatters import user_formatter
912
from wacruit.src.apps.announcement.models import Announcement
13+
from wacruit.src.apps.faq.models import FAQ
14+
from wacruit.src.apps.history.models import History
15+
from wacruit.src.apps.member.models import Member
16+
from wacruit.src.apps.pre_registration.models import PreRegistration
1017
from wacruit.src.apps.problem.models import CodeSubmission
1118
from wacruit.src.apps.problem.models import Problem
1219
from wacruit.src.apps.problem.models import Testcase
20+
from wacruit.src.apps.project.models import Project
1321
from wacruit.src.apps.recruiting.models import Recruiting
1422
from wacruit.src.apps.recruiting.models import RecruitingApplication
23+
from wacruit.src.apps.recruiting_info.models import RecruitingInfo
1524
from wacruit.src.apps.resume.models import ResumeQuestion
1625
from wacruit.src.apps.resume.models import ResumeSubmission
26+
from wacruit.src.apps.review.models import Review
27+
from wacruit.src.apps.seminar.models import Seminar
28+
from wacruit.src.apps.sponsor.models import Sponsor
29+
from wacruit.src.apps.timeline.models import Timeline
30+
from wacruit.src.apps.timeline.models import TimelineCategory
1731
from wacruit.src.apps.user.models import User
1832

1933

@@ -84,6 +98,7 @@ class RecruitingAdmin(ModelView, model=Recruiting):
8498
Recruiting.to_date,
8599
Recruiting.description,
86100
Recruiting.short_description,
101+
Recruiting.recruiting_info,
87102
]
88103

89104
column_formatters = {
@@ -179,6 +194,8 @@ class TestcaseAdmin(ModelView, model=Testcase):
179194
Testcase.expected_output: shorten_column(), # type: ignore
180195
}
181196

197+
form_overrides = {"stdin": TextAreaField, "expected_output": TextAreaField}
198+
182199
form_excluded_columns = [
183200
Testcase.submission_results,
184201
]
@@ -284,6 +301,196 @@ class RecruitingApplicationAdmin(ModelView, model=RecruitingApplication):
284301
column_sortable_list = RecruitingApplication.__table__.columns.keys()
285302

286303

304+
class ProjectAdmin(ModelView, model=Project):
305+
column_list = [
306+
Project.id,
307+
Project.name,
308+
Project.summary,
309+
Project.introduction,
310+
Project.thumbnail_url,
311+
Project.project_type,
312+
Project.is_active,
313+
]
314+
315+
form_excluded_columns = [
316+
Project.images,
317+
Project.urls,
318+
]
319+
320+
column_searchable_list = [
321+
Project.name,
322+
Project.summary,
323+
Project.introduction,
324+
]
325+
326+
column_sortable_list = Project.__table__.columns.keys()
327+
328+
329+
class MemberAdmin(ModelView, model=Member):
330+
column_list = [
331+
Member.id,
332+
Member.first_name,
333+
Member.last_name,
334+
Member.introduction,
335+
Member.department,
336+
Member.college,
337+
Member.phone_number,
338+
Member.github_id,
339+
Member.generation,
340+
Member.is_active,
341+
Member.created_at,
342+
Member.position,
343+
]
344+
345+
column_searchable_list = [Member.first_name, Member.last_name]
346+
347+
column_sortable_list = Member.__table__.columns.keys()
348+
349+
350+
class ReviewAdmin(ModelView, model=Review):
351+
column_list = [
352+
Review.id,
353+
Review.member,
354+
Review.title,
355+
Review.content,
356+
]
357+
358+
column_formatters = {
359+
Review.member: member_formatter, # type: ignore
360+
}
361+
362+
column_searchable_list = [
363+
Review.title,
364+
]
365+
366+
column_sortable_list = Review.__table__.columns.keys()
367+
368+
369+
class SeminarAdmin(ModelView, model=Seminar):
370+
column_list = [
371+
Seminar.id,
372+
Seminar.seminar_type,
373+
Seminar.curriculum_info,
374+
Seminar.prerequisite_info,
375+
Seminar.is_active,
376+
]
377+
378+
column_searchable_list = [Seminar.seminar_type]
379+
380+
column_sortable_list = Seminar.__table__.columns.keys()
381+
382+
383+
class PreRegistrationAdmin(ModelView, model=PreRegistration):
384+
column_list = [
385+
PreRegistration.id,
386+
PreRegistration.url,
387+
PreRegistration.generation,
388+
PreRegistration.is_active,
389+
]
390+
column_searchable_list = [
391+
PreRegistration.url,
392+
PreRegistration.generation,
393+
]
394+
395+
column_sortable_list = PreRegistration.__table__.columns.keys()
396+
397+
398+
class SponsorAdmin(ModelView, model=Sponsor):
399+
column_list = [
400+
Sponsor.id,
401+
Sponsor.name,
402+
Sponsor.amount,
403+
Sponsor.email,
404+
Sponsor.phone_number,
405+
Sponsor.sponsored_date,
406+
]
407+
408+
column_searchable_list = [
409+
Sponsor.name,
410+
]
411+
412+
column_sortable_list = Sponsor.__table__.columns.keys()
413+
414+
415+
class TimelineAdmin(ModelView, model=Timeline):
416+
column_list = [
417+
Timeline.id,
418+
Timeline.title,
419+
Timeline.category,
420+
Timeline.group,
421+
Timeline.start_date,
422+
Timeline.end_date,
423+
]
424+
column_formatters = {
425+
Timeline.category: timeline_category_formatter, # type: ignore
426+
}
427+
column_searchable_list = [
428+
Timeline.title,
429+
]
430+
431+
column_sortable_list = Timeline.__table__.columns.keys()
432+
433+
434+
class TimelineCategoryAdmin(ModelView, model=TimelineCategory):
435+
column_list = [
436+
TimelineCategory.id,
437+
TimelineCategory.title,
438+
]
439+
440+
column_searchable_list = [
441+
TimelineCategory.title,
442+
]
443+
444+
column_sortable_list = TimelineCategory.__table__.columns.keys()
445+
446+
447+
class FAQAdmin(ModelView, model=FAQ):
448+
column_list = [
449+
FAQ.id,
450+
FAQ.question,
451+
FAQ.answer,
452+
]
453+
454+
column_searchable_list = [
455+
FAQ.question,
456+
]
457+
458+
column_sortable_list = FAQ.__table__.columns.keys()
459+
460+
461+
class RecruitingInfoAdmin(ModelView, model=RecruitingInfo):
462+
column_list = [
463+
RecruitingInfo.id,
464+
RecruitingInfo.recruiting,
465+
RecruitingInfo.info_num,
466+
]
467+
468+
column_formatters = {
469+
RecruitingInfo.recruiting: recruiting_formatter # type: ignore
470+
}
471+
472+
column_searchable_list = [
473+
"recruiting.name",
474+
RecruitingInfo.info_num,
475+
]
476+
477+
column_sortable_list = RecruitingInfo.__table__.columns.keys()
478+
479+
480+
class HistoryAdmin(ModelView, model=History):
481+
column_list = [
482+
History.id,
483+
History.history_key,
484+
History.history_value,
485+
]
486+
487+
column_searchable_list = [
488+
History.history_key,
489+
]
490+
491+
column_sortable_list = History.__table__.columns.keys()
492+
493+
287494
admin_views = [
288495
UserAdmin,
289496
RecruitingAdmin,
@@ -294,4 +501,15 @@ class RecruitingApplicationAdmin(ModelView, model=RecruitingApplication):
294501
ResumeQuestionAdmin,
295502
ResumeSubmissionAdmin,
296503
RecruitingApplicationAdmin,
504+
ProjectAdmin,
505+
MemberAdmin,
506+
ReviewAdmin,
507+
SeminarAdmin,
508+
PreRegistrationAdmin,
509+
SponsorAdmin,
510+
TimelineAdmin,
511+
TimelineCategoryAdmin,
512+
FAQAdmin,
513+
RecruitingInfoAdmin,
514+
HistoryAdmin,
297515
]

0 commit comments

Comments
 (0)