def GET(self, *test_data):
        '''
            Retrieve and display the pairs of modules that have
            at least 1 student who has taken module A
            prior to taking module B
        '''
        is_testing = (len(test_data) > 0)
        if is_testing:
            module_A = test_data[0]
            module_B = test_data[1]
            target_ay_sem = test_data[2]
        else:
            if not session.validate_session():
                raise web.seeother('/login')
            input_data = model.validate_input(web.input(), ["moduleAandB", "aysem"],
                                              aysem_specific=False, attr_required=False)

            target_ay_sem = None
            try:
                target_ay_sem = input_data.aysem
                module_A = input_data.moduleA
                module_B = input_data.moduleB
            except AttributeError:
                module_pairs = None
                if target_ay_sem is not None:
                    module_pairs = model.get_modA_taken_prior_to_modB(target_ay_sem)

                # Get a list of all AY-Sems (for users to select)
                all_ay_sems = model.get_all_ay_sems()

                return RENDER.modulesTakenPriorToOthers("all_pairs", module_pairs, all_ay_sems,
                                                        None, None, None, None, target_ay_sem, None)


        student_counts = \
                         model.get_number_of_students_who_took_modA_prior_to_modB(module_A.upper(),
                                                                                  module_B.upper(),
                                                                                  target_ay_sem)
        module_B_students = \
                            model.get_number_of_students_taking_module_in_ay_sem(module_B.upper(),
                                                                                 target_ay_sem)

        student_prior_count = 0
        for count in student_counts:
            count = count[1]
            student_prior_count += count

        if is_testing:
            return [student_counts, student_prior_count, module_B_students]
        else:
            return RENDER.modulesTakenPriorToOthers("specific_pair", None, None, student_counts,
                                                    student_prior_count, module_A.upper(),
                                                    module_B.upper(), target_ay_sem,
                                                    module_B_students)
Esempio n. 2
0
    def GET(self):
        '''
            Handles the loading of the 'Edit General Module Info' page
        '''
        input_data = model.validate_input(web.input(), ["code"])
        module_code = input_data.code

        module_info = model.get_module(module_code)
        if module_info is None:
            return RENDER.notfound("Module " + module_code + " does not exist in the system.")

        preclusions = model.get_preclusion_as_string(module_code)
        prerequisites = model.get_prerequisite_as_string(module_code)

        return RENDER.moduleEdit(module_info, preclusions, prerequisites)
Esempio n. 3
0
    def GET(self):
        '''
            Retrieve and display the list of modules taken before
            internship and the number of students who has taken those
            modules.
        '''
        if not session.validate_session():
            raise web.seeother('/login')

        ay_sem_of_interest = None

        #see if the user has already requested a search
        input_data = model.validate_input(web.input(), ["aysem"],
                                          aysem_specific=False,
                                          attr_required=False)
        try:
            ay_sem = input_data.aysem
            ay_sem_of_interest = ay_sem
        except AttributeError:
            ay_sem_of_interest = self.CURRENT_SEM
            if not self.validateAYSem(ay_sem_of_interest):
                ay_sem_of_interest = "AY 16/17 Sem 1"

        modules_before_internship = model.get_mod_before_intern(
            ay_sem_of_interest)
        return RENDER.modulesTakenPriorToInternship(modules_before_internship,
                                                    self.AVAILABLE_AY_SEM,
                                                    ay_sem_of_interest)
    def GET(self):
        '''
            Renders the non-overlapping modules page if users requested
            for the page through the GET method.
        '''
        if not session.validate_session():
            raise web.seeother('/login')
        ay_sem_of_interest = None

        #see if the user has already requested a search
        input_data = model.validate_input(web.input(), ["aysem"],
                                          aysem_specific=False,
                                          attr_required=False)
        try:
            ay_sem = input_data.aysem
            ay_sem_of_interest = ay_sem
        except AttributeError:
            ay_sem_of_interest = self.CURRENT_SEM
            if not self.validateAYSem(ay_sem_of_interest):
                ay_sem_of_interest = "AY 16/17 Sem 1"

        lst_of_independ_mods = model.get_mods_no_one_take(ay_sem_of_interest)

        return RENDER.nonOverlappingModules(lst_of_independ_mods,
                                            self.AVAILABLE_AY_SEM,
                                            ay_sem_of_interest)
