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

« back to all changes in this revision

Viewing changes to ivle/worksheet.py

  • Committer: Matt Giuca
  • Date: 2009-01-19 16:03:36 UTC
  • mto: This revision was merged to the branch mainline in revision 1090.
  • Revision ID: matt.giuca@gmail.com-20090119160336-28ob0uev0hnikec3
Added new module: ivle.worksheet. This will contain general functions for
    worksheets (particularly for interacting with the DB), which don't belong
    in either tutorial or tutorialservice.
    worksheet now has get_exercise_status, which is a Storm re-implementation
    of ivle.db.get_problem_status. Much cleaner!
tutorial, tutorialservice: Now use ivle.worksheet.get_exercise_status rather
    than ivle.db.get_problem_status.
ivle.db: Renamed get_problem_status to _get_problem_status. Still required,
    but only used internally now.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# IVLE - Informatics Virtual Learning Environment
 
2
# Copyright (C) 2007-2009 The University of Melbourne
 
3
#
 
4
# This program is free software; you can redistribute it and/or modify
 
5
# it under the terms of the GNU General Public License as published by
 
6
# the Free Software Foundation; either version 2 of the License, or
 
7
# (at your option) any later version.
 
8
#
 
9
# This program is distributed in the hope that it will be useful,
 
10
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 
11
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
12
# GNU General Public License for more details.
 
13
#
 
14
# You should have received a copy of the GNU General Public License
 
15
# along with this program; if not, write to the Free Software
 
16
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 
17
 
 
18
# Author: Matt Giuca
 
19
 
 
20
"""
 
21
Worksheet Utility Functions
 
22
 
 
23
This module provides functions for tutorial and worksheet computations.
 
24
"""
 
25
 
 
26
from storm.locals import And, Asc, Desc
 
27
import ivle.database
 
28
 
 
29
def get_exercise_status(store, user, exercise):
 
30
    """Given a storm.store, User and Exercise, returns information about
 
31
    the user's performance on that problem.
 
32
    Returns a tuple of:
 
33
        - A boolean, whether they have successfully passed this exercise.
 
34
        - An int, the number of attempts they have made up to and
 
35
          including the first successful attempt (or the total number of
 
36
          attempts, if not yet successful).
 
37
    """
 
38
    ExerciseAttempt = ivle.database.ExerciseAttempt
 
39
    # A Storm expression denoting all active attempts by this user for this
 
40
    # exercise.
 
41
    is_relevant = ((ExerciseAttempt.user_id == user.id) &
 
42
                   (ExerciseAttempt.exercise_id == exercise.id) &
 
43
                   (ExerciseAttempt.active == True))
 
44
 
 
45
    # Get the first successful active attempt, or None if no success yet.
 
46
    # (For this user, for this exercise).
 
47
    first_success = store.find(ExerciseAttempt, is_relevant,
 
48
            ExerciseAttempt.complete == True
 
49
        ).order_by(Asc(ExerciseAttempt.date)).first()
 
50
 
 
51
    if first_success is not None:
 
52
        # Get the total number of active attempts up to and including the
 
53
        # first successful attempt.
 
54
        # (Subsequent attempts don't count, because the user had already
 
55
        # succeeded by then).
 
56
        num_attempts = store.find(ExerciseAttempt, is_relevant,
 
57
                ExerciseAttempt.date <= first_success.date).count()
 
58
    else:
 
59
        # User has not yet succeeded.
 
60
        # Get the total number of active attempts.
 
61
        num_attempts = store.find(ExerciseAttempt, is_relevant).count()
 
62
 
 
63
    return first_success is not None, num_attempts