diff --git a/app/spreadsheet_service.py b/app/spreadsheet_service.py index db10ea4..6eb09f6 100644 --- a/app/spreadsheet_service.py +++ b/app/spreadsheet_service.py @@ -135,6 +135,45 @@ def get_course_assignments(self, student_email:str, course_id:str) -> list: return assignments + def get_course_assignments_teacher(self, course_id:str) -> list: + #if coming from "courses" page, the active document will be "MASTER" + #we want to change that to the document ID of the specific course + if self.doc.id == GOOGLE_SHEETS_MASTER_DOCUMENT_ID: + courses_sheet = self.get_sheet("courses") + courses_records = courses_sheet.get_all_records() + + course_document_id_list = [c["SHEETS_DOCUMENT_ID"] for c in courses_records if c["COURSE_ID"] == int(course_id)] + + if len(course_document_id_list) == 0: + raise Exception("course not found...") + #TODO: handle within the route + if len(course_document_id_list) > 1: + raise Exception("course duplicate found...error") + #TODO: handle within the route + + self.set_active_document(course_document_id_list[0]) + + # now, get the assignments from the sheet + assignment_sheet = self.get_sheet("ASSIGNMENT_MASTER") + assignments = assignment_sheet.get_all_records() + assignments_names_points = [{'NAME': a['NAME'], 'POINTS':a['POINTS'], 'DUE_DATE':a['DUE_DATE']} for a in assignments] + + #get student_grade + gradebook_sheet = self.get_sheet("GRADEBOOK") + all_grades_df = pd.DataFrame(gradebook_sheet.get_all_records()).dropna() + + for i in range(len(assignments_names_points)): + name_points = assignments_names_points[i] + assignment_name = name_points['NAME'] + average_score = round(all_grades_df[assignment_name].mean(),2) + assignments_names_points[i]['AVERAGE_SCORE'] = average_score + assignments_names_points[i]['AVERAGE_PCT'] = f"{(average_score/name_points['POINTS'])*100:.2f}%" + + + print(assignments_names_points) + return assignments_names_points + + def get_course_roster(self, course_id:str): if self.doc.id == GOOGLE_SHEETS_MASTER_DOCUMENT_ID: courses_sheet = self.get_sheet("courses") @@ -275,14 +314,29 @@ def get_weekly_check_ins(self, course_id:str, email:str, user_role:str, check_in #TODO: handle within the route self.set_active_document(course_document_id_list[0]) + + check_in_sheet = self.get_sheet(check_in_sheet_name) + check_in_records = check_in_sheet.get_all_records() if user_role == "STUDENT": - check_in_sheet = self.get_sheet(check_in_sheet_name) - check_in_records = check_in_sheet.get_all_records() student_check_in_records = [r for r in check_in_records if r.get('Email Address') == email] - student_records_df = pd.DataFrame(student_check_in_records) - print(student_records_df) + if len(student_check_in_records) > 0: + student_records_df = pd.DataFrame(student_check_in_records) + student_records_df.drop(['Timestamp', 'Email Address']) + df_keys = list(student_records_df.columns.values) + + return student_records_df.to_dict(), df_keys + + else: + #NO CHECK IN RECORDS FOUND + return None + elif user_role == "TEACHER" or user_role == "TA": + all_records_df = pd.DataFrame(check_in_records) + mean_values = all_records_df.select_dtypes(include=['number']).groupby(all_records_df['Week Number']).mean() + return mean_values + + @@ -297,19 +351,37 @@ def get_user_courses(self, email:str) -> list: but it'll work for now... """ self.set_active_document(GOOGLE_SHEETS_MASTER_DOCUMENT_ID) - students_sheet = self.get_sheet("roster") - all_records = students_sheet.get_all_records() + roster_sheet = self.get_sheet("roster") + all_records = roster_sheet.get_all_records() courses_list = [row for row in all_records if row["EMAIL"] == email] + courses_sheet = self.get_sheet("courses") + courses_records = courses_sheet.get_all_records() + + for c in courses_list: + course_info = [cr for cr in courses_records if int(cr['COURSE_ID']) == int(c['COURSE_ID'])] + + if len(course_info) == 0: + continue + + course_info = course_info[0] + + c['DEPARTMENT'] = course_info['DEPARTMENT'] + c['NUMBER'] = course_info['NUMBER'] + c['COURSE_NAME'] = course_info['COURSE_NAME'] + return courses_list + if __name__ == "__main__": ss = SpreadsheetService() - ss.get_weekly_check_ins(course_id=12345, email='at2015@nyu.edu', user_role="STUDENT", check_in_sheet_name="check-ins-aggregate") + ss.get_weekly_check_ins("12345", "at2015@nyu.edu", "TA", "check-ins-aggregate") + + #ss.get_student_courses("st4505@nyu.edu") #ss.get_assignment_scores("st4505@nyu.edu", "12345", "onboarding") diff --git a/web_app/routes/courses_routes.py b/web_app/routes/courses_routes.py index b19af5c..14d50ae 100644 --- a/web_app/routes/courses_routes.py +++ b/web_app/routes/courses_routes.py @@ -83,6 +83,41 @@ def assignment(course_id, assignment_id): return render_template("assignment.html", assignment_details=assignment_details) + +#TA/TEACHER ROUTES +@courses_routes.route("/courses//students") +@authenticated_route +@ta_route() +def courses_teacher_roster(course_id): + ss = current_app.config["SPREADSHEET_SERVICE"] + roster_data = ss.get_course_roster(course_id) + + current_user = session.get('current_user') + courses_info = [c for c in current_user.get('user_courses') if int(c['COURSE_ID']) == int(course_id)] + + if len(courses_info) == 0: + flash(str(courses_info)) + return redirect('/user/courses') + + return render_template("course_roster.html", roster_data=roster_data, course_id=course_id, personal_course_info=courses_info[0]) + + +@courses_routes.route("/courses//assignments") +@authenticated_route +@ta_route() +def course_assignments(course_id): + ss = current_app.config["SPREADSHEET_SERVICE"] + all_assignment_data = ss.get_course_assignments_teacher(course_id) + + current_user = session.get('current_user') + courses_info = [c for c in current_user.get('user_courses') if int(c['COURSE_ID']) == int(course_id)] + if len(courses_info) == 0: + flash(str(courses_info)) + return redirect('/user/courses') + + return render_template("assignments_teacher.html", assignments=all_assignment_data, personal_course_info=courses_info[0]) + + @courses_routes.route("/courses//students/") @authenticated_route @ta_route() diff --git a/web_app/templates/assignment_teacher.html b/web_app/templates/assignment_teacher.html new file mode 100644 index 0000000..ee7fcb4 --- /dev/null +++ b/web_app/templates/assignment_teacher.html @@ -0,0 +1,46 @@ +{% extends "bootstrap_5_layout.html" %} +{% set active_page = "assignment" %} + +{% block content %} + +

