Skip to content

Commit

Permalink
Merge branch 'ta-activity-stats' of https://github.com/finnergizer/Ma…
Browse files Browse the repository at this point in the history
  • Loading branch information
david-yz-liu committed Nov 22, 2015
2 parents 44bea16 + 07fb997 commit a3e5a55
Show file tree
Hide file tree
Showing 21 changed files with 253 additions and 34 deletions.
8 changes: 8 additions & 0 deletions app/assets/stylesheets/graders.scss
Expand Up @@ -22,3 +22,11 @@
.graders-to-criteria {
padding-bottom: 5px;
}

.grader-summary-graph {
display: inline-block;
}

.grader-summary-content {
text-align: center;
}
18 changes: 18 additions & 0 deletions app/assets/stylesheets/main.scss
Expand Up @@ -82,6 +82,23 @@
.grader_distribution {
margin-bottom: 0;
}

#grader-right {
height: 380px;
overflow: scroll;
}

::-webkit-scrollbar {
-webkit-appearance: none;
width: 7px;
}

::-webkit-scrollbar-thumb {
background-color: rgba($black, 0.5);
border-radius: 4px;
box-shadow: 0 0 1px rgba($grey, 0.5);
}

}

.due_date {
Expand Down Expand Up @@ -125,3 +142,4 @@
top: 50%;
width: 100%;
}

1 change: 1 addition & 0 deletions app/controllers/assignments_controller.rb
Expand Up @@ -478,6 +478,7 @@ def refresh_graph

def view_summary
@assignment = Assignment.find(params[:id])
@current_ta = @assignment.tas.first
end

def download_assignment_list
Expand Down
10 changes: 10 additions & 0 deletions app/controllers/graders_controller.rb
Expand Up @@ -233,6 +233,16 @@ def global_actions
end
end

def grader_summary
@current_user = current_user
if @current_user.student? || @current_user.ta?
redirect_to controller: 'assignments', action: 'index'
return
end
@assignment = Assignment.find(params[:assignment_id])
render :grader_summary, layout: 'content'
end

private

# Returns a list of groupings with included associations.
Expand Down
1 change: 1 addition & 0 deletions app/controllers/main_controller.rb
Expand Up @@ -160,6 +160,7 @@ def index
]).order('id ASC')

@current_assignment = Assignment.get_current_assignment
@current_ta = @current_assignment.tas.first

render :index, layout: 'content'
end
Expand Down
5 changes: 5 additions & 0 deletions app/controllers/tas_controller.rb
Expand Up @@ -90,6 +90,11 @@ def upload_ta_list
redirect_to action: 'index'
end

def refresh_graph
@assignment = Assignment.find(params[:assignment])
@current_ta = Ta.find(params[:id])
end

private

def user_params
Expand Down
49 changes: 49 additions & 0 deletions app/models/assignment.rb
Expand Up @@ -760,6 +760,55 @@ def groups_submitted
groupings.select(&:has_submission?)
end

def get_num_assigned(ta_id = nil)
if ta_id.nil?
groupings.size
else
ta_memberships.where(user_id: ta_id).size
end
end

def get_num_marked(ta_id = nil)
if ta_id.nil?
groupings.count(marking_completed: true)
else
n = 0
ta_memberships.where(user_id: ta_id).find_each do |x|
x.grouping.marking_completed? && n += 1
end
n
end
end

def get_num_annotations(ta_id = nil)
if ta_id.nil?
num_annotations_all
else
n = 0
ta_memberships.where(user_id: ta_id).find_each do |x|
x.grouping.marking_completed? &&
n += x.grouping.current_submission_used.annotations.size
end
n
end
end

def num_annotations_all
groupings.map do |g|
g.current_submission_used.annotations.size if g.marking_completed?
end.compact.sum
end

def average_annotations(ta_id = nil)
num_marked = get_num_marked(ta_id)
avg = 0
if num_marked != 0
num_annotations = get_num_annotations(ta_id)
avg = num_annotations.to_f / num_marked
end
avg.round(2)
end

private

# Returns true if we are safe to set the repository name
Expand Down
35 changes: 21 additions & 14 deletions app/models/ta.rb
Expand Up @@ -15,20 +15,6 @@ class Ta < User
has_many :grade_entry_student_tas
has_many :grade_entry_students, through: :grade_entry_student_tas

def get_num_assigned(assignment)
assignment.ta_memberships.where(user_id: id).size
end

def get_num_marked(assignment)
n = 0
assignment.ta_memberships.where(user_id: id).each do |x|
if x.grouping.marking_completed?
n += 1
end
end
n
end