Esempio n. 5
0
    def GET(self):
        '''
            render page with add module form
        '''
        if not session.validate_session():
            raise web.seeother('/login')

        return RENDER.addModules()
Esempio n. 6
0
 def GET(self):
     '''
         This function is called when /starredModules is accessed.
     '''
     if not session.validate_session():
         raise web.seeother('/login')
     else:
         starred_module_infos = model.get_starred_modules(web.cookies().get('user'))
         return RENDER.starredModulesListing(starred_module_infos)
Esempio n. 7
0
 def GET(self):
     '''
         Handles the display of the Delete Module page
     '''
     if not session.validate_session():
         raise web.seeother('/login')
     else:
         module_infos = model.get_new_modules()
         return RENDER.deleteModule(module_infos)
Esempio n. 8
0
 def GET(self):
     '''
         This function is called when the '/modules' page (moduleListing.html) is loaded
         If user is not logged in, they are redirected to the login page.
     '''
     if not session.validate_session():
         raise web.seeother('/login')
     else:
         module_infos = model.get_all_modules_and_focus()
         aggregated_modules = self.aggregate_modules_for_focus(module_infos)
         return RENDER.moduleListing(aggregated_modules)
    def GET(self):
        '''
            Handles the loading of the 'Edit Module Prerequisites' page.
        '''
        if not session.validate_session():
            raise web.seeother('/login')
        else:
            input_data = model.validate_input(web.input(), ["code"])
            module_code = input_data.code.upper()

            prerequisites = model.get_prerequisite_units(module_code)
            return RENDER.moduleEditPrerequisite(module_code, prerequisites)
    def GET(self):
        '''
            gets the page with code and ay-sem
        '''
        if not session.validate_session():
            raise web.seeother('/login')

        input_data = model.validate_input(web.input(), ["code", "aysem"])
        module_code = input_data.code
        ay_sem = input_data.aysem

        student_list = model.get_list_students_take_module(module_code, ay_sem)
        return RENDER.studentsAffectedByModule(module_code, ay_sem, student_list)
    def GET(self):
        '''
            Renders the list of modules with specific class size page if users
            requested for the page through the GET method.
        '''
        if not session.validate_session():
            raise web.seeother('/login')

        input_data = model.validate_input(web.input(), ["aysem"],
                                          aysem_specific=False,
                                          attr_required=False)
        try:
            # Search request by user
            ay_sem_of_interest = input_data.aysem
            lower_range_class_size = input_data.lowerClassSize
            higher_range_class_size = input_data.higherClassSize
        except AttributeError:
            # Loading the page without sufficient data (first time load page)
            current_aysem = model.get_current_ay_sem()
            return RENDER.moduleSpecificSize(self.all_ay_sems, None,
                                             current_aysem, None, None)

        if not self.is_valid_range(lower_range_class_size,
                                   higher_range_class_size):
            return Outcome().POST("mods-specific-size-range", False, None)
        else:
            # All inputs are valid
            # Convert unicode to int
            lower_range = int(lower_range_class_size)
            higher_range = int(higher_range_class_size)

            list_of_mods = \
                model.get_mod_specified_class_size(ay_sem_of_interest, lower_range,
                                                   higher_range)

            return RENDER.moduleSpecificSize(self.all_ay_sems, list_of_mods,
                                             ay_sem_of_interest, lower_range,
                                             higher_range)
Esempio n. 12
0
    def GET(self):
        '''
            Handles the loading of the 'Edit Specific Module Info' page
        '''
        input_data = model.validate_input(web.input(), ["code", "aysem"], is_future=True)
        module_code = input_data.code
        ay_sem = input_data.aysem

        module_ay_sem_info_handler = IndividualModule()
        module_ay_sem_info_handler.load_mounting_info(module_code, ay_sem)
        mounting_value = module_ay_sem_info_handler.get_mounting_status()
        quota = module_ay_sem_info_handler.get_quota()

        return RENDER.mountingEdit(module_code, ay_sem, mounting_value, quota)
