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

« back to all changes in this revision

Viewing changes to ivle/worksheet/utils.py

  • Committer: William Grant
  • Date: 2012-06-28 01:52:02 UTC
  • Revision ID: me@williamgrant.id.au-20120628015202-f6ru7o367gt6nvgz
Hah

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
 
33
                          WorksheetExercise, Exercise, User
34
34
import ivle.webapp.tutorial.test
35
35
 
36
36
__all__ = ['ExerciseNotFound', 'get_exercise_status',
 
37
           'get_exercise_statistics',
37
38
           'get_exercise_stored_text', 'get_exercise_attempts',
38
39
           'get_exercise_attempt', 'test_exercise_submission',
39
40
          ]
82
83
 
83
84
    return first_success is not None, num_attempts
84
85
 
 
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
 
85
99
def get_exercise_stored_text(store, user, worksheet_exercise):
86
100
    """Given a storm.store, User and WorksheetExercise, returns an
87
101
    ivle.database.ExerciseSave object for the last saved/submitted attempt for
244
258
    exercises = []
245
259
    # Turns the worksheet into an xml stream, and then finds all the 
246
260
    # exercise nodes in the stream.
247
 
    worksheetdata = genshi.XML(worksheet.get_xml())
 
261
    worksheetdata = genshi.XML(worksheet.data_xhtml)
248
262
    for kind, data, pos in worksheetdata:
249
263
        if kind is genshi.core.START:
250
264
            # Data is a tuple of tag name and a list of name->value tuples
294
308
    jail_path = os.path.join(config['paths']['jails']['mounts'],
295
309
                             user.login)
296
310
    working_dir = os.path.join("/home", user.login)
297
 
    cons = ivle.console.Console(config, user.unixid, jail_path,
 
311
    cons = ivle.console.Console(config, user, jail_path,
298
312
                                working_dir)
299
313
 
300
314
    # Parse the file into a exercise object using the test suite
317
331
    
318
332
    Do not confuse this with a worksheet in the database. This worksheet
319
333
    has extra information for use in the output, such as marks."""
320
 
    def __init__(self, id, name, assessable):
 
334
    def __init__(self, id, name, assessable, published):
321
335
        self.id = id
322
336
        self.name = name
323
337
        self.assessable = assessable
 
338
        self.published = published
324
339
        self.complete_class = ''
325
340
        self.optional_message = ''
326
341
        self.total = 0
331
346
 
332
347
 
333
348
# XXX: This really shouldn't be needed.
334
 
def create_list_of_fake_worksheets_and_stats(store, user, offering):
 
349
def create_list_of_fake_worksheets_and_stats(config, store, user, offering,
 
350
    as_of=None):
335
351
    """Take an offering's real worksheets, converting them into stats.
336
352
 
337
353
    The worksheet listing views expect special fake worksheet objects
345
361
    problems_total = 0
346
362
 
347
363
    # Offering.worksheets is ordered by the worksheets seq_no
348
 
    for worksheet in offering.worksheets:
 
364
    worksheets = offering.worksheets
 
365
 
 
366
    # Unless we can edit worksheets, hide unpublished ones.
 
367
    if 'edit_worksheets' not in offering.get_permissions(user, config):
 
368
        worksheets = worksheets.find(published=True)
 
369
 
 
370
    for worksheet in worksheets:
349
371
        new_worksheet = FakeWorksheetForMarks(
350
 
            worksheet.identifier, worksheet.name, worksheet.assessable)
 
372
            worksheet.identifier, worksheet.name, worksheet.assessable,
 
373
            worksheet.published)
351
374
        if new_worksheet.assessable:
352
375
            # Calculate the user's score for this worksheet
353
376
            mand_done, mand_total, opt_done, opt_total = (
354
 
                ivle.worksheet.utils.calculate_score(store, user, worksheet))
 
377
                ivle.worksheet.utils.calculate_score(store, user, worksheet,
 
378
                                                     as_of=as_of))
355
379
            if opt_total > 0:
356
380
                optional_message = " (excluding optional exercises)"
357
381
            else: