Skip to content

Commit

Permalink
Merge 6ee0c79 into ef449f6
Browse files Browse the repository at this point in the history
  • Loading branch information
dakshmehta23 committed Apr 23, 2024
2 parents ef449f6 + 6ee0c79 commit 5344b08
Show file tree
Hide file tree
Showing 6 changed files with 312 additions and 83 deletions.
3 changes: 2 additions & 1 deletion Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ gem 'airbrake', '5.2.0'
gem 'authlogic', '4.5.0'
gem 'awesome_nested_set', '3.3.1'
gem 'bootstrap3-datetimepicker-rails', '~> 4.17.47'
gem 'bullet', '~> 5.7.6'
#gem 'bullet', '~> 5.7.6'
gem 'capistrano'
gem 'capistrano-bundler'
gem 'capistrano-db-tasks', require: false
Expand Down Expand Up @@ -85,6 +85,7 @@ group :development do
gem 'pry-nav'
gem 'pry-remote'
gem 'rubocop'
gem 'bullet', '~> 5.7.6' # Add bullet gem to minimize number of queries to database.
end

group :test do
Expand Down
65 changes: 53 additions & 12 deletions app/controllers/assessment360_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,13 @@ def all_students_all_reviews
@assignments = course.assignments.reject(&:is_calibrated).reject { |a| a.participants.empty? }
@course_participants = course.get_participants
insure_existence_of(@course_participants, course)
# hashes for view
# hash for view
@meta_review = {}
@meta_review_exists = {}
@teammate_review = {}
@teamed_count = {}
@teammate_review_exists = {}
@student_team_counts = {} # renamed from @teamed_count
@assignment_columns = {}
# for course
# eg. @overall_teammate_review_grades = {assgt_id1: 100, assgt_id2: 178, ...}
# @overall_teammate_review_count = {assgt_id1: 1, assgt_id2: 2, ...}
Expand All @@ -31,11 +34,15 @@ def all_students_all_reviews
# [aggregrate_review_grades_per_stu, review_count_per_stu] --> [0, 0]
%w[teammate meta].each { |type| instance_variable_set("@#{type}_review_info_per_stu", [0, 0]) }
students_teamed = StudentTask.teamed_students(cp.user)
@teamed_count[cp.id] = students_teamed[course.id].try(:size).to_i
@student_team_counts[cp.id] = students_teamed[course.id].try(:size).to_i
@assignments.each do |assignment|
@meta_review[cp.id] = {} unless @meta_review.key?(cp.id)
@teammate_review[cp.id] = {} unless @teammate_review.key?(cp.id)
assignment_participant = assignment.participants.find_by(user_id: cp.user_id)
# initializing assignment_columns with default 0 colspan for all the columns
@assignment_columns[assignment.id].nil? ? @assignment_columns[assignment.id] = {} : nil
@assignment_columns[assignment.id]["meta_review"].nil? ? @assignment_columns[assignment.id]["meta_review"] = 0 : nil
@assignment_columns[assignment.id]["teammate_review"].nil? ? @assignment_columns[assignment.id]["teammate_review"] = 0 : nil
next if assignment_participant.nil?

