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

« back to all changes in this revision

Viewing changes to ivle/webapp/admin/subject.py

  • Committer: William Grant
  • Date: 2009-07-05 03:17:19 UTC
  • mto: (1294.4.2 ui-the-third)
  • mto: This revision was merged to the branch mainline in revision 1353.
  • Revision ID: grantw@unimelb.edu.au-20090705031719-5hl9df990of50nly
Add annotated route function support to ivle.dispatch.

Show diffs side-by-side

added added

removed removed

Lines of Context:
28
28
import urlparse
29
29
import cgi
30
30
 
31
 
from storm.locals import Desc
 
31
from storm.locals import Desc, Store
32
32
import genshi
33
33
from genshi.filters import HTMLFormFiller
34
34
from genshi.template import Context, TemplateLoader
37
37
from ivle.webapp.base.xhtml import XHTMLView
38
38
from ivle.webapp.base.plugins import ViewPlugin, MediaPlugin
39
39
from ivle.webapp.errors import NotFound
 
40
from ivle.webapp import ApplicationRoot
40
41
 
41
42
from ivle.database import Subject, Semester, Offering, Enrolment, User,\
42
43
                          ProjectSet, Project, ProjectSubmission
47
48
                                             ProjectRESTView
48
49
from ivle.webapp.admin.offeringservice import OfferingRESTView
49
50
 
50
 
 
51
51
class SubjectsView(XHTMLView):
52
52
    '''The view of the list of subjects.'''
53
53
    template = 'templates/subjects.html'
100
100
    tab = 'subjects'
101
101
    permission = 'edit'
102
102
 
103
 
    def __init__(self, req, subject, year, semester):
104
 
        """Find the given offering by subject, year and semester."""
105
 
        self.context = req.store.find(Offering,
106
 
            Offering.subject_id == Subject.id,
107
 
            Subject.short_name == subject,
108
 
            Offering.semester_id == Semester.id,
109
 
            Semester.year == year,
110
 
            Semester.semester == semester).one()
111
 
 
112
 
        if not self.context:
113
 
            raise NotFound()
114
 
 
115
103
    def filter(self, stream, ctx):
116
104
        return stream | HTMLFormFiller(data=ctx['data'])
117
105
 
140
128
    template = 'templates/offering_projects.html'
141
129
    permission = 'edit'
142
130
    tab = 'subjects'
143
 
    
144
 
    def __init__(self, req, subject, year, semester):
145
 
        self.context = req.store.find(Offering,
146
 
            Offering.subject_id == Subject.id,
147
 
            Subject.short_name == subject,
148
 
            Offering.semester_id == Semester.id,
149
 
            Semester.year == year,
150
 
            Semester.semester == semester).one()
151
 
 
152
 
        if not self.context:
153
 
            raise NotFound()
154
131
 
155
132
    def project_url(self, projectset, project):
156
133
        return "/subjects/%s/%s/%s/+projects/%s" % (
207
184
    permission = "edit"
208
185
    tab = 'subjects'
209
186
 
210
 
    def __init__(self, req, subject, year, semester, project):
211
 
        self.context = req.store.find(Project,
212
 
                Project.short_name == project,
213
 
                Project.project_set_id == ProjectSet.id,
214
 
                ProjectSet.offering_id == Offering.id,
215
 
                Offering.semester_id == Semester.id,
216
 
                Semester.year == year,
217
 
                Semester.semester == semester,
218
 
                Offering.subject_id == Subject.id,
219
 
                Subject.short_name == subject).one()
220
 
        if self.context is None:
221
 
            raise NotFound()
222
 
 
223
187
    def build_subversion_url(self, svnroot, submission):
224
188
        princ = submission.assessed.principal
225
189
 
247
211
        ctx['project'] = self.context
248
212
        ctx['user'] = req.user
249
213
 
 
214
class OfferingEnrolmentSet(object):
 
215
    def __init__(self, offering):
 
216
        self.offering = offering
 
217
 
 
218
def root_to_subject(root, name):
 
219
    return root.store.find(Subject, short_name=name).one()
 
220
 
 
221
def subject_to_offering(subject, year, semester):
 
222
    return subject.offering_for_semester(year, semester)
 
223
 
 
224
def offering_to_project(offering, name):
 
225
    return Store.of(offering).find(Project,
 
226
                                   Project.project_set_id == ProjectSet.id,
 
227
                                   ProjectSet.offering == offering).one()
 
228
 
 
229
def offering_to_projectset(offering, name):
 
230
    return Store.of(offering).find(ProjectSet,
 
231
                                   ProjectSet.offering == offering).one()
 
232
 
250
233
class Plugin(ViewPlugin, MediaPlugin):
251
 
    urls = [
252
 
        ('subjects/', SubjectsView),
253
 
        ('subjects/:subject/:year/:semester/+enrolments/+new', EnrolView),
254
 
        ('subjects/:subject/:year/:semester/+projects', OfferingProjectsView),
255
 
        ('subjects/:subject/:year/:semester/+projects/:project', ProjectView),
256
 
        #API Views
257
 
        ('api/subjects/:subject/:year/:semester/+projectsets/+new',
258
 
            OfferingRESTView),
259
 
        ('api/subjects/:subject/:year/:semester/+projectsets/:projectset/+projects/+new',
260
 
            ProjectSetRESTView),
261
 
        ('api/subjects/:subject/:year/:semester/+projects/:project', 
262
 
            ProjectRESTView),
263
 
 
264
 
    ]
 
234
    forward_routes = [(ApplicationRoot, 'subjects', root_to_subject, 1),
 
235
                      (Subject, None, subject_to_offering, 2),
 
236
                      (Offering, '+projects', offering_to_project, 1),
 
237
                      (Offering, '+projectsets', offering_to_projectset, 1),
 
238
                      ]
 
239
 
 
240
    views = [(ApplicationRoot, ('subjects', '+index'), SubjectsView),
 
241
             (Offering, ('+enrolments', '+new'), EnrolView),
 
242
             (Offering, ('+projects', '+index'), OfferingProjectsView),
 
243
             (Project, '+index', ProjectView),
 
244
 
 
245
             (Offering, ('+projectsets', '+new'), OfferingRESTView, 'api'),
 
246
             (ProjectSet, ('+projects', '+new'), ProjectSetRESTView, 'api'),
 
247
             (Project, '+index', ProjectRESTView, 'api'),
 
248
             ]
265
249
 
266
250
    tabs = [
267
251
        ('subjects', 'Subjects',