Guest User

Untitled

a guest
Sep 21st, 2018
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.35 KB | None | 0 0
  1. require "uri"
  2. require "net/http"
  3. require 'mime/types'
  4. require 'crack/xml' # for just xml
  5. class ImportsController < ApplicationController
  6.  
  7. $settings = {:username => '',
  8. :password => '',
  9. :space_url => '',
  10. :file_path=>"#{File.expand_path(Rails.root)}/data/sweetyhigh_files/sweetyhigh/projects/87977-sweetyhightheg/tickets"}
  11.  
  12. def initialize()
  13. uri = URI.parse(api_url)
  14. port = 80
  15. @http = Net::HTTP.new(uri.host, port)
  16. extract_api_url
  17. end
  18.  
  19.  
  20.  
  21. def milestones
  22. milestones = Milestone.find(:all)
  23. milestones.each do |m|
  24. result = post_form("#{$settings[:space_url]}/milestones", :milestone => {
  25. :title => m.milestone,
  26. :description => '',
  27. :due_date => trac_time_to_date(m.due_date, Date.today),
  28. :skip_alerts => true,
  29. :is_completed => false
  30. }
  31. )
  32.  
  33. end
  34. end
  35.  
  36. def remove
  37. tickets = Ticket.find(:all, :order=>"ticket_id ASC")
  38. tickets.each do |d|
  39. ticket = { :ticket => {
  40. :number => d.ticket_id
  41. }}
  42. del_url = "#{$settings[:space_url]}/tickets/#{d.ticket_id}"
  43. request = http_method :delete, del_url
  44. request.form_data = rails_values ticket
  45. response = @http.request(request)
  46.  
  47. end
  48. end
  49.  
  50. def filedelete
  51. request = http_method :get, "#{$settings[:space_url]}/documents"
  52. response = @http.request(request)
  53.  
  54. files = Crack::XML.parse(response.body)
  55. files = files["documents"]
  56.  
  57. files.each do |f|
  58. request = http_method :delete, "#{$settings[:space_url]}/documents/#{f["id"]}"
  59. response = @http.request(request)
  60. end
  61. end
  62.  
  63. def tickets
  64. tickets = Ticket.find(:all, :order=>"ticket_id ASC")
  65. json = ''
  66. tickets.each do |t|
  67. file_data = File.open("#{$settings[:file_path]}/#{t.ticket_directory}/ticket.json","r")
  68. data = file_data.readlines.to_s
  69. json = JSON.parse(data)
  70. parsed_json = ActiveSupport::JSON.decode(json[0])
  71.  
  72. owner = User.find_by_lh_user_id(parsed_json["ticket"]["assigned_user_id"])
  73. act_as = User.find_by_lh_user_id(parsed_json["ticket"]["creator_id"])
  74. state = TicketStatus.find_by_old_name(parsed_json["ticket"]["state"])
  75. milestone = Milestone.find_by_milestone_id(parsed_json["ticket"]["milestone_id"])
  76.  
  77. ## Create Initial Ticket
  78. ticket = { :ticket => {
  79. :number => t.ticket_id,
  80. :summary => parsed_json["ticket"]["title"],
  81. :description => parsed_json["ticket"]["body"],
  82. :assigned_to_id => owner.nil? ? '' : owner.as_user_id,
  83. :acts_as_user_id => act_as.nil? ? '' : act_as.as_user_id,
  84. :milestone_id => milestone.nil? ? '' : milestone.assembla_id,
  85. :status => "#{state.new_name}",
  86. :skip_alerts => true,
  87. :priority=> (parsed_json["ticket"]["priority"] > 5) ? 5 :parsed_json["ticket"]["priority"],
  88. :created_on => trac_time_to_date(parsed_json["ticket"]["created_at"]),
  89. :updated_at => trac_time_to_date(parsed_json["ticket"]["updated_at"])
  90. # :severity_id => row['type'],
  91. # :version_id => row['version'],
  92. # :resolution => row['resolution'],
  93. }
  94. }
  95.  
  96. t.update_attributes(:is_migrated=>true)
  97. create = post_form("#{$settings[:space_url]}/tickets", ticket)
  98.  
  99. ticket_data = Crack::XML.parse(create.body)
  100.  
  101. ass_ticket_id = ticket_data["ticket"]["id"]
  102.  
  103. #update Tickets
  104. versions = parsed_json["ticket"]["versions"]
  105. versions.each do |v|
  106. u_act_as = User.find_by_lh_user_id(v["user_id"].to_i)
  107. u_state = TicketStatus.find_by_old_name(v["state"])
  108. u_ticket = { :ticket => {
  109. :number => t.ticket_id,
  110. :skip_alerts => true,
  111. :status => "#{u_state.new_name}",
  112. :acts_as_user_id => u_act_as.nil? ? '' : u_act_as.as_user_id,
  113. :updated_at => trac_time_to_date(v["updated_at"]),
  114. :user_comment=> v["body"]
  115. }
  116. }
  117.  
  118. update = put_form("#{$settings[:space_url]}/tickets/#{t.ticket_id}", u_ticket)
  119. end
  120.  
  121. attachments = parsed_json["ticket"]["attachments"]
  122.  
  123. if !attachments.nil?
  124. attachments.each do |a|
  125. if a.has_key?("image")
  126. attach_path = "#{$settings[:file_path]}/#{t.ticket_directory}/#{a["image"]["filename"]}"
  127. uploader = User.find_by_lh_user_id(a["image"]["uploader_id"].to_i)
  128. File.open(attach_path) do |f|
  129. # TODO Add some tag to documents
  130. params = {
  131. 'document[file]' => f,
  132. 'document[name]' => a["image"]["filename"],
  133. 'document[skip_alerts]' => true,
  134. 'document[created_at]' => trac_time_to_date(a["image"]["created_at"]),
  135. 'document[updated_at]' => trac_time_to_date(a["image"]["created_at"]),
  136. 'document[created_by]' => uploader.nil? ? '' : uploader.as_user_id,
  137. 'document[updated_by]' => uploader.nil? ? '' : uploader.as_user_id,
  138. 'document[attachable_id]' => ass_ticket_id.to_s,
  139. 'document[attachable_type]' => 'Ticket'
  140. }
  141.  
  142. print '.'
  143.  
  144. begin
  145. upload_file params
  146. rescue RemoteError =>e
  147. # TODO count failing requests
  148. p e
  149. p params
  150. end
  151. end
  152. end
  153. end
  154. end
  155.  
  156. end
  157. end
  158.  
  159.  
  160.  
  161. def api_url
  162. @api_url ||= extract_api_url
  163. end
  164.  
  165. def extract_api_url
  166. u = URI.parse($settings[:space_url])
  167. u.path = u.path.split(/\//)[0..2].join('/')
  168. @api_path = u.path
  169. u.to_s
  170. end
  171.  
  172.  
  173. def post_form(api_uri, form_data)
  174. request = http_method :post, api_uri
  175. request.form_data = rails_values form_data
  176. response = @http.request(request)
  177. end
  178.  
  179. def put_form(api_uri, form_data)
  180. request = http_method :put, api_uri
  181. request.form_data = rails_values form_data
  182. response = @http.request(request)
  183. end
  184.  
  185. def get_list(api_uri)
  186. request = http_method :get, api_uri
  187. response = @http.request(request)
  188. end
  189.  
  190. def upload_file(params)
  191. api_uri = "#{@api_path}/documents"
  192. mp = MultipartPost.new
  193. query, headers = mp.prepare_query(params)
  194. request = http_method :post, api_uri, headers
  195. request.body = query
  196. response = @http.request(request)
  197. File.open("/tmp/upload-request.log", 'w') {|f| f.write(request.body) }
  198. File.open("/tmp/upload-response.log", 'w') {|f| f.write(response.body) }
  199. end
  200.  
  201. def trac_time_to_date(time, default = nil)
  202. return default if time.to_i == 0
  203. t = Time.at time.to_i
  204. Date.new(t.year, t.month, t.day)
  205. end
  206.  
  207. def trac_time_to_time(time, default = nil)
  208. return default if time.to_i == 0
  209. Time.at time.to_i
  210. end
  211.  
  212. def http_method(method, api_uri, headers = { })
  213. case method
  214. when :get
  215. klass = Net::HTTP::Get
  216. when :post
  217. klass = Net::HTTP::Post
  218. when :put
  219. klass = Net::HTTP::Put
  220. when :delete
  221. klass = Net::HTTP::Delete
  222. else
  223. raise 'Invalid method'
  224. end
  225.  
  226. request = klass.new(api_uri, {'Accept' => 'application/xml'}.update(headers))
  227. request.basic_auth $settings[:username], $settings[:password]
  228. request
  229. end
  230.  
  231.  
  232. def rails_values params = { }
  233. rez = { }
  234.  
  235. params.each do |k, v|
  236. if v.is_a?(Hash)
  237. rez.update(hash_param(k, v))
  238. elsif v.is_a?(Time)
  239. rez[k] = v.utc.strftime("%Y-%m-%d %H:%M:%S")
  240. elsif v.is_a?(Date)
  241. rez[k] = v.strftime("%Y-%m-%d")
  242. else
  243. rez[k] = v
  244. end
  245. end
  246.  
  247. rez
  248. end
  249.  
  250. def hash_param key, value
  251. rez = { }
  252.  
  253. value.each do |k, v|
  254. rez["#{key}[#{k}]"] = v
  255. end
  256.  
  257. rez
  258. end
  259. end
  260.  
  261. class FileParam
  262. attr_accessor :k, :filename, :content
  263. def initialize( k, filename, content )
  264. @k = k
  265. @filename = filename
  266. @content = content
  267. end
  268.  
  269. def to_multipart
  270. #return "Content-Disposition: form-data; name=\"#{CGI::escape(k)}\"; filename=\"#{filename}\"\r\n" + "Content-Transfer-Encoding: binary\r\n" + "Content-Type: #{MIME::Types.type_for(@filename)}\r\n\r\n" + content + "\r\n "
  271. # Don't escape mine
  272. return "Content-Disposition: form-data; name=\"#{k}\"; filename=\"#{filename}\"\r\n" + "Content-Transfer-Encoding: binary\r\n" + "Content-Type: #{MIME::Types.type_for(@filename)}\r\n\r\n" + content + "\r\n"
  273. end
  274. end
  275.  
  276. class MultipartPost
  277. BOUNDARY = 'tarsiers-rule0000'
  278. HEADER = {"Content-type" => "multipart/form-data, boundary=" + BOUNDARY + " "}
  279.  
  280. def prepare_query (params)
  281. fp = []
  282. params.each {|k,v|
  283. if v.respond_to?(:read)
  284. fp.push(FileParam.new(k, v.path, v.read))
  285. else
  286. fp.push(Param.new(k,v))
  287. end
  288. }
  289. query = fp.collect {|p| "--" + BOUNDARY + "\r\n" + p.to_multipart }.join("") + "--" + BOUNDARY + "--"
  290. return query, HEADER
  291. end
  292. end
  293.  
  294. class Param
  295. attr_accessor :k, :v
  296. def initialize( k, v )
  297. @k = k
  298. @v = v
  299. end
  300.  
  301. def to_multipart
  302. #return "Content-Disposition: form-data; name=\"#{CGI::escape(k)}\"\r\n\r\n#{v}\r\n"
  303. # Don't escape mine...
  304. return "Content-Disposition: form-data; name=\"#{k}\"\r\n\r\n#{v}\r\n"
  305. end
  306. end
  307.  
  308. class RemoteError < StandardError
  309. attr_accessor :message, :body
  310.  
  311. def initialize(message, body)
  312. self.message = message
  313. self.body = body.to_s
  314. end
  315. end
Add Comment
Please, Sign In to add comment