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>
This commit is contained in:
2026-05-19 19:52:42 +00:00
parent 335658f2bf
commit 934848b7f5
19 changed files with 758 additions and 124 deletions
+167 -54
View File
@@ -3,8 +3,8 @@
## 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, and schedule appointments
- **Target Users**: Event organizers and event attendees
- **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
@@ -22,6 +22,10 @@
| 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`
@@ -29,7 +33,7 @@
|--------|------|-------------|
| 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 for deep linking |
| 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 |
@@ -51,6 +55,14 @@
| 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`
@@ -75,68 +87,142 @@
| 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
### Organiser Features
### Organizer Features
1. **Authentication**: Login/logout for organizers
2. **Event Management**: Create, edit, delete events
3. **Attendee List**: View all attendees for their events
3. **Attendee Management**: View, edit attendees; manage attendee types
4. **Badge Printing**: Generate printable badge list (PDF-ready HTML)
5. **Attendance Stats**: See check-in counts and attendee statistics
6. **QR Code Scanning**: Mobile camera-based check-in by scanning attendee QR codes
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 RSVP**: Register for events
3. **Profile Management**: Update profile with name, org, role, intro, photo
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
#### Organiser Flow
1. Login → Dashboard → Create Event → View Attendees → Print Badges
#### 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
## API Endpoints
## Key Pages
### Auth
- `POST /api/auth/organizer/register` - Register organizer
- `POST /api/auth/organizer/login` - Login organizer
- `POST /api/auth/attendee/register` - Register attendee
- `POST /api/auth/attendee/login` - Login attendee
- `POST /api/auth/logout` - Logout
- `/auth/login` - Organizer/attendee login
- `/auth/forgot-password` - Request password reset
- `/auth/reset-password/<token>` - Reset password with token
### Events
- `GET /api/events` - List public events
- `POST /api/events` - Create event (organizer)
- `GET /api/events/<id>` - Get event details
- `PUT /api/events/<id>` - Update event
- `DELETE /api/events/<id>` - Delete event
### 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
### Attendees
- `GET /api/events/<id>/attendees` - List attendees for event
- `GET /api/attendees/<id>` - Get attendee profile
- `PUT /api/attendees/<id>` - Update attendee profile
- `POST /api/attendees/<id>/photo` - Upload profile photo
### Connections
- `GET /api/connections` - List my connections
- `POST /api/connections` - Send connection request
- `PUT /api/connections/<id>` - Accept/reject connection
- `GET /api/attendees` - Search attendees
### Appointments
- `GET /api/appointments` - List my appointments
- `POST /api/appointments` - Request appointment
- `PUT /api/appointments/<id>` - Accept/reject appointment
### Organizer Tools
- `GET /api/organizer/events/<id>/badges` - Get badge printable view
- `GET /api/organizer/events/<id>/stats` - Get attendance stats
- `GET /api/organizer/events/<id>/scan` - QR code scanner page for check-in
### 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
@@ -154,24 +240,51 @@
├── static/
│ ├── css/
│ │ └── style.css
── js/
└── main.js
── js/
└── main.js
│ └── uploads/ # User uploaded files
└── templates/
├── base.html
├── index.html
├── register.html
├── attendees.html
├── auth/
│ ├── login.html
── register.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
└── attendee/
── dashboard.html
├── event.html
├── profile.html
├── connections.html
└── appointments.html
```
└── presenter/
── dashboard.html
```