29
from common import util
32
"""Handler for the Subjects application. Links to subject home pages."""
34
req.styles = ["media/subjects/subjects.css"]
36
handle_toplevel_menu(req)
38
handle_subject_page(req, req.path)
40
def handle_toplevel_menu(req):
41
# This is represented as a directory. Redirect and add a slash if it is
43
if req.uri[-1] != '/':
44
req.throw_redirect(req.uri + '/')
46
# Get list of subjects
47
# TODO: Fetch from DB. For now, just get directory listing
49
subjects = os.listdir(util.make_local_path(os.path.join('media',
52
req.throw_error(req.HTTP_INTERNAL_SERVER_ERROR,
53
"There are is no subject homepages directory.")
56
req.content_type = "text/html"
57
req.write_html_head_foot = True
58
req.write('<div id="ivle_padding">\n')
59
req.write("<h2>IVLE Subject Homepages</h2>\n")
60
req.write("<h2>Subjects</h2>\n<ul>\n")
61
for subject in subjects:
62
req.write(' <li><a href="%s">%s</a></li>\n'
63
% (urllib.quote(subject) + '/', cgi.escape(subject)))
67
def handle_subject_page(req, path):
68
req.content_type = "text/html"
69
req.write_html_head_foot = True # Have dispatch print head and foot
71
# Just make the iframe pointing to media/subjects
72
serve_loc = util.make_path(os.path.join('media', 'subjects', path))
73
req.write('<object class="fullscreen" type="text/html" \
74
data="%s"></iframe>'% urllib.quote(serve_loc))
29
from ivle.webapp.base.xhtml import XHTMLView
30
from ivle.webapp.base.plugins import BasePlugin
31
from ivle.webapp.errors import NotFound
32
from ivle.database import Subject
36
class SubjectsView(XHTMLView):
37
'''The view of the list of subjects.'''
38
template = 'subjects.html'
39
appname = 'subjects' # XXX
41
def populate(self, req, ctx):
42
req.styles = ["media/subjects/subjects.css"]
44
enrolled_subjects = req.user.subjects
45
unenrolled_subjects = [subject for subject in
46
req.store.find(Subject)
47
if subject not in enrolled_subjects]
49
ctx['enrolled_subjects'] = []
50
ctx['other_subjects'] = []
52
req.content_type = "text/html"
53
req.write_html_head_foot = True
55
for subject in enrolled_subjects:
57
new_subj['name'] = subject.name
58
new_subj['url'] = subject.url
59
ctx['enrolled_subjects'].append(new_subj)
61
if len(unenrolled_subjects) > 0:
62
for subject in unenrolled_subjects:
64
new_subj['name'] = subject.name
65
new_subj['url'] = subject.url
66
ctx['other_subjects'].append(new_subj)
69
class SubjectView(XHTMLView):
70
'''The view of a subject.'''
71
template = 'subject.html'
72
appname = 'subjects' # XXX
74
def __init__(self, req, subject, path):
75
self.subject = req.store.find(Subject, code=subject).one()
78
def populate(self, req, ctx):
79
if self.subject is None:
82
ctx['serve_loc'] = urllib.quote(util.make_path(os.path.join('media',
83
'subjects', self.subject.code, self.path)))
85
class Plugin(BasePlugin):
87
('subjects/', SubjectsView),
88
('subjects/:subject', SubjectView, {'path': ''}),
89
('subjects/:subject/*(path)', SubjectView),