934848b7f5
- Add forgot_password and reset_password templates and routes - Enhance profile.html with photo crop/zoom functionality - Add attendee type management to edit_attendee.html - Update templates styling and layout consistency - Document database schema in SPEC.md - Add CLAUDE.md project guidance Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
290 lines
12 KiB
Markdown
290 lines
12 KiB
Markdown
# Networking Event Platform - Specification
|
|
|
|
## Project Overview
|
|
- **Project Name**: NetEvent
|
|
- **Type**: Full-stack web application (Flask + MySQL)
|
|
- **Core Functionality**: A platform for organizing networking events where attendees can RSVP, connect, schedule appointments, and attend breakout sessions
|
|
- **Target Users**: Event organizers, event staff, and event attendees
|
|
|
|
## Technology Stack
|
|
- **Backend**: Python Flask
|
|
- **Database**: MySQL (roast.duckdns.org:33062)
|
|
- **Frontend**: HTML/CSS/JavaScript with Jinja2 templates
|
|
|
|
## Database Schema
|
|
|
|
### Tables
|
|
|
|
#### `organizers`
|
|
| Column | Type | Description |
|
|
|--------|------|-------------|
|
|
| id | INT PRIMARY KEY AUTO_INCREMENT | Organizer ID |
|
|
| email | VARCHAR(255) UNIQUE | Organizer email |
|
|
| password_hash | VARCHAR(255) | Hashed password |
|
|
| name | VARCHAR(255) | Organizer name |
|
|
| staff_code | VARCHAR(10) UNIQUE | Staff access code |
|
|
| preferred_language | VARCHAR(5) DEFAULT 'en' | Preferred language code |
|
|
| reset_token | VARCHAR(64) | Password reset token |
|
|
| reset_token_expiry | DATETIME | Password reset token expiry |
|
|
| created_at | TIMESTAMP | Creation timestamp |
|
|
|
|
#### `events`
|
|
| Column | Type | Description |
|
|
|--------|------|-------------|
|
|
| id | INT PRIMARY KEY AUTO_INCREMENT | Event ID |
|
|
| organizer_id | INT FOREIGN KEY | Reference to organizers |
|
|
| code | VARCHAR(10) UNIQUE | Unique 10-char alphanumeric event code |
|
|
| name | VARCHAR(255) | Event name |
|
|
| description | TEXT | Event description |
|
|
| start_time | DATETIME | Event start date/time |
|
|
| end_time | DATETIME | Event end date/time |
|
|
| location | VARCHAR(255) | Event location |
|
|
| max_attendees | INT | Maximum attendees (NULL = unlimited) |
|
|
| created_at | TIMESTAMP | Creation timestamp |
|
|
|
|
#### `attendees`
|
|
| Column | Type | Description |
|
|
|--------|------|-------------|
|
|
| id | INT PRIMARY KEY AUTO_INCREMENT | Attendee ID |
|
|
| event_id | INT FOREIGN KEY | Reference to events |
|
|
| email | VARCHAR(255) | Attendee email |
|
|
| password_hash | VARCHAR(255) | Hashed password |
|
|
| first_name | VARCHAR(100) | First name |
|
|
| last_name | VARCHAR(100) | Last name |
|
|
| organisation | VARCHAR(255) | Organization/Company |
|
|
| role | VARCHAR(255) | Role/Profession |
|
|
| introduction | TEXT | Short introduction |
|
|
| profile_picture | VARCHAR(255) | Profile picture path |
|
|
| checked_in | BOOLEAN DEFAULT FALSE | Check-in status |
|
|
| attendance_status | ENUM('attending', 'not_attending') | Attendance status |
|
|
| confirmation_token | VARCHAR(64) | Email confirmation token |
|
|
| attendee_code | VARCHAR(10) UNIQUE | Unique attendee code for QR |
|
|
| phone | VARCHAR(50) | Phone number |
|
|
| linkedin | VARCHAR(255) | LinkedIn profile URL |
|
|
| attendee_type_id | INT FOREIGN KEY | Reference to attendee_types |
|
|
| preferred_language | VARCHAR(5) DEFAULT 'en' | Preferred language code |
|
|
| created_at | TIMESTAMP | Creation timestamp |
|
|
|
|
#### `connections`
|
|
| Column | Type | Description |
|
|
|--------|------|-------------|
|
|
| id | INT PRIMARY KEY AUTO_INCREMENT | Connection ID |
|
|
| attendee_id | INT FOREIGN KEY | Requester attendee |
|
|
| connected_attendee_id | INT FOREIGN KEY | Connect target attendee |
|
|
| status | ENUM('pending','accepted','rejected') | Connection status |
|
|
| created_at | TIMESTAMP | Creation timestamp |
|
|
|
|
#### `appointments`
|
|
| Column | Type | Description |
|
|
|--------|------|-------------|
|
|
| id | INT PRIMARY KEY AUTO_INCREMENT | Appointment ID |
|
|
| event_id | INT FOREIGN KEY | Reference to events |
|
|
| requester_id | INT FOREIGN KEY | Requester attendee |
|
|
| target_id | INT FOREIGN KEY | Target attendee |
|
|
| appointment_time | DATETIME | Proposed meeting time |
|
|
| location | VARCHAR(255) | Meeting location |
|
|
| notes | TEXT | Appointment notes |
|
|
| status | ENUM('pending','accepted','rejected') | Appointment status |
|
|
| created_at | TIMESTAMP | Creation timestamp |
|
|
|
|
#### `breakout_sessions`
|
|
| Column | Type | Description |
|
|
|--------|------|-------------|
|
|
| id | INT PRIMARY KEY AUTO_INCREMENT | Session ID |
|
|
| code | VARCHAR(10) UNIQUE | Unique session code |
|
|
| event_id | INT FOREIGN KEY | Reference to events |
|
|
| name | VARCHAR(255) | Session name |
|
|
| description | TEXT | Session description |
|
|
| start_time | DATETIME | Session start time |
|
|
| end_time | DATETIME | Session end time |
|
|
| location | VARCHAR(255) | Session location |
|
|
| max_attendees | INT | Maximum attendees (NULL = unlimited) |
|
|
| created_at | TIMESTAMP | Creation timestamp |
|
|
|
|
#### `breakout_session_organizers`
|
|
| Column | Type | Description |
|
|
|--------|------|-------------|
|
|
| id | INT PRIMARY KEY AUTO_INCREMENT | ID |
|
|
| breakout_session_id | INT FOREIGN KEY | Reference to breakout_sessions |
|
|
| organizer_id | INT FOREIGN KEY | Reference to organizers |
|
|
| created_at | TIMESTAMP | Creation timestamp |
|
|
|
|
#### `breakout_session_rsvps`
|
|
| Column | Type | Description |
|
|
|--------|------|-------------|
|
|
| id | INT PRIMARY KEY AUTO_INCREMENT | RSVP ID |
|
|
| breakout_session_id | INT FOREIGN KEY | Reference to breakout_sessions |
|
|
| attendee_id | INT FOREIGN KEY | Reference to attendees |
|
|
| status | ENUM('registered','cancelled') | RSVP status |
|
|
| created_at | TIMESTAMP | Creation timestamp |
|
|
|
|
#### `staff`
|
|
| Column | Type | Description |
|
|
|--------|------|-------------|
|
|
| id | INT PRIMARY KEY AUTO_INCREMENT | Staff ID |
|
|
| event_id | INT FOREIGN KEY | Reference to events |
|
|
| email | VARCHAR(255) | Staff email |
|
|
| password_hash | VARCHAR(255) | Hashed password |
|
|
| first_name | VARCHAR(100) | First name |
|
|
| last_name | VARCHAR(100) | Last name |
|
|
| staff_code | VARCHAR(10) UNIQUE | Staff access code |
|
|
| invite_token | VARCHAR(64) | Invite token |
|
|
| invite_used | BOOLEAN DEFAULT FALSE | Invite used flag |
|
|
| preferred_language | VARCHAR(5) DEFAULT 'en' | Preferred language code |
|
|
| created_at | TIMESTAMP | Creation timestamp |
|
|
|
|
#### `languages`
|
|
| Column | Type | Description |
|
|
|--------|------|-------------|
|
|
| code | VARCHAR(5) PRIMARY KEY | Language code |
|
|
| name | VARCHAR(50) | English language name |
|
|
| native_name | VARCHAR(50) | Native language name |
|
|
| is_active | BOOLEAN | Active status |
|
|
| is_default | BOOLEAN | Default language flag |
|
|
| date_format | VARCHAR(30) | Date format string |
|
|
| sort_order | INT | Display sort order |
|
|
|
|
#### `attendee_types`
|
|
| Column | Type | Description |
|
|
|--------|------|-------------|
|
|
| id | INT PRIMARY KEY AUTO_INCREMENT | Type ID |
|
|
| event_id | INT FOREIGN KEY | Reference to events |
|
|
| code | VARCHAR(10) | Type code (unique per event) |
|
|
| name | VARCHAR(100) | Type name |
|
|
| price | DECIMAL(10,2) | Ticket price |
|
|
| created_at | TIMESTAMP | Creation timestamp |
|
|
|
|
## Functionality Specification
|
|
|
|
### Organizer Features
|
|
1. **Authentication**: Login/logout for organizers
|
|
2. **Event Management**: Create, edit, delete events
|
|
3. **Attendee Management**: View, edit attendees; manage attendee types
|
|
4. **Badge Printing**: Generate printable badge list (PDF-ready HTML)
|
|
5. **QR Code Scanning**: Mobile camera-based check-in by scanning attendee QR codes
|
|
6. **Breakout Sessions**: Create/manage breakout sessions within events
|
|
7. **Staff Management**: Add staff members to events via invite codes
|
|
8. **Event Staff View**: See which staff are assigned to events
|
|
|
|
### Staff Features
|
|
1. **Authentication**: Login via staff invite code
|
|
2. **QR Scanning**: Scan attendee QR codes for check-in
|
|
3. **Event Dashboard**: View assigned events and scan functionality
|
|
|
|
### Attendee Features
|
|
1. **Authentication**: Register/login for attendees
|
|
2. **Event Registration**: RSVP for events with optional payment
|
|
3. **Profile Management**: Update profile with name, org, role, intro, photo (with crop/zoom)
|
|
4. **Connections**: Send/accept/reject connection requests
|
|
5. **Appointments**: Request/accept/reject meeting appointments
|
|
6. **Breakout Sessions**: RSVP for breakout sessions
|
|
7. **Password Reset**: Request password reset via email
|
|
|
|
### User Interactions & Flows
|
|
|
|
#### Organizer Flow
|
|
1. Login → Dashboard → Create Event → Manage Attendees → Print Badges / Scan Check-in
|
|
2. Create breakout sessions, manage attendee types, invite staff
|
|
|
|
#### Staff Flow
|
|
1. Use invite code → Login → View assigned events → Scan attendees for check-in
|
|
|
|
#### Attendee Flow
|
|
1. Register → Login → RSVP to Event → Manage Profile → Connect with Attendees → Request Appointments
|
|
2. Browse and register for breakout sessions
|
|
|
|
## Key Pages
|
|
|
|
### Auth
|
|
- `/auth/login` - Organizer/attendee login
|
|
- `/auth/forgot-password` - Request password reset
|
|
- `/auth/reset-password/<token>` - Reset password with token
|
|
|
|
### Organizer
|
|
- `/organizer/dashboard` - Event overview and management
|
|
- `/organizer/events/create` - Create new event
|
|
- `/organizer/events/<id>` - Event details and management
|
|
- `/organizer/events/<id>/edit` - Edit event
|
|
- `/organizer/events/<id>/attendees` - View attendee list
|
|
- `/organizer/events/<id>/badges` - Print badges
|
|
- `/organizer/events/<id>/scan` - QR scanner for check-in
|
|
- `/organizer/events/<id>/edit-attendee/<attendee_id>` - Edit attendee
|
|
- `/organizer/events/<id>/attendee-types` - Manage attendee types
|
|
- `/organizer/events/<id>/breakout-sessions` - Manage breakout sessions
|
|
- `/organizer/events/<id>/breakout-sessions/create` - Create breakout session
|
|
- `/organizer/events/<id>/breakout-sessions/<session_id>` - Edit breakout session
|
|
- `/organizer/events/<id>/staff` - Event staff management
|
|
|
|
### Attendee
|
|
- `/attendee/dashboard` - Event dashboard
|
|
- `/attendee/profile` - Profile management with photo crop/zoom
|
|
- `/attendee/connections` - View accepted connections
|
|
- `/attendee/connection-requests` - Manage incoming connection requests
|
|
- `/attendee/appointments` - View appointments
|
|
- `/register` - Event registration
|
|
- `/attendee/personal` - Personal information page
|
|
|
|
## Security
|
|
- Password hashing with bcrypt
|
|
- Session-based authentication
|
|
- CSRF protection
|
|
- SQL injection prevention via parameterized queries
|
|
|
|
## File Structure
|
|
```
|
|
/home/paul/conference/
|
|
├── app.py # Flask application
|
|
├── config.py # Configuration
|
|
├── init_db.py # Database initialization script
|
|
├── requirements.txt # Python dependencies
|
|
├── static/
|
|
│ ├── css/
|
|
│ │ └── style.css
|
|
│ ├── js/
|
|
│ │ └── main.js
|
|
│ └── uploads/ # User uploaded files
|
|
└── templates/
|
|
├── base.html
|
|
├── index.html
|
|
├── register.html
|
|
├── attendees.html
|
|
├── auth/
|
|
│ ├── login.html
|
|
│ ├── forgot_password.html
|
|
│ └── reset_password.html
|
|
├── organizer/
|
|
│ ├── dashboard.html
|
|
│ ├── create_event.html
|
|
│ ├── edit_event.html
|
|
│ ├── edit_event_confirm.html
|
|
│ ├── event_detail.html
|
|
│ ├── event_staff.html
|
|
│ ├── badges.html
|
|
│ ├── scan.html
|
|
│ ├── edit_attendee.html
|
|
│ ├── attendee_types.html
|
|
│ ├── all_attendee_types.html
|
|
│ ├── edit_attendee_type.html
|
|
│ ├── breakout_sessions.html
|
|
│ ├── breakout_session_detail.html
|
|
│ ├── create_breakout_session.html
|
|
│ ├── edit_breakout_session.html
|
|
│ ├── edit_breakout_session_confirm.html
|
|
│ └── edit_staff.html
|
|
├── attendee/
|
|
│ ├── dashboard.html
|
|
│ ├── profile.html
|
|
│ ├── connections.html
|
|
│ ├── connection_requests.html
|
|
│ ├── event.html
|
|
│ ├── event_register.html
|
|
│ ├── payment.html
|
|
│ ├── personal.html
|
|
│ └── request_link.html
|
|
├── staff/
|
|
│ ├── dashboard.html
|
|
│ ├── staff_events.html
|
|
│ └── scan.html
|
|
└── presenter/
|
|
└── dashboard.html
|
|
``` |