Skip to content

Commit

Permalink
working get assignment details
Browse files Browse the repository at this point in the history
finally
  • Loading branch information
chrissdelaney committed Apr 2, 2024
1 parent 2450ed6 commit 613a86c
Show file tree
Hide file tree
Showing 6 changed files with 125 additions and 201 deletions.
151 changes: 78 additions & 73 deletions app/spreadsheet_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,8 @@ def get_student_courses(self, email:str) -> list:

student_courses_info = [course_info for course_info in all_courses if course_info["COURSE_ID"] in student_course_ids]

print(student_courses_info)

return student_courses_info


Expand Down Expand Up @@ -122,7 +124,20 @@ def get_course_assignments(self, student_email:str, course_id:str) -> list:

return assignments

def get_assignment_details(self, student_email:str, course_id:str, assignment_id:str) -> dict:

@staticmethod
def excel_column_to_number(column):
"""
HELPER METHOD FOR get_assignment_scores
Converts an Excel column letter (e.g., 'A', 'Z', 'AA') into its corresponding
column number (e.g., 1, 26, 27).
"""
number = 0
for char in column.upper(): # Ensure uppercase for consistency
number = number * 26 + (ord(char) - ord('A') + 1)
return number - 1

def get_assignment_scores(self, student_email:str, course_id:str, assignment_id:str) -> dict:
if self.doc.id == GOOGLE_SHEETS_MASTER_DOCUMENT_ID:
courses_sheet = self.get_sheet("courses")
courses_records = courses_sheet.get_all_records()
Expand All @@ -138,95 +153,85 @@ def get_assignment_details(self, student_email:str, course_id:str, assignment_id

self.set_active_document(course_document_id_list[0])


#fetch details about the assignment
assignments_sheet = self.get_sheet("ASSIGNMENT_MASTER")
assignments = assignments_sheet.get_all_records()
assignment_details = [a for a in assignments if a.get('SHEET_NAME') == assignment_id]

if len(assignment_details) == 0:
raise Exception("assignment sheet with id not found!")

assignment_details = assignment_details[0]


header_row = assignment_details.get("HEADER_ROW")
assignment_sheet = self.get_sheet(assignment_id)
assignment_values = assignment_sheet.get_all_values()

#fetch the student data
row = 0
header_row = []
student_row = []
for r in assignment_values:
if "Email Address" in r:
header_row = r
elif student_email in r:
student_row = r
row += 1

if header_row != [] and student_row != []:
break


if header_row == [] or student_row == []:
raise Exception("Error! Header row or student row not found.")

on_time_index = -1
raw_score_index = -1
for i in range(len(header_row)):
if header_row[i] == "ON TIME":
on_time_index = i
elif header_row[i] == "RAW SCORE":
raw_score_index = i

if on_time_index > 0 and raw_score_index > 0:
break

assignments_list = []
i = on_time_index
while i <= raw_score_index:
if i == raw_score_index:
assignment_details['RAW_SCORE'] = self.to_pct(float(student_row[i]))
break
assignments_list.append({
"metric": header_row[i],
"score": student_row[i],
"comments": student_row[i+1],
})
i += 2

assignment_details["DETAILS"] = assignments_list

###NOTE: SCORE_COLS with column indices of scores
###NOTE: COMMENT_COLS

#now get the avg and stdev
all_scores = []
raw_score_found = False
for row in assignment_values:
raw_score = row[raw_score_index]

if raw_score == "RAW SCORE":
raw_score_found = True
elif raw_score_found and (isinstance(raw_score, float) or isinstance(raw_score, int)):
all_scores.append(float(raw_score))
elif raw_score_found and raw_score == "":
break
#get student's grades on the assignment
assignment_records = assignment_sheet.get_all_records(head=header_row)
student_assignment_row = [a for a in assignment_records if a.get('Email Address') == student_email]

if len(student_assignment_row) == 0:
raise Exception("Assignment details for student not found!")

student_assignment_row = student_assignment_row[0]

#transform the student data into friendly format
scores_to_return = []
if assignment_details.get('SCORE_COLUMNS') != '':
assignment_score_cols = assignment_details.get('SCORE_COLUMNS').split(',')
assignment_score_col_indices = [self.excel_column_to_number(c) for c in assignment_score_cols]
assignment_score_col_headers = [list(student_assignment_row.keys())[i] for i in assignment_score_col_indices]

assignment_comment_cols = assignment_details.get('COMMENT_COLUMNS').split(',')
assignment_comment_col_indices = [self.excel_column_to_number(c) for c in assignment_comment_cols]
assignment_comment_col_headers = [list(student_assignment_row.keys())[i] for i in assignment_comment_col_indices]

scores_to_return = []
for score_header, comment_header in zip(assignment_score_col_headers, assignment_comment_col_headers):
metric = score_header
score = student_assignment_row[score_header]
comments = student_assignment_row[comment_header]

scores_to_return.append({'metric': metric, 'score': score, 'comments': comments})

#get student final score
final_grade_col_index = assignment_details.get('FINAL_GRADE_COLUMN_INDEX') #we have this as a number in the sheet...
final_grade_col_header = list(student_assignment_row.keys())[final_grade_col_index]

student_final_grade = student_assignment_row.get(final_grade_col_header)


#get average, stdev, etc from data
all_student_scores = [r.get(final_grade_col_header) for r in assignment_records]
all_student_scores = [s if isinstance(s, int) or isinstance(s, float) else 0 for s in all_student_scores]
all_student_scores = np.array(all_student_scores)

class_mean = round(all_student_scores.mean(),2)
class_upper_quartile = np.percentile(all_student_scores, 75)
class_lower_quartile = np.percentile(all_student_scores, 25)

#transform all assignment data into website-readable format
details_to_return = {
"NAME": assignment_details.get('NAME'),
"ASSIGNMENT_POINTS": assignment_details.get('POINTS'),
"FINAL_SCORE": student_final_grade,
"DUE_DATE": assignment_details.get('DUE_DATE'),
"CLASS_MEAN": class_mean,
"CLASS_UPPER_QUARTILE": class_upper_quartile,
"CLASS_LOWER_QUARTILE": class_lower_quartile,
"STUDENT_DETAILS": scores_to_return
}

return details_to_return

all_scores = np.array(all_scores)
scores_mean = all_scores.mean()
scores_25percentile = .75 #CHANGE
scores_75percentile = .9 #CHANGE
#scores_25percentile = np.percentile(all_scores, 25)
#scores_75percentile = np.percentile(all_scores, 75)



return assignment_details, scores_mean, scores_25percentile, scores_75percentile



if __name__ == "__main__":

ss = SpreadsheetService()

ss.get_assignment_details("[email protected]", "12345", "stocks-mjr")
#ss.get_student_courses("[email protected]")

ss.get_assignment_scores("[email protected]", "12345", "onboarding")
6 changes: 4 additions & 2 deletions web_app/routes/courses_routes.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ def assignment(course_id, assignment_id):
email = "[email protected]"
#######################

assignment_details, mean, perc25, perc75 = ss.get_assignment_details(email, course_id, assignment_id)
assignment_details = ss.get_assignment_scores(email, course_id, assignment_id)

return render_template("assignment.html", assignment_details=assignment_details, mean=mean, perc25=perc25, perc75=perc75)
print(assignment_details)

return render_template("assignment.html", assignment_details=assignment_details)
60 changes: 30 additions & 30 deletions web_app/templates/assignment.html
Original file line number Diff line number Diff line change
Expand Up @@ -6,41 +6,41 @@
<h1>Assignment: {{assignment_details.NAME}}</h1>
<h3>Due: {{assignment_details.DUE_DATE}}</h3>
<hr>
<table class="table table-hover text-center">
<thead>
<tr>
<th scope="col">Metric</th>
<th scope="col">Score</th>
<th scope="col">Comments</th>
</tr>
<tbody>
{% for a in assignment_details.DETAILS %}

{% if assignment_details.STUDENT_DETAILS is defined and assignment_details.STUDENT_DETAILS|length > 0 %}
<table class="table table-hover text-center">
<thead>
<tr>
<td>
{{ a.metric }}
</td>
<td>
{{ a.score }}
</td>
<td>
{{ a.comments }}
</td>
<th scope="col">Metric</th>
<th scope="col">Score</th>
<th scope="col">Comments</th>
</tr>
{% endfor %}
</tbody>
</thead>
</table>
<hr>
<tbody>
{% for a in assignment_details.STUDENT_DETAILS %}
<tr>
<td>
{{ a.metric }}
</td>
<td>
{{ a.score }}
</td>
<td>
{{ a.comments }}
</td>
</tr>
{% endfor %}
</tbody>
</thead>
</table>
<hr/>
{% endif %}
<h4>
Score: {{assignment_details.RAW_SCORE}}
Score: {{assignment_details.FINAL_SCORE}} / {{assignment_details.ASSIGNMENT_POINTS}}
</h4>
<p>
Points: {{assignment_details.POINTS}}
</p>
<hr>
<h3>DETAILS:</h3>
<p>Mean: {{ mean }}</p>
<p>25th Percentile: {{ perc25 }}</p>
<p>75th Percentile: {{ perc75 }}</p>
<p>Mean: {{ assignment_details.CLASS_MEAN }}</p>
<p>Lower Quartile: {{ assignment_details.CLASS_LOWER_QUARTILE }}</p>
<p>Upper Quartile: {{ assignment_details.CLASS_UPPER_QUARTILE }}</p>

{% endblock %}
19 changes: 13 additions & 6 deletions web_app/templates/courses.html
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,10 @@ <h1>My Courses</h1>
</tr>
<tbody>
{% for c in courses %}
<tr>
<a href="/courses/{{c.COURSE_ID}}">
<td>
{{ c.DEPARTMENT }}-{{ c.NUMBER }}: {{ c.COURSE_NAME }}
</td>
</a>
<tr class="clickable-row" data-href="/courses/{{ c.COURSE_ID }}">
<td>
{{ c.DEPARTMENT }}-{{ c.NUMBER }}: {{ c.COURSE_NAME }}
</td>
<td>
{{ c.TERM }}
</td>
Expand All @@ -32,4 +30,13 @@ <h1>My Courses</h1>
</thead>
</table>

<script>
document.addEventListener("DOMContentLoaded", function(){
document.querySelectorAll('.clickable-row').forEach(row => {
row.addEventListener('click', function() {
window.location.href = this.dataset.href;
});
});
});
</script>
{% endblock %}
56 changes: 0 additions & 56 deletions web_app/templates/user_orders.html

This file was deleted.

34 changes: 0 additions & 34 deletions web_app/templates/user_profile.html

This file was deleted.

0 comments on commit 613a86c

Please sign in to comment.