Example #1
0
    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)
Example #2
0
    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"
Example #3
0
    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/')
Example #4
0
  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)
Example #5
0
    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)
Example #6
0
    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)
Example #7
0
    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)
Example #8
0
    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)
Example #9
0
    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)
Example #10
0
    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)
Example #11
0
 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/')
Example #12
0
    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)
Example #13
0
    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('&nbsp;', 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)
Example #14
0
    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)
Example #15
0
    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))