12
<!--! iw:textarea: A textarea widget wrapper.
13
Generates a textarea in a div with a label. Define iw_prefix earlier
14
to automatically give a prefix to the name. -->
15
<div py:match="iw:textarea" py:with="name=((iw_prefix + '_') or '') + str(select('@name'))">
16
<label for="${name}">${select('@desc')}:</label>
17
<br py:if="defined('iw_label_linebreak') and iw_label_linebreak" />
18
<textarea id="${name}" cols="${select('@cols')}" rows="${select('@rows')}">${select('*|text()')}</textarea>
21
<div py:match="iw:text" py:with="name=((iw_prefix + '_') or '') + str(select('@name'))">
22
<label for="${name}">${select('@desc')}:</label>
23
<br py:if="defined('iw_label_linebreak') and iw_label_linebreak" />
24
<input type="text" id="${name}" value="${select('*|text()')}" />
27
<a py:match="iw:delete" href="javascript:${select('@action')}"><img title="Delete" alt="Delete" src="${mediapath}cross.png"/></a>
11
29
<h1>Edit Exercise - ${exercise.id}</h1>
12
30
<div id="ivle_padding">
13
31
<h3>Exercise Values:</h3>
14
<label for="exercise_id">Exercise Identifier:</label>
15
<input class="textinput" type="text" id="exercise_id" value="${exercise.id}" title="Exercise Identifier" />
17
<label for="exercise_name">Exercise Name:</label>
18
<input class="textinput" type='text' id='exercise_name' value="${exercise.name}" title="Exercise Name" />
20
<label for="exercise_num_rows">Number of Rows</label>
21
<input size="5" type="text" id="exercise_num_rows" value="${exercise.num_rows}" title="Number of Rows" />
23
<label for="exercise_desc">Exercise Description (in RST):</label><br />
24
<textarea cols="80" rows="10" id="exercise_desc" title="Exercise Description">${exercise.description}</textarea>
26
<label for="exercise_partial">Exercise Partial Solution (Python):</label><br />
27
<textarea cols="80" rows="5" id="exercise_partial" title="Partial Solution">${exercise.partial}</textarea>
29
<label for="exercise_solution">Exercise Full Solution:</label><br />
30
<textarea cols="80" rows="5" id="exercise_solution" title="Solution">${exercise.solution}</textarea>
32
<label for="exercise_include">Exercise Included Code:</label><br />
33
<textarea cols="80" rows="5" id="exercise_include" title="Included Code">${exercise.include}</textarea>
35
<input type="submit" value="Save Changes" onclick="edit_exercise()" />
37
<h2>Exercise Test Suites</h2>
32
<div py:with="iw_prefix='exercise'; iw_label_linebreak=True">
33
<iw:text name="id" desc="Identifier">${exercise.id}</iw:text>
34
<iw:text name="name" desc="Name">${exercise.name}</iw:text>
35
<iw:text name="num_rows" desc="Number of Rows">${exercise.num_rows}</iw:text>
36
<iw:textarea name="desc" desc="Description (RST)" cols="80" rows="10">${exercise.description}</iw:textarea>
37
<iw:textarea name="solution" desc="Solution" cols="80" rows="5">${exercise.solution}</iw:textarea>
38
<iw:textarea name="partial" desc="Partial Solution" cols="80" rows="5">${exercise.partial}</iw:textarea>
39
<iw:textarea name="include" desc="Included Code" cols="80" rows="5">${exercise.include}</iw:textarea>
40
<input type="button" value="Save" onclick="edit_exercise()" />
43
<ul class="test_suites">
39
44
<py:for each="test_suite in exercise.test_suites">
41
<h3><a id="suite_header_${test_suite.suiteid}" onclick="tog('suite_data_${test_suite.suiteid}')">Suite ${test_suite.seq_no + 1} - ${test_suite.description}</a> <a onclick="delete_suite('${test_suite.suiteid}')"><img src="${mediapath}cross.png"/></a></h3>
47
<a id="suite_header_${test_suite.suiteid}"
48
onclick="tog('suite_data_${test_suite.suiteid}')">Suite ${test_suite.seq_no + 1}: “${test_suite.description}”</a>
49
<iw:delete action="delete_suite('${test_suite.suiteid}')" />
43
52
<div class="testsuite" id="suite_data_${test_suite.suiteid}">
44
<div class="test_suite_vals">
46
<label for="test_suite_description_${test_suite.suiteid}">Description:</label> <textarea id="test_suite_description_${test_suite.suiteid}" cols="80" rows="1">${test_suite.description}</textarea>
49
<label for="test_suite_function_${test_suite.suiteid}">Function:</label> <textarea id="test_suite_function_${test_suite.suiteid}" title="Suite Function" cols="80" rows="1">${test_suite.function}</textarea>
52
<label for="test_suite_stdin_${test_suite.suiteid}">Stdin:</label> <textarea id="test_suite_stdin_${test_suite.suiteid}" title="Suite Stdin" cols="80" rows="4">${test_suite.stdin}</textarea>
55
<input type="submit" name="Save Suite" value="Save Suite" onclick="edit_suite('${test_suite.suiteid}')" />
53
<div class="test_suite_vals"
54
py:with="iw_prefix='test_suite_%d' % test_suite.suiteid">
55
<iw:textarea name="description" desc="Description" cols="80" rows="1">${test_suite.description}</iw:textarea>
56
<iw:textarea name="function" desc="Function" cols="80" rows="1">${test_suite.function}</iw:textarea>
57
<iw:textarea name="stdin" desc="Stdin" cols="80" rows="4">${test_suite.stdin}</iw:textarea>
58
<input type="button" value="Save Suite" onclick="edit_suite('${test_suite.suiteid}')" />
59
<a id='variables_header_${test_suite.suiteid}' onclick="tog('variables_${test_suite.suiteid}')"><h4>Suite ${test_suite.seq_no + 1} - Variables</h4></a>
61
62
<div class="test_variables" id="variables_${test_suite.suiteid}">
62
<py:for each="variable in test_suite.variables">
64
<a onclick="delete_var('${variable.varid}', '${test_suite.suiteid}')"><img src="${mediapath}cross.png"/></a>
64
<li py:for="variable in test_suite.variables">
65
<iw:delete action="delete_var('${variable.varid}', '${test_suite.suiteid}')" />
65
66
<label for="var_type_${variable.varid}">Type:</label>
66
67
<select name="Variable Type" id="var_type_${variable.varid}">
67
68
<py:for each="var_type in var_types">
93
93
<input type="text" id="new_var_val_${test_suite.suiteid}" />
94
94
<label for="new_var_argno_${test_suite.suiteid}">Arg Num:</label>
95
95
<input size="5" type="text" id="new_var_argno_${test_suite.suiteid}" />
96
<input type="submit" value="Add" onclick="add_var('${test_suite.suiteid}')" />
96
<input type="button" value="Add Variable" onclick="add_var('${test_suite.suiteid}')" />
99
<a onclick="tog('test_cases_${test_suite.suiteid}')" id="cases_header_${test_suite.suiteid}"><h4>Suite ${test_suite.seq_no + 1} - Test Cases</h4></a>
101
100
<div class="test_cases" id="test_cases_${test_suite.suiteid}">
103
102
<py:for each="test_case in test_suite.test_cases">
105
<h5><a onclick="tog('test_case_${test_case.testid}_${test_suite.suiteid}')" id="case_header_${test_case.testid}">Test Case ${test_case.seq_no + 1}</a> <a onclick="delete_testcase('${test_case.testid}','${test_suite.suiteid}')"><img src="${mediapath}cross.png"/></a></h5>
106
<div class="test_case" id="test_case_${test_case.testid}_${test_suite.suiteid}">
107
<label for="test_case_pass_${test_case.testid}_${test_suite.suiteid}">Pass Message:</label>
108
<input class="textinput" type="text" id="test_case_pass_${test_case.testid}_${test_suite.suiteid}" value="${test_case.passmsg}" />
110
<label for="test_case_fail_${test_case.testid}_${test_suite.suiteid}">Fail Message:</label>
111
<input class="textinput" type="text" id="test_case_fail_${test_case.testid}_${test_suite.suiteid}" value="${test_case.failmsg}" />
113
<label for="test_case_default_${test_case.test_default}_${test_suite.suiteid}">Default Mode:</label>
114
<input class="textinput" type="text" id="test_case_default_${test_case.test_default}_${test_suite.suiteid}" value="${test_case.test_default}" />
116
<input type="submit" onclick="edit_test_case('${test_case.testid}','${test_suite.suiteid}')" value="Save Case" />
105
<a onclick="tog('test_case_${test_case.testid}_${test_suite.suiteid}')"
106
id="case_header_${test_case.testid}">Test Case ${test_case.seq_no + 1}: “${test_case.passmsg}”</a>
107
<iw:delete action="delete_testcase('${test_case.testid}','${test_suite.suiteid}')" />
109
<div py:with="iw_prefix='test_case_%d_%d' % (test_case.testid, test_suite.suiteid)"
110
class="test_case" id="${iw_prefix}">
111
<iw:text name="pass" desc="Pass Message">${test_case.passmsg}</iw:text>
112
<iw:text name="fail" desc="Fail Message">${test_case.failmsg}</iw:text>
113
<iw:text name="default" desc="Default Mode">${test_case.test_default}</iw:text>
114
<input type="button" onclick="edit_test_case('${test_case.testid}','${test_suite.suiteid}')" value="Save Case" />
118
116
<h5>Test Case Parts</h5>
119
<div class="disabled_test_case_parts" id="test_case_parts_${test_case.testid}_${test_suite.suiteid}">
120
<py:for each="test_part in test_case.parts">
121
<a onclick="delete_testpart('${test_part.partid}','${test_case.testid}','${test_suite.suiteid}')"><img src="${mediapath}cross.png"/></a>
122
<label for="test_part_part_type_${test_part.partid}">Part Type:</label>
123
<select name="Part Type" id="test_part_part_type_${test_part.partid}">
117
<ul class="test_case_parts" id="test_case_parts_${test_case.testid}_${test_suite.suiteid}">
118
<li py:for="test_part in test_case.parts"
119
py:with="iw_prefix='test_part_%d' % test_part.partid">
120
<label for="test_part_${test_part.partid}_part_type">Part Type:</label>
121
<select name="Part Type" id="test_part_${test_part.partid}_part_type">
124
122
<py:for each="part_type in part_types">
125
123
<option py:if="part_type==test_part.part_type" selected="selected" value="${part_type}">${part_type}</option>
126
124
<option py:if="part_type!=test_part.part_type" value="${part_type}">${part_type}</option>
129
<label for="">Test Type</label>
130
<select name="Test Type" id="test_part_test_type_${test_part.partid}">
127
<label for="test_part_${test_part.partid}_test_type">Test Type</label>
128
<select name="Test Type" id="test_part_${test_part.partid}_test_type">
131
129
<py:for each="test_type in test_types">
132
130
<option py:if="test_type==test_part.test_type" selected="selected" value="${test_type}">${test_type}</option>
133
131
<option py:if="test_type!=test_part.test_type" value="${test_type}">${test_type}</option>
137
<label for="test_part_data_${test_part.partid}">Test:</label><br />
138
<textarea id="test_part_data_${test_part.partid}" rows="2" cols="80">${test_part.data}</textarea>
140
<label for="test_part_file_${test_part.partid}">Filename:</label>
141
<input type="text" id="test_part_file_${test_part.partid}" value="${test_part.filename}" />
143
<input type="submit" value="Save Part" onclick="edit_test_part('${test_part.partid}', '${test_case.testid}', ${test_suite.suiteid})"/>
147
<a onclick="tog('new_test_part_${test_case.testid}')">Add a New part</a>
148
<div class="add_new_part" id="new_test_part_${test_case.testid}">
149
<label for="new_test_part_part_type_${test_case.testid}">Part Type:</label>
150
<select name="Part Type" id="new_test_part_part_type_${test_case.testid}">
151
<py:for each="part_type in part_types">
152
<option value="${part_type}">${part_type}</option>
156
<label>Test Type:</label>
157
<select name="Test Type" id="new_test_part_test_type_${test_case.testid}">
158
<py:for each="test_type in test_types">
159
<option value="${test_type}">${test_type}</option>
164
<textarea id="new_test_part_data_${test_case.testid}" rows="2" cols="80"></textarea>
166
<label>Filename:</label>
167
<input type="text" id="new_test_part_file_${test_case.testid}"/>
169
<input type="submit" value="Add Part" onclick="add_test_part('${test_case.testid}', '${test_suite.suiteid}')" id="new_test_part_save_${test_case.testid}" />
134
<iw:delete action="delete_testpart('${test_part.partid}','${test_case.testid}','${test_suite.suiteid}')" />
135
<iw:textarea name="data" desc="Test" rows="2" cols="80">${test_part.data}</iw:textarea>
136
<iw:text name="file" desc="Filename">${test_part.filename}</iw:text>
137
<input type="button" value="Save Part" onclick="edit_test_part('${test_part.partid}', '${test_case.testid}', ${test_suite.suiteid})" />
139
<li py:with="iw_prefix='test_part_new'">
140
<a onclick="tog('new_test_part_${test_case.testid}')">New test case part</a>
141
<div class="add_new_part" id="new_test_part_${test_case.testid}">
142
<label for="test_part_new_part_type_${test_case.testid}">Part Type:</label>
143
<select name="Part Type" id="test_part_new_part_type_${test_case.testid}">
144
<py:for each="part_type in part_types">
145
<option value="${part_type}">${part_type}</option>
148
<label for="test_part_new_test_type_${test_case.testid}">Test Type:</label>
149
<select name="Test Type" id="test_part_new_test_type_${test_case.testid}">
150
<py:for each="test_type in test_types">
151
<option value="${test_type}">${test_type}</option>
154
<iw:textarea name="data" desc="Test" rows="2" cols="80" />
155
<iw:text name="file" desc="Filename" />
156
<input type="button" value="Create Part" onclick="add_test_part('${test_case.testid}', '${test_suite.suiteid}')" id="new_test_part_save_${test_case.testid}" />
175
<a onclick="tog('new_test_part_${test_suite.suiteid}')"><h5>Add A New Test Case</h5></a>
176
<div class="add_new_part" id="new_test_part_${test_suite.suiteid}">
177
<label for="new_test_case_pass_${test_suite.suiteid}">Pass Message:</label>
178
<input class="textinput" type="text" id="new_test_case_pass_${test_suite.suiteid}" />
180
<label for="new_test_case_fail_${test_suite.suiteid}">Fail Message:</label>
181
<input class="textinput" type="text" id="new_test_case_fail_${test_suite.suiteid}" />
183
<label for="new_test_case_default_${test_suite.suiteid}">Default Mode:</label>
184
<input class="textinput" type="text" value="ignore" id="new_test_case_default_${test_suite.suiteid}" />
186
<input type="submit" value="Add Case" onclick="add_test_case('${test_suite.suiteid}')" />
164
<h5><a onclick="tog('new_test_case_${test_suite.suiteid}')">New test case</a></h5>
165
<div py:with="iw_prefix='new_test_case_%d' % (test_suite.suiteid)"
166
class="test_case" id="${iw_prefix}">
167
<iw:text name="pass" desc="Pass Message" />
168
<iw:text name="fail" desc="Fail Message" />
169
<iw:text name="default" desc="Default Mode" />
170
<input type="button" value="Create Case" onclick="add_test_case('${test_suite.suiteid}')" />