From 0d1ca7bc49828baaaf04c152ad4ff44ffede8889 Mon Sep 17 00:00:00 2001 From: yystopf Date: Fri, 13 Sep 2024 13:48:26 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=EF=BC=9A=E5=A4=84=E7=90=86?= =?UTF-8?q?=E7=A6=85=E9=81=93=E5=9B=BE=E7=89=87=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/models/attachment.rb | 118 ++++++++++++++-------- lib/tasks/import_issues_from_chandao.rake | 45 +++------ 2 files changed, 92 insertions(+), 71 deletions(-) diff --git a/app/models/attachment.rb b/app/models/attachment.rb index a201faa30..330979e82 100644 --- a/app/models/attachment.rb +++ b/app/models/attachment.rb @@ -1,44 +1,44 @@ -# == Schema Information -# -# Table name: attachments -# -# id :integer not null, primary key -# container_id :integer -# container_type :string(30) -# filename :string(255) default(""), not null -# disk_filename :string(255) default(""), not null -# filesize :integer default("0"), not null -# content_type :string(255) default("") -# digest :string(60) default(""), not null -# downloads :integer default("0"), not null -# author_id :integer default("0"), not null -# created_on :datetime -# description :text(65535) -# disk_directory :string(255) -# attachtype :integer default("1") -# is_public :integer default("1") -# copy_from :integer -# quotes :integer default("0") -# is_publish :integer default("1") -# publish_time :datetime -# resource_bank_id :integer -# unified_setting :boolean default("1") -# cloud_url :string(255) default("") -# course_second_category_id :integer default("0") -# delay_publish :boolean default("0") -# uuid :string(255) -# -# Indexes -# -# index_attachments_on_author_id (author_id) -# index_attachments_on_container_id_and_container_type (container_id,container_type) -# index_attachments_on_course_second_category_id (course_second_category_id) -# index_attachments_on_created_on (created_on) -# index_attachments_on_is_public (is_public) -# index_attachments_on_quotes (quotes) -# index_attachments_on_uuid (uuid) -# - +# == Schema Information +# +# Table name: attachments +# +# id :integer not null, primary key +# container_id :integer +# container_type :string(30) +# filename :string(255) default(""), not null +# disk_filename :string(255) default(""), not null +# filesize :integer default("0"), not null +# content_type :string(255) default("") +# digest :string(60) default(""), not null +# downloads :integer default("0"), not null +# author_id :integer default("0"), not null +# created_on :datetime +# description :text(65535) +# disk_directory :string(255) +# attachtype :integer default("1") +# is_public :integer default("1") +# copy_from :integer +# quotes :integer default("0") +# is_publish :integer default("1") +# publish_time :datetime +# resource_bank_id :integer +# unified_setting :boolean default("1") +# cloud_url :string(255) default("") +# course_second_category_id :integer default("0") +# delay_publish :boolean default("0") +# uuid :string(255) +# +# Indexes +# +# index_attachments_on_author_id (author_id) +# index_attachments_on_container_id_and_container_type (container_id,container_type) +# index_attachments_on_course_second_category_id (course_second_category_id) +# index_attachments_on_created_on (created_on) +# index_attachments_on_is_public (is_public) +# index_attachments_on_quotes (quotes) +# index_attachments_on_uuid (uuid) +# + @@ -76,6 +76,42 @@ class Attachment < ApplicationRecord DCODES = %W(2 3 4 5 6 7 8 9 a b c f e f g h i j k l m n o p q r s t u v w x y z) + def self.build_from_remote_url(user, name, url, container=nil) + ext = name.split('.')[-1] + tmp_path = "#{Rails.root}/#{name}" + uri = URI(url) + size = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == 'https') do |http| + response = http.get(uri.path) + File.open(tmp_path, 'wb') do |file| + file.write(response.body) + end + end + digest = "#{Digest::MD5.file(tmp_path).hexdigest}_#{(Time.now.to_f * 1000).to_i}.#{ext}" + month_folder = "#{Time.now.year}/#{Time.now.month.to_s.rjust(2, '0')}" + save_path = "#{Rails.root}#{EduSetting.get("attachment_folder")}#{month_folder}" + unless Dir.exists?(save_path) + FileUtils.mkdir_p(save_path) ##不成功这里会抛异常 + end + path = File.join(save_path, digest) + FileUtils.mv(tmp_path, path) + attachment = Attachment.new + attachment.filename = name + attachment.disk_filename = path[save_path.size+1, path.size] + attachment.filesize = size + attachment.content_type = 'application/octet-stream' + attachment.digest = digest.split('.')[0] + attachment.author_id = user.id + attachment.disk_directory = month_folder + attachment.cloud_url = url + attachment.uuid = SecureRandom.uuid + attachment.container = container + attachment.save! + + return attachment + rescue + return nil + end + def diskfile File.join(File.join(Rails.root, "files"), disk_directory.to_s, disk_filename.to_s) end diff --git a/lib/tasks/import_issues_from_chandao.rake b/lib/tasks/import_issues_from_chandao.rake index d53c10baf..0a7c34888 100644 --- a/lib/tasks/import_issues_from_chandao.rake +++ b/lib/tasks/import_issues_from_chandao.rake @@ -23,39 +23,24 @@ namespace :import_from_chandao do return nil end + def get_chandao_json(api_url) + url = URI("#{EduSetting.get("chandao_server_url")}#{api_url}") + http = Net::HTTP.new(url.host, url.port); + request = Net::HTTP::Post.new(url) + request["Cookie"] = "zentaosid=#{EduSetting.get("chandao_sid")}" + response = http.request(request) + response.read_body + return JSON.parse(JSON.parse(response.read_body)['data']) + rescue + return {} + end + def trans_content_img(content, user) respace_content_arr = content.to_s.scan(/]*?src=[“.*?“][^>]*?\/?>/).map{|s|[s,s.match(/(\d+\.\w+)/)[0].split(".")[0],s.match(/(\d+\.\w+)/)[0].split(".")[1]]} respace_content_arr.each do |img| remote_image_url = "#{EduSetting.get("chandao_server_url")}/file-read-#{img[1]}.json" - tmp_local_image_path = "#{Rails.root}/#{img[1..2].join(".")}" - uri = URI(remote_image_url) - size = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == 'https') do |http| - response = http.get(uri.path) - File.open(tmp_local_image_path, 'wb') do |file| - file.write(response.body) - end - end - digest = "#{Digest::MD5.file(tmp_local_image_path).hexdigest}_#{(Time.now.to_f * 1000).to_i}.#{img[2]}" - month_folder = "#{Time.now.year}/#{Time.now.month.to_s.rjust(2, '0')}" - save_path = "#{Rails.root}#{EduSetting.get("attachment_folder")}#{month_folder}" - unless Dir.exists?(save_path) - FileUtils.mkdir_p(save_path) ##不成功这里会抛异常 - end - - local_image_path = File.join(save_path, digest) - FileUtils.mv(tmp_local_image_path, local_image_path) - attachment = Attachment.new - attachment.filename = img[1..2].join(".") - attachment.disk_filename = local_image_path[save_path.size+1, local_image_path.size] - attachment.filesize = size - attachment.content_type = img[2] - attachment.digest = digest - attachment.author_id = user.id - attachment.disk_directory = month_folder - attachment.cloud_url = remote_image_url - attachment.uuid = SecureRandom.uuid - attachment.save - + attachment = Attachment.build_from_remote_url(user, img[1..2].join("."), remote_image_url) + att_url = "#{Rails.application.config_for(:configuration)['platform_url']}/api/attachments/#{attachment.uuid}" content.gsub!(img[0], "![](#{att_url})") end @@ -89,7 +74,7 @@ namespace :import_from_chandao do issue.project_issues_index = randd_field_hash['Bug编号'].to_i issue.status_id = trans_status(randd_field_hash['Bug状态']) || IssueStatus.first.id issue.tracker_id = Tracker.first.id - issue.priority_id = randd_field_hash['优先级'].to_i + issue.priority_id = randd_field_hash['优先级'].split('P')[-1].to_i rescue 1 issue.subject = randd_field_hash['Bug标题'] issue.description = trans_content_img(randd_field_hash['重现步骤'].to_s, author) issue.created_on = randd_field_hash['创建日期'].to_time rescue nil