teammate_reviews = assignment_participant.teammate_reviews
Expand All @@ -54,10 +61,20 @@ def all_students_all_reviews
@overall_meta_review_grades,
@overall_meta_review_count,
@meta_review_info_per_stu)
end
# calculate average grade for each student on all assignments in this course
avg_review_calc_per_student(cp, @teammate_review_info_per_stu, @teammate_review)
avg_review_calc_per_student(cp, @meta_review_info_per_stu, @meta_review)
if !@meta_review[cp.id][assignment.id].nil?
@meta_review_exists[assignment.id] = true
@assignment_columns[assignment.id]["meta_review"] = 1
end
# If teammate review exists for particular assignment then update teammate_review_exist to true
# and make assignment_columns as 1 to add to colspan
if !@teammate_review[cp.id][assignment.id].nil?
@teammate_review_exists[assignment.id] = true
@assignment_columns[assignment.id]["teammate_review"] = 1
end
end
end
# avoid divide by zero error
overall_review_count(@assignments, @overall_teammate_review_count, @overall_meta_review_count)
Expand Down Expand Up @@ -86,11 +103,18 @@ def avg_review_calc_per_student(cp, review_info_per_stu, review)
# This data is used to compute the instructor assigned grade and peer review scores.
# There are many nuances about how to collect these scores. See our design document for more deails
# http://wiki.expertiza.ncsu.edu/index.php/CSC/ECE_517_Fall_2018_E1871_Grade_Summary_By_Student
def course_student_grade_summary
def course_student_grade_summary
@topics = {}
@assignment_grades = {}
@peer_review_scores = {}
@final_grades = {}
@number_of_peer_reviews = {}
@avg_peer_review_score = {}
@total_grade = {}
@topics_present = {}
@assignment_grades_present ={}
@peer_review_scores_present = {}
@assignment_category ={}
course = Course.find(params[:course_id])
@assignments = course.assignments.reject(&:is_calibrated).reject { |a| a.participants.empty? }
@course_participants = course.get_participants
Expand All @@ -100,9 +124,17 @@ def course_student_grade_summary
@assignment_grades[cp.id] = {}
@peer_review_scores[cp.id] = {}
@final_grades[cp.id] = 0
@number_of_peer_reviews[cp.id] = 0
@avg_peer_review_score[cp.id] = 0
@total_grade[cp.id] = 0
@assignments.each do |assignment|
user_id = cp.user_id
assignment_id = assignment.id
# initializing 0 colspan for all columns
@assignment_category[assignment.id].nil? ? @assignment_category[assignment.id] = {} : nil
@assignment_category[assignment_id]["topics"].nil? ? @assignment_category[assignment_id]["topics"] = 0 : nil
@assignment_category[assignment_id]["peer_review"].nil? ? @assignment_category[assignment_id]["peer_review"] = 0 : nil
@assignment_category[assignment_id]["assignment_grade"].nil? ? @assignment_category[assignment_id]["assignment_grade"] = 0 : nil
# break out of the loop if there are no participants in the assignment
next if assignment.participants.find_by(user_id: user_id).nil?
# break out of the loop if the participant has no team
Expand All @@ -122,8 +154,12 @@ def course_student_grade_summary
next if peer_review_score[:review][:scores].nil?
# Skip if there are is no peer review average score
next if peer_review_score[:review][:scores][:avg].nil?

@peer_review_scores[cp.id][assignment_id] = peer_review_score[:review][:scores][:avg].round(2)
# Finding average peer scores
@avg_peer_review_score[cp.id] += @peer_review_scores[cp.id][assignment_id]
@number_of_peer_reviews[cp.id] += 1
@peer_review_scores_present[assignment_id] = true
@assignment_category[assignment_id]["peer_review"] = 1
end
end
end
Expand All @@ -133,13 +169,19 @@ def assignment_grade_summary(cp, assignment_id, penalties)
# topic exists if a team signed up for a topic, which can be found via the user and the assignment
topic_id = SignedUpTeam.topic_id(assignment_id, user_id)
@topics[cp.id][assignment_id] = SignUpTopic.find_by(id: topic_id)
# instructor grade is stored in the team model, which is found by finding the user's team for the assignment
if !@topics[cp.id][assignment_id].nil?
@topics_present[assignment_id] = true
@assignment_category[assignment_id]["topics"] = 1
end
team_id = TeamsUser.team_id(assignment_id, user_id)
team = Team.find(team_id)
@assignment_grades[cp.id][assignment_id] = team[:grade_for_submission] ? (team[:grade_for_submission] - penalties[:submission]).round(2) : nil
return if @assignment_grades[cp.id][assignment_id].nil?

@final_grades[cp.id] += @assignment_grades[cp.id][assignment_id]
@total_grade[cp.id] += 1
@assignment_grades_present[assignment_id] = true
@assignment_category[assignment_id]["assignment_grade"] = 1
end

def insure_existence_of(course_participants, course)
Expand All @@ -163,8 +205,6 @@ def calc_overall_review_info(assignment,
# assign it as 0 instead of leaving it blank. This helps in easier calculation of overall grade
overall_review_grade_hash[assignment.id] = 0 unless overall_review_grade_hash.key?(assignment.id)
overall_review_count_hash[assignment.id] = 0 unless overall_review_count_hash.key?(assignment.id)
# Do not consider reviews that have not been filled out by teammates when calculating averages.
reviews = reviews.reject { |review| review.average_score == 'N/A' }
grades = 0
# Check if they person has gotten any review for the assignment
if reviews.count > 0
Expand All @@ -191,12 +231,13 @@ def find_peer_review_score(user_id, assignment_id)
participant_scores(participant, questions)
end

#Replace hyphen with an en-dash
def format_topic(topic)
topic.nil? ? '-' : topic.format_for_display
topic.nil? ? '' : topic.format_for_display
end

#Replace hyphen with an en-dash
def format_score(score)
score.nil? ? '-' : score
score.nil? ? '' : score
end

helper_method :format_score
Expand Down
163 changes: 116 additions & 47 deletions app/views/assessment360/all_students_all_reviews.html.erb
Original file line number Diff line number Diff line change
@@ -1,55 +1,124 @@
<!-- Defines the CSS styles for the HTML elements in the view. -->
<style>
th, td {
text-align: center;
}
}
.visibility {
display: none
}
</style>
<table class="table table-striped">
<tr>
<th rowspan=2 width="320">Students</th>
<th rowspan=2 width="30">Teammate Count</th>
<% @assignments.each do |assignment| %>
<th colspan=2 width="300"> <%= assignment.name %> </th>