Esempio n. 13
0
    def GET(self):
        '''
            renders list of modules that overlapps with this module
        '''
        if not session.validate_session():
            raise web.seeother('/login')

        data_input = model.validate_input(web.input(), ["code", "aysem"],
                                          aysem_specific=False)
        code = data_input.code
        try:
            aysem = data_input.aysem
            if aysem == "":
                raise web.seeother('/overlappingWithModule?code=' + code)
            else:
                lst_of_mods = model.get_mod_taken_together_with_mod_and_aysem(
                    code, aysem)
                return RENDER.overlappingWithModule(code, aysem, lst_of_mods,
                                                    True)
        except AttributeError:
            aysem = 'All Semesters'
            lst_of_mods = model.get_mod_taken_together_with(code)
            return RENDER.overlappingWithModule(code, aysem, lst_of_mods,
                                                False)
Esempio n. 14
0
    def GET(self):
        '''
            Renders the dummy query page if users requested
            for the page through the GET method.
        '''
        if not session.validate_session():
            raise web.seeother('/login')

        table_of_year_of_study_with_count = model.get_num_students_by_yr_study(
        )
        table_of_focus_area_with_count = model.get_num_students_by_focus_areas(
        )

        return RENDER.studentEnrollment(table_of_year_of_study_with_count,
                                        table_of_focus_area_with_count)
Esempio n. 15
0
    def GET(self):
        '''
            Renders the 'Edit All Mountings and Quotas' page if users requested
            for the page through the GET method.
        '''
        if not session.validate_session():
            raise web.seeother('/login')

        # Currently, tentative mounting will be shown for the next AY
        selected_ay = model.get_next_ay(model.get_current_ay())

        tenta_mounting_handler = Tentative()
        tenta_mounting_handler.populate_module_code_and_name()
        tenta_mounting_handler.populate_module_ay_sem_data(selected_ay)
        full_mounting_plan = tenta_mounting_handler.full_mounting_plan
        full_mounting_plan = model.replace_empty_quota_with_symbols(full_mounting_plan)

        return RENDER.editAll(selected_ay, full_mounting_plan)
    def POST(self):
        '''
            called from search with form
        '''
        # Input data will have valid inputs as function is called from submit button
        input_data = model.validate_input(web.input(), ["aysem"])
        try:
            ay_sem_of_interest = input_data.aysem
            lower_range_class_size = input_data.lowerClassSize
            higher_range_class_size = input_data.higherClassSize
        except AttributeError:
            error = RENDER.notfound(
                'Please do not tamper with our html forms. Thank you! ;)')
            raise web.notfound(error)

        webpage_to_redirect = "/moduleSpecificSize?aysem=" + ay_sem_of_interest + \
                              "&lowerClassSize=" + lower_range_class_size + \
                              "&higherClassSize=" + higher_range_class_size

        raise web.seeother(webpage_to_redirect)
Esempio n. 17
0
    def GET(self):
        '''
            This function is called when the '/' page (index.html) is loaded
            If user is not logged in, they are redirected to the login page.
        '''
        if not session.validate_session():
            raise web.seeother('/login')
        else:
            current_ay_with_current_date = model.get_current_ay_sem()[0:8]
            current_database_ay = model.get_current_ay()

            to_migrate_db = False

            if current_ay_with_current_date != current_database_ay:
                to_migrate_db = True

            # [NOTE] for debugging purposes, comment out this line when done.
            # to_migrate_db = True

            return RENDER.index(need_migration=to_migrate_db)
