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

« back to all changes in this revision

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

  • Committer: mattgiuca
  • Date: 2008-01-12 15:35:53 UTC
  • Revision ID: svn-v3-trunk0:2b9c9e99-6f39-0410-b283-7f802c844ae2:trunk:201
Added "test" directory.
Added make_date_test.py, a short script I wrote to test the date format
algorithm committed in the previous revision.

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, Nick Chadwick
19
 
 
20
 
'''AJAX backend for the tutorial application.'''
21
 
 
22
 
import os
23
 
import datetime
24
 
 
25
 
import ivle.util
26
 
import ivle.console
27
 
import ivle.database
28
 
import ivle.worksheet
29
 
import ivle.conf
30
 
import ivle.webapp.tutorial.test
31
 
 
32
 
from ivle.webapp.base.rest import JSONRESTView, named_operation
33
 
from ivle.webapp.errors import NotFound
34
 
 
35
 
# If True, getattempts or getattempt will allow browsing of inactive/disabled
36
 
# attempts. If False, will not allow this.
37
 
HISTORY_ALLOW_INACTIVE = False
38
 
 
39
 
TIMESTAMP_FORMAT = '%Y-%m-%d %H:%M:%S'
40
 
 
41
 
 
42
 
class AttemptsRESTView(JSONRESTView):
43
 
    '''REST view of a user's attempts at an exercise.'''
44
 
    def __init__(self, req, subject, worksheet, exercise, username):
45
 
        # TODO: Find exercise within worksheet.
46
 
        self.user = ivle.database.User.get_by_login(req.store, username)
47
 
        if self.user is None:
48
 
            raise NotFound()
49
 
        self.exercise = exercise
50
 
 
51
 
    def GET(self, req):
52
 
        """Handles a GET Attempts action."""
53
 
        exercise = ivle.database.Exercise.get_by_name(req.store, 
54
 
                                                        self.exercise)
55
 
 
56
 
        attempts = ivle.worksheet.get_exercise_attempts(req.store, self.user,
57
 
                            exercise, allow_inactive=HISTORY_ALLOW_INACTIVE)
58
 
        # attempts is a list of ExerciseAttempt objects. Convert to dictionaries
59
 
        time_fmt = lambda dt: datetime.datetime.strftime(dt, TIMESTAMP_FORMAT)
60
 
        attempts = [{'date': time_fmt(a.date), 'complete': a.complete}
61
 
                for a in attempts]
62
 
 
63
 
        return attempts
64
 
 
65
 
 
66
 
    def PUT(self, req, data):
67
 
        ''' Tests the given submission '''
68
 
        exercisefile = ivle.util.open_exercise_file(self.exercise)
69
 
        if exercisefile is None:
70
 
            raise NotFound()
71
 
 
72
 
        # Start a console to run the tests on
73
 
        jail_path = os.path.join(ivle.conf.jail_base, req.user.login)
74
 
        working_dir = os.path.join("/home", req.user.login)
75
 
        cons = ivle.console.Console(req.user.unixid, jail_path, working_dir)
76
 
 
77
 
        # Parse the file into a exercise object using the test suite
78
 
        exercise_obj = ivle.webapp.tutorial.test.parse_exercise_file(
79
 
                                                            exercisefile, cons)
80
 
        exercisefile.close()
81
 
 
82
 
        # Run the test cases. Get the result back as a JSONable object.
83
 
        # Return it.
84
 
        test_results = exercise_obj.run_tests(data['code'])
85
 
 
86
 
        # Close the console
87
 
        cons.close()
88
 
 
89
 
        # Get the Exercise from the database
90
 
        exercise = ivle.database.Exercise.get_by_name(req.store, self.exercise)
91
 
 
92
 
        attempt = ivle.database.ExerciseAttempt(user=req.user,
93
 
                                                exercise=exercise,
94
 
                                                date=datetime.datetime.now(),
95
 
                                                complete=test_results['passed'],
96
 
                                                # XXX
97
 
                                                text=unicode(data['code']))
98
 
 
99
 
        req.store.add(attempt)
100
 
 
101
 
        # Query the DB to get an updated score on whether or not this problem
102
 
        # has EVER been completed (may be different from "passed", if it has
103
 
        # been completed before), and the total number of attempts.
104
 
        completed, attempts = ivle.worksheet.get_exercise_status(req.store,
105
 
            req.user, exercise)
106
 
        test_results["completed"] = completed
107
 
        test_results["attempts"] = attempts
108
 
 
109
 
        return test_results
110
 
 
111
 
 
112
 
class AttemptRESTView(JSONRESTView):
113
 
    '''REST view of an exercise attempt.'''
114
 
 
115
 
    def __init__(self, req, subject, worksheet, exercise, username, date):
116
 
        # TODO: Find exercise within worksheet.
117
 
        user = ivle.database.User.get_by_login(req.store, username)
118
 
        if user is None:
119
 
            raise NotFound()
120
 
 
121
 
        try:
122
 
            date = datetime.datetime.strptime(date, TIMESTAMP_FORMAT)
123
 
        except ValueError:
124
 
            raise NotFound()
125
 
 
126
 
        exercise = ivle.database.Exercise.get_by_name(req.store, exercise)
127
 
        attempt = ivle.worksheet.get_exercise_attempt(req.store, user,
128
 
            exercise, as_of=date, allow_inactive=HISTORY_ALLOW_INACTIVE)
129
 
 
130
 
        if attempt is None:
131
 
            raise NotFound()
132
 
 
133
 
        self.context = attempt
134
 
 
135
 
    def GET(self, req):
136
 
        return {'code': self.context.text}
137
 
 
138
 
 
139
 
class ExerciseRESTView(JSONRESTView):
140
 
    '''REST view of an exercise.'''
141
 
    @named_operation
142
 
    def save(self, req, text):
143
 
        # Need to open JUST so we know this is a real exercise.
144
 
        # (This avoids users submitting code for bogus exercises).
145
 
        exercisefile = ivle.util.open_exercise_file(self.exercise)
146
 
        if exercisefile is None:
147
 
            raise NotFound()
148
 
        exercisefile.close()
149
 
 
150
 
        exercise = ivle.database.Exercise.get_by_name(req.store, self.exercise)
151
 
        ivle.worksheet.save_exercise(req.store, req.user, exercise,
152
 
                                     unicode(text), datetime.datetime.now())
153
 
        return {"result": "ok"}