10 Commits

Author SHA1 Message Date
th-kim0823
02e186a860 fix: UX — start.sh 자동 LAN IP 감지 + topics/vote 레이아웃 조정
- start.sh: 호스트 LAN IP 자동 감지 후 PUBLIC_BASE_URL 세팅, 이제 QR이 172.x 컨테이너 IP 대신 실제 LAN IP를 가리킴
- docker-compose.yml: PUBLIC_BASE_URL 환경변수 pass-through 추가
- app.py: topics min-height 480→360, font-size/line-height 상향, vote counter를 QR 위로 이동, pct 계산 단순화
- README: 실행 섹션 교체 (start.sh 권장, raw/최소 방식 병기)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-27 21:07:11 +09:00
th-kim0823
50615e0069 fix: admin URL labels + topics-empty 안내문 + README 테스트 수
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-27 20:31:24 +09:00
th-kim0823
56c273779e docs: README — 새 흐름 + URL + topics 설명
Stage 1-6 흐름 갱신 (팀편성 → 안내 → 해킹 → 발표 → 투표 → 시상)
모바일 투표 QR URL 명시 (/?mode=vote)
topics.categories + settings.current_stage 데이터 구조 설명 추가

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-27 20:20:19 +09:00
th-kim0823
067e25116a feat: admin URL 쉽게 접근 - show-urls.sh + admin 내부 링크
- show-urls.sh: localhost + LAN IP 포함 모든 URL 출력 (참가자/어드민/시상식)
- admin 페이지에 다른 페이지 URL expander 추가 (ceremony 링크 클릭 가능)
- README에 사용법 추가

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-26 18:35:15 +09:00
th-kim0823
6e517be918 refactor: DB 제거 → 단일 hackathon.json (JSON only)
DB(sqlite + WAL) 제거. 모든 state를 단일 JSON 파일로 통합.
일회용/내부용이라 유지보수성/확장성보다 단순성 우선.

변경:
- app.py: sqlite3 import 제거. load_data/save_data + threading.RLock + atomic write
  - votes: list of dict
  - titles, tie_breaks, settings: dict
  - people: roster (assign_teams가 채움)
  - 누락 키 자동 보강
- assign_teams.py: hackathon.json 단일 출력. 기존 votes/titles 보존
- Dockerfile/compose: votes.db volume 제거. hackathon.json read-write mount
- tests/e2e.py: 12개 (12/12 통과). load/save/insert_vote/clear_votes/atomic 추가
- README: 새 데이터 구조 문서화
- roster.json/participants.json 제거 (hackathon.json으로 통합)

호스트 편집 워크플로:
- jq/vi로 hackathon.json 직접 편집
- 앱 매 요청 reload — 컨테이너 재시작 불필요

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-26 18:25:46 +09:00
th-kim0823
bf4d3e73cc feat: roster.json 단일 명단 파일 + 핫리로드
호스트에서 직접 편집 가능한 단일 JSON으로 명단 일원화.
앱이 매 요청마다 디스크에서 reload → 컨테이너 재시작 불필요.

변경:
- roster.json 새 형식: {"people": [{"name", "team", "dept", "senior", "notes"}, ...]}
- assign_teams.py: roster.json + legacy participants.json 둘 다 출력
- app.py: get_participants() / get_teams() 매 호출 reload
  - PARTS = get_participants() / TEAMS = get_teams() 함수 안에서 호출
  - 모듈 레벨 PARTICIPANTS/TEAMS 제거
  - load_roster() roster.json 우선, 없으면 legacy fallback
- docker-compose: roster.json + participants.json 둘 다 mount
- Dockerfile: ROSTER env + roster.json COPY

사용자 워크플로:
- 사람 다른 팀 옮기기: roster.json에서 그 사람 'team' 값만 변경
- 자동 배정 재실행: python3 assign_teams.py

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-26 17:43:16 +09:00
th-kim0823
0c73d655a7 feat: .env 기반 ADMIN_TOKEN 관리
- docker-compose가 .env 자동 로드
- .env는 gitignore (token 노출 방지)
- .env.example 템플릿 추가
- README 절차 업데이트

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-25 19:45:18 +09:00
th-kim0823
64404c27ed feat: Docker 패키징 (로컬 테스트 + 홈서버 배포)
- Dockerfile: python:3.12-slim 베이스, headless streamlit
- docker-compose.yml: ADMIN_TOKEN 환경변수, votes.db 영속 볼륨, participants.json read-only mount
- .dockerignore: 빌드 컨텍스트 최소화

테스트:
- docker compose build OK
- 컨테이너 실행 후 http://localhost:8501 200 OK 확인

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-25 19:35:44 +09:00
th-kim0823
e661372f84 feat: 35명 7팀 배정 + 이름 기반 자동 팀 매핑
- assign_teams.py: 부서 다양성 제약(같은 부서 ≤2명) 시드 고정 배정
- participants.json: 이름→팀 매핑 산출물
- app.py: 이름 선택 → 본인 팀 자동 표시 (수동 입력 부정 차단)
- 어드민 참여율 메트릭 + 미투표자 목록

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-25 19:02:27 +09:00
th-kim0823
5fe8842e88 feat: 해커톤 투표 앱 초기 구현
- 35명/7팀/3분야(재미·완성도·실용성) 투표
- 본인 팀 제외 자동 처리
- 이름 UNIQUE 중복 방지
- 진행자 어드민 페이지: 1위와 2위 차이만 공개, 하위 팀 표수는 비공개
- sqlite 단일 파일 저장

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-25 18:55:21 +09:00