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

« back to all changes in this revision

Viewing changes to ivle/webapp/tutorial/service.py

  • Committer: William Grant
  • Date: 2010-02-15 03:15:54 UTC
  • Revision ID: grantw@unimelb.edu.au-20100215031554-jtx6yn9se091v4rf
Clarify that you actually need two project sets: one for solo, one for group.

Show diffs side-by-side

added added

removed removed

Lines of Context:
19
19
 
20
20
'''AJAX backend for the tutorial application.'''
21
21
 
22
 
import os
23
22
import datetime
24
23
 
25
24
import genshi
26
25
from storm.locals import Store
27
26
 
28
 
import ivle.console
29
27
import ivle.database
30
28
from ivle.database import Exercise, ExerciseAttempt, ExerciseSave, Worksheet, \
31
29
                          Offering, Subject, Semester, User, WorksheetExercise
32
30
import ivle.worksheet.utils
33
 
import ivle.webapp.tutorial.test
34
31
from ivle.webapp.base.rest import (JSONRESTView, named_operation,
35
32
                                   require_permission)
36
33
from ivle.webapp.errors import NotFound
38
35
 
39
36
TIMESTAMP_FORMAT = '%Y-%m-%d %H:%M:%S'
40
37
 
 
38
 
41
39
class AttemptsRESTView(JSONRESTView):
42
40
    '''REST view of a user's attempts at an exercise.'''
43
41
 
58
56
    @require_permission('edit')
59
57
    def PUT(self, req, data):
60
58
        """ Tests the given submission """
61
 
        # Start a console to run the tests on
62
 
        jail_path = os.path.join(req.config['paths']['jails']['mounts'],
63
 
                                 req.user.login)
64
 
        working_dir = os.path.join("/home", req.user.login)
65
 
        cons = ivle.console.Console(req.config, req.user.unixid, jail_path,
66
 
                                    working_dir)
67
 
 
68
 
        # Parse the file into a exercise object using the test suite
69
 
        exercise_obj = ivle.webapp.tutorial.test.parse_exercise_file(
70
 
                            self.context.worksheet_exercise.exercise, cons)
71
 
 
72
 
        # Run the test cases. Get the result back as a JSONable object.
73
 
        # Return it.
74
 
        test_results = exercise_obj.run_tests(data['code'])
75
 
 
76
 
        # Close the console
77
 
        cons.close()
 
59
        test_results = ivle.worksheet.utils.test_exercise_submission(
 
60
            req.config, req.user, self.context.worksheet_exercise.exercise,
 
61
            data['code'])
78
62
 
79
63
        attempt = ivle.database.ExerciseAttempt(user=req.user,
80
64
            worksheet_exercise = self.context.worksheet_exercise,
131
115
        return {"result": "ok"}
132
116
 
133
117
 
134
 
# Note that this is the view of an existing worksheet. Creation is handled
135
 
# by OfferingRESTView (as offerings have worksheets)
136
 
class WorksheetRESTView(JSONRESTView):
137
 
    """View used to update a worksheet."""
138
 
 
139
 
    @named_operation('edit')
140
 
    def save(self, req, name, assessable, data, format):
141
 
        """Takes worksheet data and saves it."""
142
 
        self.context.name = unicode(name)
143
 
        self.context.assessable = self.convert_bool(assessable)
144
 
        self.context.data = unicode(data)
145
 
        self.context.format = unicode(format)
146
 
        ivle.worksheet.utils.update_exerciselist(self.context)
147
 
        
148
 
        return {"result": "ok"}
149
 
 
150
118
class WorksheetsRESTView(JSONRESTView):
151
119
    """View used to update and create Worksheets."""
152
120
 
153
 
    @named_operation('edit')
154
 
    def add_worksheet(self, req, identifier, name, assessable, data, format):
155
 
        """Takes worksheet data and adds it."""
156
 
        
157
 
        new_worksheet = Worksheet()
158
 
        new_worksheet.seq_no = self.context.worksheets.count()
159
 
        # Setting new_worksheet.offering implicitly adds new_worksheet,
160
 
        # hence worksheets.count MUST be called above it
161
 
        new_worksheet.offering = self.context
162
 
        new_worksheet.identifier = unicode(identifier)
163
 
        new_worksheet.name = unicode(name)
164
 
        new_worksheet.assessable = self.convert_bool(assessable)
165
 
        new_worksheet.data = unicode(data)
166
 
        new_worksheet.format = unicode(format)
167
 
        
168
 
        # This call is added for clarity, as the worksheet is implicitly added.        
169
 
        req.store.add(new_worksheet)
170
 
 
171
 
        ivle.worksheet.utils.update_exerciselist(new_worksheet)
172
 
 
173
 
        return {"result": "ok"}
174
 
 
175
 
    @named_operation('edit')
 
121
    @named_operation('edit_worksheets')
176
122
    def move_up(self, req, worksheetid):
177
123
        """Takes a list of worksheet-seq_no pairs and updates their 
178
124
        corresponding Worksheet objects to match."""
193
139
        
194
140
        return {'result': 'ok'}
195
141
 
196
 
    @named_operation('edit')
 
142
    @named_operation('edit_worksheets')
197
143
    def move_down(self, req, worksheetid):
198
144
        """Takes a list of worksheet-seq_no pairs and updates their 
199
145
        corresponding Worksheet objects to match."""