11import json
22
3+ from django import forms
4+ import django .contrib .auth
5+ from django .contrib .auth .forms import UserChangeForm
6+ from django .core .exceptions import ValidationError
7+ from django .utils .translation import gettext_lazy as _
8+
39from ctfhub .models import (
410 Challenge ,
511 ChallengeCategory ,
915 Tag ,
1016 Team ,
1117)
12- from django import forms
13- from django .contrib .auth .forms import UserChangeForm
14- from django .contrib .auth .models import User
15- from django .core .exceptions import ValidationError
1618
1719
1820class UserUpdateForm (UserChangeForm ):
1921 class Meta :
20- model = User
22+ model = django . contrib . auth . get_user_model ()
2123 fields = [
2224 "username" ,
2325 "email" ,
@@ -93,7 +95,7 @@ def clean(self):
9395 and not self .cleaned_data ["selected_ctf" ]
9496 ):
9597 raise ValidationError ("Guests MUST have a selected_ctf" )
96- return super (MemberUpdateForm , self ).clean ()
98+ return super ().clean ()
9799
98100
99101class CtfCreateUpdateForm (forms .ModelForm ):
@@ -160,29 +162,37 @@ class ChallengeImportForm(forms.Form):
160162 ("rCTF" , "rCTF" ),
161163 )
162164 format = forms .ChoiceField (choices = FORMAT_CHOICES , initial = "CTFd" )
163- data = forms .CharField (widget = forms .Textarea )
165+ data = forms .CharField (widget = forms .Textarea ) # type: ignore ## See https://docs.djangoproject.com/en/4.2/ref/forms/widgets/#specifying-widgets
164166
165167 def clean_data (self ):
166168 data = self .cleaned_data ["data" ]
167169
168170 # Choose the cleaning method based on the format field.
169- if self .cleaned_data ["format" ] == "RAW" :
170- return self ._clean_raw_data (data )
171- elif self .cleaned_data ["format" ] == "CTFd" :
172- return self ._clean_ctfd_data (data )
173- elif self .cleaned_data ["format" ] == "rCTF" :
174- return self ._clean_rctf_data (data )
175- else :
176- raise forms .ValidationError ("Invalid data format." )
171+ if not self .cleaned_data ["format" ] in ("RAW" , "CTFd" , "rCTF" ):
172+ raise forms .ValidationError (
173+ _ ("Invalid data format: must be in %(formats)s" ),
174+ params = {"formats" : str ([x [0 ] for x in self .FORMAT_CHOICES ])},
175+ )
176+
177+ match self .cleaned_data ["format" ]:
178+ case "RAW" :
179+ return self ._clean_raw_data (data )
180+ case "CTFd" :
181+ return self ._clean_ctfd_data (data )
182+ case "rCTF" :
183+ return self ._clean_rctf_data (data )
177184
178185 @staticmethod
179186 def _clean_raw_data (data ):
180- challenges = []
181- for line in data .splitlines ():
187+ challenges : list [ dict [ str , str ]] = []
188+ for num , line in enumerate ( data .splitlines () ):
182189 parts = line .split ("|" )
183190 if len (parts ) != 2 :
184191 raise forms .ValidationError (
185- "RAW data line does not have exactly two parts."
192+ _ (
193+ "RAW must respect a two-part format with | as separator: line %(linum)s - %(data)s"
194+ ),
195+ params = {"linum" : str (num + 1 ), "data" : line },
186196 )
187197 challenges .append (
188198 {
@@ -200,10 +210,10 @@ def _clean_ctfd_data(data):
200210 raise ValidationError (
201211 "Invalid JSON format. Please provide valid CTFd JSON data."
202212 )
203- except json .JSONDecodeError :
213+ except json .JSONDecodeError as exc :
204214 raise ValidationError (
205215 "Invalid JSON format. Please provide valid CTFd JSON data."
206- )
216+ ) from exc
207217
208218 return json_data ["data" ]
209219
@@ -215,10 +225,10 @@ def _clean_rctf_data(data):
215225 raise ValidationError (
216226 "Invalid JSON format. Please provide valid rCTF JSON data."
217227 )
218- except json .JSONDecodeError :
228+ except json .JSONDecodeError as exc :
219229 raise ValidationError (
220230 "Invalid JSON format. Please provide valid rCTF JSON data."
221- )
231+ ) from exc
222232
223233 return json_data ["data" ]
224234
0 commit comments