diff --git a/app/controllers/avatar_controller.rb b/app/controllers/avatar_controller.rb index ef7cdf2f7..afd206c92 100644 --- a/app/controllers/avatar_controller.rb +++ b/app/controllers/avatar_controller.rb @@ -1,9 +1,9 @@ class AvatarController < ApplicationController - - + + include ActionView::Helpers::NumberHelper #before_filter :set_cache_buster include AvatarHelper - + def upload # Make sure that API users get used to set this content type # as it won't trigger Rails' automatic parsing of the request body for parameters @@ -29,43 +29,51 @@ class AvatarController < ApplicationController end if @temp_file && (@temp_file.size > 0) - diskfile=disk_filename(@source_type,@source_id) - @urlfile='/' << File.join("images","avatars",avatar_directory(@source_type),avatar_filename(@source_id,@image_file)) + if @temp_file.size > Setting.upload_avatar_max_size.to_i + @status = 1 + @msg = l(:error_upload_avatar_to_large, :max_size => number_to_human_size(Setting.upload_avatar_max_size.to_i)) + elsif Trustie::Utils::Image.new(@temp_file.tempfile.path).image? + diskfile=disk_filename(@source_type,@source_id) + @urlfile='/' << File.join("images","avatars",avatar_directory(@source_type),avatar_filename(@source_id,@image_file)) - # 用户头像上传时进行特别处理 - if @source_type == 'User' + # 用户头像上传时进行特别处理 + if @source_type == 'User' diskfile += "temp" @urlfile += "temp" - end - - logger.info("Saving avatar '#{diskfile}' (#{@temp_file.size} bytes)") - path = File.dirname(diskfile) - unless File.directory?(path) - FileUtils.mkdir_p(path) - end - md5 = Digest::MD5.new - File.open(diskfile, "wb") do |f| - if @temp_file.respond_to?(:read) - buffer = "" - while (buffer = @temp_file.read(8192)) - f.write(buffer) - md5.update(buffer) - end - else - f.write(@temp_file) - md5.update(@temp_file) end + + logger.info("Saving avatar '#{diskfile}' (#{@temp_file.size} bytes)") + path = File.dirname(diskfile) + unless File.directory?(path) + FileUtils.mkdir_p(path) + end + md5 = Digest::MD5.new + File.open(diskfile, "wb") do |f| + if @temp_file.respond_to?(:read) + buffer = "" + while (buffer = @temp_file.read(8192)) + f.write(buffer) + md5.update(buffer) + end + else + f.write(@temp_file) + md5.update(@temp_file) + end + end + + Trustie::Utils::Image.new(diskfile,true).compress(300) + @status = 0 + @msg = '' + else + @status = 2 + @msg = l(:not_valid_image_file) end -# self.digest = md5.hexdigest end @temp_file = nil - image = Trustie::Utils::Image.new(diskfile,true) - image.compress(300) - respond_to do |format| format.json{ - render :inline => "#{@urlfile.to_s}?#{Time.now.to_i}",:content_type => 'text/html' + render :inline => {status: @status, message:@msg, url:"#{@urlfile.to_s}?#{Time.now.to_i}"}.to_json,:content_type => 'text/html' return } format.js diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb index 508e58ba3..12925b0b1 100644 --- a/app/helpers/projects_helper.rb +++ b/app/helpers/projects_helper.rb @@ -65,6 +65,16 @@ module ProjectsHelper content_tag('div', content, :class => "tabs") end + # 判断我的项目中是否有重名项目 + def judge_same_projectname(user, project_name) + result = false + my_projects = user.projects + my_projects.each do |mp| + result = true if mp.name == project_name + end + return result + end + # Added by young def course_settings_tabs tabs = [{:name => 'info', :action => :edit_project, :partial => 'projects/edit', :label => :label_information_plural, :course=>'1'}, diff --git a/app/views/layouts/base_users.html.erb b/app/views/layouts/base_users.html.erb index 1f74ccd5d..269017eb8 100644 --- a/app/views/layouts/base_users.html.erb +++ b/app/views/layouts/base_users.html.erb @@ -199,7 +199,7 @@ <% end %> - <% elsif @user.user_extensions.identity == 3 && @user.user_extensions.occupation.empty? %> + <% elsif @user.user_extensions.identity == 3 && @user.user_extensions.occupation %>
+
作品提交还剩:
"); -} -//验证新建作业的名字 -function regex_bid_name() -{ +function show_bid_dead_line(year, month, day, divname) { + var now = new Date(); + var endDate = new Date(year, month - 1, day); + var leftTime = endDate.getTime() - now.getTime(); + var leftsecond = parseInt(leftTime / 1000); + var day1 = Math.floor(leftsecond / (60 * 60 * 24)); + var hour = Math.floor((leftsecond - day1 * 24 * 60 * 60) / 3600); + var minute = Math.floor((leftsecond - day1 * 24 * 60 * 60 - hour * 3600) / 60); + var second = Math.floor(leftsecond - day1 * 24 * 60 * 60 - hour * 3600 - minute * 60); + $("#" + divname).html("" + "作品提交还剩:
"); + } + //验证新建作业的名字 + +function regex_bid_name() { var name = $.trim($("#bid_name").val()); - if(name=="") - { + if (name == "") { $("#bid_name_span").text("名称不能为空"); return false; - } - else - { + } else { $("#bid_name_span").text(""); return true; } } //验证匿评数量 -function regex_evaluation_num() -{ +function regex_evaluation_num() { var evaluation_num = $.trim($("#bid_evaluation_num").val()); var regex = /^\d+$/; - if($("#bid_open_anonymous_evaluation").attr("checked") == "checked") - { - if(evaluation_num=="") - { + if ($("#bid_open_anonymous_evaluation").attr("checked") == "checked") { + if (evaluation_num == "") { $("#bid_evaluation_num_span").text("匿评分配数量不能为空"); return false; - } - else if(regex.test(evaluation_num)) - { - if(evaluation_num > 0) - { + } else if (regex.test(evaluation_num)) { + if (evaluation_num > 0) { $("#bid_evaluation_num_span").text(""); return true; - } - else - { + } else { $("#bid_evaluation_num_span").text("匿评分配数量必须为大于0"); return false; } - } - else - { + } else { $("#bid_evaluation_num_span").text("匿评分配数量只能为数字"); return false; } - } - else - { + } else { return true; } } //点击是否开启匿评单选框效果 -$(function(){ - $("#bid_open_anonymous_evaluation").click(function(){ - if($("#bid_open_anonymous_evaluation").attr("checked") == "checked") - { +$(function() { + $("#bid_open_anonymous_evaluation").click(function() { + if ($("#bid_open_anonymous_evaluation").attr("checked") == "checked") { $("#bid_evaluation_num_li").slideDown(); - } - else - { + } else { $("#bid_evaluation_num_li").slideUp(); } }); }); //老师提交新建作业 -function submit_new_bid(id) -{ - if(regex_bid_name()&®ex_evaluation_num()) - { +function submit_new_bid(id) { + if (regex_bid_name() && regex_evaluation_num()) { bid_description_editor.sync(); - $("#"+id).submit(); + $("#" + id).submit(); } } -function show_window (id1,id2,top,left) { - $('#'+ id1).css('top',top); - $('#'+ id1).css('left',left); - $('#'+ id1).css('display','block'); - $('#' + id2).css('display','block'); +function show_window(id1, id2, top, left) { + $('#' + id1).css('top', top); + $('#' + id1).css('left', left); + $('#' + id1).css('display', 'block'); + $('#' + id2).css('display', 'block'); } -function close_window(id1,id2){ - $('#' + id1).css('display','none'); - $('#' + id2).css('display','none'); +function close_window(id1, id2) { + $('#' + id1).css('display', 'none'); + $('#' + id2).css('display', 'none'); } //隐藏提示狂 -function hidden_atert_form(cur_page,cur_type) -{ +function hidden_atert_form(cur_page, cur_type) { hideModal($("#popbox")); } //当课程描述长度小于112px时,不显示更多按钮 -$(function(){ - if($("#course_description_content").height()>112) - { +$(function() { + if ($("#course_description_content").height() > 112) { $("#lg-foot").show(); } }); //将右侧的最小高度设置成左侧高度,美化界面 // firefox pre标签换行 -$(document).ready(function () { - $("#RSide").css("min-height",$("#LSide").height()-30); +$(document).ready(function() { + $("#RSide").css("min-height", $("#LSide").height() - 30); var userAgent = navigator.userAgent.toLowerCase(); var browser = { version: (userAgent.match(/.+(?:rv|it|ra|ie)[/: ]([d.]+)/) || [])[1], @@ -494,50 +415,55 @@ $(document).ready(function () { msie: /msie/.test(userAgent) && !/opera/.test(userAgent), mozilla: /mozilla/.test(userAgent) && !/(compatible|webkit)/.test(userAgent) }; - if (browser.mozilla || browser.opera){ + if (browser.mozilla || browser.opera) { $("pre").addClass("break_word_firefox"); - } - else{ + } else { $("pre").addClass("break_word"); } }); // 日历选择日期后关闭 -function regexDeadLine() -{ +function regexDeadLine() { ('#ui-datepicker-div').hide; } //新建、修改课程明码显示 -$(function(){ +$(function() { $("#psw_btn").click(function() { - alert("密码: "+$("#course_course_password").val()); + alert("密码: " + $("#course_course_password").val()); }); }); //课程通知更多按钮显示 -$(function(){ - $('.news_description').each(function () { - if($(this).height() >= 38) - { - $('#news_foot_'+$(this).attr('id').replace('news_description_','')).css("display","block"); - } +$(function() { + $('.news_description').each(function() { + if ($(this).height() >= 38) { + $('#news_foot_' + $(this).attr('id').replace('news_description_', '')).css("display", "block"); } - ) + }); + + $(".news_description img").one('load', function() { + var node = $(this).parents('.news_description'); + if (node && node.height() >= 38) { + $('#news_foot_' + node.attr('id').replace('news_description_', '')).css("display", "block"); + } + }).each(function() { + if (this.complete) { + $(this).load(); + } + }); }); //查找TAG资源 -function search_tag_attachment(url,tag_name,q,course_id,sort) -{ +function search_tag_attachment(url, tag_name, q, course_id, sort) { //alert("111"); $.get( - url, - { + url, { tag_name: tag_name, q: q, - course_id:course_id + course_id: course_id }, - function (data) { + function(data) { } ); @@ -546,27 +472,22 @@ function search_tag_attachment(url,tag_name,q,course_id,sort) // 课程讨论区 function showhelpAndScrollToMessage(id, id1, count) { $('#' + id).toggle(); - if(cookieget("repositories_visiable") == "true") - { - cookiesave("repositories_visiable", false,'','',''); - } - else - { - cookiesave("repositories_visiable", true,'','',''); + if (cookieget("repositories_visiable") == "true") { + cookiesave("repositories_visiable", false, '', '', ''); + } else { + cookiesave("repositories_visiable", true, '', '', ''); } var information = $(id1); var val = information.attr("value"); - if(val=="show_help") - { - $(id1).text("收起回复(" + count + ")" ); + if (val == "show_help") { + $(id1).text("收起回复(" + count + ")"); information.attr("value", "hide_help"); - } - else - { + } else { $(id1).text("展开回复(" + count + ")"); information.attr("value", "show_help"); } } + function show_more_reply(contentid, id2, id3) { $(contentid).toggleClass("course_description_none"); var information = $(id2); @@ -576,10 +497,9 @@ function show_more_reply(contentid, id2, id3) { $(id2).text("[收起]"); information.attr("value", "hide_more"); arrow.attr("src", "/images/jiantouup.jpg") - } - else { + } else { $(id2).text("[展开]"); information.attr("value", "show_more"); arrow.attr("src", "/images/jiantou.jpg") } -} \ No newline at end of file +} diff --git a/public/javascripts/jq-upload/upload.js b/public/javascripts/jq-upload/upload.js index 985450648..71dbefc32 100644 --- a/public/javascripts/jq-upload/upload.js +++ b/public/javascripts/jq-upload/upload.js @@ -44,9 +44,18 @@ $(function() { }, done: function(e, data) { var imgSpan = jQuery('#avatar_image'); - imgSpan.attr({ - "src": data.result.text ? data.result.text() : data.result - }); + var result = data.result.text ? data.result.text() : data.result; + if(result){ + var o = JSON.parse(result); + if(o.status == 0){ + imgSpan.attr({ + "src": o.url + }); + } else { + alert(o.message); + } + } + } }); }); diff --git a/public/javascripts/project.js b/public/javascripts/project.js index 0a04b2a7b..f9f88703d 100644 --- a/public/javascripts/project.js +++ b/public/javascripts/project.js @@ -425,4 +425,35 @@ $(function(){ personalized_init(); }); -//cookie记忆html区块 显示/隐藏 的代码 end \ No newline at end of file +//cookie记忆html区块 显示/隐藏 的代码 end + +// 新建项目的时候判断是否与我已有的项目重复 +function judgeprojectname(){ + $('#new_project').validate({ + errorPlacement: function(error, element){ + alert('error') + }, + success: function(label){ + alert('ok') + }, + onkeyup: false, + rules : { + name:{required : true, + remote : { + url : 'projects/judge_same_projectname', + type:'get', + dataType:'text', + data:{ + name : function(){ return $.trim( $("#name").val() ); } + }, + dataFilter:function( data ){ + if( data=='true')return false; else return true; + } + } + } + }, + messages : { + name:{required : "请填写项目名称!",remote:'您已新建过同名项目,请修改项目名称!'} + } + }); +} \ No newline at end of file diff --git a/public/stylesheets/application.css b/public/stylesheets/application.css index 85ef3240a..5c586b757 100644 --- a/public/stylesheets/application.css +++ b/public/stylesheets/application.css @@ -2794,3 +2794,4 @@ div.repos_explain{ padding-bottom: 20px; } .upload_img img{max-width: 100%;} +#activity .upload_img img{width: 580px;} diff --git a/spec/factories/attachments.rb b/spec/factories/attachments.rb new file mode 100644 index 000000000..da8e787ed --- /dev/null +++ b/spec/factories/attachments.rb @@ -0,0 +1,10 @@ +#coding=utf-8 +# +FactoryGirl.define do + factory :attachment do + filename "11.gif" + filesize 296833 + digest "8a74e086d7716f89bc4fbac0606589c7" + disk_directory "2015/05" + end +end diff --git a/spec/factories/homeworks.rb b/spec/factories/homeworks.rb new file mode 100644 index 000000000..208255a8d --- /dev/null +++ b/spec/factories/homeworks.rb @@ -0,0 +1,17 @@ +#coding=utf-8 +# +#:author_id, :budget, :deadline, :name, :description, :homework_type, :password + +FactoryGirl.define do + factory :homework, class: Bid do + name "test homework" + budget 0 + deadline {(Time.now+1.days).strftime('%Y-%m-%d')} + description "description" + homework_type 3 + reward_type 3 + end + + factory :homework_attach, class: HomeworkAttach do + end +end diff --git a/spec/factories/users.rb b/spec/factories/users.rb index 2c695b920..4595aacc5 100644 --- a/spec/factories/users.rb +++ b/spec/factories/users.rb @@ -6,4 +6,12 @@ FactoryGirl.define do password "foobar111" password_confirmation "foobar111" end + + factory :student, class: User do + login "student" + mail "student@example.com" + password "foobar111" + password_confirmation "foobar111" + end + end diff --git a/spec/models/forum_observer_spec.rb b/spec/models/forum_observer_spec.rb deleted file mode 100644 index 76d68fafa..000000000 --- a/spec/models/forum_observer_spec.rb +++ /dev/null @@ -1,5 +0,0 @@ -require 'spec_helper' - -describe ForumObserver do - pending "add some examples to (or delete) #{__FILE__}" -end diff --git a/spec/models/memo_observer_spec.rb b/spec/models/memo_observer_spec.rb deleted file mode 100644 index 82603ba7a..000000000 --- a/spec/models/memo_observer_spec.rb +++ /dev/null @@ -1,5 +0,0 @@ -require 'spec_helper' - -describe MemoObserver do - pending "add some examples to (or delete) #{__FILE__}" -end diff --git a/spec/requests/course_request_spec.rb b/spec/requests/course_request_spec.rb index d58df398e..feca37259 100644 --- a/spec/requests/course_request_spec.rb +++ b/spec/requests/course_request_spec.rb @@ -35,13 +35,53 @@ RSpec.describe "课程", :type => :request do context "修改课程图片" do include Rack::Test::Methods let(:avatar) {Rack::Test::UploadedFile.new("#{Rails.root}/spec/fixtures/test.jpg",'image/jpg')} + context "正常图片上传成功" do subject(:resp) {post upload_avatar_path(source_type: 'Course', source_id: course.id, format: :json),"avatar"=>{image: avatar}} it{ expect(subject).to be_ok } it{ expect(subject.body).not_to be_empty } + it "状态要为0" do + o = ActiveSupport::JSON.decode(subject.body) + expect(o["status"]).to eq(0) + end + it "要回传图片地址" do + o = ActiveSupport::JSON.decode(subject.body) + expect(o["url"]).not_to be_empty + end + end + + context "不是图片,上传失败" do + let(:invalid_avatar) {Rack::Test::UploadedFile.new("#{Rails.root}/spec/fixtures/hah.txt",'text/plain')} + before do + resp = post upload_avatar_path(source_type: 'Course', source_id: course.id, format: :json),"avatar"=>{image: invalid_avatar} + @o = ActiveSupport::JSON.decode(resp.body) + end + it "状态不为0" do + expect(@o["status"]).not_to eq(0) + end + it "要回传错误信息" do + expect(@o["message"]).to be_include("图片") + end + end + + context "文件过大,上传失败" do + before do + big_file = Rack::Test::UploadedFile.new("#{Rails.root}/spec/fixtures/test.jpg",'image/jpg') + allow(ActionDispatch::Http::UploadedFile).to receive(:new).and_return(double('BigFile',size: 10*1024*1024, original_filename: 'rais.jpg', tempfile: nil)) + # trace = TracePoint.new(:call) do |tp| + # p [tp.lineno, tp.defined_class, tp.method_id, tp.event] if tp.method_id == :post + # end + resp = post upload_avatar_path(source_type: 'Course', source_id: course.id, format: :json),'avatar[image]'=> big_file + @o = ActiveSupport::JSON.decode(resp.body) + end + it "状态不为0" do + expect(@o["status"]).not_to eq(0) + end + it "要回传错误信息" do + expect(@o["message"]).to be_include("大") + end end - it "不是图片,上传失败" end end diff --git a/spec/requests/zipdown_request_spec.rb b/spec/requests/zipdown_request_spec.rb index eb179f104..72831d26f 100644 --- a/spec/requests/zipdown_request_spec.rb +++ b/spec/requests/zipdown_request_spec.rb @@ -1,6 +1,40 @@ require 'rails_helper' +require 'shared_account_spec' +# "attachments"=>{"1"=>{"filename"=>"11.gif", "description"=>"", "is_public_checkbox"=>"1", "token"=>"33731.8a74e086d7716f89bc4fbac0606589c7"}} RSpec.describe "作业打包下载", :type => :request do + let(:student){FactoryGirl.create(:student)} describe "单独下载某学生作业" do + include_context "create user" + before { + FactoryGirl.create(:user) + shared_login + @homework = FactoryGirl.create(:homework, author_id: current_user.id) + + @attch = HomeworkAttach.new + @attch.bid_id = @homework.id + @attch.user_id = student.id + @attachment = Attachment.new(:file => File.open(File.join(Rails.root, "spec/fixtures/test.jpg"))) + @attachment.author = User.current + @attachment.container_type = 'HomeworkAttach' + @attachment.container_id = @attch.id + @attachment.filename = "test.jpg" + @attachment.save + params = {"1"=>{"filename" => "test.jpg", "description" =>"", + "is_public_checkbox"=>"1", + "token" => "#{@attachment.id}.#{@attachment.digest}" } + } + @attch.save_attachments(params) + @attch.name = "test.jpg" + @attch.save! + } + it "正常下载" do + uu = current_user + allow(uu).to receive(:admin?).and_return(true) + allow(User).to receive(:current).and_return(uu) + get zipdown_download_user_homework_path, {homework:@attch.id} + expect(response).to have_http_status(:success) + expect(response.content_type).to eq(Mime::Type.new("applcation/zip",:zip)) + end end end