Exemple #1
0
    def POST(self, *test_data):
        '''
            Handles the restoration of module info
        '''
        if test_data:  # for testing purposes
            input_data = test_data[0]
        else:
            input_data = model.validate_input(web.input(),
                                              ["code", "restore_type"])

        module_code = input_data.code
        restore_type = input_data.restoreType

        if restore_type.lower() == "quota":
            model.validate_input(input_data, ["aysem"])
            ay_sem = input_data.aysem

            quota = input_data.quota
            if quota == "":
                quota = None

            outcome = model.update_quota(module_code, ay_sem, quota)

            if not test_data:
                return Outcome().POST("restore_module", outcome, module_code)

        elif restore_type.lower() == "mounting":
            model.validate_input(input_data, ["aysem"])
            target_ay_sem = input_data.aysem
            mounting_change = int(input_data.mountingChange)

            outcome = None
            if mounting_change == 1:  # Is mounted, so should revert to unmounted
                outcome = model.delete_tenta_mounting(module_code,
                                                      target_ay_sem)
            elif mounting_change == 0:  # Is unmounted, so should revert to mounted
                current_ay_sem = input_data.currentAySem
                quota = model.get_quota_of_target_fixed_ay_sem(
                    module_code, current_ay_sem)
                outcome = model.add_tenta_mounting(module_code, target_ay_sem,
                                                   quota)

            if not test_data:
                return Outcome().POST("restore_module", outcome, module_code)

        elif restore_type.lower() == "moduledetails":
            original_module_details = model.get_original_module_info(
                module_code)
            model.remove_original_module_info(module_code)
            outcome = model.update_module(module_code,
                                          original_module_details[1],
                                          original_module_details[2],
                                          original_module_details[3])

            if not test_data:
                return Outcome().POST("restore_module", outcome, module_code)
Exemple #2
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)
Exemple #4
0
    def POST(self):
        '''
            Handles the deletion of a module
        '''
        # Verify that module exists
        input_data = model.validate_input(web.input(), ["code"],
                                          show_404=False)
        try:
            module_code = input_data.code
        except AttributeError:
            return Outcome().POST("delete_module", False, None)

        # Verify that module's status is 'New'
        module_infos = model.get_new_modules()
        new_modules = [module_info[0] for module_info in module_infos]
        if module_code not in new_modules:
            return Outcome().POST("delete_module", False, None)

        else:
            outcome = model.delete_module(module_code)
            if outcome is False:
                tenta_mounted_modules = model.get_all_tenta_mounted_modules()
                tenta_mounted_module_codes = [
                    module[0] for module in tenta_mounted_modules
                ]
                if module_code in tenta_mounted_module_codes:
                    return Outcome().POST("delete_module", "has_mounting",
                                          module_code)
                else:
                    return Outcome().POST("delete_module", "is_starred",
                                          module_code)
            else:
                return Outcome().POST("delete_module", True, module_code)
    def POST(self):
        '''
            called from search with ay sem form
        '''
        #will have input data as function is called from button
        input_data = model.validate_input(web.input(), ["aysem"])
        ay_sem = input_data.aysem

        raise web.seeother('/nonOverlappingModules?aysem=' + ay_sem)
    def POST(self):
        '''
            Handles the submission of the 'Edit Specific Module Info' page
        '''
        input_data = model.validate_input(web.input(), ["code", "aysem"],
                                          is_future=True, show_404=False)

        module_code = None
        ay_sem = None
        try:
            module_code = input_data.code
            ay_sem = input_data.aysem
            mounting_status = input_data.mountingStatus
        except AttributeError:
            return Outcome().POST("edit_mounting", False, module_code, ay_sem)

        try:
            quota = input_data.quota
            if quota == "":
                quota = None
        except AttributeError:
            quota = None

        outcome = None
        # If quota is being set by the user, it should not fall below 0.
        # Otherwise, if the user is not interested in leaving a value for
        # the quota, leaving it blank (none) is acceptable.
        if quota is not None:
            try:
                quota = int(quota)
                if quota < 0 or quota > 999:
                    outcome = False
            except ValueError:  # quota is not None or int
                outcome = False

        if outcome is not False:
            module_info = model.get_module(module_code)
            if module_info is None:
                outcome = False
            elif ay_sem not in self.list_of_future_ay_sems:
                outcome = False
            else:
                if mounting_status == "Mounted":
                    outcome = None
                    old_mounting_status = model.get_mounting_of_target_tenta_ay_sem(module_code,
                                                                                    ay_sem)
                    if old_mounting_status is True:
                        outcome = model.update_quota(module_code, ay_sem, quota)
                    else:
                        outcome = model.add_tenta_mounting(module_code, ay_sem, quota)
                elif mounting_status == "Not Mounted":
                    outcome = model.delete_tenta_mounting(module_code, ay_sem)
                else:
                    outcome = False

        return Outcome().POST("edit_mounting", outcome, module_code, ay_sem)
Exemple #7
0
    def POST(self):
        '''
            Invoked when user wants to search for modules
            before internship with a specified AY-Sem
        '''
        # will have input data as function is called from button
        input_data = model.validate_input(web.input(), ["aysem"])
        ay_sem = input_data.aysem

        raise web.seeother('/moduleTakenPriorToInternship?aysem=' + ay_sem)
    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)
    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):
        '''
            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)
    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)
    def POST(self):
        '''
            Handles the submission of updated module prerequisites
            for a target module.
        '''
        isSucessfullyUpdated = False

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

        if input_data:
            module_code = input_data.code.upper()
            prerequisites = json.loads(input_data.prerequisites)
            isSucessfullyUpdated = model.edit_prerequisite(module_code, prerequisites)

        new_prerequisites = model.get_prerequisite_as_string(module_code)
        response = [isSucessfullyUpdated, new_prerequisites]

        return json.dumps(response)
    def POST(self, *test_data):
        '''
            Handles the submission of the 'Edit General Module Info' page
        '''
        if test_data:   # for testing purposes
            input_data = test_data[0]
        else:
            input_data = model.validate_input(web.input(), ["code"], show_404=False)

        module_code = None
        try:
            module_code = input_data.code
            module_name = input_data.name
            module_desc = input_data.desc
            module_mc = input_data.mc

            #validate inputs

            if not model.check_name(module_name):
                return model.outcome_invalid()
        except AttributeError:
            return Outcome().POST("edit_module", False, module_code)

        # Validate that MC is a number and is between 0 and 12
        if not model.check_mcs(module_mc):
            return Outcome().POST("edit_module", False, module_code)

        old_module_info = model.get_module(module_code)
        old_module_name = old_module_info[1]
        old_module_desc = old_module_info[2]
        old_module_mc = old_module_info[3]

        outcome = True
        module_info = model.get_module(module_code)
        if module_info is None:
            outcome = False
        elif (module_name != old_module_name or module_desc != old_module_desc or
              int(module_mc) != int(old_module_mc)):
            model.store_original_module_info(module_code, old_module_name,
                                             old_module_desc, old_module_mc)
            outcome = model.update_module(module_code, module_name, module_desc, module_mc)

        if not test_data:
            return Outcome().POST("edit_module", outcome, module_code)
    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)
    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):
        '''
            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)
Exemple #19
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)
Exemple #20
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)
Exemple #21
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
    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)