Esempio n. 18
0
    def GET(self):
        '''
            This function is called when the database migration page is loaded
            If user is not logged in, they are redirected to the login page.
        '''
        if not session.validate_session():
            raise web.seeother('/login')
        else:
            current_ay_with_current_date = model.get_current_ay_sem()[0:8]
            current_database_ay = model.get_current_ay()

            if current_ay_with_current_date == current_database_ay:
                # pass # [NOTE] uncomment out this line for debugging purposes
                raise web.seeother(
                    "/")  # [NOTE] comment out this line for debugging purposes

            next_ay = model.get_next_ay(current_database_ay)
            future_ay = model.get_next_ay(next_ay)

            return RENDER.databaseMigrate(current_database_ay, next_ay,
                                          future_ay)
    def GET(self):
        '''
            Retrieve and render all the info of a module mounting
        '''
        if not session.validate_session():
            raise web.seeother('/login')

        input_data = model.validate_input(web.input(), ["code", "aysem"])
        module_code = input_data.code
        ay_sem = input_data.aysem

        # Get module's name, description, MC and status
        module_info = model.get_module(module_code)

        # Get mounting status, quota and number of students taking
        self.load_mounting_info(module_code, ay_sem)
        student_count = model.get_number_of_students_taking_module_in_ay_sem(
            module_code, ay_sem)

        # Check if the selected AY-Sem is in the current AY
        # (To determine whether to display the 'Edit Specific Info' button)
        is_future_ay = not self.is_current_ay

        # Check if module is starred
        is_starred = model.is_module_starred(module_code,
                                             web.cookies().get('user'))

        # Get the year of study and focus area distriubtions of students taking the module
        # (To be rendered as charts)
        self.load_focus_areas()
        self.load_student_enrollments(module_code, ay_sem)

        all_ay_sems = model.get_all_ay_sems()
        all_future_ay_sems = model.get_all_future_ay_sems()

        return RENDER.individualModuleInfo(
            module_info, all_ay_sems, all_future_ay_sems, is_future_ay, ay_sem,
            self.mounting_status, self.quota, student_count, is_starred,
            self.focus_areas, self.focus_area_acronyms,
            self.student_year_counts, self.focus_area_counts)
    def GET(self):
        '''
            Renders the modules page if users requested
            for the page through the GET method.
        '''
        if not session.validate_session():
            raise web.seeother('/login')

        input_data = model.validate_input(web.input(), ["aysem"],
                                          aysem_specific=False,
                                          attr_required=False)
        try:
            target_ay_sem = input_data.aysem
        except AttributeError:
            target_ay_sem = model.get_current_ay_sem()

        lst_of_mods = model.get_all_mods_taken_together(aysem=target_ay_sem)
        # Get a list of all AY-Sems (for users to select)
        all_ay_sems = model.get_all_ay_sems()

        return RENDER.overlappingModules(lst_of_mods, all_ay_sems,
                                         target_ay_sem)
    def GET(self, to_render=True, logged_in=False):
        '''
            Renders the tentative mounting page if users requested
            for the page through the GET method.
        '''
        if not session.validate_session() and not logged_in:
            raise web.seeother('/login')

        # Currently, tentative mounting will be shown for the next AY
        selected_ay = model.get_next_ay(model.get_current_ay())

        self.populate_module_code_and_name()
        self.populate_module_ay_sem_data(selected_ay)

        full_mounting_plan = model.replace_empty_quota_with_symbols(
            self.full_mounting_plan)

        if to_render:
            return RENDER.moduleMountingTentative(selected_ay,
                                                  full_mounting_plan)
        else:
            self.full_mounting_plan = full_mounting_plan
Esempio n. 22
0
    def GET(self):
        '''
            Retrieve and render all the info of a module
        '''
        if not session.validate_session():
            raise web.seeother('/login')

        input_data = model.validate_input(web.input(), ["code"])
        module_code = input_data.code

        # Get module's name, description, MC and status
        module_info = model.get_module(module_code)

        # Get mounting status, quota and number of students taking
        self.load_fixed_mounting_plan(module_code)
        self.load_tenta_mounting_plan(module_code)
        number_of_student_planning = model.get_number_students_planning(
            module_code)

        # Get module's prereqs and preclusions
        prereq_string = model.get_prerequisite_as_string(module_code)
        preclude_string = model.get_preclusion_as_string(module_code)

        # Check if module is starred
        is_starred = model.is_module_starred(module_code,
                                             web.cookies().get('user'))

        all_ay_sems = model.get_all_ay_sems()
        all_future_ay_sems = model.get_all_future_ay_sems()
        target_ay_sem = None

        #get html of overlapping modules template
        return RENDER.viewModule(module_info, all_ay_sems, all_future_ay_sems,
                                 target_ay_sem, self.fixed_mounting_plan,
                                 self.tenta_mounting_plan,
                                 number_of_student_planning, is_starred,
                                 prereq_string, preclude_string)
