clean up some rubric assessment requests stuff

refs CNVS-7414

first, start at RubricsController#assessments. there is no route for it,
so remove the action and it's view. The rubric_association partial was
only used from that view, so remove it as well. Then in
RubricAssessmentController and RubricAssociationsController #create,
note that nothing ever provides an invitations param, so remove that,
and cascade down to removing or simplifying a few other methods
(particularly RubricAssociation#invite_assessors, which created users
in a bad way, and RubricAssociation#invite_assessor, which never
assigned assessor_asset, which will shortly be non-null, and is
obviously never used cause that column is never null in production).

Finally, fix some specs to properly create rubric assessments since
the (bad) helper methods are now gone.

test plan:
 * specs
 * basic regression test around using rubrics for grading and
   peer reviews

Change-Id: Ibd7713d9fc1f847d49c47b95d8c51ce28fa41e92
Reviewed-on: https://gerrit.instructure.com/23412
Tested-by: Jenkins <jenkins@instructure.com>
QA-Review: Clare Strong <clare@instructure.com>
Reviewed-by: Simon Williams <simon@instructure.com>
Product-Review: Cody Cutrer <cody@instructure.com>
This commit is contained in:
Cody Cutrer 2013-08-16 11:42:29 -06:00
parent 68599ef914
commit 5254bfc09d
12 changed files with 28 additions and 446 deletions

View File

@ -60,19 +60,7 @@ class RubricAssessmentsController < ApplicationController
def create def create
update update
end end
def invite
@association = @context.rubric_associations.find(params[:rubric_association_id])
@rubric = @association.rubric
assessor_email = params[:rubric_assessment][:assessor_email]
# If an email address is specified, this is an invitation for someone to assess
if authorized_action(@association, @current_user, :manage)
@assessment_requests = @association.invite_assessors(@current_user, assessor_email, @association.association.find_asset_for_assessment(@association, @current_user.id)[0])
@assessment_request = @assessment_requests.first
render :json => @assessment_request.to_json(:methods => :assessor_name)
end
end
def remind def remind
@association = @context.rubric_associations.find(params[:rubric_association_id]) @association = @context.rubric_associations.find(params[:rubric_association_id])
@rubric = @association.rubric @rubric = @association.rubric

View File

