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:
@@ -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
|
||||
```
|
||||
Reference in New Issue
Block a user