Esempio n. 23
0
    def GET(self, to_render=True, logged_in=False):
        '''
            Renders the fixed mounting page if users requested
            for the page through the GET method.
        '''
        if not session.validate_session() and not logged_in:
            raise web.seeother('/login')

        self.populate_module_code_and_name()
        self.populate_module_ay_sem_data()
        current_ay = model.get_current_ay()

        full_mounting_plan = self.full_mounting_plan
        # New modules will not be displayed in fixed mounting
        full_mounting_plan = [
            subplan for subplan in full_mounting_plan
            if subplan[8].rstrip() == "Active"
        ]
        full_mounting_plan = model.replace_empty_quota_with_symbols(
            full_mounting_plan)
        if to_render:
            return RENDER.moduleMountingFixed(current_ay, full_mounting_plan)
        else:
            self.full_mounting_plan = full_mounting_plan
Esempio n. 24
0
 def GET(self):
     '''
         This function is called when /login is accessed.
     '''
     return RENDER.login(session.validate_session())
Esempio n. 25
0
    def POST(self, *received_data):
        '''
            POST method will check the type of action executed by the user,
            and display the corresponding message based on the execution's outcome.
        '''
        if received_data is not None:
            data = received_data
            action = data[0]
            outcome = data[1]
            module_code = data[2]

            outcome_message = None
            redirect_page = None

            if action == "add_module":
                if outcome is True:
                    outcome_message = "Module " + module_code + " has been added successfully!"
                    redirect_page = "/viewModule?code="+module_code
                else:
                    if module_code is None:
                        outcome_message = "Error: failed to add module!"
                    else:
                        outcome_message = "Error: " + module_code + " is an existing module!"
                    redirect_page = "/modules"
            elif action == "edit_module":
                if outcome is True:
                    outcome_message = "Module " + module_code + " has been edited successfully!"
                    redirect_page = "/viewModule?code="+module_code
                else:
                    outcome_message = "Error: Failed to edit module."
                    if module_code is None:
                        redirect_page = "/modules"
                    else:
                        redirect_page = "/viewModule?code="+module_code
            elif action == "invalid_input":
                outcome_message = "Invalid input for module name/code/MCs/description"
                redirect_page = "/"

            elif action == "edit_mounting":
                ay_sem = data[3]
                if outcome is True:
                    outcome_message = "Module " + module_code + " has been edited successfully!"
                    redirect_page = "individualModuleInfo?code="+module_code+"&aysem="+\
                                    ay_sem.replace(' ', '+').replace('/', '%2F')
                else:
                    outcome_message = "Error: Failed to edit module."
                    if module_code is None or ay_sem is None:
                        redirect_page = "/modules"
                    else:
                        redirect_page = "individualModuleInfo?code="+module_code+"&aysem="+\
                                        ay_sem.replace(' ', '+').replace('/', '%2F')

            elif action == "edit_all_mountings_and_quotas":
                if outcome is True:
                    outcome_message = "Modules have been edited successfully!"
                else:
                    outcome_message = "Error: Failed to edit modules."
                redirect_page = "/editAll"

            elif action == "restore_module":
                if outcome is True:
                    outcome_message = "Module " + module_code + " has been restored successfully!"
                    redirect_page = "/viewModule?code="+module_code
                else:
                    outcome_message = "Error: Failed to restore module."
                    redirect_page = "/modifiedModules"

            elif action == "delete_module":
                if outcome is True:
                    outcome_message = "Module " + module_code + " has been deleted successfully!"
                    redirect_page = "/deleteModule"
                else:
                    outcome_message = "Error: Failed to delete module. "
                    redirect_page = "/deleteModule"
                    if module_code is not None:
                        if outcome == "has_mounting":
                            outcome_message += "Module " + module_code + " has " +\
                                               "mountings that refer to it. " +\
                                               "Please remove all mountings before deleting " +\
                                               "the module."
                            redirect_page = "/viewModule?code=" + module_code
                        elif outcome == "is_starred":
                            outcome_message += "Module " + module_code + " is a starred module. " +\
                                               "Please unstar the module before deleting " +\
                                               "the module."
                            redirect_page = "/viewModule?code=" + module_code

            elif action == "create_user":
                if outcome is True:
                    outcome_message = "Your account has been created successfully. " +\
                                      "Please proceed to login."
                    redirect_page = "/login"
                elif outcome == "taken":
                    outcome_message = "The username has been taken. " +\
                                      "Please register with a different username."
                    redirect_page = "/register"
                else:
                    outcome_message = "Error: Invalid UserID/password. " +\
                                      "Please check that your UserID/password is not more than " +\
                                      "20 characters long and does not contain special characters."
                    redirect_page = "/register"

            elif action == "login_user":
                outcome_message = "Login credentials are empty or incorrect. " +\
                                  "Please try again."
                redirect_page = "/login"

            elif action == "module_taken_prior":
                outcome_message = "Error: Module code " + module_code + " does not exist! "
                redirect_page = "/moduleTakenPriorToOthers"

            elif action == "non-overlapping-mods":
                outcome_message = "The AY-Semester you specified does not exist!"
                redirect_page = "/nonOverlappingModules"

            elif action == "mods-specific-size-aysem":
                outcome_message = "The AY-Semester you specified does not exist!"
                redirect_page = "/moduleSpecificSize"

            elif action == "mods-specific-size-range":
                outcome_message = "You have specified an invalid range!"
                redirect_page = "/moduleSpecificSize"

            elif action == "mods-before-internship":
                outcome_message = "The AY-Semester you specified does not exist!"
                redirect_page = "/moduleTakenPriorToInternship"

            elif action == "migrate-database":
                if outcome is True:
                    outcome_message = "The database has been successfully migrated to the new AY."
                else:
                    outcome_message = "The database migration could not be performed. " +\
                                      "Please contact the system administrator."
                redirect_page = "/"

            elif action == "back-to-listing":
                outcome_message = "The module you want to view has been deleted by another user!"
                redirect_page = "/"
            else:
                outcome_message = "unknown error has occured with action " + action

            return RENDER.outcome(outcome_message, redirect_page)
