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
+65
View File
@@ -0,0 +1,65 @@
from decimal import Decimal
from django import forms
from django.db import transaction
from .models import StudentProfile
class StudentSettingsForm(forms.Form):
first_name = forms.CharField(max_length=150, required=False)
last_name = forms.CharField(max_length=150, required=False)
display_name = forms.CharField(
max_length=40,
required=False,
help_text="Shown on the public leaderboard instead of your full name.",
)
country = forms.CharField(max_length=80, required=False)
target_band = forms.DecimalField(
min_value=4,
max_value=9,
decimal_places=1,
widget=forms.NumberInput(attrs={"min": "4", "max": "9", "step": "0.5"}),
)
daily_goal = forms.IntegerField(min_value=10, max_value=300)
def __init__(self, *args, user, profile, **kwargs):
self.user = user
self.profile = profile
kwargs.setdefault(
"initial",
{
"first_name": user.first_name,
"last_name": user.last_name,
"display_name": profile.display_name,
"country": profile.country,
"target_band": profile.target_band,
"daily_goal": profile.daily_goal,
},
)
super().__init__(*args, **kwargs)
for field in self.fields.values():
field.widget.attrs["class"] = "settings-input"
def clean_target_band(self):
target_band = self.cleaned_data["target_band"]
if target_band % Decimal("0.5"):
raise forms.ValidationError(
"Choose an IELTS band score in 0.5 increments."
)
return target_band
@transaction.atomic
def save(self):
self.user.first_name = self.cleaned_data["first_name"].strip()
self.user.last_name = self.cleaned_data["last_name"].strip()
self.user.save(update_fields=["first_name", "last_name"])
self.profile.target_band = float(self.cleaned_data["target_band"])
self.profile.daily_goal = self.cleaned_data["daily_goal"]
self.profile.display_name = self.cleaned_data["display_name"].strip()
self.profile.country = self.cleaned_data["country"].strip()
self.profile.save(
update_fields=["target_band", "daily_goal", "display_name", "country"]
)
return self.user