{{ first_name }} {{ last_name }}: {{assignment_details.NAME}}

+

Due: {{assignment_details.DUE_DATE}}

+
+ + {% if assignment_details.STUDENT_DETAILS is defined and assignment_details.STUDENT_DETAILS|length > 0 %} + + + + + + + + + {% for a in assignment_details.STUDENT_DETAILS %} + + + + + + {% endfor %} + + +
MetricScoreComments
+ {{ a.metric }} + + {{ a.score }} + + {{ a.comments }} +
+
+ {% endif %} +

+ Score: {{assignment_details.FINAL_SCORE}} / {{assignment_details.ASSIGNMENT_POINTS}} +

+
+

DETAILS:

+

Mean: {{ assignment_details.CLASS_MEAN }}

+

Lower Quartile: {{ assignment_details.CLASS_LOWER_QUARTILE }}

+

Upper Quartile: {{ assignment_details.CLASS_UPPER_QUARTILE }}

+ +{% endblock %} diff --git a/web_app/templates/assignments_teacher.html b/web_app/templates/assignments_teacher.html index 6e1d6dc..3879ece 100644 --- a/web_app/templates/assignments_teacher.html +++ b/web_app/templates/assignments_teacher.html @@ -3,7 +3,7 @@ {% block content %} -

Assignments - {{first_name}} {{last_name}}({{student_email}})

+

Assignments: {{personal_course_info.DEPARTMENT}}-{{personal_course_info.NUMBER}} {{personal_course_info.COURSE_NAME}}

@@ -11,7 +11,7 @@

Assignments - {{first_name}} {{last_name}}({{student_email}})

- + @@ -27,7 +27,7 @@

Assignments - {{first_name}} {{last_name}}({{student_email}})

{{ a.POINTS }} {% endfor %} diff --git a/web_app/templates/course_students.html b/web_app/templates/course_students.html index ccf0ed5..e433ab7 100644 --- a/web_app/templates/course_students.html +++ b/web_app/templates/course_students.html @@ -3,7 +3,7 @@ {% block content %} -

Course Roster

+

ROSTER: {{personal_course_info.DEPARTMENT}}-{{personal_course_info.NUMBER}} {{personal_course_info.COURSE_NAME}}

Assignment Due Date PointsGradeAverage Score
- {{ a.GRADE }} + {{ a.AVERAGE_SCORE }} ({{ a.AVERAGE_PCT }})
diff --git a/web_app/templates/course_teacher.html b/web_app/templates/course_teacher.html new file mode 100644 index 0000000..65ebeb2 --- /dev/null +++ b/web_app/templates/course_teacher.html @@ -0,0 +1,35 @@ +{% extends "bootstrap_5_layout.html" %} +{% set active_page = "assignments" %} + +{% block content %} + +

Course: {{personal_course_info.DEPARTMENT}}-{{personal_course_info.NUMBER}} {{personal_course_info.COURSE_NAME}}

+ +
+ + + + + + + + + + + + + +
PAGE
Roster
Assignments
+ + + +{% endblock %} diff --git a/web_app/templates/student_assignments_teacher.html b/web_app/templates/student_assignments_teacher.html new file mode 100644 index 0000000..d5799b7 --- /dev/null +++ b/web_app/templates/student_assignments_teacher.html @@ -0,0 +1,47 @@ +{% extends "bootstrap_5_layout.html" %} +{% set active_page = "assignments" %} + +{% block content %} + +

Assignments - {{first_name}} {{last_name}} ({{student_email}})

+ + + + + + + + + + + + {% for a in assignments %} + + + + + + + {% endfor %} + +
AssignmentDue DatePointsGrade
+ {{ a.NAME }} + + {{ a.DUE_DATE }} + + {{ a.POINTS }} + + {{ a.GRADE }} +
+ + + +{% endblock %}