Esempio n. 26
0
    def GET(self, *test_data):
        '''
            Renders the oversubscribed modules page if users requested
            for the page through the GET method.
        '''
        if test_data:
            target_ay_sem = test_data[0]
        else:
            if not session.validate_session():
                raise web.seeother('/login')

            input_data = model.validate_input(web.input(), ["aysem"],
                                              aysem_specific=False,
                                              attr_required=False)
            try:
                target_ay_sem = input_data.aysem
            except AttributeError:
                target_ay_sem = model.get_current_ay_sem()

        all_ay_sems = model.get_all_ay_sems()

        #list_of_oversub_mod = model.get_oversub_mod()
        list_of_oversub_mod = []

        current_ay = model.get_current_ay()
        if target_ay_sem[0:8] == current_ay:

            fixed_mounting_handler = Fixed()
            fixed_mounting_handler.GET(to_render=False, logged_in=True)
            full_mounting_plan = fixed_mounting_handler.full_mounting_plan

            if target_ay_sem[9:15] == "Sem 1":
                for subplan in full_mounting_plan:
                    module_code = subplan[0]
                    module_name = subplan[1]
                    sem1_quota = subplan[4]
                    sem1_num_students = subplan[6]
                    if ((sem1_quota != '?' and sem1_quota != '-') \
                        and sem1_num_students > sem1_quota) \
                        or ((sem1_quota == '?' or sem1_quota == '-') and sem1_num_students > 0):
                        if sem1_quota == '?' or sem1_quota == '-':
                            oversub_amount = sem1_num_students
                        else:
                            oversub_amount = sem1_num_students - sem1_quota
                        list_of_oversub_mod.append(
                            (module_code, module_name, target_ay_sem,
                             sem1_quota, sem1_num_students, oversub_amount))

            else:
                for subplan in full_mounting_plan:
                    module_code = subplan[0]
                    module_name = subplan[1]
                    sem2_quota = subplan[5]
                    sem2_num_students = subplan[7]
                    if ((sem2_quota != '?' and sem2_quota != '-') \
                        and sem2_num_students > sem2_quota) \
                        or ((sem2_quota == '?' or sem2_quota == '-') and sem2_num_students > 0):
                        if sem2_quota == '?' or sem2_quota == '-':
                            oversub_amount = sem2_num_students
                        else:
                            oversub_amount = sem2_num_students - sem2_quota
                        list_of_oversub_mod.append(
                            (module_code, module_name, target_ay_sem,
                             sem2_quota, sem2_num_students, oversub_amount))

        else:
            tenta_mounting_handler = Tentative()
            tenta_mounting_handler.GET(to_render=False, logged_in=True)
            full_mounting_plan = tenta_mounting_handler.full_mounting_plan

            if target_ay_sem[9:15] == "Sem 1":
                for subplan in full_mounting_plan:
                    module_code = subplan[0]
                    module_name = subplan[1]
                    sem1_quota = subplan[4]
                    sem1_num_students = subplan[6]
                    if ((sem1_quota != '?' and sem1_quota != '-') \
                        and sem1_num_students > sem1_quota) \
                        or ((sem1_quota == '?' or sem1_quota == '-') and sem1_num_students > 0):
                        if sem1_quota == '?' or sem1_quota == '-':
                            oversub_amount = sem1_num_students
                        else:
                            oversub_amount = sem1_num_students - sem1_quota
                        list_of_oversub_mod.append(
                            (module_code, module_name, target_ay_sem,
                             sem1_quota, sem1_num_students, oversub_amount))

            else:
                for subplan in full_mounting_plan:
                    module_code = subplan[0]
                    module_name = subplan[1]
                    sem2_quota = subplan[5]
                    sem2_num_students = subplan[7]
                    if ((sem2_quota != '?' and sem2_quota != '-') \
                        and sem2_num_students > sem2_quota) \
                        or ((sem2_quota == '?' or sem2_quota == '-') and sem2_num_students > 0):
                        if sem2_quota == '?' or sem2_quota == '-':
                            oversub_amount = sem2_num_students
                        else:
                            oversub_amount = sem2_num_students - sem2_quota
                        list_of_oversub_mod.append(
                            (module_code, module_name, target_ay_sem,
                             sem2_quota, sem2_num_students, oversub_amount))

        if not test_data:
            return RENDER.oversubscribedModules(list_of_oversub_mod,
                                                all_ay_sems, target_ay_sem)
        else:
            return list_of_oversub_mod
