Initial commit

This commit is contained in:
kddd21a
2026-07-29 10:47:40 +00:00
commit 402c3ec6ed
171 changed files with 10536 additions and 0 deletions
+5
View File
@@ -0,0 +1,5 @@
{% extends "base.html" %}
{% block title %}Manage Email | Testpoint{% endblock %}
{% block content %}<section class="auth-page"><div class="auth-card"><div class="auth-card__header"><span class="auth-card__icon"><i class="bi bi-envelope-at"></i></span><h1>Manage email</h1><p>Add and verify the email address used to sign in.</p></div>
{% if emailaddresses %}<form method="post" action="{% url 'account_email' %}" class="email-manage-form">{% csrf_token %}<div class="email-address-list">{% for emailaddress in emailaddresses %}<label class="email-address-item"><input type="radio" name="email" value="{{ emailaddress.email }}"{% if emailaddress.primary or emailaddresses|length == 1 %} checked{% endif %}><span><strong>{{ emailaddress.email }}</strong><small>{% if emailaddress.verified %}Verified{% else %}Not verified{% endif %}{% if emailaddress.primary %} · Primary{% endif %}</small></span></label>{% endfor %}</div><div class="email-actions"><button type="submit" name="action_primary">Make primary</button><button type="submit" name="action_send">Resend verification</button><button class="email-remove" type="submit" name="action_remove">Remove</button></div></form>{% endif %}
<div class="auth-divider"><span>Add another address</span></div><form method="post" action="{% url 'account_email' %}">{% csrf_token %}<div class="auth-field"><label for="id_email">New email address</label><input id="id_email" type="email" name="email" autocomplete="email" required>{% for error in form.email.errors %}<p class="auth-error">{{ error }}</p>{% endfor %}</div><button class="auth-submit" type="submit" name="action_add">Add email</button></form><p class="auth-card__switch"><a href="{% url 'student_settings' %}">Back to profile settings</a></p></div></section>{% include "components/footer.html" %}{% endblock %}
+3
View File
@@ -0,0 +1,3 @@
{% extends "base.html" %}
{% block title %}Confirm Email | Testpoint{% endblock %}
{% block content %}<section class="auth-page"><div class="auth-card auth-card--compact"><div class="auth-card__header"><span class="auth-card__icon"><i class="bi bi-patch-check"></i></span><h1>Confirm your email</h1>{% if confirmation %}<p>Confirm <strong>{{ confirmation.email_address.email }}</strong> as the email for your Testpoint account.</p>{% else %}<p>This confirmation link is invalid or has expired.</p>{% endif %}</div>{% if confirmation %}<form method="post" action="{% url 'account_confirm_email' confirmation.key %}">{% csrf_token %}<button class="auth-submit" type="submit">Confirm email</button></form>{% else %}<a class="auth-submit auth-submit--link" href="{% url 'account_email' %}">Request a new link</a>{% endif %}<p class="auth-card__switch"><a href="{% url 'home' %}">Return home</a></p></div></section>{% include "components/footer.html" %}{% endblock %}
+12
View File
@@ -0,0 +1,12 @@
{% extends "base.html" %}
{% block title %}Login | Testpoint{% endblock %}
{% block content %}
<section class="auth-page"><div class="auth-card"><div class="auth-card__header"><span class="auth-card__icon"><i class="bi bi-book"></i></span><h1>Welcome back</h1><p>Continue your IELTS preparation.</p></div>
{% if form.non_field_errors %}<div class="auth-alert" role="alert">{{ form.non_field_errors }}</div>{% endif %}
<form method="post" action="{% url 'account_login' %}" novalidate>{% csrf_token %}{% if redirect_field_value %}<input type="hidden" name="{{ redirect_field_name }}" value="{{ redirect_field_value }}">{% endif %}
<div class="auth-field"><label for="id_login">Email</label><input id="id_login" type="email" name="login" value="{{ form.login.value|default:'' }}" placeholder="you@example.com" autocomplete="email" required autofocus aria-describedby="login-errors">{% for error in form.login.errors %}<p class="auth-error" id="login-errors">{{ error }}</p>{% endfor %}</div>
<div class="auth-field"><div class="auth-label-row"><label for="id_password">Password</label><a href="{% url 'account_reset_password' %}">Forgot password?</a></div><input id="id_password" type="password" name="password" placeholder="Enter your password" autocomplete="current-password" required aria-describedby="password-errors">{% for error in form.password.errors %}<p class="auth-error" id="password-errors">{{ error }}</p>{% endfor %}</div>
<label class="auth-check"><input type="checkbox" name="remember"> <span>Remember me</span></label><button class="auth-submit" type="submit">Sign in</button></form>
<p class="auth-card__switch">Don't have an account? <a href="{% url 'account_signup' %}">Create one</a></p></div></section>
{% include "components/footer.html" %}
{% endblock %}
+3
View File
@@ -0,0 +1,3 @@
{% extends "base.html" %}
{% block title %}Logout | Testpoint{% endblock %}
{% block content %}<section class="auth-page"><div class="auth-card auth-card--compact"><div class="auth-card__header"><span class="auth-card__icon"><i class="bi bi-box-arrow-right"></i></span><h1>Sign out?</h1><p>You can return and continue your preparation at any time.</p></div><form method="post" action="{% url 'account_logout' %}">{% csrf_token %}<button class="auth-submit" type="submit">Sign out</button></form><p class="auth-card__switch"><a href="{% url 'home' %}">Cancel and return home</a></p></div></section>{% include "components/footer.html" %}{% endblock %}
+3
View File
@@ -0,0 +1,3 @@
{% extends "base.html" %}
{% block title %}Change Password | Testpoint{% endblock %}
{% block content %}<section class="auth-page"><div class="auth-card"><div class="auth-card__header"><span class="auth-card__icon"><i class="bi bi-shield-lock"></i></span><h1>Change password</h1><p>Choose a strong password you do not use elsewhere.</p></div>{% if form.non_field_errors %}<div class="auth-alert" role="alert">{{ form.non_field_errors }}</div>{% endif %}<form method="post" action="{% url 'account_change_password' %}">{% csrf_token %}<div class="auth-field"><label for="id_oldpassword">Current password</label><input id="id_oldpassword" type="password" name="oldpassword" autocomplete="current-password" required>{% for error in form.oldpassword.errors %}<p class="auth-error">{{ error }}</p>{% endfor %}</div><div class="auth-field"><label for="id_password1">New password</label><input id="id_password1" type="password" name="password1" autocomplete="new-password" required>{% for error in form.password1.errors %}<p class="auth-error">{{ error }}</p>{% endfor %}</div><div class="auth-field"><label for="id_password2">Confirm new password</label><input id="id_password2" type="password" name="password2" autocomplete="new-password" required>{% for error in form.password2.errors %}<p class="auth-error">{{ error }}</p>{% endfor %}</div><button class="auth-submit" type="submit">Update password</button></form><p class="auth-card__switch"><a href="{% url 'student_settings' %}">Back to profile settings</a></p></div></section>{% include "components/footer.html" %}{% endblock %}
+3
View File
@@ -0,0 +1,3 @@
{% extends "base.html" %}
{% block title %}Reset Password | Testpoint{% endblock %}
{% block content %}<section class="auth-page"><div class="auth-card"><div class="auth-card__header"><span class="auth-card__icon"><i class="bi bi-envelope"></i></span><h1>Reset your password</h1><p>Enter your email and we'll send reset instructions.</p></div>{% if form.non_field_errors %}<div class="auth-alert" role="alert">{{ form.non_field_errors }}</div>{% endif %}<form method="post" action="{% url 'account_reset_password' %}">{% csrf_token %}<div class="auth-field"><label for="id_email">Email</label><input id="id_email" type="email" name="email" value="{{ form.email.value|default:'' }}" placeholder="you@example.com" autocomplete="email" required>{% for error in form.email.errors %}<p class="auth-error">{{ error }}</p>{% endfor %}</div><button class="auth-submit" type="submit">Send reset link</button></form><p class="auth-card__switch"><a href="{% url 'account_login' %}">Back to sign in</a></p></div></section>{% include "components/footer.html" %}{% endblock %}
@@ -0,0 +1,3 @@
{% extends "base.html" %}
{% block title %}Reset Email Sent | Testpoint{% endblock %}
{% block content %}<section class="auth-page"><div class="auth-card auth-card--compact"><div class="auth-card__header"><span class="auth-card__icon"><i class="bi bi-send-check"></i></span><h1>Check your email</h1><p>If an account exists for that address, we sent instructions for choosing a new password.</p></div><div class="auth-alert auth-alert--info">For your security, the message may take a few minutes to arrive.</div><p class="auth-card__switch"><a href="{% url 'account_login' %}">Back to sign in</a></p></div></section>{% include "components/footer.html" %}{% endblock %}
@@ -0,0 +1,3 @@
{% extends "base.html" %}
{% block title %}Choose New Password | Testpoint{% endblock %}
{% block content %}<section class="auth-page"><div class="auth-card"><div class="auth-card__header"><span class="auth-card__icon"><i class="bi bi-shield-lock"></i></span>{% if token_fail %}<h1>Invalid reset link</h1><p>This password-reset link has expired or has already been used.</p>{% else %}<h1>Choose a new password</h1><p>Use a strong password you do not use on another site.</p>{% endif %}</div>{% if token_fail %}<a class="auth-submit auth-submit--link" href="{% url 'account_reset_password' %}">Request another link</a>{% else %}<form method="post">{% csrf_token %}{% if form.non_field_errors %}<div class="auth-alert" role="alert">{{ form.non_field_errors }}</div>{% endif %}<div class="auth-field"><label for="id_password1">New password</label><input id="id_password1" type="password" name="password1" autocomplete="new-password" required>{% for error in form.password1.errors %}<p class="auth-error">{{ error }}</p>{% endfor %}</div><div class="auth-field"><label for="id_password2">Confirm new password</label><input id="id_password2" type="password" name="password2" autocomplete="new-password" required>{% for error in form.password2.errors %}<p class="auth-error">{{ error }}</p>{% endfor %}</div><button class="auth-submit" type="submit">Change password</button></form>{% endif %}</div></section>{% include "components/footer.html" %}{% endblock %}
@@ -0,0 +1,3 @@
{% extends "base.html" %}
{% block title %}Password Changed | Testpoint{% endblock %}
{% block content %}<section class="auth-page"><div class="auth-card auth-card--compact"><div class="auth-card__header"><span class="auth-card__icon"><i class="bi bi-check-circle"></i></span><h1>Password changed</h1><p>Your password has been updated successfully. You can now sign in.</p></div><a class="auth-submit auth-submit--link" href="{% url 'account_login' %}">Sign in</a></div></section>{% include "components/footer.html" %}{% endblock %}
+13
View File
@@ -0,0 +1,13 @@
{% extends "base.html" %}
{% block title %}Register | Testpoint{% endblock %}
{% block content %}
<section class="auth-page"><div class="auth-card"><div class="auth-card__header"><span class="auth-card__icon"><i class="bi bi-book"></i></span><h1>Create your account</h1><p>Start preparing for your target IELTS band.</p></div>
{% if form.non_field_errors %}<div class="auth-alert" role="alert">{{ form.non_field_errors }}</div>{% endif %}
<form method="post" action="{% url 'account_signup' %}" novalidate>{% csrf_token %}
<div class="auth-field"><label for="id_username">Username</label><input id="id_username" type="text" name="username" value="{{ form.username.value|default:'' }}" placeholder="Choose a username" autocomplete="username" required>{% for error in form.username.errors %}<p class="auth-error">{{ error }}</p>{% endfor %}</div>
<div class="auth-field"><label for="id_email">Email</label><input id="id_email" type="email" name="email" value="{{ form.email.value|default:'' }}" placeholder="you@example.com" autocomplete="email" required>{% for error in form.email.errors %}<p class="auth-error">{{ error }}</p>{% endfor %}</div>
<div class="auth-field"><label for="id_password1">Password</label><input id="id_password1" type="password" name="password1" placeholder="Create a secure password" autocomplete="new-password" required>{% for error in form.password1.errors %}<p class="auth-error">{{ error }}</p>{% endfor %}</div>
<div class="auth-field"><label for="id_password2">Confirm password</label><input id="id_password2" type="password" name="password2" placeholder="Repeat your password" autocomplete="new-password" required>{% for error in form.password2.errors %}<p class="auth-error">{{ error }}</p>{% endfor %}</div>
<button class="auth-submit" type="submit">Create Account</button></form><p class="auth-card__switch">Already have an account? <a href="{% url 'account_login' %}">Sign in</a></p></div></section>
{% include "components/footer.html" %}
{% endblock %}
+3
View File
@@ -0,0 +1,3 @@
{% extends "base.html" %}
{% block title %}Verify Your Email | Testpoint{% endblock %}
{% block content %}<section class="auth-page"><div class="auth-card auth-card--compact"><div class="auth-card__header"><span class="auth-card__icon"><i class="bi bi-envelope-check"></i></span><h1>Check your email</h1><p>We sent you a verification link. Open it to activate your Testpoint account.</p></div><div class="auth-alert auth-alert--info">If it is not in your inbox, check your spam folder and confirm that you entered the correct address.</div><p class="auth-card__switch"><a href="{% url 'account_login' %}">Return to sign in</a></p></div></section>{% include "components/footer.html" %}{% endblock %}