Files
conference/SPEC.md
T
paul 934848b7f5 Add password reset flow, attendee profile enhancements, and spec
- 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>
2026-05-19 19:52:42 +00:00

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
```