@ -19,13 +19,11 @@
class RubricAssociationsController < ApplicationController class RubricAssociationsController < ApplicationController
before_filter :require_context before_filter :require_context
def create def create
@invitees = params[:rubric_association].delete(:invitations) rescue nil
update update
end end
def update def update
params[:rubric_association] ||= {} params[:rubric_association] ||= {}
params[:rubric_association].delete(:invitations)
@association = @context.rubric_associations.find(params[:id]) rescue nil @association = @context.rubric_associations.find(params[:id]) rescue nil
@association_object = RubricAssociation.get_association_object(params[:rubric_association]) @association_object = RubricAssociation.get_association_object(params[:rubric_association])
@association_object = nil unless @association_object && @association_object.try(:context) == @context @association_object = nil unless @association_object && @association_object.try(:context) == @context
@ -41,7 +39,7 @@ class RubricAssociationsController < ApplicationController
params[:rubric_association][:association] = @association.association if @association params[:rubric_association][:association] = @association.association if @association
params[:rubric_association][:association] ||= @association_object params[:rubric_association][:association] ||= @association_object
params[:rubric_association][:id] = @association.id if @association params[:rubric_association][:id] = @association.id if @association
@association = RubricAssociation.generate_with_invitees(@current_user, @rubric, @context, params[:rubric_association], @invitees) @association = RubricAssociation.generate(@current_user, @rubric, @context, params[:rubric_association])
json_res = { json_res = {
:rubric => ActiveSupport::JSON.decode(@rubric.to_json(:methods => :criteria, :include_root => false, :permissions => {:user => @current_user, :session => session})), :rubric => ActiveSupport::JSON.decode(@rubric.to_json(:methods => :criteria, :include_root => false, :permissions => {:user => @current_user, :session => session})),
:rubric_association => ActiveSupport::JSON.decode(@association.to_json(:include_root => false, :include => [:rubric_assessments, :assessment_requests], :methods => :assessor_name, :permissions => {:user => @current_user, :session => session})) :rubric_association => ActiveSupport::JSON.decode(@association.to_json(:include_root => false, :include => [:rubric_assessments, :assessment_requests], :methods => :assessor_name, :permissions => {:user => @current_user, :session => session}))

View File

@ -38,15 +38,7 @@ class RubricsController < ApplicationController
@actual_rubric = @rubric_association.rubric @actual_rubric = @rubric_association.rubric
end end
def assessments
if authorized_action(@context, @current_user, :manage)
@rubric_associations = @context.rubric_associations.bookmarked
@rubrics = @rubric_associations.map{|r| r.rubric}
end
end
def create def create
@invitees = params[:rubric_association].delete(:invitations) rescue nil
update update
end end
@ -58,7 +50,6 @@ class RubricsController < ApplicationController
# instead of the old one. # instead of the old one.
def update def update
params[:rubric_association] ||= {} params[:rubric_association] ||= {}
params[:rubric_association].delete(:invitations)
@association_object = RubricAssociation.get_association_object(params[:rubric_association]) @association_object = RubricAssociation.get_association_object(params[:rubric_association])
params[:rubric][:user] = @current_user if params[:rubric] params[:rubric][:user] = @current_user if params[:rubric]
if (!@association_object || authorized_action(@association_object, @current_user, :read)) && authorized_action(@context, @current_user, :manage_rubrics) if (!@association_object || authorized_action(@association_object, @current_user, :read)) && authorized_action(@context, @current_user, :manage_rubrics)
@ -84,7 +75,7 @@ class RubricsController < ApplicationController
@rubric.user = @current_user @rubric.user = @current_user
end end
if params[:rubric] && (@rubric.grants_right?(@current_user, session, :update) || (@association && @association.grants_right?(@current_user, session, :update))) #authorized_action(@rubric, @current_user, :update) if params[:rubric] && (@rubric.grants_right?(@current_user, session, :update) || (@association && @association.grants_right?(@current_user, session, :update))) #authorized_action(@rubric, @current_user, :update)
@association = @rubric.update_with_association(@current_user, params[:rubric], @context, params[:rubric_association], @invitees) @association = @rubric.update_with_association(@current_user, params[:rubric], @context, params[:rubric_association])
@rubric = @association.rubric if @association @rubric = @association.rubric if @association
end end
json_res = {} json_res = {}

View File

@ -149,26 +149,12 @@ class Rubric < ActiveRecord::Base
self.rubric_associations.create(:association => association, :context => context, :use_for_grading => !!opts[:use_for_grading], :purpose => purpose) self.rubric_associations.create(:association => association, :context => context, :use_for_grading => !!opts[:use_for_grading], :purpose => purpose)
end end
def clone_for_association(current_user, association, rubric_params, association_params, invitees="") def update_with_association(current_user, rubric_params, context, association_params)
rubric = Rubric.new
self.attributes.delete_if{|k, v| false}.each do |key, value|
rubric.send("#{key}=", value) if rubric.respond_to?(key)
end
rubric.migration_id = "cloned_from_#{self.id}"
rubric.rubric_id = self.id
rubric.free_form_criterion_comments = rubric_params[:free_form_criterion_comments] == '1' if rubric_params[:free_form_criterion_comments]
rubric.user = current_user
rubric_params[:hide_score_total] ||= association_params[:hide_score_total]
rubric.update_criteria(rubric_params)
RubricAssociation.generate_with_invitees(current_user, rubric, context, association_params, invitees) if association_params[:association] || association_params[:url]
end
def update_with_association(current_user, rubric_params, context, association_params, invitees="")
self.free_form_criterion_comments = rubric_params[:free_form_criterion_comments] == '1' if rubric_params[:free_form_criterion_comments] self.free_form_criterion_comments = rubric_params[:free_form_criterion_comments] == '1' if rubric_params[:free_form_criterion_comments]
self.user ||= current_user self.user ||= current_user
rubric_params[:hide_score_total] ||= association_params[:hide_score_total] rubric_params[:hide_score_total] ||= association_params[:hide_score_total]
self.update_criteria(rubric_params) self.update_criteria(rubric_params)
RubricAssociation.generate_with_invitees(current_user, self, context, association_params, invitees) if association_params[:association] || association_params[:url] RubricAssociation.generate(current_user, self, context, association_params) if association_params[:association] || association_params[:url]
end end
def unique_item_id(id=nil) def unique_item_id(id=nil)

View File

@ -142,36 +142,13 @@ class RubricAssociation < ActiveRecord::Base
end end
end end
protected :update_assignment_points protected :update_assignment_points
def invite_assessor(assessee, assessor, asset, invite=false)
# Invitations should be unique per asset, user and assessor
assessment_request = self.assessment_requests.find_by_user_id_and_assessor_id(assessee.id, assessor.id)
assessment_request ||= self.assessment_requests.build(:user => assessee, :assessor => assessor)
assessment_request.workflow_state = "assigned" if assessment_request.new_record?
assessment_request.asset = asset
invite ? assessment_request.send_reminder! : assessment_request.save!
assessment_request
end
def remind_user(assessee) def remind_user(assessee)
assessment_request = self.assessment_requests.find_by_user_id(assessee.id) assessment_request = self.assessment_requests.find_by_user_id(assessee.id)
assessment_request ||= self.assessment_requests.build(:user => assessee) assessment_request ||= self.assessment_requests.build(:user => assessee)
assessment_request.send_reminder! if assessment_request.assigned? assessment_request.send_reminder! if assessment_request.assigned?
assessment_request assessment_request
end end
def invite_assessors(assessee, invitations, asset)
assessors = TmailParser.new(invitations).parse
assessors.map do |assessor|
cc = CommunicationChannel.find_or_create_by_path(assessor[:email])
user = cc.user || User.create() { |u| u.workflow_state = :creation_pending }
user.assert_name(assessor[:name] || assessor[:email])
cc.user ||= user
cc.save!
user.reload
invite_assessor(assessee, user, asset, true)
end
end
def update_rubric def update_rubric
cnt = self.rubric.rubric_associations.for_grading.length rescue 0 cnt = self.rubric.rubric_associations.for_grading.length rescue 0
@ -207,7 +184,7 @@ class RubricAssociation < ActiveRecord::Base
self.context.students - self.rubric_assessments.map{|a| a.user} - self.assessment_requests.map{|a| a.user} self.context.students - self.rubric_assessments.map{|a| a.user} - self.assessment_requests.map{|a| a.user}
end end
def self.generate_with_invitees(current_user, rubric, context, params, invitees=nil) def self.generate(current_user, rubric, context, params)
raise "context required" unless context raise "context required" unless context
association_object = params.delete :association association_object = params.delete :association
if (association_id = params.delete(:id)) && association_id.present? if (association_id = params.delete(:id)) && association_id.present?
@ -223,10 +200,6 @@ class RubricAssociation < ActiveRecord::Base
association.skip_updating_points_possible = params.delete :skip_updating_points_possible association.skip_updating_points_possible = params.delete :skip_updating_points_possible
association.update_attributes(params) association.update_attributes(params)
association.association = association_object association.association = association_object
# Invite any recipients from the get-go
if invitees && association
assessments = association.invite_assessors(current_user, invitees, association_object.find_asset_for_assessment(association, current_user.id)[0])
end
association association
end end

View File

@ -1,132 +0,0 @@
<% association = rubric_association || nil %>
<div id="association_<%= association ? association.id : "blank" %>" class="rubric_association" style="<%= hidden unless association %>">
<a name="association_<%= association ? association.id : "{{ id }}" %>"></a>
<div class="header">
<div class="links">
<a href="#" class="edit_association_link no-hover"><%= image_tag "edit.png" %></a>
<a href="<%= context_url(@context, :context_rubric_association_url, association ? association.id : "{{ id }}") %>" class="delete_association_link no-hover"><%= image_tag "delete.png" %></a>
</div>
<div class="association_display title">
<a href="<%= context_url(@context, :context_rubric_association_rubric_assessments_url, association ? association.id : "{{ id }}") %>"><%= (association.title || t('no_name', "No Name")) rescue t('no_name', "No Name") %></a>
</div>
<div class="association_edit">
<%= blabel :rubric_association, :title, :en => "Name" %>
<%= text_field :rubric_association, :title, :value => ((association.title || t('assessment_name', "Assessment Name")) rescue t('assessment_name', "Assessment Name")) %>
</div>
</div>
<div class="content">
<% if @context.is_a?(User) %>
<div class="association_display" style="text-align: left; margin-bottom: 10px;">
<a href="<%= association.url rescue "{{ url }}" %>" class="association_url link"><%= t('view_assessed_page', 'View the Page Being Assessed') %></a>
</div>
<div class="association_edit">
<%= blabel :rubric_association, :url, :en => "URL to Assess" %>
<%= text_field :rubric_association, :url, :value => ((association.url || "http://") rescue "http://") %>
</div>
<div class="association_display" style="font-size: 0.8em;">
<table style="width: 100%;"><tr>
<td style="vertical-align: top;">
<%= before_label('invited_assessors', 'Invited Assessors') %>
<ul class="unstyled_list assessor_list" style="margin-left: 20px;">
<% if !association || association.assessment_requests.incomplete.empty? %>
<li class="none_assigned_message"><%= t('none_invited', 'None Invited') %></li>
<% else %>
<% association.assessment_requests.incomplete.each do |assessment| %>
<li style="<%= 'font-weight: bold;' if assessment.completed? %>" title="<%= t('assessment_completed', 'Assessment Completed') if assessment.completed? %>"><%= assessment.assessor_name %></li>
<% end %>
<% end %>
</ul>
<% if association && !association.rubric_assessments.empty? %>
<%= before_label('completed_assessments', 'Completed Assessments') %>
<ul class="unstyled_list" style="margin-left: 20px;">
<% association.rubric_assessments.each do |assessment| %>
<li><%= assessment.assessor_name %></li>
<% end %>
</ul>
<% end %>
<div style="margin: 10px 0 0;" class="rubric_assessment_invitation">
<a href="#" class="add_rubric_assessment_link add-small"><%= t('invite_new_assessor', 'Invite New Assessor') %></a>
<a href="<%= context_url(@context, :context_rubric_association_invite_assessor_url, (association ? association.id : "{{ id }}")) %>" class="add_rubric_assessment_url" style="display: none;">&nbsp;</a>
<% form_for :rubric_assessment, :url => ".", :html => {:class => "add_rubric_assessment_form", :style => "display: none;"} do |f| %>
<%= text_field :rubric_assessment, :assessor_email, :style => "width: 150px;" %>
<div class="button-container">
<button type="submit" class="btn"><%= t('buttons.invite', 'Invite') %></button>
</div>
<% end %>
</div>
</td><td style="vertical-align: top; width: 60%;" class="description">
<%= association && association.description || t("no_description", "No Description") %>
</td>
</tr></table>
</div>
<div class="association_edit" style="margin-top: 10px;">
<table><tr>
<td>
<div class="association_new">
<%= blabel :rubric_association, :invitations, :en => "People to Assess" %><br/>
<%= text_area :rubric_association, :invitations, :value => t('emails_to_invite', '"Paste in here the email addresses of those you want to invite to assess this work"') , :style => "width: 90%; height: 75px;" %>
</div>
</td><td>
<%= blabel :rubric_association, :description, :en => "Assessment Instructions" %><br/>
<%= text_area :rubric_association, :description, :value => ((association.description || t('instructions', "Instructions")) rescue t('special_instructions', "Type any special instructions you have for those assessing your work")), :style => "width: 90%; height: 75px;" %>
</td>
</tr></table>
</div>
<% else %>
<div class="association_display" style="font-size: 0.8em;">
<table style="width: 100%;"><tr>
<td style="vertical-align: top;">
<%= before_label('unsubmitted_assessments', 'Unsubmitted') %>
<ul class="unstyled_list" style="margin-left: 20px;">
<% if association %>
<% association.unsubmitted_users.each do |user| %>
<li><%= context_user_name(@context, user) %></li>
<% end %>
<% end %>
</ul>
<% if association && !association.rubric_assessments.empty? %>
<%= before_label('submitted_and_incomplete_assessments', 'Submitted and Incomplete') %>
<ul class="unstyled_list" style="margin-left: 20px;">
<% association.assessment_requests.incomplete.each do |assessment| %>
<li><%= context_user_name(@context, assessment.user) %></li>
<% end %>
</ul>
<%= before_label('submitted_and_completed_assessments', 'Submitted and Completed') %>
<ul class="unstyled_list" style="margin-left: 20px;">
<% association.rubric_assessments.each do |assessment| %>
<li><%= context_user_name(@context, assessment.user) %></li>
<% end %>
</ul>
<% end %>
</td><td style="vertical-align: top; width: 60%;" class="description">
<%= association && association.description || t("no_description", "No Description") %>
</td>
</tr></table>
</div>
<div class="association_edit" style="margin-top: 10px;">
<table><tr>
<td>
</td><td>
<%= blabel :rubric_association, :description, :en => "Assessment Instructions" %><br/>
<% if @context.is_a?(User) %>
<%= text_area :rubric_association, :description, :value => ((association.description || t('instructions', "Instructions")) rescue t('special_instructions', "Type any special instructions you have for those assessing your work")), :style => "width: 90%; height: 75px;" %>
<% else %>
<%= text_area :rubric_association, :description, :value => ((association.description || t('instructions', "Instructions")) rescue t('submitting_instructions', "Type any instructions for those submitting items for assessment")), :style => "width: 90%; height: 75px;" %>
<% end %>
</td>
</tr></table>
</div>
<% end %>
<div style="text-align: right; font-size: 0.8em; margin-top: 0;">
<a href="#" class="toggle_rubric_link"><%= t 'links.show_rubric', 'Show Rubric' %></a>
</div>
<div class="rubric_holder" style="display: none;">
<%= render :partial => "shared/rubric", :object => (association.rubric rescue nil), :locals => {:editable => true, :rubric_association => association} %>
</div>
<div class="association_buttons association_edit button-container">
<button type="button" class="save_button btn"><%= t('buttons.save_assessment', 'Save Assessment') %></button>
<button type="button" class="cancel_button btn button-secondary"><%= t('#buttons.cancel', 'Cancel') %></button>
</div>
<a href="<%= context_url(@context, :context_rubric_association_url, association ? association.id : "{{ id }}") %>" style="display: none;" class="update_rubric_association_url">&nbsp;</a>
</div>
</div>

View File

@ -1,193 +0,0 @@
<% content_for :page_title, t(:page_title, "Assessments") %>
<% content_for :right_side do %>
<a href="<%= context_url(@context, :context_rubrics_url) %>" class="add_rubric_association_link add"><%= t('add_rubric_assessment', 'Add Rubric Assessment') %></a>
<% end %>
<% content_for :stylesheets do %>
<style>
.rubric_association {
border: 1px solid #aaa;
-moz-border-radius: 5px;
margin-bottom: 10px;
}
.rubric_association .header {
-moz-border-radius-topleft: 3px;
-moz-border-radius-topright: 3px;
background-color: #ddd;
padding: 2px 5px;
font-size: 1.2em;
border-bottom: 1px solid #aaa;
}
.rubric_association .content {
padding: 10px;
}
.rubric_association .links {
float: right;
}
.rubric_association#association_new .association_new {
display: block;
}
.rubric_association .association_new {
display: none;
}
.rubric_association.editing .association_display {
display: none;
}
.rubric_association.editing .association_edit {
display: block;
}
.rubric_association .association_edit {
display: none;
}
.rubric_association .rubric .rubric_title .links {
display: none;
}
.rubric_association table.rubric {
margin-top: 0;
}
.rubric_association table.rubric td,
.rubric_association table.rubric th,
.rubric_association table.rubric table.ratings td {
border-color: #ccc;
}
.rubric_association table.rubric thead th {
background-color: #eee;
}
</style>
<% end %>
<% js_bundle :edit_rubric %>
<% js_block do %>
<script>
require([
'i18nObj' /* I18n.t */,
'jquery' /* $ */,
'jquery.ajaxJSON' /* ajaxJSON */,
'jquery.instructure_forms' /* formSubmit, getFormData */,
'jquery.instructure_misc_plugins' /* confirmDelete */,
'jquery.loadingImg' /* loadingImage */,
'jquery.templateData' /* fillTemplateData */,
'vendor/jquery.scrollTo' /* /\.scrollTo/ */
], function(I18n, $) {
window.rubricEditing = null;
window.rubricAssociation = {
addAssessment: function($association, assessment) {
$association.find(".assessor_list").find(".none_assigned_message").remove();
$association.find(".assessor_list").append("<li>" + assessment.assessor_name + "</li>");
}
}
$(document).ready(function() {
$(".association_edit textarea").focus(function() {
$(this).select();
});
$(".add_rubric_assessment_link").click(function(event) {
event.preventDefault();
var $form = $(this).parents(".rubric_assessment_invitation").find(".add_rubric_assessment_form");
$form.slideToggle();
$form.attr('action', $(this).parents(".rubric_assessment_invitation").find(".add_rubric_assessment_url").attr('href'));
});
$(".rubric_association .add_rubric_assessment_form").formSubmit({
beforeSubmit: function(data) {
$(this).loadingImage();
},
success: function(data) {
$(this).loadingImage('remove');
$(this).slideUp();
rubricAssociation.addAssessment($(this).parents(".rubric_association"), data.assessment_request);
}
});
$(".add_rubric_association_link").click(function(event) {
event.preventDefault();
if ($("#association_new").length > 0) {
return;
}
var $association = $("#association_blank").clone(true).removeAttr('id');
$association.find(".rubric").removeAttr('id').show();
$association.attr('id', 'association_new');
$association.find(".edit_association_link").click();
$association.find(".toggle_rubric_link").click();
$("#rubrics").prepend($association.show());
$("html,body").scrollTo($association);
});
$(".edit_association_link").click(function(event) {
event.preventDefault();
if ($(this).parents(".rubric_association").hasClass('editing')) {
return;
}
$(this).parents(".rubric_association").addClass('editing');
var $rubric = rubricEditing.editRubric($(this).parents(".rubric_association").find(".rubric:first"));
$rubric.find("tr.summary").next().hide();
$(this).parents(".rubric_association").find(":text:visible:first").focus().select();
});
$(".rubric_association .association_buttons .cancel_button").click(function() {
$(this).parents(".rubric_association").removeClass('editing');
rubricEditing.hideEditRubric($(this).parents(".rubric_association").find(".rubric"));
if ($(this).parents(".rubric_association").attr('id') == 'association_new') {
$(this).parents(".rubric_association").slideUp(function() {
$(this).remove();
});
}
});
$(".rubric_association .delete_association_link").click(function(event) {
event.preventDefault();
$(this).parents(".rubric_association").confirmDelete({
url: $(this).attr('href'),
message: <%= jt('are_you_sure_prompt', "Are you sure you want to delete this assessment? All results will be lost.") %>,
success: function() {
$(this).slideUp(function() {
$(this).remove();
});
}
});
});
$(".rubric_association .toggle_rubric_link").click(function(event) {
event.preventDefault();
$(this).parents(".rubric_association").find(".rubric_holder").slideToggle();
$(this).text($(this).text() == "Show Rubric" ? "Hide Rubric" : "Show Rubric");
});
$(".rubric_association .association_buttons .save_button").click(function() {
var $association = $(this).parents(".rubric_association");
$association.loadingImage();
var url = $association.attr('id') == 'association_new' ? $(".add_rubric_association_url").attr('href') : $association.find(".update_rubric_association_url").attr('href');
var method = $association.attr('id') == 'association_new' ? "POST" : "PUT";
var data = rubricEditing.rubricData($association.find(".rubric:first"));
data = $.extend(data, $association.find(".association_edit").getFormData());
data.match_assessment_to_association = "1";
data['rubric_assessment[user_id]'] = $(".current_user_id").text();
$.ajaxJSON(url, method, data, function(data) {
var association = data.rubric_association;
$association.loadingImage('remove')
$association.fillTemplateData({
data: association,
hrefValues: ['id', 'rubric_id'],
id: 'association_' + association.id
});
$association.find(".association_url").attr('href', association.url);
for (var idx in association.assessment_requests) {
var assessment = association.assessment_requests[idx];
rubricAssociation.addAssessment($association, assessment);
}
$association.find(".association_buttons .cancel_button").click();
var rubric = data.rubric;
rubric.rubric_association_id = association.id;
rubricEditing.updateRubric($association.find(".rubric:first"), rubric);
});
});
});
});
</script>
<% end %>
<div id="rubrics">
<div style="display: none;" id="rubric_parameters">
<input type="hidden" name="association_type" value="<%= @context.class.to_s %>"/>
<input type="hidden" name="association_id" value="<%= @context.id %>"/>
<input type="hidden" name="purpose" value="bookmark"/>
</div>
<span class="current_user_id" style="display: none;"><%= @current_user.id %></span>
<a href="<%= context_url(@context, :context_rubric_associations_url) %>" class="add_rubric_association_to_existing_rubric_url" style="display: none;">&nbsp;</a>
<a href="<%= context_url(@context, :context_rubrics_url) %>" class="add_rubric_association_url" style="display: none;">&nbsp;</a>
<%= render :partial => "rubric_association", :collection => @rubric_associations %>
</div>
<%= render :partial => "rubric_association", :object => nil %>
<%= render :partial => "shared/rubric_forms" %>

View File

@ -342,7 +342,6 @@ FakeRails3Routes.draw do
resources :gradebook_uploads resources :gradebook_uploads
resources :rubrics resources :rubrics
resources :rubric_associations do resources :rubric_associations do
match 'invite' => 'rubric_assessments#invite', :as => :invite_assessor
match 'remind/:assessment_request_id' => 'rubric_assessments#remind', :as => :remind_assessee match 'remind/:assessment_request_id' => 'rubric_assessments#remind', :as => :remind_assessee
resources :rubric_assessments, :path => 'assessments' resources :rubric_assessments, :path => 'assessments'
end end
@ -643,7 +642,6 @@ FakeRails3Routes.draw do
match 'external_tools/:id' => 'users#external_tool', :as => :external_tool match 'external_tools/:id' => 'users#external_tool', :as => :external_tool
resources :rubrics resources :rubrics
resources :rubric_associations do resources :rubric_associations do
match 'invite' => 'rubric_assessments#invite', :as => :invite_assessor
resources :rubric_assessments, :path => :assessments resources :rubric_assessments, :path => :assessments
end end

View File

@ -88,39 +88,29 @@ describe RubricAssessmentsController do
end end
describe "POST 'remind'" do describe "POST 'remind'" do
it "should require authorization" do before do
course_with_teacher(:active_all => true) course_with_teacher(:active_all => true)
rubric_association_model(:user => @user, :context => @course) rubric_association_model(:user => @user, :context => @course)
@assessment_request = @rubric_association.invite_assessors(@user, "bob@example.com", @rubric_association.association.submission_for_student(@user)).first assessor = User.create!
@course.enroll_student(assessor)
assessor_asset = @rubric_association.association.find_or_create_submission(assessor)
user_asset = @rubric_association.association.find_or_create_submission(assessor)
@assessment_request = @rubric_association.assessment_requests.create!(user: @user, asset: user_asset, assessor: assessor, assessor_asset: assessor_asset)
end
it "should require authorization" do
post 'remind', :course_id => @course.id, :rubric_association_id => @rubric_association.id, :assessment_request_id => @assessment_request.id post 'remind', :course_id => @course.id, :rubric_association_id => @rubric_association.id, :assessment_request_id => @assessment_request.id
assert_unauthorized assert_unauthorized
end end
it "should send reminder" do it "should send reminder" do
course_with_teacher_logged_in(:active_all => true) user_session(@teacher)
rubric_association_model(:user => @user, :context => @course)
@assessment_request = @rubric_association.invite_assessors(@user, "bob@example.com", @rubric_association.association.submission_for_student(@user)).first
post 'remind', :course_id => @course.id, :rubric_association_id => @rubric_association.id, :assessment_request_id => @assessment_request.id post 'remind', :course_id => @course.id, :rubric_association_id => @rubric_association.id, :assessment_request_id => @assessment_request.id
assigns[:request].should_not be_nil assigns[:request].should_not be_nil
assigns[:request].should eql(@assessment_request) assigns[:request].should eql(@assessment_request)
response.should be_success response.should be_success
end end
end end
describe "POST 'invite'" do
it "should require authorization" do
course_with_teacher(:active_all => true)
rubric_association_model(:user => @user, :context => @course, :purpose => 'grading')
post 'invite', :course_id => @course.id, :rubric_association_id => @rubric_association.id, :rubric_assessment => {:assessor_email => "bob@example.com"}
assert_unauthorized
end
it "should send invitation" do
course_with_teacher_logged_in(:active_all => true)
rubric_association_model(:user => @user, :context => @course, :purpose => 'grading')
post 'invite', :course_id => @course.id, :rubric_association_id => @rubric_association.id, :rubric_assessment => {:assessor_email => "bob@example.com"}
assigns[:assessment_request].should_not be_nil
end
end
describe "DELETE 'destroy'" do describe "DELETE 'destroy'" do
it "should require authorization" do it "should require authorization" do
course_with_teacher(:active_all => true) course_with_teacher(:active_all => true)
@ -207,7 +197,8 @@ describe RubricAssessmentsController do
@assignment.update_attributes(:peer_review_count => 2) @assignment.update_attributes(:peer_review_count => 2)
res = @assignment.assign_peer_reviews res = @assignment.assign_peer_reviews
res.should_not be_empty res.should_not be_empty
res.length.should eql(6) # two of the six possible combinations have already been created
res.length.should eql(4)
res.to_a.find{|r| r.assessor == @student1 && r.user == @student2}.should_not be_nil res.to_a.find{|r| r.assessor == @student1 && r.user == @student2}.should_not be_nil
post 'create', :course_id => @course.id, :rubric_association_id => @rubric_association.id, :rubric_assessment => {:user_id => @student2.id, :assessment_type => 'peer_review'} post 'create', :course_id => @course.id, :rubric_association_id => @rubric_association.id, :rubric_assessment => {:user_id => @student2.id, :assessment_type => 'peer_review'}
@ -228,7 +219,9 @@ def setup_course_assessment
@course.enroll_teacher(@teacher2).accept! @course.enroll_teacher(@teacher2).accept!
@assignment = @course.assignments.create!(:title => "Some Assignment") @assignment = @course.assignments.create!(:title => "Some Assignment")
rubric_assessment_model(:user => @user, :context => @course, :association => @assignment, :purpose => 'grading') rubric_assessment_model(:user => @user, :context => @course, :association => @assignment, :purpose => 'grading')
@rubric_association.invite_assessor(@student1, @student2, @assignment.find_or_create_submission(@student1)) student1_asset = @assignment.find_or_create_submission(@student1)
@rubric_association.invite_assessor(@student1, @student3, @assignment.find_or_create_submission(@student1)) student2_asset = @assignment.find_or_create_submission(@student2)
@rubric_association.invite_assessor(@student1, @teacher2, @assignment.find_or_create_submission(@student1)) student3_asset = @assignment.find_or_create_submission(@student3)
@rubric_association.assessment_requests.create!(user: @student1, asset: student1_asset, assessor: @student2, assessor_asset: student2_asset)
@rubric_association.assessment_requests.create!(user: @student1, asset: student1_asset, assessor: @student3, assessor_asset: student3_asset)
end end

View File

@ -34,15 +34,6 @@ describe RubricAssociationsController do
assigns[:association].title.should eql("some association") assigns[:association].title.should eql("some association")
response.should be_success response.should be_success
end end
it "should invite users if specified" do
course_with_teacher_logged_in(:active_all => true)
rubric_association_model(:user => @user, :context => @course, :purpose => 'grading')
post 'create', :course_id => @course.id, :rubric_association => {:rubric_id => @rubric.id, :title => "some association", :invitations => "bob@example.com", :association_type => @rubric_association.association.class.name, :association_id => @rubric_association.association.id, :purpose => 'grading'}
assigns[:association].should_not be_nil
assigns[:association].title.should eql("some association")
assigns[:association].assessment_requests.should_not be_empty
response.should be_success
end
end end
describe "PUT 'update'" do describe "PUT 'update'" do

View File

@ -64,17 +64,6 @@ describe RubricsController do
assigns[:rubric].rubric_associations.length.should eql(1) assigns[:rubric].rubric_associations.length.should eql(1)
response.should be_success response.should be_success
end end
it "should invite users if specified" do
course_with_teacher_logged_in(:active_all => true)
association = @course.assignments.create!(assignment_valid_attributes)
post 'create', :course_id => @course.id, :rubric => {}, :rubric_association => {:association_type => association.class.to_s, :association_id => association.id, :invitations => "bob@example.com", :purpose => 'grading'}
assigns[:rubric].should_not be_nil
assigns[:rubric].should_not be_new_record
assigns[:rubric].rubric_associations.length.should eql(1)
assigns[:rubric].rubric_associations.first.assessment_requests.should_not be_empty
assigns[:rubric].rubric_associations.first.assessment_requests.first.assessor.email.should eql("bob@example.com")
response.should be_success
end
end end
describe "PUT 'update'" do describe "PUT 'update'" do

View File

@ -47,7 +47,7 @@ describe RubricAssociation do
"skip_updating_points_possible"=>false, "update_if_existing"=>true, "skip_updating_points_possible"=>false, "update_if_existing"=>true,
"use_for_grading"=>"1", "association"=>@assignment}) #, "id"=>3}) "use_for_grading"=>"1", "association"=>@assignment}) #, "id"=>3})
@rubric_assoc = RubricAssociation.generate_with_invitees(@teacher, @rubric, @test_course, rubric_association) @rubric_assoc = RubricAssociation.generate(@teacher, @rubric, @test_course, rubric_association)
# students complete it # students complete it
@assignment.submit_homework(@student_1, :submission_type => 'online_text_entry', :body => 'Finished first') @assignment.submit_homework(@student_1, :submission_type => 'online_text_entry', :body => 'Finished first')
@ -96,7 +96,7 @@ describe RubricAssociation do
"skip_updating_points_possible"=>false, "update_if_existing"=>true, "skip_updating_points_possible"=>false, "update_if_existing"=>true,
"use_for_grading"=>"1", "association"=>@assignment}) #, "id"=>3}) "use_for_grading"=>"1", "association"=>@assignment}) #, "id"=>3})
@rubric_assoc = RubricAssociation.generate_with_invitees(@teacher, @rubric, @test_course, rubric_association) @rubric_assoc = RubricAssociation.generate(@teacher, @rubric, @test_course, rubric_association)
end end
it "should have 2 assessment_requests" do it "should have 2 assessment_requests" do
@ -116,7 +116,7 @@ describe RubricAssociation do
rubric_params = HashWithIndifferentAccess.new({"title"=>"Some Rubric", "criteria"=>{"0"=>{"learning_outcome_id"=>"", "ratings"=>{"0"=>{"points"=>"5", "id"=>"blank", "description"=>"Full Marks"}, "1"=>{"points"=>"0", "id"=>"blank_2", "description"=>"No Marks"}}, "points"=>"5", "long_description"=>"", "id"=>"", "description"=>"Description of criterion"}}, "points_possible"=>"5", "free_form_criterion_comments"=>"0"}) rubric_params = HashWithIndifferentAccess.new({"title"=>"Some Rubric", "criteria"=>{"0"=>{"learning_outcome_id"=>"", "ratings"=>{"0"=>{"points"=>"5", "id"=>"blank", "description"=>"Full Marks"}, "1"=>{"points"=>"0", "id"=>"blank_2", "description"=>"No Marks"}}, "points"=>"5", "long_description"=>"", "id"=>"", "description"=>"Description of criterion"}}, "points_possible"=>"5", "free_form_criterion_comments"=>"0"})
rubric_association_params = HashWithIndifferentAccess.new({:association=>@account, :hide_score_total=>"0", :use_for_grading=>"0", :purpose=>"bookmark"}) rubric_association_params = HashWithIndifferentAccess.new({:association=>@account, :hide_score_total=>"0", :use_for_grading=>"0", :purpose=>"bookmark"})
#8864: the below raised a MethodNotFound error by trying to call @account.submissions #8864: the below raised a MethodNotFound error by trying to call @account.submissions
lambda { @rubric.update_with_association(@user, rubric_params, @account, rubric_association_params, nil) }.should_not raise_error lambda { @rubric.update_with_association(@user, rubric_params, @account, rubric_association_params) }.should_not raise_error
end end
end end
end end