Esempio n. 27
0
 def GET(self):
     '''
         This function is called when /register is accessed.
     '''
     return RENDER.register()
Esempio n. 28
0
def validate_input(input_data,
                   input_types,
                   is_future=False,
                   aysem_specific=True,
                   attr_required=True,
                   show_404=True):
    '''
        Validates that the GET input data (in the URL) is valid.

        input_types indicate the list of data types to validate.
        e.g. if GET input contains 'code' and 'aysem', then input_types = ["code", "aysem"]

        An input is considered valid if:
        1) The value was specified and
        2) The value exists in the system

        If any input is invalid, return 404 page (by default).

        Depending on the circumstances, optional arguments may be passed into the function:
        is_future:
            Set to True if want to ensure that AY-Sem is in a future AY
            (if AY-Sem is not required at all, then ignore this argument)
        aysem_specific:
            Set to True if the AY-Sem attribute is mandatory, False if it is optional
            (if AY-Sem is not required at all, then ignore this argument)
        attr_required:
            Set to True if at least one attribute is required
            Set to False if it is acceptable to have no input data
        show_404:
            Set to False if don't want to return 404 page (function will return False instead)
    '''
    from app import RENDER

    if attr_required is False and len(input_data) == 0:
        return input_data

    for input_type in input_types:
        if input_type == "code":
            try:
                module_code = input_data.code
            except AttributeError:
                if show_404:
                    error = RENDER.notfound('Module code is not specified')
                    raise web.notfound(error)
                else:
                    return False
            module_exist = database.is_existing_module(module_code.upper())
            if not module_exist:
                if show_404:
                    error = RENDER.notfound('Module code "' + module_code +\
                                            '" does not exist in our system')
                    raise web.notfound(error)
                else:
                    return False
            else:
                input_data.code = module_code.upper()

        elif input_type == "aysem":
            try:
                ay_sem = input_data.aysem
                if ay_sem == "":
                    raise AttributeError
            except AttributeError:
                if aysem_specific:
                    if show_404:
                        error = RENDER.notfound('AY-Semester is not specified')
                        raise web.notfound(error)
                    else:
                        return False
                else:
                    continue

            if is_future:
                valid_aysem = is_aysem_in_system_and_is_future(ay_sem)
            else:
                valid_aysem = is_aysem_in_system(ay_sem)

            if not valid_aysem:
                if is_future:
                    error = RENDER.notfound('AY-Semester "' + ay_sem +\
                                            '" does not exist in our system,' +\
                                            ' or is not in a future AY')
                else:
                    error = RENDER.notfound('AY-Semester "' + ay_sem +\
                                            '" does not exist in our system')
                if show_404:
                    raise web.notfound(error)
                else:
                    return False
            else:
                input_data.aysem = valid_aysem

        elif input_type == "modify_type" or input_type == "restore_type":
            try:
                if input_type == "modify_type":
                    info_type = input_data.modifyType
                else:
                    info_type = input_data.restoreType
            except AttributeError:
                if input_type == "modify_type":
                    error = RENDER.notfound('Modify type is not specified')
                else:
                    error = RENDER.notfound('Restore type is not specified')
                raise web.notfound(error)
            valid_info_type = info_type.upper() == "QUOTA" or \
                              info_type.upper() == "MOUNTING" or \
                              info_type.upper() == "MODULEDETAILS"
            if not valid_info_type:
                if input_type == "modify_type":
                    error = RENDER.notfound('Modify type "' + info_type +\
                                            '" is not recognised by the system')
                else:
                    error = RENDER.notfound('Restore type "' + info_type +\
                                            '" is not recognised by the system')
                raise web.notfound(error)

        elif input_type == "moduleAandB":
            try:
                moduleA_code = input_data.moduleA
                is_moduleA_specified = True
            except AttributeError:
                is_moduleA_specified = False
            try:
                moduleB_code = input_data.moduleB
                is_moduleB_specified = True
            except AttributeError:
                is_moduleB_specified = False

            if (is_moduleA_specified and not is_moduleB_specified) or \
               (not is_moduleA_specified and is_moduleB_specified):
                error = RENDER.notfound(
                    "1 out of 2 module codes is not specified")
                raise web.notfound(error)
            elif not is_moduleA_specified and not is_moduleB_specified:
                continue

            module_exist = database.is_existing_module(moduleA_code.upper())
            if not module_exist:
                error = RENDER.notfound('Module code "' + moduleA_code +\
                                        '" does not exist in our system')
                raise web.notfound(error)
            else:
                input_data.moduleA = moduleA_code.upper()
            module_exist = database.is_existing_module(moduleB_code.upper())
            if not module_exist:
                error = RENDER.notfound('Module code "' + moduleB_code +\
                                        '" does not exist in our system')
                raise web.notfound(error)
            else:
                input_data.moduleB = moduleB_code.upper()

    return input_data
