fromdjangoimportformsfromdjango.core.exceptionsimportValidationErrorfromcollege.modelsimportApplication,AcademicRecord,TestScorefromdjango.utils.translationimportgettext_lazyas_fromdjango.dbimporttransactionfromdjango.core.files.storageimportdefault_storageclassCollegeApplicationForm(forms.ModelForm):classMeta:model=Applicationfields=['first_name', 'last_name', 'email', 'phone_number', 'address', 'birthdate', 'intended_major']widgets={
'birthdate':forms.DateInput(attrs={'type': 'date'}),}gpa=forms.DecimalField(max_digits=4,decimal_places=2,min_value=0.0,max_value=4.0,label="GPA")sat_score=forms.IntegerField(min_value=400,max_value=1600,required=False,label="SATScore")act_score=forms.IntegerField(min_value=1,max_value=36,required=False,label="ACTScore")transcript=forms.FileField(required=True,label="Transcript")defclean_email(self):email=self.cleaned_data['email']ifApplication.objects.filter(email=email).exists():raiseValidationError(_('Anapplicationwiththisemailalreadyexists.'))returnemaildefclean(self):cleaned_data=super().clean()sat_score=cleaned_data.get('sat_score')act_score=cleaned_data.get('act_score')ifnotsat_scoreandnotact_score:raiseValidationError(_('Atleastonetestscore(SATorACT)isrequired.'))returncleaned_datadefsave(self,commit=True):try:withtransaction.atomic():application=super().save(commit=False)application.save()# Save the application firstAcademicRecord.objects.create(application=application,gpa=self.cleaned_data['gpa'],transcript=self.cleaned_data['transcript'])ifself.cleaned_data.get('sat_score'):TestScore.objects.create(application=application,test_type='SAT',score=self.cleaned_data['sat_score'])ifself.cleaned_data.get('act_score'):TestScore.objects.create(application=application,test_type='ACT',score=self.cleaned_data['act_score'])returnapplicationexceptExceptionase:# Handle exceptions appropriately, log the error, and potentially raise a more user-friendly exception.print(f"Errorsavingapplication:{e}")# Replace with proper loggingraiseValidationError(_("Anerroroccurredwhilesavingyourapplication.Pleasetryagainlater."))