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