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
41
42
from ivle.database import Subject, Semester, Offering, Enrolment, User,\
42
43
ProjectSet, Project, ProjectSubmission
101
101
permission = 'edit'
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()
115
103
def filter(self, stream, ctx):
116
104
return stream | HTMLFormFiller(data=ctx['data'])
140
128
template = 'templates/offering_projects.html'
141
129
permission = 'edit'
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()
155
132
def project_url(self, projectset, project):
156
133
return "/subjects/%s/%s/%s/+projects/%s" % (
207
184
permission = "edit"
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:
223
187
def build_subversion_url(self, svnroot, submission):
224
188
princ = submission.assessed.principal
247
211
ctx['project'] = self.context
248
212
ctx['user'] = req.user
214
class OfferingEnrolmentSet(object):
215
def __init__(self, offering):
216
self.offering = offering
218
def root_to_subject(root, name):
219
return root.store.find(Subject, short_name=name).one()
221
def subject_to_offering(subject, year, semester):
222
return subject.offering_for_semester(year, semester)
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()
229
def offering_to_projectset(offering, name):
230
return Store.of(offering).find(ProjectSet,
231
ProjectSet.offering == offering).one()
250
233
class Plugin(ViewPlugin, MediaPlugin):
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),
257
('api/subjects/:subject/:year/:semester/+projectsets/+new',
259
('api/subjects/:subject/:year/:semester/+projectsets/:projectset/+projects/+new',
261
('api/subjects/:subject/:year/:semester/+projects/:project',
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),
240
views = [(ApplicationRoot, ('subjects', '+index'), SubjectsView),
241
(Offering, ('+enrolments', '+new'), EnrolView),
242
(Offering, ('+projects', '+index'), OfferingProjectsView),
243
(Project, '+index', ProjectView),
245
(Offering, ('+projectsets', '+new'), OfferingRESTView, 'api'),
246
(ProjectSet, ('+projects', '+new'), ProjectSetRESTView, 'api'),
247
(Project, '+index', ProjectRESTView, 'api'),
267
251
('subjects', 'Subjects',