2
2
import mimetypes
3
3
import os
4
4
from itertools import chain
5
+ from typing import List
5
6
from zipfile import BadZipfile , ZipFile
6
7
7
8
from django .conf import settings
@@ -44,7 +45,19 @@ class ProblemDataForm(ModelForm):
44
45
def clean_zipfile (self ):
45
46
if hasattr (self , 'zip_valid' ) and not self .zip_valid :
46
47
raise ValidationError (_ ('Your zip file is invalid!' ))
47
- return self .cleaned_data ['zipfile' ]
48
+
49
+ zipfile = self .cleaned_data ['zipfile' ]
50
+ if zipfile and not zipfile .name .endswith ('.zip' ):
51
+ raise ValidationError (_ ("Zip files must end in '.zip'" ))
52
+
53
+ return zipfile
54
+
55
+ def clean_generator (self ):
56
+ generator = self .cleaned_data ['generator' ]
57
+ if generator and generator .name == 'init.yml' :
58
+ raise ValidationError (_ ('Generators must not be named init.yml.' ))
59
+
60
+ return generator
48
61
49
62
clean_checker_args = checker_args_cleaner
50
63
@@ -62,10 +75,11 @@ class ProblemCaseForm(ModelForm):
62
75
63
76
class Meta :
64
77
model = ProblemTestCase
65
- fields = ('order' , 'type' , 'input_file' , 'output_file' , 'points' ,
66
- 'is_pretest' , 'output_limit' , ' output_prefix' , 'checker' , 'checker_args' , 'generator_args' )
78
+ fields = ('order' , 'type' , 'input_file' , 'output_file' , 'points' , 'is_pretest' , 'output_limit' ,
79
+ 'output_prefix' , 'checker' , 'checker_args' , 'generator_args' , 'batch_dependencies ' )
67
80
widgets = {
68
81
'generator_args' : HiddenInput ,
82
+ 'batch_dependencies' : HiddenInput ,
69
83
'type' : Select (attrs = {'style' : 'width: 100%' }),
70
84
'points' : NumberInput (attrs = {'style' : 'width: 4em' }),
71
85
'output_prefix' : NumberInput (attrs = {'style' : 'width: 4.5em' }),
@@ -157,7 +171,7 @@ def get_case_formset(self, files, post=False):
157
171
return ProblemCaseFormSet (data = self .request .POST if post else None , prefix = 'cases' , valid_files = files ,
158
172
queryset = ProblemTestCase .objects .filter (dataset_id = self .object .pk ).order_by ('order' ))
159
173
160
- def get_valid_files (self , data , post = False ):
174
+ def get_valid_files (self , data , post = False ) -> List [ str ] :
161
175
try :
162
176
if post and 'problem-data-zipfile-clear' in self .request .POST :
163
177
return []
@@ -166,26 +180,35 @@ def get_valid_files(self, data, post=False):
166
180
elif data .zipfile :
167
181
return ZipFile (data .zipfile .path ).namelist ()
168
182
except BadZipfile :
169
- return []
183
+ raise
170
184
return []
171
185
172
186
def get_context_data (self , ** kwargs ):
173
187
context = super (ProblemDataView , self ).get_context_data (** kwargs )
188
+ valid_files = []
174
189
if 'data_form' not in context :
175
190
context ['data_form' ] = self .get_data_form ()
176
- valid_files = context ['valid_files' ] = self .get_valid_files (context ['data_form' ].instance )
177
- context ['data_form' ].zip_valid = valid_files is not False
178
- context ['cases_formset' ] = self .get_case_formset (valid_files )
179
- context ['valid_files_json' ] = mark_safe (json .dumps (context ['valid_files' ]))
180
- context ['valid_files' ] = set (context ['valid_files' ])
191
+ try :
192
+ valid_files = self .get_valid_files (context ['data_form' ].instance )
193
+ except BadZipfile :
194
+ pass
195
+ context ['valid_files' ] = set (valid_files )
196
+ context ['valid_files_json' ] = mark_safe (json .dumps (valid_files ))
197
+
198
+ context ['cases_formset' ] = self .get_case_formset (valid_files )
181
199
context ['all_case_forms' ] = chain (context ['cases_formset' ], [context ['cases_formset' ].empty_form ])
182
200
return context
183
201
184
202
def post (self , request , * args , ** kwargs ):
185
203
self .object = problem = self .get_object ()
186
204
data_form = self .get_data_form (post = True )
187
- valid_files = self .get_valid_files (data_form .instance , post = True )
188
- data_form .zip_valid = valid_files is not False
205
+ try :
206
+ valid_files = self .get_valid_files (data_form .instance , post = True )
207
+ data_form .zip_valid = True
208
+ except BadZipfile :
209
+ valid_files = []
210
+ data_form .zip_valid = False
211
+
189
212
cases_formset = self .get_case_formset (valid_files , post = True )
190
213
if data_form .is_valid () and cases_formset .is_valid ():
191
214
data = data_form .save ()
0 commit comments