handling master file for application type jobs
[qcg-portal.git] / qcg / templates / qcg / job_submit.html
1 {% extends 'qcg/base.html' %}
2 {% load staticfiles bootstrap3 qcg_utils %}
3
4 {% block extra_css %}
5     <link href="{% static 'qcg/selectize/selectize.bootstrap3.css' %}" rel="stylesheet">
6 {% endblock %}
7
8 {% block extra_js %}
9     <script src="{% static 'qcg/selectize/selectize.min.js' %}"></script>
10     <script src="{% static 'qcg/formset/jquery.formset.js' %}"></script>
11
12     {% include 'filex/source.js.html' %}
13
14     <script>
15         var filex = filex || {};
16
17         $(function () {
18             'use strict';
19
20             var gridftpButton = $('<button/>', {
21                 'type': 'button',
22                 'class': 'btn btn-default pull-right',
23                 'text': 'Wybierz',
24                 'data-toggle': 'modal',
25                 'data-target': '#gridftp'
26             });
27
28             function fullPath(path, file) {
29                 var res = path + file.get('name');
30
31                 if (file.isDir())
32                     res += '/';
33
34                 return res;
35             }
36
37             $('#id_master_file,#id_executable,#id_input,#id_preprocess_script,#id_postprocess_script').before(function() {
38                 var target = this;
39                 return gridftpButton.clone().click(function() {
40                     $('#select-btn').off().click(function() {
41                         var selected = filex.selectedFiles();
42
43                         if (selected.length != 1 || !selected[0].isFile()) {
44                             alert('Wybierz dokładnie jeden plik.');
45                             return;
46                         }
47
48                         var file = fullPath(filex.host + '/' + filex.path.full() + '/', selected[0]);
49
50                         target.selectize.clear();
51                         target.selectize.addOption({value: file, text: file});
52                         target.selectize.addItem(file);
53                         target.selectize.refreshItems();
54
55                         $('#gridftp').modal('hide');
56                         filex.clearSelection();
57                     });
58                 });
59             }).wrap('<div style="margin-right: 80px"></div>');
60
61             $('#id_stage_in').before(function() {
62                 var target = this;
63                 return gridftpButton.clone().click(function() {
64                     $('#select-btn').off().click(function() {
65                         var path = filex.host + '/' + filex.path.full() + '/';
66
67                         _.each(filex.selectedFiles(), function(item) {
68                             var file = fullPath(path, item);
69                             target.selectize.addOption({value: file, text: file});
70                             target.selectize.addItem(file);
71                         });
72                         target.selectize.refreshItems();
73
74                         $('#gridftp').modal('hide');
75                         filex.clearSelection();
76                     });
77                 });
78             }).wrap('<div style="margin-right: 80px"></div>');
79
80             $('#id_application').selectize();
81             $('#id_arguments,#id_properties,#id_native').selectize({
82                 plugins: ['remove_button'],
83                 create: true,
84                 render: {
85                     option_create: function(data, escape) {
86                         return '<div class="create">Dodaj <strong>' + escape(data.input) + '</strong>&hellip;</div>';
87                     }
88                 }
89             });
90             $('#id_queue').selectize({
91                 create: true,
92                 render: {
93                     option_create: function(data, escape) {
94                         return '<div class="create">Wybierz <strong>' + escape(data.input) + '</strong>&hellip;</div>';
95                     }
96                 }
97             });
98             $('#id_modules,#id_hosts,#id_master_file,#id_executable,#id_input,#id_stage_in,#id_preprocess_script,#id_postprocess_script').selectize({
99                 plugins: ['remove_button']
100             });
101
102             // hide delete checkbox in empty env form
103             $('#env-form-empty').find('div.form-group:last-of-type').hide();
104             $('#env-controls').find('> div').formset({
105                 formTemplate: '#env-form-empty',
106                 parent: '#env-controls',
107                 addLinkParent: '#add-env-form',
108                 addText: 'dodaj »',
109                 addCssClass: 'add-btn',
110                 deleteText: 'Usuń',
111                 deleteCssClass: 'delete-btn btn btn-xs btn-danger'
112             });
113
114             $('input[name="notify_type"],input[name="watch_output_type"],input[name="preprocess_type"],input[name="postprocess_type"]').on('change', function () {
115                 $(this).tab('show');
116             }).each(function() {
117                 $(this).parent().toggleClass('active', this.checked);
118
119                 if (this.checked)
120                     $(this).tab('show');
121             });
122
123             $('#toggle-advanced').click(function(e) {
124                 e.preventDefault();
125                 $('form .collapse').collapse('toggle');
126                 $(this).find('span').text(this.text == "Pokaż zaawansowane" ? "Ukryj zaawansowane" : "Pokaż zaawansowane");
127             });
128
129             $('#gridftp').one('show.bs.modal', function() {
130                 filex.initialLoad();
131             });
132         });
133     </script>
134 {% endblock %}
135
136 {% block container %}
137     <h1 class="page-header">{% block title %}Zleć zadanie{% endblock %}</h1>
138
139     {% if errors %}
140         <div class="alert alert-danger">
141             <strong>Uwaga!</strong> Formularz zawiera błędy.
142             {{ form.non_field_errors }}
143             {{ env_formset.non_field_errors }}
144         </div>
145     {% endif %}
146
147     <form action="." method="post" class="form-horizontal">
148         {% csrf_token %}
149
150         <!-- Nav tabs -->
151         <ul class="nav nav-tabs" style="margin-bottom: 20px">
152             <li role="presentation" class="active"><a href="#basic" data-toggle="tab">Podstawowe</a></li>
153             <li role="presentation"><a href="#resources" data-toggle="tab">Zasoby</a></li>
154             <li role="presentation"><a href="#files" data-toggle="tab">Pliki</a></li>
155             <li role="presentation"><a href="#environment" data-toggle="tab">Środowisko</a></li>
156             <li role="presentation"><a href="#monitoring" data-toggle="tab">Powiadomienia</a></li>
157             <li role="presentation"><a href="#other" data-toggle="tab">Inne</a></li>
158         </ul>
159
160         <div class="tab-content">
161             <fieldset id="basic" class="tab-pane active" role="tabpanel">
162                 {% bootstrap_field form.application layout="horizontal" %}
163                 {% bootstrap_field form.master_file layout="horizontal" %}
164                 {% bootstrap_field form.executable layout="horizontal" form_group_class="form-group collapse" %}
165                 {% bootstrap_field form.script layout="horizontal" form_group_class="form-group collapse" %}
166                 {% bootstrap_field form.arguments layout="horizontal" %}
167                 {% bootstrap_field form.note layout="horizontal" %}
168                 {% bootstrap_field form.grant layout="horizontal" form_group_class="form-group collapse" %}
169             </fieldset>
170
171             <fieldset id="resources" class="tab-pane" role="tabpanel">
172                 {% bootstrap_field form.hosts layout="horizontal" %}
173                 {% bootstrap_field form.queue layout="horizontal" %}
174                 {% bootstrap_field form.properties layout="horizontal" form_group_class="form-group collapse" %}
175                 {% bootstrap_field form.modules layout="horizontal" form_group_class="form-group collapse" %}
176                 {% bootstrap_field form.procs layout="horizontal" %}
177                 {% bootstrap_field form.nodes layout="horizontal" form_group_class="form-group collapse" %}
178                 {% bootstrap_field form.wall_time layout="horizontal" form_group_class="form-group timerange" %}
179                 {% bootstrap_field form.memory layout="horizontal" form_group_class="form-group collapse" %}
180                 {% bootstrap_field form.memory_per_slot layout="horizontal" form_group_class="form-group collapse" %}
181                 {% bootstrap_field form.reservation layout="horizontal" form_group_class="form-group collapse" %}
182             </fieldset>
183
184             <fieldset id="files" class="tab-pane" role="tabpanel">
185                 {% bootstrap_field form.input layout="horizontal" %}
186                 {% bootstrap_field form.stage_in layout="horizontal" %}
187 {#                {% bootstrap_field form.stage_out layout="horizontal" form_group_class="form-group collapse" %}#}
188             </fieldset>
189
190             <fieldset id="environment" class="tab-pane" role="tabpanel">
191                 {{ env_formset.management_form }}
192
193                 <div class="form-group">
194                     <label class="col-sm-3 col-md-4 control-label">Zmienne środowiskowe</label>
195                     <div class="col-sm-9 col-md-6">
196                         <div id="env-controls">
197                             {% for env_form in env_formset %}
198                                 <div>{% bootstrap_form env_form layout='inline' %}</div>
199                             {% endfor %}
200                         </div>
201                         <div id="add-env-form"></div>
202                         <div id="env-form-empty" style="display: none">
203                             {% bootstrap_form env_formset.empty_form layout='inline' %}
204                         </div>
205                     </div>
206                 </div>
207             </fieldset>
208
209             <fieldset id="monitoring" class="tab-pane" role="tabpanel">
210                 {% bootstrap_checkbox form.monitoring %}
211
212                 <div class="form-group">
213                     <label class="col-sm-3 col-md-4 control-label">Monitorowanie stanu</label>
214                     <div class="col-sm-9 col-md-6">
215                         <div class="btn-group" data-toggle="buttons">
216                             {% for option in form.notify_type %}
217                                 <label class="btn btn-default">
218                                     <input type="radio" autocomplete="off" name="{{ option.name }}" value="{{ option.choice_value }}"
219                                             {% if option.is_checked %}checked{% endif %}
220                                             data-target=".notify-type-{{ forloop.counter0 }}"> {{ option.choice_label }}
221                                 </label>
222                             {% endfor %}
223                         </div>
224                     </div>
225                 </div>
226
227                 <div class="tab-content">
228                     <div class="tab-pane notify-type-0"></div>
229
230                     <div class="tab-pane notify-type-1 notify-type-2" style="margin-top: 15px">
231                         {% bootstrap_field form.notify_address layout="horizontal" %}
232                     </div>
233                 </div>
234
235                 <div class="collapse">
236                     <div class="form-group">
237                         <label class="col-sm-3 col-md-4 control-label">Monitorowanie wyjścia</label>
238                         <div class="col-sm-9 col-md-6">
239                             <div class="btn-group" data-toggle="buttons">
240                                 {% for option in form.watch_output_type %}
241                                     <label class="btn btn-default">
242                                         <input type="radio" autocomplete="off" name="{{ option.name }}" value="{{ option.choice_value }}"
243                                                 {% if option.is_checked %}checked{% endif %}
244                                                 data-target=".watch-output-type-{{ forloop.counter0 }}"> {{ option.choice_label }}
245                                     </label>
246                                 {% endfor %}
247                             </div>
248                         </div>
249                     </div>
250
251                     <div class="tab-content">
252                         <div class="tab-pane watch-output-type-0"></div>
253
254                         <div class="tab-pane watch-output-type-1 watch-output-type-2" style="margin-top: 15px">
255                             {% bootstrap_field form.watch_output_address layout="horizontal" %}
256                             {% bootstrap_field form.watch_output_pattern layout="horizontal" %}
257                         </div>
258                     </div>
259                 </div>
260             </fieldset>
261
262             <fieldset id="other" class="tab-pane" role="tabpanel">
263                 <div class="form-group">
264                     <label class="col-sm-3 col-md-4 control-label">Preprocessing</label>
265                     <div class="col-sm-9 col-md-6">
266                         <div class="btn-group" data-toggle="buttons">
267                             {% for option in form.preprocess_type %}
268                                 <label class="btn btn-default">
269                                     <input type="radio" autocomplete="off" name="{{ option.name }}" value="{{ option.choice_value }}"
270                                             {% if option.is_checked %}checked{% endif %}
271                                             data-target=".preprocess-type-{{ forloop.counter0 }}"> {{ option.choice_label }}
272                                 </label>
273                             {% endfor %}
274                         </div>
275                     </div>
276                 </div>
277
278                 <div class="tab-content">
279                     <div class="tab-pane preprocess-type-0"></div>
280
281                     <div class="tab-pane preprocess-type-1" style="margin-top: 15px">
282                         {% bootstrap_field form.preprocess_cmd layout="horizontal" %}
283                     </div>
284
285                     <div class="tab-pane preprocess-type-2" style="margin-top: 15px">
286                         {% bootstrap_field form.preprocess_script layout="horizontal" %}
287                     </div>
288                 </div>
289
290                 <div class="form-group">
291                     <label class="col-sm-3 col-md-4 control-label">Postprocessing</label>
292                     <div class="col-sm-9 col-md-6">
293                         <div class="btn-group" data-toggle="buttons">
294                             {% for option in form.postprocess_type %}
295                                 <label class="btn btn-default">
296                                     <input type="radio" autocomplete="off" name="{{ option.name }}" value="{{ option.choice_value }}"
297                                             {% if option.is_checked %}checked{% endif %}
298                                             data-target=".postprocess-type-{{ forloop.counter0 }}"> {{ option.choice_label }}
299                                 </label>
300                             {% endfor %}
301                         </div>
302                     </div>
303                 </div>
304
305                 <div class="tab-content">
306                     <div class="tab-pane postprocess-type-0"></div>
307
308                     <div class="tab-pane postprocess-type-1" style="margin-top: 15px">
309                         {% bootstrap_field form.postprocess_cmd layout="horizontal" %}
310                     </div>
311
312                     <div class="tab-pane postprocess-type-2" style="margin-top: 15px">
313                         {% bootstrap_field form.postprocess_script layout="horizontal" %}
314                     </div>
315                 </div>
316
317                 {% bootstrap_field form.native layout="horizontal" %}
318                 {% bootstrap_checkbox form.persistent %}
319             </fieldset>
320         </div>
321
322         <hr>
323
324         <div class="row">
325             <div class="col-sm-offset-3 col-md-offset-4 col-sm-9 col-md-6">
326                 <button type="submit" class="btn btn-primary">Zleć zadanie</button>
327                 <button type="reset" class="btn btn-warning">Resetuj</button>
328                 <a id="toggle-advanced" href="#"><span class="text-muted">Pokaż zaawansowane</span></a>
329             </div>
330         </div>
331     </form>
332
333     <div id="gridftp" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="modal-label" aria-hidden="true">
334         <div class="modal-dialog modal-lg">
335             <div class="modal-content">
336                 <div class="modal-header">
337                     <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
338                     <h4 class="modal-title" id="modal-label">Wybierz plik</h4>
339                 </div>
340                 <div class="modal-body">
341                     {% include 'filex/source.html' %}
342                 </div>
343                 <div class="modal-footer">
344                     <button type="button" class="btn btn-default" data-dismiss="modal">Anuluj</button>
345                     <button id="select-btn" type="button" class="btn btn-primary">Wybierz</button>
346                 </div>
347             </div>
348         </div>
349     </div>
350
351 {% endblock %}