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
+2 -2
View File
@@ -28,8 +28,8 @@
<img src="{{ attendee.qr_code }}" alt="QR Code" width="100" height="100">
</div>
<div class="badge-body">
<p class="badge-org">{{ (attendee.organisation)|spacify if attendee.organisation else '' }}</p>
<p class="badge-role">{{ (attendee.role)|spacify if attendee.role else '' }}</p>
<p class="badge-org">{{ attendee.organisation if attendee.organisation else '' }}</p>
<p class="badge-role">{{ attendee.role if attendee.role else '' }}</p>
{% if attendee.introduction %}
<p class="badge-intro">{{ attendee.introduction[:80] }}{% if attendee.introduction|length > 80 %}...{% endif %}</p>
{% endif %}
@@ -45,8 +45,8 @@
<tr>
<td>{{ rsvp.first_name }} {{ rsvp.last_name }}</td>
<td>{{ rsvp.email }}</td>
<td>{{ (rsvp.organisation)|spacify if rsvp.organisation else '-' }}</td>
<td>{{ (rsvp.role)|spacify if rsvp.role else '-' }}</td>
<td>{{ rsvp.organisation if rsvp.organisation else '-' }}</td>
<td>{{ rsvp.role if rsvp.role else '-' }}</td>
</tr>
{% endfor %}
</tbody>
@@ -3,7 +3,7 @@
{% block title %}{{ 'create_breakout_session'|t }} - NetEvents{% endblock %}
{% block content %}
<div class="form-container" style="padding: 20px;">
<div class="form-container">
<h1>{{ 'create_breakout_session'|t }}</h1>
<p class="event-info">{{ 'event'|t }}: {{ event.name }}</p>
+5
View File
@@ -47,6 +47,11 @@
</select>
</div>
<div class="form-group checkbox-group">
<input type="checkbox" id="visible_to_others" name="visible_to_others" value="1" {% if attendee.visible_to_others %}checked{% endif %}>
<label for="visible_to_others">{{ 'visible_to_attendees'|t }}</label>
</div>
<div class="form-actions">
<button type="submit" class="btn btn-primary">{{ 'save_changes'|t }}</button>
<a href="{{ url_for('organizer_dashboard') }}" class="btn btn-outline">{{ 'cancel'|t }}</a>
@@ -3,7 +3,7 @@
{% block title %}{{ 'edit_breakout_session'|t }} - NetEvents{% endblock %}
{% block content %}
<div class="form-container" style="padding: 20px;">
<div class="form-container">
<h1>{{ 'edit_breakout_session'|t }}</h1>
<p class="event-info">{{ 'event'|t }}: {{ event.name }}</p>
+3 -3
View File
@@ -372,7 +372,7 @@ th.sort-desc .sort-icon::before {
<section class="attendees-section">
<div class="section-box">
<h2>{{ 'registered_attendees'|t }}</h2>
<h2>{{ 'registered_attendees'|t }} ({{ attendees|length }})</h2>
<div class="section-actions">
<a href="{{ url_for('register_attendee', code=event.code) }}" class="btn btn-primary">{{ 'add_attendee'|t }}</a>
<a href="{{ url_for('event_badges', event_id=event.id) }}" class="btn btn-secondary">🖨️ {{ 'print_badges'|t }}</a>
@@ -416,8 +416,8 @@ th.sort-desc .sort-icon::before {
<input type="checkbox" name="attendee_ids" value="{{ attendee.id }}" class="attendee-checkbox" form="batch-assign-form">
</td>
<td>{{ attendee.first_name }} {{ attendee.last_name }}</td>
<td>{{ (attendee.organisation)|spacify if attendee.organisation else '-' }}</td>
<td>{{ (attendee.role)|spacify if attendee.role else '-' }}</td>
<td>{{ attendee.organisation if attendee.organisation else '-' }}</td>
<td>{{ attendee.role if attendee.role else '-' }}</td>
<td>
{% if attendee.attendee_type_name %}
<span class="badge" style="background: #3498db; color: white;">{{ attendee.attendee_type_name }}</span>