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

« back to all changes in this revision

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

Created a new view for IVLE, allowing lecturers and tutors to 
administrate projects.

At the moment, this new view can add projectsets, and add projects.
It can also view the details of a project.

Show diffs side-by-side

added added

removed removed

Lines of Context:
27
27
import cgi
28
28
 
29
29
from storm.locals import Desc
 
30
import genshi
30
31
from genshi.filters import HTMLFormFiller
 
32
from genshi.template import Context, TemplateLoader
31
33
import formencode
32
34
 
33
35
from ivle.webapp.base.xhtml import XHTMLView
34
36
from ivle.webapp.base.plugins import ViewPlugin, MediaPlugin
35
37
from ivle.webapp.errors import NotFound
36
 
from ivle.database import Subject, Semester, Offering, Enrolment, User
 
38
from ivle.database import Subject, Semester, Offering, Enrolment, User,\
 
39
                          ProjectSet, Project
37
40
from ivle import util
38
41
 
 
42
from ivle.webapp.admin.projectservice import ProjectSetRESTView,\
 
43
                                             ProjectRESTView
 
44
from ivle.webapp.admin.offeringservice import OfferingRESTView
 
45
 
39
46
 
40
47
class SubjectsView(XHTMLView):
41
48
    '''The view of the list of subjects.'''
42
 
    template = 'subjects.html'
 
49
    template = 'templates/subjects.html'
43
50
    tab = 'subjects'
44
51
 
45
52
    def authorize(self, req):
85
92
 
86
93
class EnrolView(XHTMLView):
87
94
    """A form to enrol a user in an offering."""
88
 
    template = 'enrol.html'
 
95
    template = 'templates/enrol.html'
89
96
    tab = 'subjects'
90
97
    permission = 'edit'
91
98
 
126
133
 
127
134
class SubjectProjectSetView(XHTMLView):
128
135
    """View the ProjectSets for a subject."""
129
 
    template = 'subject_projects.html'
 
136
    template = 'templates/subject_projects.html'
130
137
    permission = 'edit'
131
138
    
132
139
    def __init__(self, req, subject, year, semester):
139
146
 
140
147
        if not self.context:
141
148
            raise NotFound()
 
149
 
 
150
    def project_url(self, projectset, project):
 
151
        return "/subjects/" + self.context.subject.short_name + "/" +\
 
152
                self.context.semester.year + "/" + \
 
153
                self.context.semester.semester + "/+projectsets/" +\
 
154
                str(projectset.id) + "/+projects/" + project.short_name
 
155
 
 
156
    def new_project_url(self, projectset):
 
157
        return "/api/subjects/" + self.context.subject.short_name + "/" +\
 
158
                self.context.semester.year + "/" + \
 
159
                self.context.semester.semester + "/+projectsets/" +\
 
160
                str(projectset.id) + "/+projects/+new"
142
161
    
143
162
    def populate(self, req, ctx):
144
163
        self.plugin_styles[Plugin] = ["project.css"]
 
164
        self.plugin_scripts[Plugin] = ["project.js"]
145
165
        ctx['offering'] = self.context
146
 
 
147
 
class ProjectSetView(XHTMLView):
 
166
        ctx['subject'] = self.context.subject.short_name
 
167
        ctx['year'] = self.context.semester.year
 
168
        ctx['semester'] = self.context.semester.semester
 
169
 
 
170
        ctx['projectsets'] = []
 
171
 
 
172
        #Open the projectset Fragment, and render it for inclusion
 
173
        #into the ProjectSets page
 
174
        #XXX: This could be a lot cleaner
 
175
        loader = genshi.template.TemplateLoader(".", auto_reload=True)
 
176
 
 
177
        set_fragment = os.path.join(os.path.dirname(__file__),
 
178
                "templates/projectset_fragment.html")
 
179
        project_fragment = os.path.join(os.path.dirname(__file__),
 
180
                "templates/project_fragment.html")
 
181
 
 
182
        for projectset in self.context.project_sets:
 
183
            settmpl = loader.load(set_fragment)
 
184
            setCtx = Context()
 
185
            setCtx['group_size'] = projectset.max_students_per_group
 
186
            setCtx['projectset_id'] = projectset.id
 
187
            setCtx['new_project_url'] = self.new_project_url(projectset)
 
188
            setCtx['projects'] = []
 
189
 
 
190
            for project in projectset.projects:
 
191
                projecttmpl = loader.load(project_fragment)
 
192
                projectCtx = Context()
 
193
                projectCtx['project'] = project
 
194
                projectCtx['project_url'] = self.project_url(projectset, project)
 
195
 
 
196
                setCtx['projects'].append(
 
197
                        projecttmpl.generate(projectCtx))
 
198
 
 
199
            ctx['projectsets'].append(settmpl.generate(setCtx))
 
200
 
 
201
 
 
202
class ProjectView(XHTMLView):
148
203
    """View the submissions for a ProjectSet"""
149
 
    template = 'projectsubmissions.html'
150
 
    permission = 'edit'
 
204
    template = "templates/project.html"
 
205
    permission = "edit"
 
206
 
 
207
    def __init__(self, req, subject, year, semester, projectset, project):
 
208
        self.context = req.store.find(Project,
 
209
                Project.short_name == project,
 
210
                Project.project_set_id == ProjectSet.id,
 
211
                ProjectSet.offering_id == Offering.id,
 
212
                Offering.semester_id == Semester.id,
 
213
                Semester.year == year,
 
214
                Semester.semester == semester,
 
215
                Offering.subject_id == Subject.id,
 
216
                Subject.short_name == subject).one()
 
217
        if self.context is None:
 
218
            raise NotFound()
 
219
 
 
220
    def populate(self, req, ctx):
 
221
        ctx['project'] = self.context
 
222
        ctx['assesseds'] = self.context.assesseds
 
223
 
151
224
 
152
225
class Plugin(ViewPlugin, MediaPlugin):
153
226
    urls = [
154
227
        ('subjects/', SubjectsView),
155
228
        ('subjects/:subject/:year/:semester/+enrolments/+new', EnrolView),
156
229
        ('subjects/:subject/:year/:semester/+projects', SubjectProjectSetView),
 
230
        ('subjects/:subject/:year/:semester/+projectsets/:projectset/+projects/:project', ProjectView),
157
231
        #API Views
158
 
        
 
232
        ('api/subjects/:subject/:year/:semester/+projectsets/+new',
 
233
            OfferingRESTView),
 
234
        ('api/subjects/:subject/:year/:semester/+projectsets/:projectset/+projects/+new',
 
235
            ProjectSetRESTView),
 
236
        ('api/subjects/:subject/:year/:semester/+projectsets/:projectset/+projects/:project', 
 
237
            ProjectRESTView),
 
238
 
159
239
    ]
160
240
 
161
241
    tabs = [