def __init__(self, college_codes, branch_codes, semester): """ :type branch_codes: list containing branch codes of branches selected by user :type college_codes: list containing college codes of colleges selected by user :type semester: integer lies between 0 and 8 """ ExcelGenerator.__init__(self, college_codes, branch_codes, semester)
def graph_selector(self): """ Selects which graph to plot on the basis of fields selected and returns data in the form such that google charts can plot graph :return: a list containing data which is to be passed to google charts """ # this dictionary maps branch codes to their abbreviations branch_dict = { "00": "CE", "10": "CSE", "13": "IT", "20": "EE", "21": "EN", "22": "ICE", "30": "ELE", "31": "ECE", "32": "EIE", "35": "AEI", "40": "ME", "41": "MT", "45": "IPE", "51": "CHE", "54": "BT", } # this dictionary maps college codes to their abbreviations college_dict = { "027": "AKGEC", "029": "KIET", "032": "ABES", "033": "RKGIT", "054": "BBDNITM", "063": "GLAITM", "068": "MIET", "077": "KNMIET", "091": "JSSATE", "097": "GALGOTIAS", "110": "IERT", "122": "RAMSWAROOP", "128": "BHARAT", "143": "IMS", "161": "KEC", "164": "PSIT", "193": "UNITED", "520": "INDRAPRASTHA", } # this if plots marks for subjects of one college, one branch and one semester if len(self.colleges) == 1 and len(self.branches) == 1 and len(self.semester) == 1: # the dictionary to be returned return_dict = {} data = [["Subject Codes", "Maximum Obtained", "Average Marks", "Minimum Obtained"]] return_dict["title"] = ( "Subject-wise analysis: College: " + college_dict[self.colleges[0].code] + " - Branch: " + branch_dict[self.branches[0].code] + " - Semester: " + str(self.semester[0]) ) # getting results in list of dictionary form by calling result_dict method results = ExcelGenerator.result_dict(self.colleges[0], self.branches[0], self.semester[0]) if not results: return_dict["error"] = "Selected branch and semester doesn't exist for this college" return return_dict data_list = [[str(sub_code), 0, 0, 300] for sub_code in results[1]] num_students = 0 maximum_marks = [] # stores maximum marks of each subject for i in range(len(results[0])): sub_code_keys = results[0][i]["marks"].keys() if sub_code_keys == results[1]: # checking if student is normal or not num_students += 1 if not maximum_marks: for r in range(len(sub_code_keys)): maximum_marks.append(GraphGenerator.max_of_subject(results[0][i]["marks"].values()[r][-1])) for j in range(len(sub_code_keys)): sub_marks = sum(results[0][i]["marks"][sub_code_keys[j]][1:-1]) data_list[j][2] += sub_marks if data_list[j][1] < sub_marks: data_list[j][1] = int(sub_marks) if data_list[j][3] > sub_marks: data_list[j][3] = int(sub_marks) for k in range(len(results[1])): data_list[k][2] = int(data_list[k][2] / float(num_students)) data_list[k][1] = int(data_list[k][1] / float(maximum_marks[k]) * 100) data_list[k][2] = int(data_list[k][2] / float(maximum_marks[k]) * 100) data_list[k][3] = int(data_list[k][3] / float(maximum_marks[k]) * 100) return_dict["data"] = data + data_list return return_dict # this if plots average, max and min marks of each semester for selected college and branch elif len(self.colleges) == 1 and len(self.branches) == 1 and len(self.semester) != 1: # dictionary to be returned return_dict = {} data = [["Semesters", "Maximum Marks", "Average Marks", "Minimum Marks"]] return_dict["title"] = ( "Semester-wise analysis: College: " + college_dict[self.colleges[0].code] + " - Branch: " + branch_dict[self.branches[0].code] ) for sem in self.semester: # querying marks of each semester sem_marks = AverageMarks.objects.filter( college=self.colleges[0], branch=self.branches[0], semester=sem ).first() if sem_marks: data.append([str(sem), int(sem_marks.maximum), int(sem_marks.average), int(sem_marks.minimum)]) if len(data) == 1: return_dict["error"] = "Selected branch doesn't exist for this college" return return_dict return_dict["data"] = data return return_dict # this if plots average, max, min marks of each branch of selected college and semester elif len(self.colleges) == 1 and len(self.branches) != 1 and len(self.semester) == 1: # dictionary to be returned return_dict = {} data = [["Branches", "Maximum", "Average", "Minimum"]] return_dict["title"] = ( "Branch-wise analysis: College: " + college_dict[self.colleges[0].code] + " - Semester: " + str(self.semester[0]) ) for branch in self.branches: # querying marks of each branch br_marks = AverageMarks.objects.filter( college=self.colleges[0], branch=branch, semester=self.semester[0] ).first() if br_marks: data.append( [branch_dict[branch.code], int(br_marks.maximum), int(br_marks.average), int(br_marks.minimum)] ) if len(data) == 1: return_dict["error"] = "Selected branch and semester doesn't exist for this college" return return_dict return_dict["data"] = data return return_dict # plots average marks of each branch for each semester of the selected college elif len(self.colleges) == 1 and len(self.branches) != 1 and len(self.semester) != 1: # dictionary to be returned return_dict = {} data = [["Semesters"]] return_dict["title"] = "Semester-wise analysis College: " + college_dict[self.colleges[0].code] # lists contains branches which exist for selected college existing_branches = [] # the next two loops for adding existing branches to the list for sem in self.semester: for branch in self.branches: sem_marks = AverageMarks.objects.filter( college=self.colleges[0], branch=branch, semester=sem ).first() if sem_marks: if branch not in existing_branches: existing_branches.append(branch) data[0].append(branch_dict[branch.code]) for sem in self.semester: sem_list = [str(sem)] # individual list to be appended to the nested list for branch in existing_branches: sem_marks = AverageMarks.objects.filter( college=self.colleges[0], branch=branch, semester=sem ).first() if sem_marks: sem_list.append(int(sem_marks.average)) else: sem_list.append(0) # adding zero if marks doesn't exit for that semester data.append(sem_list) if len(data) == 1: return_dict["error"] = "Branches doesn't exist for selected college" return return_dict return_dict["data"] = data return return_dict # plots marks of selected colleges for given branch and semester elif len(self.colleges) != 1 and len(self.branches) == 1 and len(self.semester) == 1: # dictionary to be returned return_dict = {} data = [["Colleges", "Maximum", "Average", "Minimum"]] return_dict["title"] = ( "College-wise analysis of Branch: " + branch_dict[self.branches[0].code] + " - Semester: " + str(self.semester[0]) ) for college in self.colleges: college_marks = AverageMarks.objects.filter( college=college, branch=self.branches[0], semester=self.semester[0] ).first() if college_marks: data.append( [ college_dict[college.code], int(college_marks.maximum), int(college_marks.average), int(college_marks.minimum), ] ) if len(data) == 1: return_dict["error"] = "No colleges for selected branch and semester" return return_dict return_dict["data"] = data return return_dict # plots semester-wise marks of different colleges for selected branch elif len(self.colleges) != 1 and len(self.branches) == 1 and len(self.semester) != 1: # dictionary to be returned return_dict = {} data = [["Semesters"]] return_dict["title"] = "Semester-wise analysis of Branch: " + branch_dict(self.branches[0].code) existing_colleges = [] # next 2 for loops for selecting which colleges have selected branch for sem in self.semester: for college in self.colleges: college_marks = AverageMarks.objects.filter( college=college, branch=self.branches[0], semester=sem ).first() if college_marks: # add college if marks exist if college not in existing_colleges: existing_colleges.append(college) data[0].append(college_dict[college.code]) # for making data list for sem in self.semester: sem_list = [str(sem)] for i in range(len(existing_colleges)): college_marks = AverageMarks.objects.filter( college=existing_colleges[i], branch=self.branches[0], semester=sem ).first() if college_marks: sem_list.append(int(college_marks.average)) else: sem_list.append(0) data.append(sem_list) if len(data) == 1: return_dict["error"] = "Selected branch doesn't exist in selected colleges" return return_dict return_dict["data"] = data return return_dict # plots branch-wise marks of different colleges(clustered) for selected semester elif len(self.colleges) != 1 and len(self.branches) != 1 and len(self.semester) == 1: # dictionary to be returned return_dict = {} data = [["Branches"]] return_dict["title"] = "Branch-wise analysis of Semester: " + str(self.semester[0]) common_branches = [] # selecting common branches for branch in self.branches: flag = 1 for college in self.colleges: college_marks = AverageMarks.objects.filter( college=college, branch=branch, semester=self.semester[0] ).first() if not college_marks: flag = 0 if flag == 1: common_branches.append(branch) # making data list if some common branches found if common_branches: for branch in common_branches: branch_list = [branch_dict[branch.code]] for college in self.colleges: college_marks = AverageMarks.objects.filter( college=college, branch=branch, semester=self.semester[0] ).first() if college_marks: if college_dict[college.code] not in data[0]: data[0].append(college_dict[college.code]) branch_list.append(int(college_marks.average)) data.append(branch_list) return_dict["data"] = data return return_dict # checking for common colleges common_colleges = [] for college in self.colleges: flag = 1 for branch in self.branches: branch_marks = AverageMarks.objects.filter( college=college, branch=branch, semester=self.semester[0] ) if not branch_marks: flag = 0 if flag == 1: common_colleges.append(college) # making data list if common colleges found if common_colleges: for branch in self.branches: branch_list = [branch_dict[branch.code]] for college in common_colleges: college_marks = AverageMarks.objects.filter( college=college, branch=branch, semester=self.semester[0] ).first() if college_marks: if college_dict[college.code] not in data[0]: data[0].append(college_dict[college.code]) branch_list.append(int(college_marks.average)) data.append(branch_list) return_dict["data"] = data return return_dict # if no common branch or common college found then returning the error message return_dict["error"] = "Selected branches do not exist in selected colleges" return return_dict # plots semester-wise average marks(of all branches) of selected colleges(clustered) elif len(self.colleges) != 0 and len(self.branches) != 1 and len(self.semester) != 1: # dictionary to be returned return_dict = {} data = [["Semesters"]] return_dict["title"] = "Semester-wise analysis of different colleges by taking average of all branches" for sem in self.semester: sem_list = [str(sem)] common_branches = [] for branch in self.branches: flag = 1 for college in self.colleges: college_marks = AverageMarks.objects.filter( college=college, branch=branch, semester=sem ).first() if not college_marks: flag = 0 if flag == 1: common_branches.append(branch) if common_branches: common_colleges = self.colleges else: common_branches = self.branches common_colleges = [] for college in self.colleges: flag = 1 for branch in common_branches: branch_marks = AverageMarks.objects.filter( college=college, branch=branch, semester=sem ).first() if not branch_marks: flag = 0 if flag == 1: common_colleges.append(college) for college in common_colleges: if college_dict[college.code] not in data[0]: data[0].append(college_dict[college.code]) college_marks = 0 for branch in common_branches: branch_marks = AverageMarks.objects.filter(college=college, branch=branch, semester=sem).first() college_marks += branch_marks.average college_marks = int(college_marks / float(len(common_branches))) sem_list.append(college_marks) data.append(sem_list) if len(data[0]) != 1: # returning data return_dict["data"] = data return return_dict else: # returning error message if no data found return_dict["error"] = "Selected branches do not exist for selected colleges" return return_dict