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,32 +61,48 @@ 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
+ if ($ formUpload ->isSubmitted () && $ formUpload ->isValid ()) {
71
77
if ($ contest === null ) {
72
78
$ this ->addFlash ('danger ' , 'No active contest ' );
73
79
} elseif (!$ this ->dj ->checkrole ('jury ' ) && !$ contest ->getFreezeData ()->started ()) {
74
80
$ this ->addFlash ('danger ' , 'Contest has not yet started ' );
75
81
} else {
76
82
/** @var Problem $problem */
77
- $ problem = $ form ->get ('problem ' )->getData ();
83
+ $ problem = $ formUpload ->get ('problem ' )->getData ();
78
84
/** @var Language $language */
79
- $ language = $ form ->get ('language ' )->getData ();
85
+ $ language = $ formUpload ->get ('language ' )->getData ();
80
86
/** @var UploadedFile[] $files */
81
- $ files = $ form ->get ('code ' )->getData ();
87
+ $ files = $ formUpload ->get ('code ' )->getData ();
82
88
if (!is_array ($ files )) {
83
89
$ files = [$ files ];
84
90
}
85
- $ entryPoint = $ form ->get ('entry_point ' )->getData () ?: null ;
91
+ $ entryPoint = $ formUpload ->get ('entry_point ' )->getData () ?: null ;
86
92
$ 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
89
106
);
90
107
91
108
if ($ submission ) {
@@ -96,11 +113,77 @@ public function createAction(Request $request, ?Problem $problem = null): Respon
96
113
} else {
97
114
$ this ->addFlash ('danger ' , $ message );
98
115
}
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
+
99
177
return $ this ->redirectToRoute ('team_index ' );
100
178
}
101
179
}
102
180
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
+ ];
104
187
$ data ['validFilenameRegex ' ] = SubmissionService::FILENAME_REGEX ;
105
188
106
189
if ($ request ->isXmlHttpRequest ()) {
0 commit comments