~azzar1/unity/add-show-desktop-key

« back to all changes in this revision

Viewing changes to bin/ivle-addexercise

Modified worksheets to properly link attempts to worksheets and
exercises, not just exercises

Show diffs side-by-side

added added

removed removed

Lines of Context:
119
119
    store.add(new_suite)
120
120
    return new_suite
121
121
 
122
 
def add_part(store, element_type, test_type, data, filename=u""):
 
122
def add_part(store, part_type, test_type, data, filename=u""):
123
123
    new_part = TestCasePart()
124
 
    new_part.element_type = element_type
125
 
    new_part.test_type = test_type
126
 
    new_part.data = data
 
124
    new_part.part_type = unicode(part_type)
 
125
    new_part.test_type = unicode(test_type)
 
126
    new_part.data = unicode(data)
127
127
    new_part.filename = unicode(filename)
128
128
    store.add(new_part)
129
129
    return new_part
173
173
    return new_test_case
174
174
 
175
175
xmlfile = sys.argv[1]
176
 
try:
177
 
    filedom = minidom.parse(xmlfile)
178
 
except IOError, e:
179
 
    sys.exit('ivle-addexercise: error opening file ' + xmlfile + ': ' + e[1])
180
 
 
181
 
 
182
 
for child in filedom.childNodes:
183
 
    if child.nodeType == child.ELEMENT_NODE and child.tagName == 'exercise':
184
 
        exercise = child
185
 
    else:
186
 
        sys.exit('ivle-addexercise: error parsing XML: root node must be "exercise"')
187
 
 
188
 
exercisename = exercise.getAttribute('name')
189
 
rows = exercise.getAttribute('rows')
190
 
solution = None
191
 
partial_solution = None
192
 
include_code = None
193
 
description = None
194
 
test_suite_nodes = []
195
 
for child in exercise.childNodes:
196
 
    if child.nodeType != child.ELEMENT_NODE:
197
 
        continue
198
 
    if child.tagName == 'solution':
199
 
        if solution is not None:
200
 
            sys.exit('ivle-addexercise: error parsing XML: multiple "solution" nodes')
201
 
        solution = getTextData(child)
202
 
    elif child.tagName == 'include':
203
 
        if include_code is not None:
204
 
            sys.exit('ivle-addexercise: error parsing XML: multiple "include" nodes')
205
 
        include_code = getTextData(child)
206
 
    elif child.tagName == 'partial':
207
 
        if partial_solution is not None:
208
 
            sys.exit('ivle-addexercise: error parsing XML: multiple "include" nodes')
209
 
        partial_solution = getTextData(child)
210
 
    elif child.tagName == 'case':
211
 
        test_suite_nodes.append(child)
212
 
    elif child.tagName == 'desc':
213
 
        description = getTextData(child)
214
 
 
215
 
if solution is None:
216
 
    sys.exit("ivle-addexercise: error parsing XML: No solution given")
217
 
if len(test_suite_nodes) == 0:
218
 
    sys.exit("ivle-addexercise: error parsing XML:")
219
 
 
220
 
store = get_store()
221
 
new_exercise = Exercise()
222
 
new_exercise.id = unicode(xmlfile)
223
 
new_exercise.name = exercisename
224
 
new_exercise.num_rows = int(rows)
225
 
new_exercise.partial = partial_solution
226
 
new_exercise.solution = solution
227
 
new_exercise.include = include_code
228
 
new_exercise.description = description
229
 
new_exercise.partial = partial_solution
230
 
store.add(new_exercise)
231
 
suite_num = 0
232
 
for suite in test_suite_nodes:
233
 
    new_exercise.test_suites.add(add_test_suite(suite, suite_num, store))
234
 
    suite_num += 1
235
 
 
236
 
store.add(new_exercise)
237
 
store.commit()
 
176
 
 
177
def add_exercise(xmlfile):
 
178
    try:
 
179
        filedom = minidom.parse(xmlfile)
 
180
    except IOError, e:
 
181
        raise Exception('ivle-addexercise: error opening file ' + xmlfile + ': ' + e[1])
 
182
 
 
183
    for child in filedom.childNodes:
 
184
        if child.nodeType == child.ELEMENT_NODE and child.tagName == 'exercise':
 
185
            exercise = child
 
186
        else:
 
187
            raise XMLMalformedError('ivle-addexercise: error parsing XML: root node must be "exercise"')
 
188
 
 
189
    exercisename = exercise.getAttribute('name')
 
190
    rows = exercise.getAttribute('rows')
 
191
    if rows == '':
 
192
        rows = 4
 
193
    solution = None
 
194
    partial_solution = None
 
195
    include_code = None
 
196
    description = None
 
197
    test_suite_nodes = []
 
198
    for child in exercise.childNodes:
 
199
        if child.nodeType != child.ELEMENT_NODE:
 
200
            continue
 
201
        if child.tagName == 'solution':
 
202
            if solution is not None:
 
203
                raise XMLMalformedError('ivle-addexercise: error parsing XML: multiple "solution" nodes')
 
204
            solution = getTextData(child)
 
205
        elif child.tagName == 'include':
 
206
            if include_code is not None:
 
207
                raise XMLMalformedError('ivle-addexercise: error parsing XML: multiple "include" nodes')
 
208
            include_code = getTextData(child)
 
209
        elif child.tagName == 'partial':
 
210
            if partial_solution is not None:
 
211
                raise XMLMalformedError('ivle-addexercise: error parsing XML: multiple "include" nodes')
 
212
            partial_solution = getTextData(child)
 
213
        elif child.tagName == 'case':
 
214
            test_suite_nodes.append(child)
 
215
        elif child.tagName == 'desc':
 
216
            description = getTextData(child)
 
217
 
 
218
    if solution is None:
 
219
        raise XMLMalformedError("ivle-addexercise: error parsing XML: No solution given")
 
220
    if len(test_suite_nodes) == 0:
 
221
        raise XMLMalformedError("ivle-addexercise: error parsing XML: No Tests Given!")
 
222
 
 
223
    store = get_store()
 
224
    new_exercise = Exercise()
 
225
    new_exercise.id = unicode(xmlfile)
 
226
    new_exercise.name = exercisename
 
227
    new_exercise.num_rows = int(rows)
 
228
    new_exercise.partial = partial_solution
 
229
    new_exercise.solution = solution
 
230
    new_exercise.include = include_code
 
231
    new_exercise.description = description
 
232
    new_exercise.partial = partial_solution
 
233
    store.add(new_exercise)
 
234
    suite_num = 0
 
235
    for suite in test_suite_nodes:
 
236
        new_exercise.test_suites.add(add_test_suite(suite, suite_num, store))
 
237
        suite_num += 1
 
238
 
 
239
    store.add(new_exercise)
 
240
    store.commit()
 
241
    
 
242
xmlfiles = sys.argv[1:]
 
243
for xmlfile in xmlfiles:
 
244
    print "Adding exercise", xmlfile
 
245
    #try:
 
246
    add_exercise(xmlfile)
 
247
    #except Exception, e:
 
248
    #    print "ERROR: Could not add file", xmlfile
 
249
    #    print e.stacktrace()