def memberships_for_assignment(assignment)
assignment.ta_memberships.where(user_id: id, include: { grouping: :group })
end
Expand Down Expand Up @@ -70,4 +56,25 @@ def get_membership_count_by_grade_entry_form(grade_entry_form)
.includes(:grade_entry_form)
.count
end

def grade_distribution_array(assignment, intervals = 20)
distribution = Array.new(intervals, 0)
assignment.groupings.joins(:tas)
.where(memberships: { user_id: id }).find_each do |grouping|
result = grouping.current_submission_used.get_latest_completed_result
next if result.nil?
distribution = update_distribution(distribution, result,
assignment.total_mark, intervals)
end # end of groupings loop
distribution.to_json
end

def update_distribution(distribution, result, out_of, intervals)
steps = 100 / intervals # number of percentage steps in each interval
percentage = [100, (result.total_mark / out_of * 100).ceil].min
interval = (percentage / steps).floor
interval -= (percentage % steps == 0) ? 1 : 0
distribution[interval] += 1
distribution
end
end
8 changes: 7 additions & 1 deletion app/views/assignments/_assignment_summary.html.erb
Expand Up @@ -14,13 +14,19 @@

<div class='right'>
<%= render partial: 'assignments/assignment_info_summary', locals: { assignment: assignment } %>
<%= render partial: 'assignments/grader_summary', locals: { assignment: assignment } %>
<p>
<%= link_to I18n.t(:refresh_graph),
refresh_graph_assignment_path(id: assignment.id),
remote: true %>
</p>
</div>
<br>
<div id='assignment_<%= assignment.id %>_ta_graph' class='left'>
<%= render partial: 'graders/ta_grade_distribution_graph', locals: { assignment: assignment, ta: ta } %>
</div>
<div class='right'>
<%= render partial: 'assignments/grader_summary', locals: { assignment: assignment } %>
</div>
</div>
<% end %>

35 changes: 23 additions & 12 deletions app/views/assignments/_grader_summary.html.erb
@@ -1,16 +1,27 @@
<p class="grader_distribution"><%= I18n.t(:grader_distribution ) %></p>

<% if assignment.tas.empty? %>
<%= link_to I18n.t(:assign_graders),
<p class="grader_distribution"><%= t(:grader_distribution) %>:</p>
<%= link_to t(:assign_graders),
assignment_graders_path(assignment) %>
<% else %>
<ul>
<% assignment.tas.each do |ta| %>
<li><%= "#{ta.first_name} #{ta.last_name}" %>
(<%= t('browse_submissions.how_many_marked',
num_marked: ta.get_num_marked(assignment),
num_assigned: ta.get_num_assigned(assignment)) %>)
</li>
<% end %>
</ul>
<p class="grader_distribution"><%= t(:grader_distribution) %>
(<%= link_to t('graders.all_graders'), { controller: 'graders',
action: 'grader_summary',
assignment_id: assignment.id }
%>):</p>
<div id="grader-right">
<ul>
<% assignment.tas.each do |ta| %>
<li>
<%= link_to "#{ta.first_name} #{ta.last_name}",
{ controller: 'tas', action: 'refresh_graph', id: ta.id,
assignment: assignment.id },
remote: true %>
(<%= t('browse_submissions.how_many_marked_short',
num_marked: assignment.get_num_marked(ta.id),
num_assigned: assignment.get_num_assigned(ta.id)) %>)
</li>
<% end %>
</ul>
</div>
<% end %>

24 changes: 24 additions & 0 deletions app/views/assignments/_list_manage.html.erb
Expand Up @@ -75,6 +75,30 @@
results_average: assignment.results_average) %>
<% end %>
</span>
<% if assignment.submission_rule.can_collect_now? %>
<br>
<span id='ta_marked__<%= assignment.short_identifier %>'>
<% if @current_user.admin? %>
<%= t('browse_submissions.how_many_marked',
num_marked: assignment.get_num_marked(),
num_assigned: assignment.get_num_assigned()) %>
<% else %>
<%= t('browse_submissions.how_many_marked',
num_marked: assignment.get_num_marked(@current_user.id),
num_assigned: assignment.get_num_assigned(@current_user.id)) %>
<% end %>
</span>
<br>
<span id='ta_avg_annotations__<%= assignment.short_identifier %>'>
<% if @current_user.admin? %>
<%= t('browse_submissions.average_annotations',
average_annotations: assignment.average_annotations()) %>
<% else %>
<%= t('browse_submissions.average_annotations',
average_annotations: assignment.average_annotations(@current_user.id)) %>
<% end %>
</span>
<% end %>
</td>
</tr>
<% end %>
Expand Down
6 changes: 5 additions & 1 deletion app/views/assignments/view_summary.js.erb
@@ -1,11 +1,15 @@
document.getElementById('assignment_summaries').innerHTML =
"<%= escape_javascript(render partial: 'assignment_summary',
locals: { assignment: @assignment }).html_safe %>";
locals: { assignment: @assignment, ta: @current_ta}).html_safe %>";

