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

« back to all changes in this revision

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

Clean up ivle.webapp.tutorial.service.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
# IVLE - Informatics Virtual Learning Environment
2
 
# Copyright (C) 2007-2008 The University of Melbourne
 
2
# Copyright (C) 2007-2009 The University of Melbourne
3
3
#
4
4
# This program is free software; you can redistribute it and/or modify
5
5
# it under the terms of the GNU General Public License as published by
15
15
# along with this program; if not, write to the Free Software
16
16
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
17
17
 
18
 
# Module: TutorialService
19
 
# Author: Matt Giuca
20
 
# Date:   25/1/2008
21
 
 
22
 
# Provides the AJAX backend for the tutorial application.
23
 
# This allows several actions to be performed on the code the student has
24
 
# typed into one of the exercise boxes.
25
 
 
26
 
# Calling syntax
27
 
# Path must be empty.
28
 
# The arguments determine what is to be done on this file.
29
 
 
30
 
# "action". One of the tutorialservice actions.
31
 
# "exercise" - The path to a exercise file (including the .xml extension),
32
 
#              relative to the subjects base directory.
33
 
# action "save" or "test" (POST only):
34
 
#   "code" - Full text of the student's code being submitted.
35
 
# action "getattempts": No arguments. Returns a list of
36
 
#   {'date': 'formatted_date', 'complete': bool} dicts.
37
 
# action "getattempt":
38
 
#   "date" - Formatted date. Gets most recent attempt before (and including)
39
 
#   that date.
40
 
#   Returns JSON string containing code, or null.
41
 
 
42
 
# Returns a JSON response string indicating the results.
 
18
# Author: Matt Giuca, Nick Chadwick
 
19
 
 
20
'''AJAX backend for the tutorial application.'''
43
21
 
44
22
import os
45
 
import time
46
23
import datetime
47
24
 
48
 
import cjson
49
 
 
50
 
from ivle import util
51
 
from ivle import console
 
25
import ivle.util
 
26
import ivle.console
52
27
import ivle.database
53
28
import ivle.worksheet
54
29
import ivle.conf
55
 
import ivle.webapp.tutorial.test # XXX: Really .test, not real test.
 
30
import ivle.webapp.tutorial.test
56
31
 
57
 
from ivle.webapp.base.rest import JSONRESTView
58
 
import ivle.database
59
 
from ivle.webapp.base.rest import named_operation
 
32
from ivle.webapp.base.rest import JSONRESTView, named_operation
60
33
 
61
34
# If True, getattempts or getattempt will allow browsing of inactive/disabled
62
35
# attempts. If False, will not allow this.
66
39
 
67
40
 
68
41
class AttemptsRESTView(JSONRESTView):
69
 
    '''
70
 
    Class to return a list of attempts for a given exercise, or add an Attempt
71
 
    '''
 
42
    '''REST view of a user's attempts at an exercise.'''
72
43
    def GET(self, req):
73
44
        """Handles a GET Attempts action."""
74
45
        exercise = ivle.database.Exercise.get_by_name(req.store, 
81
52
        time_fmt = lambda dt: datetime.datetime.strftime(dt, TIMESTAMP_FORMAT)
82
53
        attempts = [{'date': time_fmt(a.date), 'complete': a.complete}
83
54
                for a in attempts]
84
 
                
 
55
 
85
56
        return attempts
86
 
        
 
57
 
 
58
 
87
59
    def PUT(self, req, data):
88
60
        ''' Tests the given submission '''
89
 
        exercisefile = util.open_exercise_file(self.exercise)
 
61
        exercisefile = ivle.util.open_exercise_file(self.exercise)
90
62
        if exercisefile is None:
91
63
            req.throw_error(req.HTTP_NOT_FOUND,
92
64
                "The exercise was not found.")
94
66
        # Start a console to run the tests on
95
67
        jail_path = os.path.join(ivle.conf.jail_base, req.user.login)
96
68
        working_dir = os.path.join("/home", req.user.login)
97
 
        cons = console.Console(req.user.unixid, jail_path, working_dir)
 
69
        cons = ivle.console.Console(req.user.unixid, jail_path, working_dir)
98
70
 
99
71
        # Parse the file into a exercise object using the test suite
100
72
        exercise_obj = ivle.webapp.tutorial.test.parse_exercise_file(
119
91
                                                text=unicode(data['code']))
120
92
 
121
93
        req.store.add(attempt)
122
 
        req.store.commit()
 
94
 
123
95
        # Query the DB to get an updated score on whether or not this problem
124
96
        # has EVER been completed (may be different from "passed", if it has
125
97
        # been completed before), and the total number of attempts.
129
101
        test_results["attempts"] = attempts
130
102
 
131
103
        return test_results
132
 
        
 
104
 
133
105
 
134
106
class AttemptRESTView(JSONRESTView):
135
 
    '''
136
 
    View used to extract the data of a specified attempt
137
 
    '''
138
 
    
 
107
    '''REST view of an exercise attempt.'''
 
108
 
139
109
    def GET(self, req):
140
110
        # Get an actual date object, rather than a string
141
111
        date = datetime.datetime.strptime(self.date, TIMESTAMP_FORMAT)
142
 
        
 
112
 
143
113
        exercise = ivle.database.Exercise.get_by_name(req.store, self.exercise)
144
114
        attempt = ivle.worksheet.get_exercise_attempt(req.store, req.user,
145
115
            exercise, as_of=date, allow_inactive=HISTORY_ALLOW_INACTIVE)
147
117
            attempt = attempt.text
148
118
        # attempt may be None; will write "null"
149
119
        return {'code': attempt}
150
 
        
 
120
 
 
121
 
151
122
class ExerciseRESTView(JSONRESTView):
152
 
    '''
153
 
    Handles a save action. This saves the user's code without executing it.
154
 
    '''
 
123
    '''REST view of an exercise.'''
155
124
    @named_operation
156
125
    def save(self, req, text):
157
126
        # Need to open JUST so we know this is a real exercise.
158
127
        # (This avoids users submitting code for bogus exercises).
159
 
        exercisefile = util.open_exercise_file(self.exercise)
 
128
        exercisefile = ivle.util.open_exercise_file(self.exercise)
160
129
        if exercisefile is None:
161
130
            req.throw_error(req.HTTP_NOT_FOUND,
162
131
                "The exercise was not found.")
165
134
        exercise = ivle.database.Exercise.get_by_name(req.store, self.exercise)
166
135
        ivle.worksheet.save_exercise(req.store, req.user, exercise,
167
136
                                     unicode(text), datetime.datetime.now())
168
 
        req.store.commit()
169
137
        return {"result": "ok"}