diff --git a/advlabdb/adminModelViews.py b/advlabdb/adminModelViews.py index 3824805..4fd9a67 100644 --- a/advlabdb/adminModelViews.py +++ b/advlabdb/adminModelViews.py @@ -63,6 +63,7 @@ from advlabdb.utils import ( initActiveSemesterMenuLinks, randomPassword, setUserActiveSemester, + sortedSemestersStartingWithNewest, userActiveSemester, ) @@ -1440,6 +1441,15 @@ class AnalysisView(SecureAdminBaseView): assistantMarksSubmit = SubmitField( label="Assistant's marks", ) + finalPartMarksSubmit = SubmitField( + label="Final part marks", + ) + + def htmlFig(fig): + buf = BytesIO() + fig.savefig(buf, format="png") + + return b64encode(buf.getbuffer()).decode("ascii") def markHist(data, title): fig = Figure() @@ -1463,10 +1473,7 @@ class AnalysisView(SecureAdminBaseView): ax.set_title(title) - buf = BytesIO() - fig.savefig(buf, format="png") - - return b64encode(buf.getbuffer()).decode("ascii") + return AnalysisView.htmlFig(fig) def markHists(markType, activeAssistants): attr = markType.lower() + "_mark" @@ -1512,6 +1519,53 @@ class AnalysisView(SecureAdminBaseView): protocolMarkHists=protocolMarkHists, ) + if form.finalPartMarksSubmit.data: + parts = userActiveSemester().parts + activeSemesterFinalPartMarksHists = [ + AnalysisView.markHist( + data=np.array([partStudent.final_part_mark for partStudent in part.part_students]), + title=part.repr(), + ) + for part in parts + ] + + semesters = sortedSemestersStartingWithNewest() + semesterLabels = [semester.repr() for semester in semesters] + meanFinalPartMarks = np.flip( + [ + np.mean( + np.hstack( + [ + [partStudent.final_part_mark for partStudent in part.part_students] + for part in semester.parts + ] + ) + ) + for semester in semesters + ] + ) + + fig = Figure() + ax = fig.subplots() + x = range(1, len(meanFinalPartMarks) + 1) + ax.plot( + x, + meanFinalPartMarks, + marker="d", + ) + # TODO: Change ticks to semester labels + # TODO: Check linestyle + ax.set_xticks(x) + ax.set_xlim(0.5, x[-1] + 0.5) + + meanFinalPartMarksPlot = AnalysisView.htmlFig(fig) + + return self.render( + "analysis/final_part_marks.html", + activeSemesterFinalPartMarksHists=activeSemesterFinalPartMarksHists, + meanFinalPartMarksPlot=meanFinalPartMarksPlot, + ) + return self.render("analysis/analysis.html", form=form) diff --git a/advlabdb/templates/analysis/analysis.html b/advlabdb/templates/analysis/analysis.html index 2cf06dd..ff3014a 100644 --- a/advlabdb/templates/analysis/analysis.html +++ b/advlabdb/templates/analysis/analysis.html @@ -9,5 +9,7 @@
{{ form.csrf_token }} {{ form.assistantMarksSubmit }} +
+ {{ form.finalPartMarksSubmit }}
{% endblock body %} diff --git a/advlabdb/templates/analysis/final_part_marks.html b/advlabdb/templates/analysis/final_part_marks.html new file mode 100644 index 0000000..9f20ec3 --- /dev/null +++ b/advlabdb/templates/analysis/final_part_marks.html @@ -0,0 +1,15 @@ +{% from "macros.html" import information %} +{% extends "admin/master.html" %} + +{% block body %} + {{information(current_user, userActiveSemester, role="admin")}} + +
+ + {% for activeSemesterFinalPartMarksHist in activeSemesterFinalPartMarksHists %} + +
+ {% endfor %} + + +{% endblock body %}