Esempio n. 29
0
    def GET(self):
        '''
            Renders the modified modules page if users requested
            for the page through the GET method.
        '''
        if not session.validate_session():
            raise web.seeother('/login')

        # User can select the type of modified information they want to see
        # By default, the page will show ALL modified modules
        modify_type = None
        module_code = None
        input_data = model.validate_input(web.input(), ["code", "modify_type"],
                                          attr_required=False)

        try:
            modify_type = input_data.modifyType
        except AttributeError:
            modify_type = None
        try:
            module_code = input_data.code
        except AttributeError:
            module_code = None

        # If module code is specified, only return data for the specified module
        modified_modules_summary = []
        modified_modules_mounting = []
        modified_modules_quota = []
        modified_modules_details = []
        modified_modules = []
        if module_code is not None:
            if modify_type.lower() == "mounting":
                modified_modules = self.get_modules_with_modified_mounting()
                module = [
                    module for module in modified_modules
                    if module[0] == module_code
                ]
            elif modify_type.lower() == "quota":
                modified_modules = self.get_modules_with_modified_quota()
                module = [
                    module for module in modified_modules
                    if module[0] == module_code
                ]
            elif modify_type.lower() == "moduledetails":
                module = None
                modified_modules = self.get_modules_with_modified_details()
                module = None
                for mm in modified_modules:
                    if mm[0][0] == module_code:
                        module = mm
                        break

            modified_modules = module

        # Else return all 4 modification tables, for all the modified modules
        else:
            modified_modules_summary = self.get_all_modified_modules()
            modified_modules_mounting = self.get_modules_with_modified_mounting(
            )
            modified_modules_quota = self.get_modules_with_modified_quota()
            modified_modules_details = self.get_modules_with_modified_details()

        return RENDER.moduleModified(modify_type, modified_modules_summary,
                                     modified_modules_mounting,
                                     modified_modules_quota,
                                     modified_modules_details, module_code,
                                     modified_modules)