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

621 by mattgiuca
Added 2 new apps: home and subjects. Both fairly incomplete, just a basic
1
# IVLE
2
# Copyright (C) 2007-2008 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
# App: subjects
19
# Author: Matt Giuca
20
# Date: 29/2/2008
21
22
# This is an IVLE application.
23
# A sample / testing application for IVLE.
24
627 by mattgiuca
subjects: Now presents a top-level subjects menu (same as tutorials).
25
import os
26
import urllib
27
import cgi
28
1125 by William Grant
Rework ivle.webapp.admin.subjects#SubjectsView to split offerings nicely by
29
from storm.locals import Desc
1149 by William Grant
Allow tutors and lecturers to enrol people in their offerings.
30
from genshi.filters import HTMLFormFiller
31
import formencode
1125 by William Grant
Rework ivle.webapp.admin.subjects#SubjectsView to split offerings nicely by
32
1099.1.34 by William Grant
Split up ivle.webapp.base.views into ivle.webapp.base.{rest,xhtml}, as it was
33
from ivle.webapp.base.xhtml import XHTMLView
1099.1.115 by William Grant
Add tabs to the new framework. Move the app icons into the apps themselves.
34
from ivle.webapp.base.plugins import ViewPlugin, MediaPlugin
1099.1.20 by William Grant
ivle.webapp.admin.subject: Port www/apps/subjects to new framework.
35
from ivle.webapp.errors import NotFound
1149 by William Grant
Allow tutors and lecturers to enrol people in their offerings.
36
from ivle.database import Subject, Semester, Offering, Enrolment, User
1079 by William Grant
Merge setup-refactor branch. This completely breaks existing installations;
37
from ivle import util
621 by mattgiuca
Added 2 new apps: home and subjects. Both fairly incomplete, just a basic
38
1099.1.20 by William Grant
ivle.webapp.admin.subject: Port www/apps/subjects to new framework.
39
40
class SubjectsView(XHTMLView):
41
    '''The view of the list of subjects.'''
1099.1.35 by William Grant
ivle.webapp.base.xhtml#XHTMLView: Rename app_template to template (the things
42
    template = 'subjects.html'
1116 by William Grant
Move the old tutorial views into the 'subjects' tab, so they get the right
43
    tab = 'subjects'
1099.1.20 by William Grant
ivle.webapp.admin.subject: Port www/apps/subjects to new framework.
44
1099.1.110 by William Grant
Implement an authorization system in the new framework. This breaks the REST
45
    def authorize(self, req):
1138 by William Grant
SubjectsView now tells users if they have no enrolments.
46
        return req.user is not None
1099.1.110 by William Grant
Implement an authorization system in the new framework. This breaks the REST
47
1099.1.20 by William Grant
ivle.webapp.admin.subject: Port www/apps/subjects to new framework.
48
    def populate(self, req, ctx):
1139 by William Grant
Show group administration links on SubjectsView where privileges allow it.
49
        ctx['user'] = req.user
1125 by William Grant
Rework ivle.webapp.admin.subjects#SubjectsView to split offerings nicely by
50
        ctx['semesters'] = []
51
        for semester in req.store.find(Semester).order_by(Desc(Semester.year),
52
                                                     Desc(Semester.semester)):
53
            enrolments = semester.enrolments.find(user=req.user)
54
            if enrolments.count():
55
                ctx['semesters'].append((semester, enrolments))
1099.1.20 by William Grant
ivle.webapp.admin.subject: Port www/apps/subjects to new framework.
56
1149 by William Grant
Allow tutors and lecturers to enrol people in their offerings.
57
58
class UserValidator(formencode.FancyValidator):
59
    """A FormEncode validator that turns a username into a user.
60
61
    The state must have a 'store' attribute, which is the Storm store
62
    to use."""
63
    def _to_python(self, value, state):
64
        user = User.get_by_login(state.store, value)
65
        if user:
66
            return user
67
        else:
1150 by William Grant
Refuse a +enrol if the user is already enrolled. This stops overwriting
68
            raise formencode.Invalid('User does not exist', value, state)
69
70
71
class NoEnrolmentValidator(formencode.FancyValidator):
72
    """A FormEncode validator that ensures absence of an enrolment.
73
74
    The state must have an 'offering' attribute.
75
    """
76
    def _to_python(self, value, state):
77
        if state.offering.get_enrolment(value):
78
            raise formencode.Invalid('User already enrolled', value, state)
79
        return value
1149 by William Grant
Allow tutors and lecturers to enrol people in their offerings.
80
81
82
class EnrolSchema(formencode.Schema):
1150 by William Grant
Refuse a +enrol if the user is already enrolled. This stops overwriting
83
    user = formencode.All(NoEnrolmentValidator(), UserValidator())
1149 by William Grant
Allow tutors and lecturers to enrol people in their offerings.
84
85
86
class EnrolView(XHTMLView):
87
    """A form to enrol a user in an offering."""
88
    template = 'enrol.html'
89
    tab = 'subjects'
90
    permission = 'edit'
91
92
    def __init__(self, req, subject, year, semester):
93
        """Find the given offering by subject, year and semester."""
94
        self.context = req.store.find(Offering,
95
            Offering.subject_id == Subject.id,
96
            Subject.short_name == subject,
97
            Offering.semester_id == Semester.id,
98
            Semester.year == year,
99
            Semester.semester == semester).one()
100
101
        if not self.context:
102
            raise NotFound()
103
104
    def filter(self, stream, ctx):
105
        return stream | HTMLFormFiller(data=ctx['data'])
106
107
    def populate(self, req, ctx):
108
        if req.method == 'POST':
109
            data = dict(req.get_fieldstorage())
110
            try:
111
                validator = EnrolSchema()
1150 by William Grant
Refuse a +enrol if the user is already enrolled. This stops overwriting
112
                req.offering = self.context # XXX: Getting into state.
1149 by William Grant
Allow tutors and lecturers to enrol people in their offerings.
113
                data = validator.to_python(data, state=req)
114
                self.context.enrol(data['user'])
115
                req.store.commit()
116
                req.throw_redirect(req.uri)
117
            except formencode.Invalid, e:
118
                errors = e.unpack_errors()
119
        else:
120
            data = {}
121
            errors = {}
122
123
        ctx['data'] = data or {}
124
        ctx['offering'] = self.context
125
        ctx['errors'] = errors
126
127
1099.1.115 by William Grant
Add tabs to the new framework. Move the app icons into the apps themselves.
128
class Plugin(ViewPlugin, MediaPlugin):
1099.1.20 by William Grant
ivle.webapp.admin.subject: Port www/apps/subjects to new framework.
129
    urls = [
130
        ('subjects/', SubjectsView),
1149 by William Grant
Allow tutors and lecturers to enrol people in their offerings.
131
        ('subjects/:subject/:year/:semester/+enrolments/+new', EnrolView),
1099.1.20 by William Grant
ivle.webapp.admin.subject: Port www/apps/subjects to new framework.
132
    ]
1099.1.115 by William Grant
Add tabs to the new framework. Move the app icons into the apps themselves.
133
134
    tabs = [
1118 by matt.giuca
Rewrote tooltips for the four tabs visible by default.
135
        ('subjects', 'Subjects',
136
         'View subject content and complete worksheets',
137
         'subjects.png', 'subjects', 5)
1099.1.115 by William Grant
Add tabs to the new framework. Move the app icons into the apps themselves.
138
    ]
139
140
    media = 'subject-media'