resubmit to scribd on inline view

test plan:
 1. have an environment with scribd and google doc previews enabled
 2. create a document, in a format compatible with both scribd
    and google docs (it needs to be a new document that isn't in
    scribd yet)
 3. upload this document to a course
 4. give a few minutes for scribd to process it
 5. make sure the scribd preview works in the files tab
 6. delete the file from the course
 7. undelete the file (use /courses/X/undelete)
 8. preview the file in the files tab; it should use google docs
    since the scribd doc was deleted
 9. wait a few minutes (canvas noticed the file was scribdable
    but had no scribd doc when you previewed in the last step,
    and resubmitted it to scribd) and then reload the page
10. a subsequent preview should show up in scribd
11. in addition to the files tab, also test
  a. documents embedded in rich text via wiki sidebar
  b. student submissions in SpeedGrader (probably requires the
     console, because there's no undelete for user files)

fixes CNVS-6774

Change-Id: Ic9fa5d43ef16522e1bd7a12d45f1f5dc7efbfe6f
Reviewed-on: https://gerrit.instructure.com/22378
QA-Review: August Thornton <august@instructure.com>
Reviewed-by: Bracken Mosbacker <bracken@instructure.com>
Product-Review: Bracken Mosbacker <bracken@instructure.com>
Tested-by: Jenkins <jenkins@instructure.com>
This commit is contained in:
Jeremy Stanley 2013-07-16 11:49:32 -06:00
parent 9b961986f1
commit b216585323
5 changed files with 75 additions and 5 deletions

View File

@ -281,7 +281,9 @@ class FilesController < ApplicationController
end
return
end
if (params[:download] && params[:verifier] && params[:verifier] == @attachment.uuid) || authorized_action(@attachment, @current_user, :read)
if (params[:download] && params[:verifier] && params[:verifier] == @attachment.uuid) ||
@attachment.attachment_associations.where(:context_type => 'Submission').any? { |aa| aa.context.grants_right?(@current_user, session, :read) } ||
authorized_action(@attachment, @current_user, :read)
if params[:download]
if (params[:verifier] && params[:verifier] == @attachment.uuid) || (@attachment.grants_right?(@current_user, session, :download))
disable_page_views if params[:preview]

View File

@ -1686,5 +1686,15 @@ class Attachment < ActiveRecord::Base
def record_inline_view
update_attribute(:last_inline_view, Time.now)
check_rerender_scribd_doc unless self.scribd_doc
end
def check_rerender_scribd_doc
if scribdable? && scribd_doc.nil?
self.scribd_attempts = 0
self.workflow_state = 'pending_upload'
self.save!
send_later :submit_to_scribd!
end
end
end

View File

@ -35,7 +35,7 @@ define([
"application/vnd.sun.xml.writer": [1, 1],
"application/excel": [1, 1],
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": [1, 1],
"text/rtf": [1, false],
"text/rtf": [1, 1],
"application/vnd.openxmlformats-officedocument.spreadsheetml.template": [1, 1],
"application/vnd.sun.xml.impress": [1, 1],
"application/vnd.sun.xml.calc": [1, 1],
@ -90,7 +90,7 @@ define([
// if I have a url to ping back to the app that I viewed this file inline, ping it.
if (opts.attachment_view_inline_ping_url) {
$.ajaxJSON(opts.attachment_view_inline_ping_url, 'POST', {}, function() { }, function() { });
$.trackEvent('Doc Previews', serviceUsed, JSON.stringify(opts));
$.trackEvent('Doc Previews', serviceUsed, JSON.stringify(opts, ['attachment_id', 'submission_id', 'mimetype', 'crocodoc_session_url', 'scribd_doc_id']));
}
}

View File

@ -304,6 +304,19 @@ describe FilesController do
@file.reload.last_inline_view.should > 1.minute.ago
end
it "should record the inline view when a teacher previews a student's submission" do
course_with_student :active_all => true
@assignment = @course.assignments.create!(:title => 'upload_assignment', :submission_types => 'online_upload')
attachment_model :context => @student
@assignment.submit_homework @student, :attachments => [@attachment]
teacher_in_course :active_all => true
user_session @teacher
get 'show', :user_id => @student.id, :id => @attachment.id, :inline => 1
response.should be_success
@attachment.reload.last_inline_view.should > 1.minute.ago
end
it "should mark files as viewed for module progressions if the file data is requested and it includes the scribd_doc data" do
file_in_a_module
@file.scribd_doc = Scribd::Document.new

View File

@ -365,8 +365,15 @@ describe Attachment do
end
context "scribd cleanup" do
def fake_scribd_doc(doc_id = String.random(8))
before do
ScribdAPI.stubs(:enabled?).returns(true)
end
after do
ScribdAPI.unstub(:enabled?)
end
def fake_scribd_doc(doc_id = String.random(8))
scribd_doc = Scribd::Document.new
scribd_doc.doc_id = doc_id
scribd_doc.secret_password = 'asdf'
@ -375,7 +382,6 @@ describe Attachment do
end
def attachment_with_scribd_doc(doc = fake_scribd_doc, opts = {})
ScribdAPI.stubs(:enabled?).returns(true)
att = attachment_model(opts)
att.scribd_doc = doc
att.save!
@ -463,6 +469,45 @@ describe Attachment do
@child.read_attribute(:scribd_doc).should be_nil
end
end
describe "check_rerender_scribd_doc" do
before do
scribd_mime_type_model(:extension => 'docx')
end
it "should resubmit a deleted scribd doc" do
@attachment = attachment_with_scribd_doc(fake_scribd_doc, :filename => 'file.docx', :scribd_attempts => 3)
@attachment.scribd_doc.expects(:destroy).once.returns(true)
@attachment.delete_scribd_doc
expect {
@attachment.check_rerender_scribd_doc
}.to change(Delayed::Job, :count).by(1)
Delayed::Job.find_by_tag('Attachment#submit_to_scribd!').should_not be_nil
@attachment.should be_pending_upload
@attachment.scribd_attempts.should == 0
end
it "should do nothing if a scribd_doc already exists" do
@attachment = attachment_with_scribd_doc(fake_scribd_doc, :filename => 'file.docx')
expect {
@attachment.check_rerender_scribd_doc
}.to change(Delayed::Job, :count).by(0)
end
it "should be invoked on record_inline_view" do
@attachment = attachment_model(:filename => 'file.docx')
expect {
@attachment.record_inline_view
}.to change(Delayed::Job, :count).by(1)
end
it "should do nothing on non-scribdable types" do
@attachment = attachment_model(:filename => 'file.lolcats')
expect {
@attachment.check_rerender_scribd_doc
}.to change(Delayed::Job, :count).by(0)
end
end
end
context "conversion_status" do