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

« back to all changes in this revision

Viewing changes to bin/ivle-marks

  • 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:
24
24
 
25
25
import sys
26
26
import os
27
 
import re
28
27
import csv
 
28
import datetime
29
29
import optparse
30
30
from xml.dom import minidom
31
31
 
57
57
    return (userdata_header + [ws.name for ws in worksheets]
58
58
            + ["Total %", "Mark"])
59
59
 
60
 
def get_marks_user(worksheets, user):
 
60
def get_marks_user(worksheets, user, as_of=None):
61
61
    """Gets marks for a particular user for a particular set of worksheets.
62
62
    @param worksheets: List of Worksheet objects to get marks for.
63
63
    @param user: User to get marks for.
 
64
    @param as_of: Optional datetime. If supplied, gets the marks as of as_of.
64
65
    @returns: The user's percentage for each worksheet, overall, and
65
66
    their final mark, as a list of strings, in a manner which corresponds to
66
67
    the headings produced by get_marks_header.
74
75
    for worksheet in worksheets:
75
76
        # We simply ignore optional exercises here
76
77
        mand_done, mand_total, _, _ = (
77
 
            ivle.worksheet.utils.calculate_score(store, user, worksheet))
 
78
            ivle.worksheet.utils.calculate_score(store, user, worksheet,
 
79
                                                 as_of))
78
80
        if mand_total > 0:
79
81
            worksheet_pcts.append(float(mand_done) / mand_total)
80
82
        else:
86
88
        ivle.worksheet.utils.calculate_mark(problems_done, problems_total))
87
89
    return worksheet_pcts + [float(percent)/100, mark]
88
90
 
89
 
def writeuser(worksheets, user, csvfile):
 
91
def writeuser(worksheets, user, csvfile, cutoff=None):
90
92
    userdata = get_userdata(user)
91
 
    marksdata = get_marks_user(worksheets, user)
 
93
    marksdata = get_marks_user(worksheets, user, cutoff)
92
94
    data = userdata + marksdata
93
95
    # CSV writer can't handle non-ASCII characters. Encode to UTF-8.
94
96
    data = [unicode(x).encode('utf-8') for x in data]
108
110
    parser.add_option("-s", "--semester",
109
111
        action="store", dest="semester", metavar="YEAR/SEMESTER",
110
112
        help="Semester of the subject's offering (eg. 2009/1). "
111
 
        "Defaults to the currently active semester.",
 
113
             "Defaults to the currently active semester.",
 
114
        default=None)
 
115
    parser.add_option("-c", "--cutoff",
 
116
        action="store", dest="cutoff", metavar="DATE",
 
117
        help="Cutoff date (calculate the marks as of this date). "
 
118
             "YYYY-MM-DD H:M:S.",
112
119
        default=None)
113
120
    (options, args) = parser.parse_args(argv[1:])
114
121
 
128
135
        except ValueError:
129
136
            parser.error('Invalid semester (must have form "year/semester")')
130
137
 
 
138
    if options.cutoff is not None:
 
139
        try:
 
140
            cutoff = datetime.datetime.strptime(options.cutoff,
 
141
                                                "%Y-%m-%d %H:%M:%S")
 
142
        except ValueError:
 
143
            parser.error("Invalid date format: '%s' "
 
144
                         "(must be YYYY-MM-DD H:M:S)." % options.cutoff)
 
145
    else:
 
146
        cutoff = None
 
147
 
131
148
    store = ivle.database.get_store()
132
149
 
133
150
    # Get the subject from the DB
177
194
                   offering.id == ivle.database.Enrolment.offering).order_by(
178
195
                        ivle.database.User.login)
179
196
    for user in users:
180
 
        writeuser(worksheets, user, csvfile)
 
197
        writeuser(worksheets, user, csvfile, cutoff)
181
198
 
182
199
if __name__ == "__main__":
183
200
    sys.exit(main(sys.argv))