Registration & Approval System
COMPLETE
- Custom
acwe_registration module built and functional
- Registration form with keyword validation field
- Keyword stored in Drupal state system
- Keyword management form at
/admin/config/acwe/rehearsal-keyword
- Shows current keyword
- Shows last updated date/time
- Logs who updated it (accountability)
- Includes helpful tips (collapsed)
- Approval dashboard at
/admin/people/pending
- Lists all pending registrations
- Shows username, email, time waiting
- Approve/Deny/View action links
- Logs all approval actions
- "Registration Approver" role created (for section leaders and board members)
- Auto-assignment to Section Groups on approval
- Welcome email sent automatically on approval
- Full workflow tested end-to-end successfully
Technical Implementation:
• Form alter via hook_form_alter()
• Custom validation handler for keyword check
• Custom approval form with confirmation step
• Group assignment via Group module API
• State API for keyword storage
Section Groups
COMPLETE
- 11 Section Groups created matching forum structure:
- Conductor
- Flutes/Piccolos
- Oboes/Bassoons/English Horns
- Clarinets
- Bass Clarinets
- Saxophones
- French Horns
- Cornets/Trumpets
- Trombones
- Euphoniums/Tubas
- Percussion
- Groups assigned IDs 1-11 sequentially
- Auto-assignment logic built into ApproveUserForm
- Mapping between section field values and group IDs
- Tested: Users correctly added to groups on approval
Architecture Notes:
• field_primary_section and Group membership are separate
• Only linked automatically at initial approval
• Admins can manually adjust group membership later
• Allows flexibility for multi-section players and guest musicians
Forum System
COMPLETE
- Forum module installed (contrib version for Drupal 11)
- Complete forum structure created programmatically:
- Announcements Container: 1 forum (Official Announcements)
- General Container: 3 forums (General Discussion, Repertoire Discussion, Off-Topic & Social)
- Section Forums Container: 11 section-specific forums
- Total: 3 containers, 15 forums
- Members-only access implemented via custom hooks:
hook_node_access() - Blocks anonymous users from viewing forum content
hook_preprocess_page() - Redirects anonymous users from /forum pages
- Permissions configured:
- Authenticated users: Create, edit own, delete own forum content
- Registration approvers: Edit any, delete any, administer forums
Security:
• Anonymous users cannot see forum content (NODE_ACCESS_DENY)
• Anonymous users redirected from /forum to homepage
• All forum nodes require authentication
• Moderators can edit/delete any post
Member Directory
COMPLETE
- View created at
/members/directory
- Table display with three columns:
- Name (username)
- Primary Section/Instrument
- Member Since (account creation date)
- Privacy-focused: No email addresses or phone numbers displayed
- Exposed filter: "Filter by Section" dropdown
- Filters: Active users only, excludes admin accounts (uid 0 and 1)
- Pagination: 50 members per page
- Sorted alphabetically by username
- Clickable column headers for sorting
- Custom CSS styling with proper contrast:
- Dark headers (ACWE primary color) with white text
- Alternating row colors
- Hover effects
- Mobile-responsive
Implementation:
• Views configuration saved to database
• CSS added to theme (acwe2025_bootstrap/css/style.css)
• Library attached via hook_preprocess_views_view()
• Uses ACWE color variables for consistency
Anti-Spam Protection
COMPLETE
- reCAPTCHA v3 configured and enabled:
- Site key: 6LfDogcsAAAAABGXPMA6YKSsCSoWVAPAHrWuYdpq
- Secret key configured (not displayed here)
- Enabled on: Registration form, Password reset form, Contact forms
- Invisible background scoring (v3)
- Honeypot module configured:
- 5-second time limit for form submissions
- All forms protected (
protect_all_forms: true)
- Hidden field that bots auto-fill
- Antibot module enabled:
- 6-second delay before form submission available
- JavaScript-based bot detection
- Flood Control module installed for rate limiting
- Rehearsal Keyword as human verification (custom)
- Manual Approval workflow (final spam barrier)
Multi-Layer Protection Strategy
Layer 1: reCAPTCHA v3 (invisible scoring)
Layer 2: Honeypot + Antibot (hidden field + time delay)
Layer 3: Rehearsal keyword validation (custom verification question)
Layer 4: Manual approval by section leaders (human review)
Result: Extremely robust protection against automated spam and bot registrations
Field Management
COMPLETE
- field_primary_section recreated as
list_string type
- 11 allowed values configured (matching sections)
- Widget changed to
options_select (dropdown)
- Existing user data preserved during migration
- Admins now see dropdown instead of text field when editing users
- Ensures data consistency across all user profiles
Migration Script:
• Saved existing values before deletion
• Deleted old string field
• Purged field data
• Created new list_string field storage
• Created new field configuration
• Restored all saved values
• Updated form display configuration
• Zero data loss
Phase 1.6 - Security & Profile Enhancements
COMPLETE
- reCAPTCHA v3: Upgraded from v2 to v3 module
- Installed
drupal/recaptcha_v3 module
- Removed orphaned v2 configuration
- Configured invisible v3 verification
- User Profile System: Profile module integrated
- Installed
drupal/profile 1.13.0
- Created Member Profile type
- Added First Name and Last Name fields
- Profile accessible at /user/{uid}/profile
- Navigation Improvements: Mobile-friendly offcanvas menu
- Enabled Bootstrap offcanvas collapse in theme settings
- Fixed icon colors in navigation and dropdowns
- CSS improvements for better contrast
- System Cleanup: Database and cache optimization
- Removed orphaned module references (blog routes, recaptcha)
- Cleaned up core.extension configuration
- Multiple cache rebuilds for stability
Technical Updates (Nov 18-19, 2025):
• Module: drupal/recaptcha_v3 (replaced drupal/recaptcha)
• Module: drupal/profile 1.13.0
• CSS: Navigation icon color fixes in style.css
• Config: Bootstrap offcanvas navbar behavior enabled
• Database: Cleaned orphaned module entries
Phase 1.7 - Login Flow & Documentation
COMPLETE
- Login Destination System: Post-login routing to section groups
- Installed
drupal/login_destination module
- Created URL aliases for all 11 sections (/flutes, /trumpets, etc.)
- Token-based redirect using
[current-user:field_primary_section:value]
- Users land on their section group page after login
- Configuration Cleanup: Removed obsolete content types
- Deleted 18 event_calendar config files + 1 group relationship
- Deleted 17 multimedia config files + 1 group relationship
- Total cleanup: 36 orphaned configuration files
- Config sync directory now consistent with active site
- Registration Form Fix: Resolved TypeError bug
- Removed duplicate form element creation for field widgets
- Simplified form alter to only adjust field weights
- Field widgets now render naturally without conflicts
- New user registration now completes without errors
- Comprehensive Documentation: USERGUIDE.md rewrite
- 14 structured sections covering all aspects
- Environment comparison (dev vs production)
- Complete workflows: registration, approval, login
- Roles, permissions, groups mapping reference tables
- Troubleshooting matrix with common issues
- Maintenance commands and deployment checklist
Technical Updates (Nov 26-27, 2025):
• Module: drupal/login_destination
• URL Aliases: 11 section aliases created via path_alias
• Bug Fix: acwe_registration.module form alter simplified
• Config: 36 orphaned files removed from sync directory
• Docs: USERGUIDE.md expanded to comprehensive reference (14 sections)
User Documentation
NEEDS REWRITE
- Draft documentation created as Page nodes (unpublished):
- Node 509: Member Portal Guide - For New Members
- Node 510: Member Portal Guide - For Section Leaders & Approvers
- Problem: Current documentation is too long and checklist-like
- Not scannable or user-friendly
- Too much detail for quick reference
- Needs to be broken into focused, task-oriented pages
- Needed: Rewrite as concise, focused how-to guides
- "How to Register" (1 page, simple steps)
- "How to Post in Forums" (quick guide)
- "How to Approve New Members" (section leaders)
- "How to Find Sheet Music" (when implemented)
- "Quick Start Guide" (landing page with links)
- Content Migration Needed:
- Existing "ACWE's music library" page (node 491) needs integration
- Other member-facing content to be identified and migrated
- Create clear information architecture
Action Items:
• Audit existing member content (identify what to migrate)
• Create content strategy for user-facing documentation
• Rewrite as short, task-oriented pages (not long checklists)
• Design clear navigation for help/documentation section
• Test with actual users for clarity and usability
Sheet Music Library System
NOT STARTED
- Current State: Existing "ACWE's music library" page (node 491)
- Likely references old/external music management system
- Needs to be reviewed and integrated with new portal
- Planned Approach: Drupal-native using Group content
- Leverage existing Groups module infrastructure
- Section groups already in place (ready to extend)
- No external API integration needed
- Architecture Design:
- Content Type: "Sheet Music" with fields for title, composer, arranger, part/instrument
- PDF file uploads (private file system for security)
- Group content plugin: Makes sheet music group-able
- Access control via Groups module (only group members can access)
Copyright Compliance & Retention
NOT STARTED
- Automatic Retention Management:
- Retention date = Performance date + 2 weeks (configurable)
- Calculated automatically on file upload
- Cron job checks daily for expired files
- Email warnings 7 days before deletion
- Auto-deletion after retention date passes
- Admin Override:
- Mark files as "Keep indefinitely"
- For public domain or ensemble-owned music
- Requires justification note
- Audit Trail:
- Log all uploads (who, when, what file)
- Log all deletions (manual and automatic)
- Track who downloaded files
- Available for copyright compliance reviews
Upload & Distribution Workflow
NOT STARTED
- Upload Interface:
- For directors, section leaders, librarians
- Bulk upload capability (multiple files at once)
- Associate with concert/event
- Auto-assign to appropriate section groups
- Member Access:
- View: Music library page (filtered by section group membership)
- Search/filter by: Concert, composer, title, date
- Download individual PDFs
- Optional: Bulk download for concert
- Notifications:
- "New music available for your section"
- Email notification to section group members
- In-portal notification badge
Integration with Existing System
Groups Module Foundation:
- ✅ 11 Section Groups already created and tested
- ✅ Users auto-assigned to groups on registration approval
- ✅ Group membership management already working
- ✅ Access control architecture in place
What's Needed:
- Create "Sheet Music" content type
- Enable Group content plugin for Sheet Music
- Configure private file system
- Build upload form/interface
- Create music library view
- Implement retention/deletion system
- Add notification integration
Estimated Effort: 2-3 weeks (after core features tested and stable)
Why Drupal-Native for Music Management
Advantages over External System Integration:
- Seamless Access Control: Groups already manage section membership
- Single Sign-On: No separate login for music system
- Unified Interface: Same portal for forums, directory, and music
- Simpler Architecture: No API complexity, no sync issues
- Better Notifications: Integrated with message system
- Easier Maintenance: One system to update and secure
- More Flexible: Easy to add features (comments, ratings, practice notes)
Decision: Build natively in Drupal using Group content (same proven approach as rest of portal)
Technology Stack for Music Management:
• Group content plugin (part of Groups 3.3.5 module)
• Drupal private file system (secure storage)
• Custom content type: sheet_music
• Computed field for retention date calculation
• Cron hooks for automated deletion checks
• Message module for "new music" notifications
• Views for music library displays (by section, by concert)
• Custom module: acwe_music (to be created)
• Extends existing acwe_registration module architecture