Spaces:
Runtime error
Runtime error
Update app.py
Browse files
app.py
CHANGED
@@ -8,35 +8,44 @@ from collections import defaultdict
|
|
8 |
|
9 |
# ========== TRANSCRIPT PARSING FUNCTIONS ==========
|
10 |
def extract_courses_with_grade_levels(text):
|
|
|
11 |
grade_level_pattern = r"(Grade|Year)\s*[:]?\s*(\d+|Freshman|Sophomore|Junior|Senior)"
|
12 |
grade_match = re.search(grade_level_pattern, text, re.IGNORECASE)
|
13 |
current_grade_level = grade_match.group(2) if grade_match else "Unknown"
|
14 |
|
|
|
15 |
course_pattern = r"""
|
16 |
(?:^|\n)
|
17 |
-
(?: (Grade|Year)\s*[:]?\s*(\d+|Freshman|Sophomore|Junior|Senior)\s*[\n-]* )?
|
18 |
(
|
19 |
-
(?:[A-Z]{2,}\s?\d{3})
|
20 |
|
|
21 |
-
[A-Z][a-z]+(?:\s[A-Z][a-z]+)
|
22 |
)
|
23 |
\s*
|
24 |
-
(?: [:\-]?\s* ([A-F][+-]?|\d{2,3}%)? )?
|
|
|
|
|
25 |
"""
|
26 |
|
27 |
courses_by_grade = defaultdict(list)
|
28 |
current_grade = current_grade_level
|
29 |
|
30 |
for match in re.finditer(course_pattern, text, re.VERBOSE | re.MULTILINE):
|
31 |
-
grade_context, grade_level, course, grade = match.groups()
|
32 |
|
33 |
if grade_context:
|
34 |
current_grade = grade_level
|
35 |
|
36 |
if course:
|
37 |
-
course_info = {
|
|
|
|
|
|
|
38 |
if grade:
|
39 |
course_info["grade"] = grade.strip()
|
|
|
|
|
40 |
courses_by_grade[current_grade].append(course_info)
|
41 |
|
42 |
return dict(courses_by_grade)
|
@@ -94,8 +103,6 @@ def parse_transcript(file):
|
|
94 |
else:
|
95 |
output_text += "No GPA information found\n"
|
96 |
|
97 |
-
output_text += "\n(Courses not shown here)"
|
98 |
-
|
99 |
return output_text, {
|
100 |
"gpa": gpa_data,
|
101 |
"grade_level": grade_level,
|
@@ -123,15 +130,37 @@ def parse_transcript(file):
|
|
123 |
courses = df[col].tolist()
|
124 |
break
|
125 |
|
126 |
-
|
127 |
-
output_text += "\n".join(f"- {course}" for course in courses)
|
128 |
-
|
129 |
-
return output_text, {
|
130 |
"gpa": {"unweighted": gpa, "weighted": "N/A"},
|
131 |
"grade_level": grade_level,
|
132 |
"courses": courses
|
133 |
}
|
134 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
135 |
# ========== LEARNING STYLE QUIZ ==========
|
136 |
learning_style_questions = [
|
137 |
"When you study for a test, you prefer to:",
|
|
|
8 |
|
9 |
# ========== TRANSCRIPT PARSING FUNCTIONS ==========
|
10 |
def extract_courses_with_grade_levels(text):
|
11 |
+
# First extract the current grade level
|
12 |
grade_level_pattern = r"(Grade|Year)\s*[:]?\s*(\d+|Freshman|Sophomore|Junior|Senior)"
|
13 |
grade_match = re.search(grade_level_pattern, text, re.IGNORECASE)
|
14 |
current_grade_level = grade_match.group(2) if grade_match else "Unknown"
|
15 |
|
16 |
+
# Improved course pattern to better match course codes and names
|
17 |
course_pattern = r"""
|
18 |
(?:^|\n)
|
19 |
+
(?: (Grade|Year)\s*[:]?\s*(\d+|Freshman|Sophomore|Junior|Senior)\s*[\n-]* )? # Optional grade level context
|
20 |
(
|
21 |
+
(?:[A-Z]{2,}\s?\d{3}[A-Z]?\b) # Course codes like MATH101 or CS 201A
|
22 |
|
|
23 |
+
(?:[A-Z][a-z]+(?:\s+[A-Z][a-z]+)+) # Course names like "Calculus I" or "World History"
|
24 |
)
|
25 |
\s*
|
26 |
+
(?: [:\-]?\s* ([A-F][+-]?|\d{2,3}%)? )? # Optional grade
|
27 |
+
\s*
|
28 |
+
(?: [:\-]?\s* (\d\.\d{1,2})? )? # Optional credit hours
|
29 |
"""
|
30 |
|
31 |
courses_by_grade = defaultdict(list)
|
32 |
current_grade = current_grade_level
|
33 |
|
34 |
for match in re.finditer(course_pattern, text, re.VERBOSE | re.MULTILINE):
|
35 |
+
grade_context, grade_level, course, grade, credits = match.groups()
|
36 |
|
37 |
if grade_context:
|
38 |
current_grade = grade_level
|
39 |
|
40 |
if course:
|
41 |
+
course_info = {
|
42 |
+
"course": course.strip(),
|
43 |
+
"grade_level": current_grade
|
44 |
+
}
|
45 |
if grade:
|
46 |
course_info["grade"] = grade.strip()
|
47 |
+
if credits:
|
48 |
+
course_info["credits"] = credits.strip()
|
49 |
courses_by_grade[current_grade].append(course_info)
|
50 |
|
51 |
return dict(courses_by_grade)
|
|
|
103 |
else:
|
104 |
output_text += "No GPA information found\n"
|
105 |
|
|
|
|
|
106 |
return output_text, {
|
107 |
"gpa": gpa_data,
|
108 |
"grade_level": grade_level,
|
|
|
130 |
courses = df[col].tolist()
|
131 |
break
|
132 |
|
133 |
+
return f"Grade Level: {grade_level}\nGPA: {gpa}", {
|
|
|
|
|
|
|
134 |
"gpa": {"unweighted": gpa, "weighted": "N/A"},
|
135 |
"grade_level": grade_level,
|
136 |
"courses": courses
|
137 |
}
|
138 |
|
139 |
+
# ... [keep all other functions the same until transcript_display] ...
|
140 |
+
|
141 |
+
def transcript_display(transcript_dict):
|
142 |
+
if not transcript_dict:
|
143 |
+
return "No transcript uploaded."
|
144 |
+
|
145 |
+
if isinstance(transcript_dict, dict) and "courses" in transcript_dict:
|
146 |
+
if isinstance(transcript_dict["courses"], dict):
|
147 |
+
display = "### Course History\n\n"
|
148 |
+
for grade_level, courses in transcript_dict["courses"].items():
|
149 |
+
display += f"**Grade {grade_level}**\n"
|
150 |
+
for course in courses:
|
151 |
+
display += f"- {course.get('course', 'N/A')}"
|
152 |
+
if 'grade' in course:
|
153 |
+
display += f" (Grade: {course['grade']})"
|
154 |
+
if 'credits' in course:
|
155 |
+
display += f" | Credits: {course['credits']}"
|
156 |
+
display += "\n"
|
157 |
+
display += "\n"
|
158 |
+
return display
|
159 |
+
elif isinstance(transcript_dict["courses"], list):
|
160 |
+
return "### Courses\n" + "\n".join([f"- {course}" for course in transcript_dict["courses"]])
|
161 |
+
|
162 |
+
return "No course information available in the expected format."
|
163 |
+
|
164 |
# ========== LEARNING STYLE QUIZ ==========
|
165 |
learning_style_questions = [
|
166 |
"When you study for a test, you prefer to:",
|