<!--# Checkbox for Metareviews and Teammate Reviews -->
<b style="margin-bottom: 40px;">Select columns:</b>
<tr>
<td>
<label for="metareview"><b>Metareviews</b></label>
<input type="checkbox" value="show-hide" checked="checked" id="metareviewbox">
</td>
<td>
<label for="teammateReview"><b>Teammate Reviews</b></label>
<input type="checkbox" value="show-hide" checked="checked" id="teammatereviewbox">
</td>
</tr>
<br>
<br>

<!-- # Table to display the students' reviews -->
<table class="table table-striped">
<tr>
<th rowspan=2 width="160" class="sorter-true">Student Name</th>
<th rowspan=2 width="160" class="sorter-true">Student ID</th>
<th rowspan=2 width="30">Teammate Count</th>
<% @assignments.each do |assignment| %>
<% if !@teammate_review_exists[assignment.id].nil? || !@meta_review_exists[assignment.id].nil? %>
<!-- # Assignment header with colspan for Metareviews and Teammate Reviews -->
<th colspan="<%= @assignment_columns[assignment.id]["meta_review"] + @assignment_columns[assignment.id]["teammate_review"] %>" width="300" class="assignment-header" id="<%= assignment.id %>"> <%= assignment.name %> </th>
<% end %>
<th colspan="2" width="300">Aggregate Score</th>
</tr>
<% end %>
<th colspan="2" width="300" id="aggregate-score-header">Aggregate Score</th>
</tr>
<tr>
<% @assignments.each do |assignment| %>
<!-- # Metareviews and Teammate Reviews columns -->
<% if !@meta_review_exists[assignment.id].nil? %> <td class="metaReviews" id="metaReviews-<%= assignment.id %>"><b>Metareviews</b></td> <% end %>
<% if !@teammate_review_exists[assignment.id].nil? %> <td class="teammateReviews" id="teammateReviews-<%= assignment.id %>"><b>Teammate Reviews</b></td> <% end %>
<% end %>
<td class="metaReviews"><b>Metareviews</b></td>
<td class="teammateReviews"><b>Teammate Reviews</b></td>
</tr>

<!-- # Iterates through each course participant to display their reviews -->
<% @course_participants.each do |cp|%>
<tr>
<% (0..@assignments.size).each do %>
<td><b>Metareviews</b></td>
<td><b>Teammate Reviews</b></td>
<% end %>
<td align="center"><%= cp.fullname(session[:ip]) %> </td>
<td align="center"><%= cp.name(session[:ip]) %> </td>

<td><%= @student_team_counts[cp.id] %></td>
<% @assignments.each do |assignment|%>
<!-- # Displays the Metareviews and Teammate Reviews for each course participant -->
<% if !@meta_review_exists[assignment.id].nil? %> <td class="metaReviews"><%= format_score(@meta_review[cp.id][assignment.id]) unless @meta_review.nil? %></td> <% end %>
<% if !@teammate_review_exists[assignment.id].nil? %> <td class="teammateReviews"><%= format_score(@teammate_review[cp.id][assignment.id]) unless @teammate_review.nil? %></td> <% end %>
<% end%>
<!-- # Displays the overall Metareviews and Teammate Reviews for each course participant -->
<td class="metaReviews"><%= format_score(@meta_review[cp.id][:avg_grade_for_assgt]) unless @meta_review.nil? || @meta_review[cp.id].nil? %></td>
<td class="teammateReviews"><%= format_score(@teammate_review[cp.id][:avg_grade_for_assgt]) unless @teammate_review.nil? || @teammate_review[cp.id].nil?%></td>
</tr>

