99use App \Entity \Submission ;
1010use App \Entity \Testcase ;
1111use App \Form \Type \SubmitProblemType ;
12+ use App \Form \Type \SubmitProblemPasteType ;
1213use App \Service \ConfigurationService ;
1314use App \Service \DOMJudgeService ;
1415use App \Service \EventLogService ;
@@ -60,34 +61,111 @@ public function createAction(Request $request, ?Problem $problem = null): Respon
6061 if ($ problem !== null ) {
6162 $ data ['problem ' ] = $ problem ;
6263 }
63- $ form = $ this ->formFactory
64+ $ formUpload = $ this ->formFactory
6465 ->createBuilder (SubmitProblemType::class, $ data )
6566 ->setAction ($ this ->generateUrl ('team_submit ' ))
6667 ->getForm ();
6768
68- $ form ->handleRequest ($ request );
69+ $ formPaste = $ this ->formFactory
70+ ->createBuilder (SubmitProblemPasteType::class, $ data )
71+ ->setAction ($ this ->generateUrl ('team_submit ' ))
72+ ->getForm ();
6973
70- if ($ form ->isSubmitted () && $ form ->isValid ()) {
74+ $ formUpload ->handleRequest ($ request );
75+ $ formPaste ->handleRequest ($ request );
76+
77+ if ($ formUpload ->isSubmitted () && $ formUpload ->isValid ()) {
7178 if ($ contest === null ) {
7279 $ this ->addFlash ('danger ' , 'No active contest ' );
7380 } elseif (!$ this ->dj ->checkrole ('jury ' ) && !$ contest ->getFreezeData ()->started ()) {
7481 $ this ->addFlash ('danger ' , 'Contest has not yet started ' );
7582 } else {
7683 /** @var Problem $problem */
77- $ problem = $ form ->get ('problem ' )->getData ();
84+ $ problem = $ formUpload ->get ('problem ' )->getData ();
7885 /** @var Language $language */
79- $ language = $ form ->get ('language ' )->getData ();
86+ $ language = $ formUpload ->get ('language ' )->getData ();
8087 /** @var UploadedFile[] $files */
81- $ files = $ form ->get ('code ' )->getData ();
88+ $ files = $ formUpload ->get ('code ' )->getData ();
8289 if (!is_array ($ files )) {
8390 $ files = [$ files ];
8491 }
85- $ entryPoint = $ form ->get ('entry_point ' )->getData () ?: null ;
92+ $ entryPoint = $ formUpload ->get ('entry_point ' )->getData () ?: null ;
8693 $ 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 ]
89139 );
140+ $ tempFileName = preg_replace ('/[^a-zA-Z0-9_.-]/ ' , '_ ' , $ tempFileName );
141+ $ tempFilePath = $ tempDir . DIRECTORY_SEPARATOR . $ tempFileName ;
142+ file_put_contents ($ tempFilePath , $ codeContent );
90143
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+ );
91169 if ($ submission ) {
92170 $ this ->addFlash (
93171 'success ' ,
@@ -96,11 +174,17 @@ public function createAction(Request $request, ?Problem $problem = null): Respon
96174 } else {
97175 $ this ->addFlash ('danger ' , $ message );
98176 }
177+
99178 return $ this ->redirectToRoute ('team_index ' );
100179 }
101180 }
102181
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+ ];
104188 $ data ['validFilenameRegex ' ] = SubmissionService::FILENAME_REGEX ;
105189
106190 if ($ request ->isXmlHttpRequest ()) {
0 commit comments