Exemplo n.º 1
0
def update_database():
    db_version = get_database().db_version.find_one({})
    if db_version is None:
        db_version = 0
    else:
        db_version = db_version['db_version']

    if db_version < 1:
        print "Updating database to db_version 1"
        # Init the database
        get_database().submissions.ensure_index([("username", pymongo.ASCENDING)])
        get_database().submissions.ensure_index([("courseid", pymongo.ASCENDING)])
        get_database().submissions.ensure_index([("courseid", pymongo.ASCENDING), ("taskid", pymongo.ASCENDING)])
        get_database().submissions.ensure_index([("submitted_on", pymongo.DESCENDING)])  # sort speed

        get_database().user_tasks.ensure_index([("username", pymongo.ASCENDING), ("courseid", pymongo.ASCENDING), ("taskid", pymongo.ASCENDING)],
                                               unique=True)
        get_database().user_tasks.ensure_index([("username", pymongo.ASCENDING), ("courseid", pymongo.ASCENDING)])
        get_database().user_tasks.ensure_index([("courseid", pymongo.ASCENDING), ("taskid", pymongo.ASCENDING)])
        get_database().user_tasks.ensure_index([("courseid", pymongo.ASCENDING)])
        get_database().user_tasks.ensure_index([("username", pymongo.ASCENDING)])

        db_version = 1

    if db_version < 2:
        print "Updating database to db_version 2"
        # Register users that submitted some tasks to the related courses
        data = get_database().user_tasks.aggregate([{"$group": {"_id": "$courseid", "usernames": {"$addToSet": "$username"}}}])
        for r in list(data):
            try:
                course = FrontendCourse(r['_id'])
                for u in r['usernames']:
                    course.register_user(u, force=True)
            except:
                print "There was an error while updating the database. Some users may have been unregistered from the course {}".format(r['_id'])
        db_version = 2

    if db_version < 3:
        print "Updating database to db_version 3"
        # Add the grade for all the old submissions
        get_database().submissions.update({}, {"$set": {"grade": 0.0}}, multi=True)
        get_database().submissions.update({"result": "success"}, {"$set": {"grade": 100.0}}, multi=True)
        get_database().user_tasks.update({}, {"$set": {"grade": 0.0}}, multi=True)
        get_database().user_tasks.update({"succeeded": True}, {"$set": {"grade": 100.0}}, multi=True)
        db_version = 3

    get_database().db_version.update({}, {"$set": {"db_version": db_version}}, upsert=True)
Exemplo n.º 2
0
    def call_main(self):
        """ Display main page (only when logged) """

        username = User.get_username()

        # Handle registration to a course
        user_input = web.input()
        registration_status = None
        if "register_courseid" in user_input and user_input["register_courseid"] != "":
            try:
                course = FrontendCourse(user_input["register_courseid"])
                if not course.is_registration_possible(username):
                    registration_status = False
                else:
                    registration_status = course.register_user(username, user_input.get("register_password", None))

                if course.is_group_course() and course.can_students_choose_group():
                    raise web.seeother("/group/"+course.get_id())
            except:
                registration_status = False
        if "unregister_courseid" in user_input:
            try:
                course = FrontendCourse(user_input["unregister_courseid"])
                course.unregister_user(username)
            except:
                pass

        # Display
        last_submissions = get_user_last_submissions({}, 5, True)
        except_free_last_submissions = []
        for submission in last_submissions:
            try:
                submission["task"] = FrontendCourse(submission['courseid']).get_task(submission['taskid'])
                except_free_last_submissions.append(submission)
            except:
                pass

        all_courses = FrontendCourse.get_all_courses()

        open_courses = {courseid: course for courseid, course in all_courses.iteritems() if course.is_open_to_user(username)}
        open_courses = OrderedDict(sorted(open_courses.iteritems(), key=lambda x: x[1].get_name()))

        registerable_courses = {courseid: course for courseid, course in all_courses.iteritems() if
                                not course.is_open_to_user(username) and course.is_registration_possible(username)}
        registerable_courses = OrderedDict(sorted(registerable_courses.iteritems(), key=lambda x: x[1].get_name()))

        return renderer.main(open_courses, registerable_courses, except_free_last_submissions, registration_status)