<% @course_participants.each do |cp|%>
<tr>
<td align="center"><%= "#{cp.name(session[:ip])} (#{cp.fullname(session[:ip])})" %> </td>
<td><%= @teamed_count[cp.id] %></td>
<% @assignments.each do |assignment|%>
<td><%= @meta_review[cp.id][assignment.id] unless @meta_review.nil? %></td>
<td><%= @teammate_review[cp.id][assignment.id] unless @teammate_review.nil? %></td>
<% end%>
<td><%= @meta_review[cp.id][:avg_grade_for_assgt] unless @meta_review.nil? || @meta_review[cp.id].nil? %></td>
<td><%= @teammate_review[cp.id][:avg_grade_for_assgt] unless @teammate_review.nil? || @teammate_review[cp.id].nil?%></td>
<%end%>
<tr>
<td><b>Class Average</b></td>
<td></td>
<% @assignments.each do |assignment|%>
<% if !@meta_review_exists[assignment.id].nil? %> <td class="metaReviews"><%= "#{@overall_meta_review_grades[assignment.id] / @overall_meta_review_count[assignment.id]}%" %></td> <% end %>
<% if !@teammate_review_exists[assignment.id].nil? %> <td class="teammateReviews"><%= "#{@overall_teammate_review_grades[assignment.id] / @overall_teammate_review_count[assignment.id]}%" %></td> <% end %>
<% end%>
<!-- # Displays the overall Metareviews and Teammate Reviews for the class average -->
<% total_meta_review_grade = @overall_meta_review_grades.inject(0) {|sum, (k, v)| sum + v } %>
<% total_meta_review_count = @overall_meta_review_count.inject(0) {|sum, (k, v)| sum + v } %>
<td class="metaReviews">
<%= total_meta_review_count.zero? ? "N/A" :
"#{total_meta_review_grade / total_meta_review_count}%" %>
</td>
<!-- # Displays the overall Metareviews and Teammate Reviews for the class average -->
<% total_teammate_review_grade = @overall_teammate_review_grades.inject(0) {|sum, (k, v)| sum + v } %>
<% total_teammate_review_count = @overall_teammate_review_count.inject(0) {|sum, (k, v)| sum + v } %>
<td class="teammateReviews">
<%= total_meta_review_count.zero? ? "N/A" :
"#{total_teammate_review_grade / total_teammate_review_count}%" %>
</td>
</tr>
<%end%>
<tr>
<td><b>Class Average</b></td>
<td></td>
<% @assignments.each do |assignment|%>
<td><%= "#{@overall_meta_review_grades[assignment.id] / @overall_meta_review_count[assignment.id]}%" %></td>
<td><%= "#{@overall_teammate_review_grades[assignment.id] / @overall_teammate_review_count[assignment.id]}%" %></td>
<% end%>
<% total_meta_review_grade = @overall_meta_review_grades.inject(0) {|sum, (k, v)| sum + v } %>
<% total_meta_review_count = @overall_meta_review_count.inject(0) {|sum, (k, v)| sum + v } %>
<td>
<%= total_meta_review_count.zero? ? "N/A" :
"#{total_meta_review_grade / total_meta_review_count}%" %>
</td>
<% total_teammate_review_grade = @overall_teammate_review_grades.inject(0) {|sum, (k, v)| sum + v } %>
<% total_teammate_review_count = @overall_teammate_review_count.inject(0) {|sum, (k, v)| sum + v } %>
<td>
<%= total_meta_review_count.zero? ? "N/A" :
"#{total_teammate_review_grade / total_teammate_review_count}%" %>
</td>
</tr>
</table>
</div>
</table>


<script>
const aggregateScoreHeader = document.getElementById("aggregate-score-header");
let aggregateScoreColSpan = 2;
const assignmentHeaderClasses = document.querySelectorAll(".assignment-header");
// # Function to handle checkbox change
function handleCheckboxChange(checkboxId, reviewClassesSelector, reviewPrefix) {
const reviewClasses = document.querySelectorAll(reviewClassesSelector);
const checkBox = document.getElementById(checkboxId);

checkBox.addEventListener('change', function() {
this.checked ? aggregateScoreColSpan += 1 : aggregateScoreColSpan -= 1; //# Update aggregate score colspan based on checkbox state
aggregateScoreHeader.setAttribute("colspan", aggregateScoreColSpan);

reviewClasses.forEach(el => { //#Toggle visibility of review classes
el.classList.toggle('visibility');
});

//# Update assignment header colspan and visibility based on checkbox state
assignmentHeaderClasses.forEach(el => {
let assignmentColSpan = Number(el.getAttribute("colspan"));
this.checked ? assignmentColSpan += 1 : assignmentColSpan -= 1;
const element = document.getElementById(reviewPrefix + '-' + el.id);

if (element){
el.setAttribute("colspan", assignmentColSpan);
el.style.display = assignmentColSpan <= 0 ? "none" : null;
}
});
});
}
handleCheckboxChange('metareviewbox', '.metaReviews', 'metaReviews'); //#Call handleCheckboxChange for Metareviews checkbox
handleCheckboxChange('teammatereviewbox', '.teammateReviews', 'teammateReviews'); //#Call handleCheckboxChange for Teammate Reviews checkbox
</script>
Loading

0 comments on commit 5344b08

Please sign in to comment.