-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathquery_func.py
273 lines (222 loc) · 9.86 KB
/
query_func.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
def return_associated_course(cur, degree, level):
"""
This function intends to return all courses provided by different levels of the given degree.
"""
cur.execute("""
SELECT course_id, is_core, degree_name, level
FROM deg_course
WHERE degree_name = %s AND level = %s;
""", (degree, level))
course_info = cur.fetchall()
return course_info
def return_all_sections_per_degree(cur, degree, level, begin, end):
"""
This function intends to return all sections provided by different levels of the given degree.
"""
cur.execute("""
SELECT s.sec_id, s.course_id, dc.degree_name, dc.level, s.year, s.semester
FROM deg_course dc JOIN section s ON dc.course_id = s.course_id
WHERE dc.degree_name = %s AND dc.level = %s
AND s.year BETWEEN %s AND %s
ORDER BY s.year DESC, (CASE WHEN s.semester ='Spring' THEN 1
WHEN s.semester = 'Summer' THEN 2
WHEN s.semester = 'Fall' THEN 3 END);
""", (degree, level, begin, end))
section_info = cur.fetchall()
return section_info
def return_all_goals(cur, degree, level):
"""
This function intends to return all goals associated with different levels of the given degree.
"""
cur.execute("""
SELECT g.goal_code, g.description, g.degree_name, g.level
FROM goal g
WHERE g.degree_name = %s AND g.level = %s
ORDER BY g.level, g.goal_code;
""", (degree, level))
goal_info = cur.fetchall()
return goal_info
def return_courses_with_goals(cur, degree, level):
"""
This function intends to return all goals and courses associated with different levels of the given degree.
"""
cur.execute("""
SELECT g.goal_code, g.description, dc.course_id, dc.degree_name, dc.level
FROM deg_course dc JOIN goal g ON dc.degree_name = g.degree_name
WHERE g.degree_name = %s AND g.level = %s AND dc.level = %s
ORDER BY dc.level AND g.goal_code;
""", (degree, level, level))
course_goal_info = cur.fetchall()
return course_goal_info
def return_all_section_per_course(cur, course, begin_year, end_year, begin_semester, end_semester):
cur.execute("""
SELECT s.sec_id, s.course_id, s.year, s.semester
FROM section s JOIN course c ON c.course_id = s.course_id
WHERE c.course_id = %s
AND s.year BETWEEN %s AND %s
ORDER BY s.year, (
CASE
WHEN s.semester = 'Spring' THEN 1
WHEN s.semester = 'Summer' THEN 2
WHEN s.semester = 'Fall' THEN 3
END
);
""", (course, begin_year, end_year))
all_section_per_course_info = cur.fetchall()
mapping = {"Spring": 1, "Summer": 2, "Fall": 3}
begin_s = mapping.get(begin_semester)
end_s = mapping.get(end_semester)
filtered_section = []
for sec_id, course_id, year, semester in all_section_per_course_info:
given_s = mapping.get(semester)
if ((year == int(begin_year) and given_s >= int(begin_s)) or (year == end_year and given_s <= int(end_s)) or (year > int(begin_year) or year < int(end_year))):
filtered_section.append((sec_id, course_id, year, semester))
return filtered_section
def return_all_sections_per_instructor(cur, ins_id, begin_year, end_year, begin_semester, end_semester):
cur.execute("""
SELECT s.sec_id, s.course_id, s.year, s.semester
FROM section s
JOIN instructor i ON s.ins_id = i.ins_id
JOIN course c ON s.course_id = c.course_id
WHERE i.ins_id = %s
AND s.year BETWEEN %s AND %s
ORDER BY s.year, (
CASE
WHEN s.semester = 'Spring' THEN 1
WHEN s.semester = 'Summer' THEN 2
WHEN s.semester = 'Fall' THEN 3
END
);
""", (ins_id, begin_year, end_year))
all_section_per_ins_info = cur.fetchall()
mapping = {"Spring": 1, "Summer": 2, "Fall": 3}
begin_s = mapping.get(begin_semester)
end_s = mapping.get(end_semester)
filtered_section = []
for sec_id, course_id, year, semester in all_section_per_ins_info:
given_s = mapping.get(semester)
if ((year == int(begin_year) and given_s >= int(begin_s)) or (year == end_year and given_s <= int(end_s)) or (year > int(begin_year) or year < int(end_year))):
filtered_section.append((sec_id, course_id, year, semester))
return filtered_section
return all_section_per_ins_info
def check_evaluation_status(cur, year, semester, ins_id):
cur.execute("""
SELECT DISTINCT s.course_id, s.sec_id, s.year, s.semester, dc.degree_name, dc.level, e.improvement, e.grade_a, e.grade_b, e.grade_c, e.grade_f,e.measure_type
FROM section s
JOIN deg_course dc ON s.course_id = dc.course_id
JOIN goal g ON dc.degree_name = g.degree_name AND dc.level = g.level
LEFT JOIN evaluation e
ON s.sec_id = e.sec_id AND s.year = e.year AND s.semester = e.semester
AND e.degree_name = dc.degree_name AND e.level = dc.level AND s.course_id = e.course_id
WHERE s.semester = %s AND s.year = %s AND s.ins_id = %s;
""", (semester, year, ins_id))
evaluation_info = cur.fetchall()
# Initialize the results
section_status = []
# Iterate evaluation info
for course_id, sec_id, year, semester, degree_name, level, improvement, grade_a, grade_b, grade_c, grade_f, measure_type in evaluation_info:
# Initialize the missing fields
missing_field = []
# Add improvement in the missing field if improvement is NULL
if not improvement:
missing_field.append("improvement")
# Add grade and its counts if grade counts is NULL
grades = {
'grade_a': grade_a,
'grade_b': grade_b,
'grade_c': grade_c,
'grade_f': grade_f,
}
print(grades)
for grade_name, grade_count in grades.items():
if grade_count is None:
missing_field.append(grade_name)
print(missing_field)
# Check the missing field by counting the number of missing field
if len(missing_field) == 5: # all fileds are missing
status = "evaluation Not Entered"
elif len(missing_field) <= 4 and len(missing_field) > 0: # some are missing
status = "evaluation Partially Entered"
elif len(missing_field) == 0: # no missing field
status = "evaluation Fully Entered"
# Append section and degree-specific status
section_status.append({
"course_id": course_id,
"sec_id": sec_id,
"year": year,
"semester": semester,
"degree_name": degree_name,
"level": level,
"status": status,
"missing_fields": missing_field,
"improvement": improvement,
"grade_a": grade_a,
"grade_b": grade_b,
"grade_c": grade_c,
"grade_f": grade_f,
"measure_type": measure_type,
})
return section_status
def return_sections_over_percentage(cur, year: int, semester, percentage: int):
cur.execute("""
SELECT DISTINCT s.sec_id, s.course_id, s.year, s.semester, s.Num_Student, ((e.grade_a + e.grade_b + e.grade_c) / NULLIF((e.grade_a + e.grade_b + e.grade_c + e.grade_f), 0)) * 100 AS Non_F_Percentage
FROM evaluation e JOIN section s ON e.sec_id = s.sec_id
AND e.year = s.year
AND e.semester = s.semester
WHERE e.year = %s AND e.semester = %s
Having Non_F_Percentage >= %s;
""", (year, semester, percentage))
section_over_percentage_info = cur.fetchall()
return section_over_percentage_info
def get_degrees(cur):
cur.execute("SELECT CONCAT(name, ' , ', level) FROM degree;")
all_degrees = cur.fetchall()
all_degrees_to_list = [row[0] for row in all_degrees]
return all_degrees_to_list if all_degrees_to_list else ["No Degrees"]
def get_courses(cur):
cur.execute("SELECT CONCAT(course_id, ' , ', name) FROM course;")
all_courses = cur.fetchall()
all_courses_to_list = [row[0] for row in all_courses]
return all_courses_to_list if all_courses_to_list else ["No Courses"]
def get_instructors(cur):
cur.execute("SELECT CONCAT(ins_id, ' , ', name) FROM instructor")
all_instructors = cur.fetchall()
all_instructors_to_list = [row[0] for row in all_instructors]
return all_instructors_to_list if all_instructors_to_list else ["No Instructor"]
def get_section_info(cur):
cur.execute("SELECT sec_id, year, semester, course_id FROM section")
all_sections = cur.fetchall()
return all_sections if all_sections else [("No sec_id", "No Year", "No Semester", "No Course")]
def get_degree_info(cur):
cur.execute("""
SELECT name, level
FROM degree
""")
degree_info = cur.fetchall()
return degree_info if degree_info else [("No degree Name", "No Level")]
def get_degree_goal_info(cur):
cur.execute("""
SELECT d.name, d.level, g.goal_code
FROM degree d JOIN goal g on d.name = g.degree_name AND d.level = g.level
""")
degree_info = cur.fetchall()
return degree_info if degree_info else [("No degree Name", "No Level", "No Goal")]
def get_evaluation_info(cur):
cur.execute("""
SELECT *
FROM evaluation
WHERE
""")
def get_source_evaluation(cur, sec_id, semester, year, course_id):
cur.execute("""
SELECT improvement, grade_a, grade_b, grade_c, grade_f, measure_type
FROM evaluation
WHERE sec_id = %s AND semester = %s AND year = %s
AND course_id = %s;
""", (sec_id, semester, year, course_id))
source_evaluation = cur.fetchone()
if source_evaluation is None:
print(
f"No other evaluation found for {course_id}-{sec_id}-{year}-{semester}.")
return {"error": "Source evaluation not found"}
return source_evaluation