9
9
use App \Entity \Submission ;
10
10
use App \Entity \Testcase ;
11
11
use App \Form \Type \SubmitProblemType ;
12
+ use App \Form \Type \SubmitProblemPasteType ;
12
13
use App \Service \ConfigurationService ;
13
14
use App \Service \DOMJudgeService ;
14
15
use App \Service \EventLogService ;
@@ -60,34 +61,111 @@ public function createAction(Request $request, ?Problem $problem = null): Respon
60
61
if ($ problem !== null ) {
61
62
$ data ['problem ' ] = $ problem ;
62
63
}
63
- $ form = $ this ->formFactory
64
+ $ formUpload = $ this ->formFactory
64
65
->createBuilder (SubmitProblemType::class, $ data )
65
66
->setAction ($ this ->generateUrl ('team_submit ' ))
66
67
->getForm ();
67
68
68
- $ form ->handleRequest ($ request );
69
+ $ formPaste = $ this ->formFactory
70
+ ->createBuilder (SubmitProblemPasteType::class, $ data )
71
+ ->setAction ($ this ->generateUrl ('team_submit ' ))
72
+ ->getForm ();
69
73
70
- if ($ form ->isSubmitted () && $ form ->isValid ()) {
74
+ $ formUpload ->handleRequest ($ request );
75
+ $ formPaste ->handleRequest ($ request );
76
+
77
+ if ($ formUpload ->isSubmitted () && $ formUpload ->isValid ()) {
71
78
if ($ contest === null ) {
72
79
$ this ->addFlash ('danger ' , 'No active contest ' );
73
80
} elseif (!$ this ->dj ->checkrole ('jury ' ) && !$ contest ->getFreezeData ()->started ()) {
74
81
$ this ->addFlash ('danger ' , 'Contest has not yet started ' );
75
82
} else {
76
83
/** @var Problem $problem */
77
- $ problem = $ form ->get ('problem ' )->getData ();
84
+ $ problem = $ formUpload ->get ('problem ' )->getData ();
78
85
/** @var Language $language */
79
- $ language = $ form ->get ('language ' )->getData ();
86
+ $ language = $ formUpload ->get ('language ' )->getData ();
80
87
/** @var UploadedFile[] $files */
81
- $ files = $ form ->get ('code ' )->getData ();
88
+ $ files = $ formUpload ->get ('code ' )->getData ();
82
89
if (!is_array ($ files )) {
83
90
$ files = [$ files ];
84
91
}
85
- $ entryPoint = $ form ->get ('entry_point ' )->getData () ?: null ;
92
+ $ entryPoint = $ formUpload ->get ('entry_point ' )->getData () ?: null ;
86
93
$ submission = $ this ->submissionService ->submitSolution (
87
- $ team , $ this ->dj ->getUser (), $ problem ->getProbid (), $ contest , $ language , $ files , 'team page ' , null ,
88
- null , $ entryPoint , null , null , $ message
94
+ $ team ,
95
+ $ this ->dj ->getUser (),
96
+ $ problem ->getProbid (),
97
+ $ contest ,
98
+ $ language ,
99
+ $ files ,
100
+ 'team page ' ,
101
+ null ,
102
+ null ,
103
+ $ entryPoint ,
104
+ null ,
105
+ null ,
106
+ $ message
107
+ );
108
+
109
+ if ($ submission ) {
110
+ $ this ->addFlash (
111
+ 'success ' ,
112
+ 'Submission done! Watch for the verdict in the list below. '
113
+ );
114
+ } else {
115
+ $ this ->addFlash ('danger ' , $ message );
116
+ }
117
+ return $ this ->redirectToRoute ('team_index ' );
118
+ }
119
+ } elseif ($ formPaste ->isSubmitted () && $ formPaste ->isValid ()) {
120
+ if ($ contest === null ) {
121
+ $ this ->addFlash ('danger ' , 'No active contest ' );
122
+ } elseif (!$ this ->dj ->checkrole ('jury ' ) && !$ contest ->getFreezeData ()->started ()) {
123
+ $ this ->addFlash ('danger ' , 'Contest has not yet started ' );
124
+ } else {
125
+ $ problem = $ formPaste ->get ('problem ' )->getData ();
126
+ $ language = $ formPaste ->get ('language ' )->getData ();
127
+ $ codeContent = $ formPaste ->get ('code_content ' )->getData ();
128
+ if ($ codeContent == null || empty (trim ($ codeContent ))) {
129
+ $ this ->addFlash ('danger ' ,'No code content provided. ' );
130
+ return $ this ->redirectToRoute ('team_index ' );
131
+ }
132
+ $ tempDir = sys_get_temp_dir ();
133
+ $ tempFileName = sprintf (
134
+ 'submission_%s_%s_%s.%s ' ,
135
+ $ user ->getUsername (),
136
+ $ problem ->getName (),
137
+ date ('Y-m-d_H-i-s ' ),
138
+ $ language ->getExtensions ()[0 ]
89
139
);
140
+ $ tempFileName = preg_replace ('/[^a-zA-Z0-9_.-]/ ' , '_ ' , $ tempFileName );
141
+ $ tempFilePath = $ tempDir . DIRECTORY_SEPARATOR . $ tempFileName ;
142
+ file_put_contents ($ tempFilePath , $ codeContent );
90
143
144
+ $ uploadedFile = new UploadedFile (
145
+ $ tempFilePath ,
146
+ $ tempFileName ,
147
+ 'application/octet-stream ' ,
148
+ null ,
149
+ true
150
+ );
151
+
152
+ $ files = [$ uploadedFile ];
153
+ $ entryPoint = $ formPaste ->get ('entry_point ' )->getData () ?: null ;
154
+ $ submission = $ this ->submissionService ->submitSolution (
155
+ $ team ,
156
+ $ this ->dj ->getUser (),
157
+ $ problem ,
158
+ $ contest ,
159
+ $ language ,
160
+ $ files ,
161
+ 'team page ' ,
162
+ null ,
163
+ null ,
164
+ $ entryPoint ,
165
+ null ,
166
+ null ,
167
+ $ message
168
+ );
91
169
if ($ submission ) {
92
170
$ this ->addFlash (
93
171
'success ' ,
@@ -96,11 +174,17 @@ public function createAction(Request $request, ?Problem $problem = null): Respon
96
174
} else {
97
175
$ this ->addFlash ('danger ' , $ message );
98
176
}
177
+
99
178
return $ this ->redirectToRoute ('team_index ' );
100
179
}
101
180
}
102
181
103
- $ data = ['form ' => $ form ->createView (), 'problem ' => $ problem ];
182
+ $ data = [
183
+ 'formupload ' => $ formUpload ->createView (),
184
+ 'formpaste ' => $ formPaste ->createView (),
185
+ 'problem ' => $ problem ,
186
+ 'defaultSubmissionCodeMode ' => (bool ) $ this ->config ->get ('default_submission_code_mode ' ),
187
+ ];
104
188
$ data ['validFilenameRegex ' ] = SubmissionService::FILENAME_REGEX ;
105
189
106
190
if ($ request ->isXmlHttpRequest ()) {
0 commit comments