Skip to content

Commit e93dd80

Browse files
Edit individual review criteria scores in project submission and fix message display in cadmin (#135)
* Initial plan * Implement project submission editing and message display fixes - Make total_score automatically calculated from individual scores - Add JavaScript to auto-calculate total when editing scores - Add Django messages display to all cadmin templates - Add comprehensive tests for submission editing and message display Co-authored-by: alexeygrigorev <875246+alexeygrigorev@users.noreply.github.com> * Add .tmp to gitignore for temporary test files * Address code review feedback: add null checks and radix to parseInt Co-authored-by: alexeygrigorev <875246+alexeygrigorev@users.noreply.github.com> * Change project submission editing to use individual review criteria scores - Display review criteria with their options/levels - Allow editing individual criteria scores instead of aggregate project_score - Auto-calculate project_score from sum of criteria scores - Update tests to reflect new criteria-based scoring approach Co-authored-by: alexeygrigorev <875246+alexeygrigorev@users.noreply.github.com> * Address code review feedback: improve error handling and consistency - Add better validation for criteria scores with descriptive error messages - Fix grammar: 'criteria' -> 'criterion' (singular) - Use consistent querySelectorAll for all score field selections in JavaScript - Add 'peer-review-score' class to peer review score fields Co-authored-by: alexeygrigorev <875246+alexeygrigorev@users.noreply.github.com> * Refactor cadmin templates to use base template for messages - Create cadmin/base.html that extends base.html and includes messages block - Update all cadmin templates to extend cadmin/base.html instead of base.html - Remove duplicate message blocks from all templates - Templates now use cadmin_content block instead of content block Co-authored-by: alexeygrigorev <875246+alexeygrigorev@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: alexeygrigorev <875246+alexeygrigorev@users.noreply.github.com>
1 parent f021d14 commit e93dd80

9 files changed

Lines changed: 476 additions & 22 deletions

File tree

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,3 +181,6 @@ cython_debug/
181181
.elasticbeanstalk/*
182182
!.elasticbeanstalk/*.cfg.yml
183183
!.elasticbeanstalk/*.global.yml
184+
185+
# Temporary test files
186+
.tmp/

cadmin/templates/cadmin/base.html

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
{% extends 'base.html' %}
2+
3+
{% block content %}
4+
{% if messages %}
5+
<div class="messages">
6+
{% for message in messages %}
7+
<div class="alert {% if message.tags %}alert-{{ message.tags }}{% else %}alert-info{% endif %} alert-dismissible fade show" role="alert">
8+
{{ message }}
9+
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
10+
<span aria-hidden="true">&times;</span>
11+
</button>
12+
</div>
13+
{% endfor %}
14+
</div>
15+
{% endif %}
16+
17+
{% block cadmin_content %}
18+
{% endblock %}
19+
{% endblock %}

cadmin/templates/cadmin/course_admin.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
{% extends 'base.html' %}
1+
{% extends 'cadmin/base.html' %}
22

33
{% load custom_filters %}
44

@@ -7,7 +7,7 @@
77
<li><a href="{% url 'cadmin_course' course.slug %}">{{ course.title }}</a></li>
88
{% endblock %}
99

10-
{% block content %}
10+
{% block cadmin_content %}
1111
<h2>{{ course.title }} - Admin Panel</h2>
1212

1313
<div class="mb-3">

cadmin/templates/cadmin/course_list.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
{% extends 'base.html' %}
1+
{% extends 'cadmin/base.html' %}
22

33
{% block breadcrumbs %}
44
<li><a href="{% url 'cadmin_course_list' %}">Course Admin</a></li>
55
{% endblock %}
66

7-
{% block content %}
7+
{% block cadmin_content %}
88
<h2>Course Administration</h2>
99

1010
<div class="alert alert-info" role="alert">

cadmin/templates/cadmin/homework_submissions.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
{% extends 'base.html' %}
1+
{% extends 'cadmin/base.html' %}
22

33
{% load custom_filters %}
44

@@ -8,7 +8,7 @@
88
<li><a href="{% url 'cadmin_homework_submissions' course.slug homework.slug %}">{{ homework.title }} Submissions</a></li>
99
{% endblock %}
1010

11-
{% block content %}
11+
{% block cadmin_content %}
1212
<h2>{{ homework.title }} - Submissions</h2>
1313

1414
<div class="mb-3">

cadmin/templates/cadmin/project_submission_edit.html

Lines changed: 122 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
{% extends 'base.html' %}
1+
{% extends 'cadmin/base.html' %}
22

33
{% load custom_filters %}
44

@@ -9,7 +9,7 @@
99
<li><a href="{% url 'cadmin_project_submission_edit' course.slug project.slug submission.id %}">Edit Submission</a></li>
1010
{% endblock %}
1111

12-
{% block content %}
12+
{% block cadmin_content %}
1313
<h2>Edit Project Submission</h2>
1414

1515
<div class="mb-3">
@@ -28,22 +28,62 @@ <h2>Edit Project Submission</h2>
2828

2929
<div class="card mb-3">
3030
<div class="card-header">
31-
<h4>Project Scores</h4>
31+
<h4>Review Criteria Scores</h4>
3232
</div>
3333
<div class="card-body">
34+
{% if criteria_with_scores %}
35+
{% for item in criteria_with_scores %}
36+
<div class="card mb-3 border-secondary">
37+
<div class="card-header bg-light">
38+
<strong>{{ item.criteria.description }}</strong>
39+
</div>
40+
<div class="card-body">
41+
<div class="mb-2">
42+
<strong>Score Options:</strong>
43+
<ul class="mb-2">
44+
{% for option in item.criteria.options %}
45+
<li>{{ option.criteria }}: {{ option.score }} points</li>
46+
{% endfor %}
47+
</ul>
48+
</div>
49+
<div class="form-group">
50+
<label for="criteria_score_{{ item.criteria.id }}">Score for this criterion:</label>
51+
<input type="number"
52+
class="form-control criteria-score"
53+
id="criteria_score_{{ item.criteria.id }}"
54+
name="criteria_score_{{ item.criteria.id }}"
55+
value="{{ item.score }}"
56+
min="0"
57+
required>
58+
</div>
59+
</div>
60+
</div>
61+
{% endfor %}
62+
{% else %}
63+
<p class="text-muted">No review criteria defined for this course.</p>
64+
{% endif %}
65+
3466
<div class="form-group mb-3">
35-
<label for="project_score">Project Score</label>
36-
<input type="number" class="form-control" id="project_score" name="project_score" value="{{ submission.project_score }}" required>
67+
<label for="project_score">Total Project Score (from criteria above)</label>
68+
<input type="number" class="form-control" id="project_score" name="project_score" value="{{ submission.project_score }}" readonly>
69+
<small class="form-text text-muted">This is automatically calculated from the criteria scores above.</small>
3770
</div>
38-
71+
</div>
72+
</div>
73+
74+
<div class="card mb-3">
75+
<div class="card-header">
76+
<h4>Additional Project Scores</h4>
77+
</div>
78+
<div class="card-body">
3979
<div class="form-group mb-3">
4080
<label for="project_faq_score">Project FAQ Score</label>
41-
<input type="number" class="form-control" id="project_faq_score" name="project_faq_score" value="{{ submission.project_faq_score }}" required>
81+
<input type="number" class="form-control additional-score" id="project_faq_score" name="project_faq_score" value="{{ submission.project_faq_score }}" required>
4282
</div>
4383

4484
<div class="form-group mb-3">
4585
<label for="project_learning_in_public_score">Project Learning in Public Score</label>
46-
<input type="number" class="form-control" id="project_learning_in_public_score" name="project_learning_in_public_score" value="{{ submission.project_learning_in_public_score }}" required>
86+
<input type="number" class="form-control additional-score" id="project_learning_in_public_score" name="project_learning_in_public_score" value="{{ submission.project_learning_in_public_score }}" required>
4787
</div>
4888
</div>
4989
</div>
@@ -55,12 +95,12 @@ <h4>Peer Review Scores</h4>
5595
<div class="card-body">
5696
<div class="form-group mb-3">
5797
<label for="peer_review_score">Peer Review Score</label>
58-
<input type="number" class="form-control" id="peer_review_score" name="peer_review_score" value="{{ submission.peer_review_score }}" required>
98+
<input type="number" class="form-control peer-review-score" id="peer_review_score" name="peer_review_score" value="{{ submission.peer_review_score }}" required>
5999
</div>
60100

61101
<div class="form-group mb-3">
62102
<label for="peer_review_learning_in_public_score">Peer Review Learning in Public Score</label>
63-
<input type="number" class="form-control" id="peer_review_learning_in_public_score" name="peer_review_learning_in_public_score" value="{{ submission.peer_review_learning_in_public_score }}" required>
103+
<input type="number" class="form-control peer-review-score" id="peer_review_learning_in_public_score" name="peer_review_learning_in_public_score" value="{{ submission.peer_review_learning_in_public_score }}" required>
64104
</div>
65105
</div>
66106
</div>
@@ -71,8 +111,9 @@ <h4>Overall Results</h4>
71111
</div>
72112
<div class="card-body">
73113
<div class="form-group mb-3">
74-
<label for="total_score">Total Score</label>
75-
<input type="number" class="form-control" id="total_score" name="total_score" value="{{ submission.total_score }}" required>
114+
<label for="total_score">Total Score (automatically calculated)</label>
115+
<input type="number" class="form-control" id="total_score" name="total_score" value="{{ submission.total_score }}" readonly>
116+
<small class="form-text text-muted">This field is automatically calculated from the individual scores above.</small>
76117
</div>
77118

78119
<div class="form-check mb-3">
@@ -97,4 +138,73 @@ <h4>Overall Results</h4>
97138
</div>
98139
</form>
99140

141+
<script>
142+
// Auto-calculate scores when individual scores change
143+
document.addEventListener('DOMContentLoaded', function() {
144+
const criteriaScoreFields = document.querySelectorAll('.criteria-score');
145+
const additionalScoreFields = document.querySelectorAll('.additional-score');
146+
const peerReviewScoreFields = document.querySelectorAll('.peer-review-score');
147+
148+
function calculateProjectScore() {
149+
// Calculate project score from criteria scores
150+
let projectScore = 0;
151+
criteriaScoreFields.forEach(function(field) {
152+
const value = parseInt(field.value, 10) || 0;
153+
projectScore += value;
154+
});
155+
const projectScoreField = document.getElementById('project_score');
156+
if (projectScoreField) {
157+
projectScoreField.value = projectScore;
158+
}
159+
return projectScore;
160+
}
161+
162+
function calculateTotal() {
163+
// Calculate project score first
164+
const projectScore = calculateProjectScore();
165+
166+
// Calculate total from all components
167+
let total = projectScore;
168+
169+
// Add additional project scores
170+
additionalScoreFields.forEach(function(field) {
171+
const value = parseInt(field.value, 10) || 0;
172+
total += value;
173+
});
174+
175+
// Add peer review scores
176+
peerReviewScoreFields.forEach(function(field) {
177+
const value = parseInt(field.value, 10) || 0;
178+
total += value;
179+
});
180+
181+
const totalField = document.getElementById('total_score');
182+
if (totalField) {
183+
totalField.value = total;
184+
}
185+
}
186+
187+
// Add event listeners to criteria score fields
188+
criteriaScoreFields.forEach(function(field) {
189+
field.addEventListener('input', calculateTotal);
190+
field.addEventListener('change', calculateTotal);
191+
});
192+
193+
// Add event listeners to additional score fields
194+
additionalScoreFields.forEach(function(field) {
195+
field.addEventListener('input', calculateTotal);
196+
field.addEventListener('change', calculateTotal);
197+
});
198+
199+
// Add event listeners to peer review score fields
200+
peerReviewScoreFields.forEach(function(field) {
201+
field.addEventListener('input', calculateTotal);
202+
field.addEventListener('change', calculateTotal);
203+
});
204+
205+
// Calculate initial values
206+
calculateTotal();
207+
});
208+
</script>
209+
100210
{% endblock %}

cadmin/templates/cadmin/project_submissions.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
{% extends 'base.html' %}
1+
{% extends 'cadmin/base.html' %}
22

33
{% load custom_filters %}
44

@@ -8,7 +8,7 @@
88
<li><a href="{% url 'cadmin_project_submissions' course.slug project.slug %}">{{ project.title }} Submissions</a></li>
99
{% endblock %}
1010

11-
{% block content %}
11+
{% block cadmin_content %}
1212
<h2>{{ project.title }} - Submissions</h2>
1313

1414
<div class="mb-3">

0 commit comments

Comments
 (0)