# 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/` - Reset password with token ### Organizer - `/organizer/dashboard` - Event overview and management - `/organizer/events/create` - Create new event - `/organizer/events/` - Event details and management - `/organizer/events//edit` - Edit event - `/organizer/events//attendees` - View attendee list - `/organizer/events//badges` - Print badges - `/organizer/events//scan` - QR scanner for check-in - `/organizer/events//edit-attendee/` - Edit attendee - `/organizer/events//attendee-types` - Manage attendee types - `/organizer/events//breakout-sessions` - Manage breakout sessions - `/organizer/events//breakout-sessions/create` - Create breakout session - `/organizer/events//breakout-sessions/` - Edit breakout session - `/organizer/events//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 ```