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

« back to all changes in this revision

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

  • Committer: Matt Giuca
  • Date: 2009-05-19 03:51:14 UTC
  • mto: This revision was merged to the branch mainline in revision 1322.
  • Revision ID: matt.giuca@gmail.com-20090519035114-4scjhvg7ai73anq0
doc/man: Renamed filesystem to directory hierarchy.

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, Store
 
31
from storm.locals import Desc
32
32
import genshi
33
33
from genshi.filters import HTMLFormFiller
34
34
from genshi.template import Context, TemplateLoader
36
36
 
37
37
from ivle.webapp.base.xhtml import XHTMLView
38
38
from ivle.webapp.base.plugins import ViewPlugin, MediaPlugin
39
 
from ivle.webapp import ApplicationRoot
 
39
from ivle.webapp.errors import NotFound
40
40
 
41
41
from ivle.database import Subject, Semester, Offering, Enrolment, User,\
42
42
                          ProjectSet, Project, ProjectSubmission
46
46
from ivle.webapp.admin.projectservice import ProjectSetRESTView,\
47
47
                                             ProjectRESTView
48
48
from ivle.webapp.admin.offeringservice import OfferingRESTView
49
 
from ivle.webapp.admin.publishing import (root_to_subject,
50
 
            subject_to_offering, offering_to_projectset, offering_to_project,
51
 
            subject_url, offering_url, projectset_url, project_url)
52
 
from ivle.webapp.admin.breadcrumbs import (SubjectBreadcrumb,
53
 
            OfferingBreadcrumb, UserBreadcrumb, ProjectBreadcrumb)
54
 
from ivle.webapp.groups import GroupsView
 
49
 
55
50
 
56
51
class SubjectsView(XHTMLView):
57
52
    '''The view of the list of subjects.'''
99
94
    user = formencode.All(NoEnrolmentValidator(), UserValidator())
100
95
 
101
96
 
102
 
class EnrolmentsView(XHTMLView):
103
 
    """A page which displays all users enrolled in an offering."""
104
 
    template = 'templates/enrolments.html'
105
 
    permission = 'edit'
106
 
 
107
 
    def populate(self, req, ctx):
108
 
        ctx['offering'] = self.context
109
 
 
110
97
class EnrolView(XHTMLView):
111
98
    """A form to enrol a user in an offering."""
112
99
    template = 'templates/enrol.html'
113
100
    tab = 'subjects'
114
101
    permission = 'edit'
115
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
 
116
115
    def filter(self, stream, ctx):
117
116
        return stream | HTMLFormFiller(data=ctx['data'])
118
117
 
141
140
    template = 'templates/offering_projects.html'
142
141
    permission = 'edit'
143
142
    tab = 'subjects'
144
 
 
 
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
 
 
155
    def project_url(self, projectset, project):
 
156
        return "/subjects/%s/%s/%s/+projects/%s" % (
 
157
                    self.context.subject.short_name,
 
158
                    self.context.semester.year,
 
159
                    self.context.semester.semester,
 
160
                    project.short_name
 
161
                    )
 
162
 
 
163
    def new_project_url(self, projectset):
 
164
        return "/api/subjects/" + self.context.subject.short_name + "/" +\
 
165
                self.context.semester.year + "/" + \
 
166
                self.context.semester.semester + "/+projectsets/" +\
 
167
                str(projectset.id) + "/+projects/+new"
 
168
    
145
169
    def populate(self, req, ctx):
146
170
        self.plugin_styles[Plugin] = ["project.css"]
147
171
        self.plugin_scripts[Plugin] = ["project.js"]
148
 
        ctx['req'] = req
149
172
        ctx['offering'] = self.context
150
173
        ctx['projectsets'] = []
151
 
        ctx['OfferingRESTView'] = OfferingRESTView
152
174
 
153
175
        #Open the projectset Fragment, and render it for inclusion
154
176
        #into the ProjectSets page
163
185
        for projectset in self.context.project_sets:
164
186
            settmpl = loader.load(set_fragment)
165
187
            setCtx = Context()
166
 
            setCtx['req'] = req
167
188
            setCtx['projectset'] = projectset
 
189
            setCtx['new_project_url'] = self.new_project_url(projectset)
168
190
            setCtx['projects'] = []
169
 
            setCtx['GroupsView'] = GroupsView
170
 
            setCtx['ProjectSetRESTView'] = ProjectSetRESTView
171
191
 
172
192
            for project in projectset.projects:
173
193
                projecttmpl = loader.load(project_fragment)
174
194
                projectCtx = Context()
175
 
                projectCtx['req'] = req
176
195
                projectCtx['project'] = project
 
196
                projectCtx['project_url'] = self.project_url(projectset, project)
177
197
 
178
198
                setCtx['projects'].append(
179
199
                        projecttmpl.generate(projectCtx))
187
207
    permission = "edit"
188
208
    tab = 'subjects'
189
209
 
 
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
 
190
223
    def build_subversion_url(self, svnroot, submission):
191
224
        princ = submission.assessed.principal
192
225
 
214
247
        ctx['project'] = self.context
215
248
        ctx['user'] = req.user
216
249
 
217
 
class OfferingEnrolmentSet(object):
218
 
    def __init__(self, offering):
219
 
        self.offering = offering
220
 
 
221
250
class Plugin(ViewPlugin, MediaPlugin):
222
 
    forward_routes = (root_to_subject, subject_to_offering,
223
 
                      offering_to_project, offering_to_projectset)
224
 
    reverse_routes = (subject_url, offering_url, projectset_url, project_url)
225
 
 
226
 
    views = [(ApplicationRoot, ('subjects', '+index'), SubjectsView),
227
 
             (Offering, ('+enrolments', '+index'), EnrolmentsView),
228
 
             (Offering, ('+enrolments', '+new'), EnrolView),
229
 
             (Offering, ('+projects', '+index'), OfferingProjectsView),
230
 
             (Project, '+index', ProjectView),
231
 
 
232
 
             (Offering, ('+projectsets', '+new'), OfferingRESTView, 'api'),
233
 
             (ProjectSet, ('+projects', '+new'), ProjectSetRESTView, 'api'),
234
 
             (Project, '+index', ProjectRESTView, 'api'),
235
 
             ]
236
 
 
237
 
    breadcrumbs = {Subject: SubjectBreadcrumb,
238
 
                   Offering: OfferingBreadcrumb,
239
 
                   User: UserBreadcrumb,
240
 
                   Project: ProjectBreadcrumb,
241
 
                   }
 
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
    ]
242
265
 
243
266
    tabs = [
244
267
        ('subjects', 'Subjects',