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,32 +61,48 @@ 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+ if ($ formUpload ->isSubmitted () && $ formUpload ->isValid ()) {
7177 if ($ contest === null ) {
7278 $ this ->addFlash ('danger ' , 'No active contest ' );
7379 } elseif (!$ this ->dj ->checkrole ('jury ' ) && !$ contest ->getFreezeData ()->started ()) {
7480 $ this ->addFlash ('danger ' , 'Contest has not yet started ' );
7581 } else {
7682 /** @var Problem $problem */
77- $ problem = $ form ->get ('problem ' )->getData ();
83+ $ problem = $ formUpload ->get ('problem ' )->getData ();
7884 /** @var Language $language */
79- $ language = $ form ->get ('language ' )->getData ();
85+ $ language = $ formUpload ->get ('language ' )->getData ();
8086 /** @var UploadedFile[] $files */
81- $ files = $ form ->get ('code ' )->getData ();
87+ $ files = $ formUpload ->get ('code ' )->getData ();
8288 if (!is_array ($ files )) {
8389 $ files = [$ files ];
8490 }
85- $ entryPoint = $ form ->get ('entry_point ' )->getData () ?: null ;
91+ $ entryPoint = $ formUpload ->get ('entry_point ' )->getData () ?: null ;
8692 $ submission = $ this ->submissionService ->submitSolution (
87- $ team , $ this ->dj ->getUser (), $ problem ->getProbid (), $ contest , $ language , $ files , 'team page ' , null ,
88- null , $ entryPoint , null , null , $ message
93+ $ team ,
94+ $ this ->dj ->getUser (),
95+ $ problem ->getProbid (),
96+ $ contest ,
97+ $ language ,
98+ $ files ,
99+ 'team page ' ,
100+ null ,
101+ null ,
102+ $ entryPoint ,
103+ null ,
104+ null ,
105+ $ message
89106 );
90107
91108 if ($ submission ) {
@@ -96,11 +113,77 @@ public function createAction(Request $request, ?Problem $problem = null): Respon
96113 } else {
97114 $ this ->addFlash ('danger ' , $ message );
98115 }
116+ return $ this ->redirectToRoute ('team_index ' );
117+ }
118+ } elseif ($ formPaste ->isSubmitted () && $ formPaste ->isValid ()) {
119+ if ($ contest === null ) {
120+ $ this ->addFlash ('danger ' , 'No active contest ' );
121+ } elseif (!$ this ->dj ->checkrole ('jury ' ) && !$ contest ->getFreezeData ()->started ()) {
122+ $ this ->addFlash ('danger ' , 'Contest has not yet started ' );
123+ } else {
124+ $ problem = $ formPaste ->get ('problem ' )->getData ();
125+ $ language = $ formPaste ->get ('language ' )->getData ();
126+ $ codeContent = $ formPaste ->get ('code_content ' )->getData ();
127+ if ($ codeContent == null || empty (trim ($ codeContent ))) {
128+ $ this ->addFlash ('danger ' ,'No code content provided. ' );
129+ return $ this ->redirectToRoute ('team_index ' );
130+ }
131+ $ tempDir = sys_get_temp_dir ();
132+ $ tempFileName = sprintf (
133+ 'submission_%s_%s_%s.%s ' ,
134+ $ user ->getUsername (),
135+ $ problem ->getName (),
136+ date ('Y-m-d_H-i-s ' ),
137+ $ language ->getExtensions ()[0 ]
138+ );
139+ $ tempFileName = preg_replace ('/[^a-zA-Z0-9_.-]/ ' , '_ ' , $ tempFileName );
140+ $ tempFilePath = $ tempDir . DIRECTORY_SEPARATOR . $ tempFileName ;
141+ file_put_contents ($ tempFilePath , $ codeContent );
142+
143+ $ uploadedFile = new UploadedFile (
144+ $ tempFilePath ,
145+ $ tempFileName ,
146+ 'application/octet-stream ' ,
147+ null ,
148+ true
149+ );
150+
151+ $ files = [$ uploadedFile ];
152+ $ entryPoint = $ tempFileName ;
153+ $ submission = $ this ->submissionService ->submitSolution (
154+ $ team ,
155+ $ this ->dj ->getUser (),
156+ $ problem ,
157+ $ contest ,
158+ $ language ,
159+ $ files ,
160+ 'team page ' ,
161+ null ,
162+ null ,
163+ $ entryPoint ,
164+ null ,
165+ null ,
166+ $ message
167+ );
168+ if ($ submission ) {
169+ $ this ->addFlash (
170+ 'success ' ,
171+ 'Submission done! Watch for the verdict in the list below. '
172+ );
173+ } else {
174+ $ this ->addFlash ('danger ' , $ message );
175+ }
176+
99177 return $ this ->redirectToRoute ('team_index ' );
100178 }
101179 }
102180
103- $ data = ['form ' => $ form ->createView (), 'problem ' => $ problem ];
181+ $ data = [
182+ 'formupload ' => $ formUpload ->createView (),
183+ 'formpaste ' => $ formPaste ->createView (),
184+ 'problem ' => $ problem ,
185+ 'defaultSubmissionCodeMode ' => (bool ) $ this ->config ->get ('default_submission_code_mode ' ),
186+ ];
104187 $ data ['validFilenameRegex ' ] = SubmissionService::FILENAME_REGEX ;
105188
106189 if ($ request ->isXmlHttpRequest ()) {
0 commit comments