def gradesMain(self, courseid): ctx = {'course': CourseHelper.fetch_course(courseid)} if ctx['course'] == None: return whiteboard.template.render('error.html', context_dict={'error': 'The specified course (ID %s) does not exist' % courseid}) return whiteboard.template.render('grades.html', context_dict = ctx)
def assignmentResponse_POST(self, courseid, assignmentid, upload): if CourseHelper.fetch_course(courseid) == None: return whiteboard.template.render( "error.html", context_dict={"error": "The specified course does not exist"} ) path = "files/%s/responses/" % courseid sql = whiteboard.sqltool.SqlTool() try: sql.query_text = "INSERT INTO Documents (name, path, courseid, assignmentid, type) VALUES (@name, @path, @courseid, @assignmentid, 'response')" sql.addParameter("@name", "response_%s_%s" % (cherrypy.session["username"], assignmentid)) sql.addParameter("@path", path) sql.addParameter("@courseid", courseid) sql.addParameter("@assignmentid", assignmentid) document_id = sql.executeWithId() except: sql.rollback = True raise if not os.path.exists(path): os.makedirs(path) with open(path + str(document_id), "wb") as output: while True: data = upload.file.read(8192) if not data: break output.write(data) return "Response submitted"
def addDocument_POST(self, courseid, name, upload, parent): if CourseHelper.fetch_course(courseid) == None: return whiteboard.template.render('error.html', context_dict = {'error': 'The specified course does not exist'}) path = "files/%s/" % courseid sql = whiteboard.sqltool.SqlTool() try: sql.query_text = "INSERT INTO Documents (name, path, courseid, parent, type) VALUES (@name, @path, @courseid, @parent, 'document')" sql.addParameter("@name", name) sql.addParameter("@path", path) sql.addParameter("@courseid", courseid) if int(parent) == 0: sql.addParameter("@parent", None) else: sql.addParameter("@parent", parent) document_id = sql.executeWithId() except: sql.rollback = True raise if not os.path.exists(path): os.makedirs(path) with open(path + str(document_id), "wb") as permanent: while True: data = upload.file.read(8192) if not data: break permanent.write(data) raise cherrypy.HTTPRedirect('documents/')
def bulkRoleAdd(self, courseid): ctx = {'course': CourseHelper.fetch_course(courseid)} if ctx['course'] == None: errorctx = {'error': 'The specified course (ID %s) does not exist' % courseid} return whiteboard.template.render('error.html', context_dict=errorctx) return whiteboard.template.render('bulkroleadd.html', context_dict=ctx)
def createAssignment(self, courseid): ctx = {"course": CourseHelper.fetch_course(courseid)} if ctx["course"] == None: return whiteboard.template.render( "error.html", context_dict={"error": "The specified course does not exist"} ) return whiteboard.template.render("createassignment.html", context_dict=ctx)
def addAnnouncement(self, courseid): """Render announcement creation page""" ctx = {'course': CourseHelper.fetch_course(courseid)} if ctx['course'] == None: errorctx = {'error': 'The specified course (ID %s) does not exist' % courseid} return whiteboard.template.render('error.html', context_dict=errorctx) return whiteboard.template.render('courseaddannouncement.html', context_dict = ctx)
def courseRoleAdmin(self, courseid): """Render the roleadmin view""" ctx = {'course': CourseHelper.fetch_course(courseid)} if ctx['course'] == None: errorctx = {'error': 'The specified course (ID %s) does not exist' % courseid} return whiteboard.template.render('error.html', context_dict=errorctx) return whiteboard.template.render('courseroleadmin.html', context_dict = ctx)
def documentsMain(self, courseid, subfolder): ctx = {'course': CourseHelper.fetch_course(courseid)} if subfolder == '/': folder = None else: folder = subfolder.split('/')[1] sql = whiteboard.sqltool.SqlTool() try: if folder: sql.query_text = "SELECT * FROM Documents WHERE courseid = @courseid AND type IN ('document', 'folder') AND parent = @parent" sql.addParameter("@parent", folder) else: sql.query_text = "SELECT * FROM Documents WHERE courseid = @courseid AND type IN ('document', 'folder') AND parent IS NULL" sql.addParameter("@courseid", courseid) with sql.execute() as datareader: ctx['folder_contents'] = [row for row in datareader] if folder != None: sql.query_text = """ WITH RECURSIVE recursive_folders AS ( SELECT *, 0 AS level, ARRAY[documentid] AS trail FROM Documents WHERE type = 'folder' AND parent IS NULL UNION ALL SELECT D.*, level + 1, F.trail || D.documentid AS trail FROM Documents D JOIN recursive_folders F ON D.parent = F.documentid WHERE D.type = 'folder' ) SELECT * FROM Documents WHERE ARRAY[documentid] <@ ( SELECT trail FROM recursive_folders WHERE courseid = @courseid AND trail[array_upper(trail, 1)] = @parent ) """ sql.addParameter("@courseid", courseid) sql.addParameter("@parent", folder) with sql.execute() as datareader: ctx['parent_folders'] = [row for row in datareader] else: ctx['parent_folders'] = [] except: sql.rollback = True raise return whiteboard.template.render('documents.html', context_dict=ctx)
def courseMain(self, courseid): """Serves main page for a course""" ctx = {} ctx['course'] = CourseHelper.fetch_course(courseid) if ctx['course'] == None: errorctx = {'error': 'The specified course (ID %s) does not exist' % courseid} return whiteboard.template.render('error.html', context_dict=errorctx) ctx['announcements'] = AnnouncementHelper.fetch_announcements_for_course(courseid) return whiteboard.template.render('course.html', context_dict=ctx)
def assignmentResponse(self, courseid, assignmentid): ctx = { "course": CourseHelper.fetch_course(courseid), "assignment": AssignmentHelper.fetch_assignment(assignmentid), } if ctx["course"] == None: return whiteboard.template.render( "error.html", context_dict={"error": "The specified course does not exist"} ) if ctx["assignment"] == None: return whiteboard.template.render( "error.html", context_dict={"error": "The specified assignment does not exist"} ) return whiteboard.template.render("submitresponse.html", context_dict=ctx)
def createFolder_POST(self, courseid, name, parent): if CourseHelper.fetch_course(courseid) == None: return whiteboard.template.render('error.html', context_dict = {'error': 'The specified course does not exist'}) sql = whiteboard.sqltool.SqlTool() try: sql.query_text = "INSERT INTO Documents (name, courseid, parent, type) VALUES (@name, @courseid, @parent, 'folder')" sql.addParameter("@name", name) sql.addParameter("@courseid", courseid) if int(parent) == 0: sql.addParameter("@parent", None) else: sql.addParameter("@parent", parent) sql.execute() except: sql.rollback = True raise raise cherrypy.HTTPRedirect('documents/')
def assignmentsMain(self, courseid): ctx = {"course": CourseHelper.fetch_course(courseid)} if ctx["course"] == None: return whiteboard.template.render( "error.html", context_dict={"error": "The specified course does not exist"} ) ctx["assignments"] = [] sql = whiteboard.sqltool.SqlTool() sql.query_text = """SELECT COALESCE(A.assignmentid, D.assignmentid) AS assignmentid, title, due, documentid, points FROM Assignments A LEFT OUTER JOIN ( SELECT documentid, assignmentid FROM Documents WHERE type = 'assignment' ) AS D ON A.assignmentid = D.assignmentid WHERE A.courseid = @courseid""" sql.addParameter("@courseid", courseid) with sql.execute() as datareader: ctx["assignments"] = [x for x in datareader] return whiteboard.template.render("assignments.html", context_dict=ctx)
def createFolder(self, courseid): ctx = {'course': CourseHelper.fetch_course(courseid)} if ctx['course'] == None: return whiteboard.template.render('error.html', context_dict = {'error': 'The specified course does not exist'}) sql = whiteboard.sqltool.SqlTool() ctx['folders'] = [] try: # I love PostgreSQL for this more than can be considered sane sql.query_text = """ WITH RECURSIVE recursive_folders AS ( SELECT *, 0 AS level, ARRAY[documentid] AS trail FROM Documents WHERE type = 'folder' AND parent IS NULL UNION ALL SELECT D.*, level + 1, F.trail || D.documentid AS trail FROM Documents D JOIN recursive_folders F ON D.parent = F.documentid WHERE D.type = 'folder' ) SELECT REPEAT(' ', level) || name AS display_name, * FROM recursive_folders WHERE courseid = @courseid ORDER BY trail; """ sql.addParameter("@courseid", courseid) with sql.execute() as datareader: for row in datareader: ctx['folders'].append(row) except: sql.rollback = True raise return whiteboard.template.render('createfolder.html', context_dict = ctx)
def viewResponses(self, courseid, assignmentid): ctx = { "course": CourseHelper.fetch_course(courseid), "assignment": AssignmentHelper.fetch_assignment(assignmentid), } if ctx["course"] == None or ctx["assignment"] == None: return whiteboard.template.render("error.html", "That doesn't exist.") sql = whiteboard.sqltool.SqlTool() sql.query_text = """ SELECT D.*, G.* FROM Documents D JOIN Grades G on D.assignmentid = G.assignmentid WHERE type = 'response' AND substring(D.name, G.caseid) IS NOT NULL AND D.courseid = @courseid AND D.assignmentid = @assignmentid""" sql.addParameter("@courseid", courseid) sql.addParameter("@assignmentid", assignmentid) with sql.execute() as datareader: ctx["submissions"] = [row for row in datareader] return whiteboard.template.render("viewresponses.html", context_dict=ctx)
def createCourse_POST(self, coursetitle, coursecode, courseterm, courseinstructor): new_course_id = CourseHelper.create_course(coursetitle, coursecode, courseterm) RoleHelper.grant_user_role(courseinstructor, new_course_id, 'instructor') raise cherrypy.HTTPRedirect(url('/course/%i/' % new_course_id))