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

« back to all changes in this revision

Viewing changes to ivle/worksheet/utils.py

  • Committer: William Grant
  • Date: 2010-02-18 03:31:47 UTC
  • Revision ID: grantw@unimelb.edu.au-20100218033147-z1es9tzrx7eg85gu
Ensure that we always close the DB connection at request termination, even in the case of an exception.

Show diffs side-by-side

added added

removed removed

Lines of Context:
30
30
 
31
31
import ivle.database
32
32
from ivle.database import ExerciseAttempt, ExerciseSave, Worksheet, \
33
 
                          WorksheetExercise, Exercise, User
 
33
                          WorksheetExercise, Exercise
34
34
import ivle.webapp.tutorial.test
35
35
 
36
36
__all__ = ['ExerciseNotFound', 'get_exercise_status',
37
 
           'get_exercise_statistics',
38
37
           'get_exercise_stored_text', 'get_exercise_attempts',
39
38
           'get_exercise_attempt', 'test_exercise_submission',
40
39
          ]
83
82
 
84
83
    return first_success is not None, num_attempts
85
84
 
86
 
def get_exercise_statistics(store, worksheet_exercise):
87
 
    """Return statistics about an exercise (with respect to a given
88
 
    worksheet).
89
 
    (number of students completed, number of students attempted)."""
90
 
    # Count the set of Users whose ID matches an attempt in this worksheet
91
 
    num_completed = store.find(User, User.id == ExerciseAttempt.user_id,
92
 
        ExerciseAttempt.ws_ex_id == worksheet_exercise.id,
93
 
        ExerciseAttempt.complete == True).config(distinct=True).count()
94
 
    num_attempted = store.find(User, User.id == ExerciseAttempt.user_id,
95
 
        ExerciseAttempt.ws_ex_id == worksheet_exercise.id,
96
 
        ).config(distinct=True).count()
97
 
    return num_completed, num_attempted
98
 
 
99
85
def get_exercise_stored_text(store, user, worksheet_exercise):
100
86
    """Given a storm.store, User and WorksheetExercise, returns an
101
87
    ivle.database.ExerciseSave object for the last saved/submitted attempt for
258
244
    exercises = []
259
245
    # Turns the worksheet into an xml stream, and then finds all the 
260
246
    # exercise nodes in the stream.
261
 
    worksheetdata = genshi.XML(worksheet.data_xhtml)
 
247
    worksheetdata = genshi.XML(worksheet.get_xml())
262
248
    for kind, data, pos in worksheetdata:
263
249
        if kind is genshi.core.START:
264
250
            # Data is a tuple of tag name and a list of name->value tuples
331
317
    
332
318
    Do not confuse this with a worksheet in the database. This worksheet
333
319
    has extra information for use in the output, such as marks."""
334
 
    def __init__(self, id, name, assessable, published):
 
320
    def __init__(self, id, name, assessable):
335
321
        self.id = id
336
322
        self.name = name
337
323
        self.assessable = assessable
338
 
        self.published = published
339
324
        self.complete_class = ''
340
325
        self.optional_message = ''
341
326
        self.total = 0
346
331
 
347
332
 
348
333
# XXX: This really shouldn't be needed.
349
 
def create_list_of_fake_worksheets_and_stats(config, store, user, offering):
 
334
def create_list_of_fake_worksheets_and_stats(store, user, offering):
350
335
    """Take an offering's real worksheets, converting them into stats.
351
336
 
352
337
    The worksheet listing views expect special fake worksheet objects
360
345
    problems_total = 0
361
346
 
362
347
    # Offering.worksheets is ordered by the worksheets seq_no
363
 
    worksheets = offering.worksheets
364
 
 
365
 
    # Unless we can edit worksheets, hide unpublished ones.
366
 
    if 'edit_worksheets' not in offering.get_permissions(user, config):
367
 
        worksheets = worksheets.find(published=True)
368
 
 
369
 
    for worksheet in worksheets:
 
348
    for worksheet in offering.worksheets:
370
349
        new_worksheet = FakeWorksheetForMarks(
371
 
            worksheet.identifier, worksheet.name, worksheet.assessable,
372
 
            worksheet.published)
 
350
            worksheet.identifier, worksheet.name, worksheet.assessable)
373
351
        if new_worksheet.assessable:
374
352
            # Calculate the user's score for this worksheet
375
353
            mand_done, mand_total, opt_done, opt_total = (