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

« back to all changes in this revision

Viewing changes to ivle/worksheet/utils.py

  • Committer: Matt Giuca
  • Date: 2009-04-24 14:29:12 UTC
  • mto: This revision was merged to the branch mainline in revision 1196.
  • Revision ID: matt.giuca@gmail.com-20090424142912-bgkaglhv1ct4vi87
ivle.worksheet.utils: Can now calculate exercise and worksheet marks as of a
    particular date (optional argument).
ivle-marks: Added --cutoff argument which allows the user to display the marks
    as of a given date. (This allows you to get the marks at a particular
    cut-off date, since students may continue working past this date; the
    marks should not count).

Show diffs side-by-side

added added

removed removed

Lines of Context:
34
34
           'get_exercise_attempts', 'get_exercise_attempt',
35
35
          ]
36
36
 
37
 
def get_exercise_status(store, user, worksheet_exercise):
 
37
def get_exercise_status(store, user, worksheet_exercise, as_of=None):
38
38
    """Given a storm.store, User and Exercise, returns information about
39
39
    the user's performance on that problem.
 
40
    @param store: A storm.store
 
41
    @param user: A User.
 
42
    @param worksheet_exercise: An Exercise.
 
43
    @param as_of: Optional datetime. If supplied, gets the status as of as_of.
40
44
    Returns a tuple of:
41
45
        - A boolean, whether they have successfully passed this exercise.
42
46
        - An int, the number of attempts they have made up to and
48
52
    is_relevant = ((ExerciseAttempt.user_id == user.id) &
49
53
            (ExerciseAttempt.ws_ex_id == worksheet_exercise.id) &
50
54
            (ExerciseAttempt.active == True))
 
55
    if as_of is not None:
 
56
        is_relevant &= ExerciseAttempt.date <= as_of
51
57
 
52
58
    # Get the first successful active attempt, or None if no success yet.
53
59
    # (For this user, for this exercise).
162
168
    saved.date = date
163
169
    saved.text = text
164
170
 
165
 
def calculate_score(store, user, worksheet):
 
171
def calculate_score(store, user, worksheet, as_of=None):
166
172
    """
167
173
    Given a storm.store, User, Exercise and Worksheet, calculates a score for
168
174
    the user on the given worksheet.
 
175
    @param store: A storm.store
 
176
    @param user: A User.
 
177
    @param worksheet: A Worksheet.
 
178
    @param as_of: Optional datetime. If supplied, gets the score as of as_of.
169
179
    Returns a 4-tuple of ints, consisting of:
170
180
    (No. mandatory exercises completed,
171
181
     Total no. mandatory exercises,
183
193
        worksheet = worksheet_exercise.worksheet
184
194
        optional = worksheet_exercise.optional
185
195
 
186
 
        done, _ = get_exercise_status(store, user, worksheet_exercise)
 
196
        done, _ = get_exercise_status(store, user, worksheet_exercise, as_of)
187
197
        # done is a bool, whether this student has completed that problem
188
198
        if optional:
189
199
            opt_total += 1