jQuery('#assignment_<%= @assignment.id %>_graph').html(
"<%= escape_javascript(render partial: 'grade_distribution_graph',
locals: { assignment: @assignment }) %>");

jQuery('#assignment_<%= @assignment.id %>_ta_graph').html(
"<%= escape_javascript(render partial: 'graders/ta_grade_distribution_graph',
locals: { assignment: @assignment, ta: @current_ta }) %>");

jQuery('a[data-id]').removeClass('link_disabled');

jQuery('a[data-id="<%= @assignment.short_identifier %>"]').addClass('link_disabled');
35 changes: 35 additions & 0 deletions app/views/graders/_ta_grade_distribution_graph.html.erb
@@ -0,0 +1,35 @@
<% unless ta.nil? %>
<h3><%= ta.first_name + ' ' + ta.last_name%></h3>
<div>
(<%= t('browse_submissions.how_many_marked',
num_marked: assignment.get_num_marked(ta.id),
num_assigned: assignment.get_num_assigned(ta.id)) %>)
</div>
<canvas id='a<%= assignment.id %>_ta_<%= ta.id %>' width='400' height='350'></canvas>
<script>
//<![CDATA[
// Set up graph
var ctx = document.getElementById('a<%= assignment.id %>_ta_<%= ta.id %>').getContext('2d');

// Set up data
var data = {
labels: ['0% - 5%', '6% - 10%', '11% - 15%', '16% - 20%', '21% - 25%', '26% - 30%', '31% - 35%', '36% - 40%', '41% - 45%', '46% - 50%', '51% - 55%', '56% - 60%', '61% - 65%', '66% - 70%', '71% - 75%', '76% - 80%', '81% - 85%', '86% - 90%', '91% - 95%', '96% - 100%'],
datasets: [{
fillColor: 'rgba(151,187,205,0.5)',
strokeColor: 'rgba(151,187,205,1)',
data: <%= ta.grade_distribution_array(assignment,20) %>
}]
};

var options = {
scaleLineWidth: 2,
barStrokeWidth: 1,
barValueSpacing: 2,
scaleLabel: ' <%%=value%>'
};

// Draw it
new Chart(ctx).Bar(data, options);
//]]>
</script>
<% end %>
26 changes: 26 additions & 0 deletions app/views/graders/grader_summary.html.erb
@@ -0,0 +1,26 @@
<% content_for :head do %>
<%= javascript_include_tag 'Chart' %>
<% end %>

<div class='title_bar'>
<h1>
<%= t(:assignment_link,
short_id: @assignment.short_identifier,
description: @assignment.description) %> -
<%= t(:grader_distribution) %>
</h1>
</div>
<div class='wrapper'>
<div id='section'>
<div class='grader-summary-content'>
<% @assignment.tas.each do |ta| %>
<div class='grader-summary-graph'>
<div id='assignment_<%= @assignment.id %>_ta_<% ta.id %>_graph'>
<%= render partial: 'graders/ta_grade_distribution_graph',
locals: { assignment: @assignment, ta: ta } %>
</div>
</div>
<% end %>
</div>
</div>
</div>
2 changes: 1 addition & 1 deletion app/views/main/index.html.erb
Expand Up @@ -21,7 +21,7 @@
</div>
</div>
<div id='assignment_summaries'>
<%= render partial: 'assignments/assignment_summary', locals: { assignment: @current_assignment } %>
<%= render partial: 'assignments/assignment_summary', locals: { assignment: @current_assignment, ta: @current_ta } %>
</div>
<div style="clear:both;"></div>
</div>
Expand Down
4 changes: 2 additions & 2 deletions app/views/submissions/browse.html.erb
Expand Up @@ -68,8 +68,8 @@
<% if @current_user.ta? %>
<span class='menu_bar'></span>
<%= t('browse_submissions.how_many_marked',
num_marked: @current_user.get_num_marked(@assignment),
num_assigned: @current_user.get_num_assigned(@assignment)) %>
num_marked: @assignment.get_num_marked(@current_user.id),
num_assigned: @assignment.get_num_assigned(@current_user.id)) %>
<% end %>
<% end %>
Expand Down
4 changes: 4 additions & 0 deletions app/views/tas/refresh_graph.js.erb
@@ -0,0 +1,4 @@
jQuery('#assignment_<%= @assignment.id %>_ta_graph').html(
"<%= escape_javascript(render partial: 'graders/ta_grade_distribution_graph',
locals: { assignment: @assignment,
ta: @current_ta }) %>");

0 comments on commit a3e5a55

Please sign in to comment.