46
46
from ivle.webapp.errors import NotFound, Forbidden
47
47
from ivle.webapp.tutorial.rst import rst as rstfunc
48
48
from ivle.webapp.tutorial.service import AttemptsRESTView, AttemptRESTView, \
49
ExerciseRESTView, WorksheetRESTView
49
ExerciseRESTView, WorksheetRESTView, OfferingRESTView
52
52
"""This class represents a worksheet and a particular students progress
377
377
worksheets are actually displayed on the page."""
380
class WorksheetAdminView(XHTMLView):
380
class WorksheetEditView(XHTMLView):
381
381
"""The admin view for an offering.
383
383
This view is designed to replace worksheets.xml, turning them instead
384
384
into XML directly from RST."""
385
385
permission = "edit"
386
template = "worksheet_admin.html"
387
appname = "Worksheet Admin"
386
template = "worksheet_edit.html"
387
appname = "Edit Worksheet"
389
def __init__(self, req, subject, year, semester, worksheet):
389
def __init__(self, req, **kwargs):
391
subject = kwargs['subject']
392
year = kwargs['year']
393
semester = kwargs['semester']
394
worksheet = kwargs['worksheet']
390
395
self.context = req.store.find(DBWorksheet,
391
396
DBWorksheet.identifier == worksheet,
392
397
DBWorksheet.offering_id == Offering.id,
416
422
ctx['semester'] = self.semester
425
class WorksheetAddView(XHTMLView):
426
"""This view allows a user to add a worksheet"""
428
template = "worksheet_add.html"
429
appname = "Add Worksheet"
431
def __init__(self, req, subject, year, semester):
432
self.context = req.store.find(Offering,
433
Offering.semester_id == Semester.id,
434
Semester.year == year,
435
Semester.semester == semester,
436
Offering.subject_id == Subject.id,
437
Subject.code == subject
440
self.subject = subject
442
self.semester = semester
444
if self.context is None:
447
def populate(self, req, ctx):
448
self.plugin_styles[Plugin] = ["tutorial_admin.css"]
449
self.plugin_scripts[Plugin] = ['tutorial_admin.js']
451
ctx['subject'] = self.subject
452
ctx['year'] = self.year
453
ctx['semester'] = self.semester
455
#XXX: Get the list of formats from somewhere else
456
ctx['formats'] = ['xml', 'rst']
419
459
class Plugin(ViewPlugin, MediaPlugin):
421
461
('subjects/:subject/:year/:semester/+worksheets', OfferingView),
422
('subjects/:subject/:year/:semester/+worksheets/+edit', OfferingAdminView),
462
('subjects/:subject/:year/:semester/+worksheets/+add', WorksheetAddView),
423
463
('subjects/:subject/+worksheets/+media/*(path)', SubjectMediaView),
424
464
('subjects/:subject/:year/:semester/+worksheets/:worksheet', WorksheetView),
425
('subjects/:subject/:year/:semester/+worksheets/:worksheet/+edit', WorksheetAdminView),
465
('subjects/:subject/:year/:semester/+worksheets/:worksheet/+edit', WorksheetEditView),
466
('api/subjects/:subject/:year/:semester/+worksheets', OfferingRESTView),
426
467
('api/subjects/:subject/:year/:semester/+worksheets/:worksheet/*exercise/'
427
468
'+attempts/:username', AttemptsRESTView),
428
469
('api/subjects/:subject/:year/:semester/+worksheets/:worksheet/*exercise/'