Admin Forms
Forms for administrative tasks including challenge management, leaderboards, and user administration. Source:app/admin/forms.py
LeaderboardEntryForm
Form for creating and editing leaderboard entries.user_id(SelectField): Dropdown selection of registered usersscore(IntegerField): User’s current point total (minimum 0)key_stage(SelectField): Educational key stage classificationKS3: Key Stage 3 (Years 7-8)KS4: Key Stage 4 (Years 9-11)KS5: Key Stage 5 (Years 12-13)
submit(SubmitField): Submit button
user_id: DataRequiredscore: DataRequired, NumberRange(min=0)key_stage: DataRequired
app/admin/forms.py:106-134
ChallengeForm
Form for creating and editing educational challenges.title(StringField): Challenge title (1-100 characters)content(CKEditorField): Rich text description of the challengeimage(FileField): Optional image upload (jpg, png, gif)release_at(CrossPlatformDateTimeField): Scheduled release date/time (optional)lock_after_hours(IntegerField): Auto-lock after X hours (1-8760, optional)key_stage(SelectField): Educational key stage (ks3, ks4, ks5)answer_boxes(FieldList): Dynamic list of answer boxessubmit(SubmitField): Submit button
title: DataRequired, Length(min=1, max=100)content: DataRequiredimage: FileAllowed([‘jpg’, ‘png’, ‘gif’])release_at: Optional, validate_datetime_optionallock_after_hours: Optional, NumberRange(min=1, max=8760)key_stage: DataRequired
app/admin/forms.py:164-199
AnswerBoxForm
Nested form for managing individual answer boxes within a challenge.box_label(StringField): Label for the answer boxcorrect_answer(StringField): The correct answer for this boxorder(StringField): Optional ordering for multiple answer boxes
app/admin/forms.py:137-162
SummerChallengeForm
Form for creating summer competition challenges. Fields:title(StringField): Challenge title (1-100 characters)content(CKEditorField): Rich text challenge descriptionimage(FileField): Optional image upload (jpg, png, gif)release_at(CrossPlatformDateTimeField): Scheduled release date/timekey_stage(SelectField): Educational key stage (KS3, KS4, KS5)duration_hours(IntegerField): Duration in hours (1-168)answer_boxes(FieldList): Dynamic list of answer boxessubmit(SubmitField): Submit button
app/admin/forms.py:201-213
ArticleForm
Form for creating and managing articles and newsletters.title(StringField): Article title (1-100 characters)author(StringField): Article author name (1-100 characters)content(CKEditorField): Rich text contenttype(SelectField): Publication typearticle: Articlenewsletter: Newsletter
file(FileField): Optional PDF file uploadsubmit(SubmitField): Submit button
title: DataRequired, Length(min=1, max=100)author: DataRequired, Length(min=1, max=100)content: DataRequiredtype: DataRequiredfile: FileAllowed([‘pdf’])
app/admin/forms.py:231-260
EditUserForm
Form for editing existing user details.first_name(StringField): User’s first namelast_name(StringField): User’s last nameemail(StringField): User’s email addressyear(SelectField): Academic year (7-13)is_competition_participant(BooleanField): Summer competition participant flagschool_id(SelectField): School selection (dynamically populated)maths_class(StringField): Mathematics classsubmit(SubmitField): Submit button
first_name: DataRequiredlast_name: DataRequiredemail: DataRequired, Emailyear: DataRequiredschool_id: Optional
__init__.
See source: app/admin/forms.py:263-311
CreateUserForm
Form for creating a new user account.first_name(StringField): User’s first namelast_name(StringField): User’s last nameemail(StringField): User’s email addresspassword(StringField): Initial passwordyear(SelectField): Academic year (7-13)is_admin(BooleanField): Grant administrative privilegesis_competition_participant(BooleanField): Summer competition participant flagschool_id(SelectField): School selection (dynamically populated)maths_class(StringField): Mathematics classsubmit(SubmitField): Submit button
first_name: DataRequiredlast_name: DataRequiredemail: DataRequired, Emailpassword: DataRequiredyear: DataRequiredschool_id: Optional
app/admin/forms.py:314-368
AnnouncementForm
Form for creating and publishing announcements.title(StringField): Announcement titlecontent(CKEditorField): Rich text contentsubmit(SubmitField): Submit button
title: DataRequiredcontent: DataRequired
app/admin/forms.py:371-387
SchoolForm
Form for managing school records. Fields:name(StringField): School name (max 100 characters)email_domain(StringField): School email domain (max 100 characters)address(StringField): School address (max 200 characters)submit(SubmitField): Submit button
name: DataRequired, Length(max=100)email_domain: Length(max=100)address: Length(max=200)
app/admin/forms.py:389-393
SummerLeaderboardEntryForm
Form for creating and editing summer competition leaderboard entries. Fields:user_id(SelectField): Dropdown selection of registered usersschool_id(SelectField): Dropdown selection of participating schoolsscore(IntegerField): User’s current point total (minimum 0)submit(SubmitField): Submit button
user_id: DataRequiredschool_id: DataRequiredscore: DataRequired, NumberRange(min=0)
app/admin/forms.py:396-417
Authentication Forms
Forms for user authentication including login and registration. Source:app/auth/forms.py
LoginForm
Form for user login authentication.email(StringField): User’s email addresspassword(PasswordField): User’s passwordremember_me(BooleanField): Option to maintain user sessionsubmit(SubmitField): Submit button
email: DataRequired, Emailpassword: DataRequired
app/auth/forms.py:39-62
RegistrationForm
Form for creating a new user account.first_name(StringField): User’s first namelast_name(StringField): User’s last nameemail(StringField): School email addressyear(SelectField): Academic year (7-13)password(PasswordField): User’s chosen passwordpassword2(PasswordField): Password confirmationmaths_class(StringField): User’s mathematics classsubmit(SubmitField): Submit button
first_name: DataRequiredlast_name: DataRequiredemail: DataRequired, Email, custom validationyear: DataRequiredpassword: DataRequiredpassword2: DataRequired, EqualTo(‘password’)maths_class: DataRequired
validate_email(): Ensures email ends with ‘@uptoncourtgrammar.org.uk’ and is not already registered
app/auth/forms.py:65-122
SummerRegistrationForm
Form for summer competition registration.first_name(StringField): User’s first namelast_name(StringField): User’s last nameemail(StringField): Email addressyear(SelectField): Academic year (7-13)school_id(SelectField): User’s school (dynamically populated)password(PasswordField): User’s chosen passwordpassword2(PasswordField): Password confirmationaccept_terms(BooleanField): Agreement to competition termssubmit(SubmitField): Submit button
- All standard fields: DataRequired
email: DataRequired, Email, custom validationpassword2: EqualTo(‘password’)accept_terms: DataRequired
validate_email(): Checks if email is already registered and validates against school’s email domain
__init__.
See source: app/auth/forms.py:124-207
SummerLoginForm
Form for summer competition login authentication. Fields:email(StringField): Email addresspassword(PasswordField): User’s passwordyear(SelectField): Academic year (7-13)school_id(SelectField): User’s school (dynamically populated)remember_me(BooleanField): Option to maintain user sessionsubmit(SubmitField): Submit button
email: DataRequired, Emailpassword: DataRequiredyear: DataRequiredschool_id: DataRequired
__init__.
See source: app/auth/forms.py:209-246
Profile Forms
Forms for user profile management. Source:app/profile/forms.py
ChangePasswordForm
Form for changing user account password.current_password(StringField): User’s current passwordnew_password(StringField): User’s chosen new passwordconfirm_password(StringField): Confirmation of new passwordsubmit(SubmitField): Submit button
- All fields: DataRequired
- Verify current password is correct
- Ensure new password meets complexity requirements
- Confirm new password is different from current password
- Verify new password matches confirmation
app/profile/forms.py:35-62
Custom Validators
validate_datetime_optional()
Custom validator for optional datetime fields with cross-platform compatibility.%Y-%m-%dT%H:%M(HTML5 datetime-local)%Y-%m-%d %H:%M:%S%Y-%m-%d %H:%M
- Allows None for optional fields
- Accepts datetime objects
- Parses common datetime string formats
- Raises ValidationError for invalid formats
app/admin/forms.py:53-75
Custom Field Types
CrossPlatformDateTimeField
Enhanced DateTimeLocalField that works consistently across platforms.- Handles multiple datetime formats
- Cross-platform compatibility
- Graceful fallback for parsing failures
%Y-%m-%dT%H:%M(HTML5 datetime-local)%Y-%m-%d %H:%M:%S%Y-%m-%d %H:%M%m/%d/%Y %H:%M
app/admin/forms.py:78-103