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)
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)