You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
educoder/app/controllers/files_controller.rb

311 lines
12 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

class FilesController < ApplicationController
include MessagesHelper
before_action :require_login, except: %i[index]
before_action :find_course, except: %i[public_with_course_and_project mine_with_course_and_project]
before_action :find_ids, only: %i[bulk_delete bulk_send bulk_move bulk_public bulk_publish]
before_action :file_validate_sort_type, only: :index
before_action :validate_send_message_to_course_params, only: :bulk_send
before_action :set_pagination, only: %i[index public_with_course_and_project mine_with_course_and_project]
before_action :validate_upload_params, only: %i[upload import]
before_action :find_file, only: %i[show setting update]
SORT_TYPE = %w[created_on downloads quotes]
def index
sort = params[:sort] || 0 # 0: 降序1: 升序
sort_type = params[:sort_type] || 'created_on' # created_on时间排序 downloads下载次数排序; quotes: 引用次数排序
course_second_category_id = params[:course_second_category_id] || 0 # 0: 为主目录, 其他为次目录id
@user = current_user
@attachments = @course.attachments.by_course_second_category_id(course_second_category_id)
.includes(attachment_group_settings: :course_group, author: [:user_extension, :course_members])
.ordered(sort: sort.to_i, sort_type: sort_type.strip)
get_category(@course, course_second_category_id)
@total_count = @attachments.size
@public_count = @attachments.publiced.size
@private_count = @total_count - @public_count
@attachments = @attachments.by_keywords(params[:search])
@attachments =
case @user.course_identity(@course)
when 5
@attachments.published
when 6, 7
@attachments.publiced.published
else
@attachments
end
@attachments = @attachments.page(@page).per(@page_size)
end
def bulk_publish
return normal_status(403, "您没有权限进行操作") if current_user.course_identity(@course) >= 5
@course.attachments.by_ids(@attachment_ids).unpublish.update_all(is_publish: 1, publish_time: Time.now)
render_ok
end
def bulk_delete
ActiveRecord::Base.transaction do
begin
@course.attachments.by_ids(@attachment_ids).destroy_all
rescue Exception => e
tip_exception(e.message)
raise ActiveRecord::Rollback
end
end
end
def bulk_send
return normal_status(403, "您没有权限进行该操作") unless current_user.teacher_of_course?(@course)
course_ids = params[:to_course_ids]
begin
@attachment_ids.each do |id|
@attachment = @course.attachments.find_by_id id
course_ids.each do |course_id|
course = Course.find_by_id course_id
unless @attachment.nil? || course.nil?
course.attachments << course.attachments.build(@attachment.attributes.except("id").merge(
quotes: 0,
downloads: 0,
author_id: current_user.id,
created_on: Time.now,
course_second_category_id: 0 # TODO 暂时只支持发送到其他课堂的主目录
))
end
end
end
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
raise ActiveRecord::Rollback
end
end
def bulk_move
return normal_status(403, "您没有权限进行该操作") unless current_user.teacher_of_course?(@course)
to_category_id = params[:to_category_id] || 0 # 默认移动到主目录
unless to_category_id == 0
course_second_category = @course.course_second_categories.find_by_id to_category_id
return normal_status(2, "参数to_category_id有误该目录不存在") if course_second_category.nil?
end
begin
@course.attachments.by_ids(@attachment_ids).update_all(course_second_category_id: to_category_id)
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
raise ActiveRecord::Rollback
end
end
def bulk_public
@user = current_user
return normal_status(403, "您没有权限进行该操作") unless @user.teacher_of_course?(@course)
@course.attachments.by_ids(@attachment_ids).update_all(is_public: 1)
end
def public_with_course_and_project
@attachments = Attachment.publiced.simple_columns
.contains_course_and_project
.includes(:author => :user_extension)
.by_filename_or_user_name(params[:search])
.ordered(sort: 0, sort_type: 'created_on')
@total_count = @attachments.size
@attachments = @attachments.page(@page).per(@page_size)
end
def mine_with_course_and_project
@current_user = current_user
@attachments = Attachment.mine(current_user)
.simple_columns
.contains_course_and_project
.by_keywords(params[:search])
.ordered(sort: 0, sort_type: 'created_on')
@total_count = @attachments.size
@attachments = @attachments.page(@page).per(@page_size)
end
# 上传资源
def upload
attachment_ids = params[:attachment_ids]
course_second_category_id = params[:course_second_category_id] || 0 # 0: 为主目录, 其他为次目录id
is_unified_setting = params.has_key?(:is_unified_setting) ? params[:is_unified_setting] : true
publish_time = params[:publish_time]
course_group_publish_times = params[:course_group_publish_times] || []
begin
attachment_ids.each do |attchment_id|
attachment = Attachment.find_by_id attchment_id
unless attachment.nil?
attachment.container = @course
attachment.course_second_category_id = course_second_category_id
attachment.description = params[:description]
attachment.is_public = params[:is_public] ? 1 : 0
attachment.set_publish_time(publish_time) if is_unified_setting
attachment.set_course_group_publish_time(@course, course_group_publish_times) if @course.course_groups.size > 0 && !is_unified_setting && publish_time.blank?
attachment.save!
end
end
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
raise ActiveRecord::Rollback
end
end
# 选用资源 & 导入资源
def import
return normal_status(403, "您没有权限进行该操作") unless current_user.teacher_of_course?(@course) || current_user.student_of_course?(@course)
attachment_ids = params[:attachment_ids]
course_second_category_id = params[:course_second_category_id] || 0 # 0: 为主目录, 其他为次目录id
begin
attachment_ids.each do |attachment_id|
ori = Attachment.find_by_id(attachment_id)
@course.attachments.each do |att|
@exist = false
if att.id == ori.id || (!att.copy_from.nil? && !ori.copy_from.nil? && att.copy_from == ori.copy_from) || att.copy_from == ori.id || att.id == ori.copy_from
att.created_on = Time.now
att.save
@exist = true
break
end
end
next if @exist
attach_copied_obj = ori.copy
attach_copied_obj.container = @course
attach_copied_obj.created_on = Time.now
attach_copied_obj.author = current_user
attach_copied_obj.is_public = 0
attach_copied_obj.is_publish = 1
attach_copied_obj.publish_time = Time.now
attach_copied_obj.course_second_category_id = course_second_category_id
attach_copied_obj.copy_from = ori.copy_from.nil? ? ori.id : ori.copy_from
if attach_copied_obj.attachtype == nil
attach_copied_obj.attachtype = 4
end
attach_copied_obj.save
ori.update_columns(quotes: ori.quotes.to_i + 1)
end
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
raise ActiveRecord::Rollback
end
end
# 资源设置
def update
return normal_status(403, "您没有权限进行该操作") if current_user.course_identity(@course) >= 5 && @file.author != current_user
is_unified_setting = params[:is_unified_setting]
publish_time = params[:publish_time]
is_public = params[:is_public]
course_group_publish_times = params[:course_group_publish_times] || []
@old_attachment = @file
@new_attachment = Attachment.find_by_id params[:new_attachment_id]
begin
unless @new_attachment.nil?
@new_attachment_history = @old_attachment.become_history
@new_attachment_history.save!
@old_attachment.copy_attributes_from_new_attachment(@new_attachment)
@old_attachment.is_public = is_public == true ? 1 : 0 if is_public
@old_attachment.save!
@new_attachment.delete
end
if params[:description] && !params[:description].strip.blank? && params[:description] != @old_attachment.description
@old_attachment.description = params[:description]
end
@old_attachment.set_public(is_public)
if is_unified_setting
@old_attachment.set_publish_time(publish_time)
@old_attachment.attachment_group_settings.destroy_all
end
if publish_time.blank? && @course.course_groups.size > 0 && !is_unified_setting
@old_attachment.set_course_group_publish_time(@course, course_group_publish_times)
end
@old_attachment.save!
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
raise ActiveRecord::Rollback
end
end
def show
return normal_status(403, "您没有权限进行该操作") if !current_user.teacher_of_course?(@course) && current_user != @file.author
@attachment_histories = @file.attachment_histories
end
def histories
@user = current_user
@file = @course.attachments.find_by_id params[:id]
return normal_status(-2, "该课程下没有id为 #{params[:id]}的资源") if @file.nil?
return normal_status(403, "您没有权限进行该操作") if @user != @file.author && !@user.teacher_of_course?(@course) && !@file.public?
@attachment_histories = @file.attachment_histories
end
def get_category(course, category_id)
if category_id == 0
category = course.attachment_course_modules.first
@category_id = category.try(:id)
@category_name = category.try(:module_name)
else
category = CourseSecondCategory.find category_id
@category_id = category.try(:id)
@category_name = category.try(:name)
end
end
private
def find_file
@file = Attachment.find params[:id]
end
def find_attachment_ids(attachment_ids = params[:attachment_ids])
return normal_status(-2, "参数attachment_ids不能为空") if attachment_ids.blank?
return normal_status(-2, "参数attachment_ids格式错误") if !attachment_ids.is_a? Array
end
def find_course_second_category_id
course_second_category_id = params[:course_second_category_id] || 0 # 0: 为主目录, 其他为次目录id
if course_second_category_id != 0
course_second_category = CourseSecondCategory.find_by(id: course_second_category_id, category_type: "attachment")
return normal_status(-2, "未来找到course_second_category为 #{course_second_category_id} 的目录") if course_second_category.nil?
end
end
def find_ids
@attachment_ids = params[:ids] || []
find_attachment_ids(@attachment_ids)
end
def file_validate_sort_type
normal_status(-2, "参数sort_tyope暂时只支持 'created_on', 'quotes', 'downloads'") if params.has_key?(:sort_type) && !SORT_TYPE.include?(params[:sort_type].strip)
end
def validate_upload_params
find_attachment_ids
find_course_second_category_id
end
end