OSDN Git Service

rails upgrade to 4
[pettanr/pettanr.git] / bin / panel_import.rb
diff --git a/bin/panel_import.rb b/bin/panel_import.rb
new file mode 100644 (file)
index 0000000..da532bf
--- /dev/null
@@ -0,0 +1,367 @@
+#サポートツール\r
+require 'rubygems'\r
+require 'active_support/all'\r
+require 'rest_client'\r
+require 'yaml'\r
+require 'json'\r
+require 'base64'\r
+\r
+if ARGV.size < 1\r
+  puts "uploader.rb src_host src_auth dest_host dest_auth"\r
+  puts "upload on child dirs"\r
+  exit\r
+end\r
+\r
+src_host = ARGV[0]\r
+src_auth = ARGV[1]\r
+dest_host = ARGV[2]\r
+dest_auth = ARGV[3]\r
+\r
+class Importer\r
+  def initialize src_host, src_auth, dest_host, dest_auth\r
+    @src_host = src_host\r
+    @src_auth = src_auth\r
+    @dest_host = dest_host\r
+    @dest_auth = dest_auth\r
+    @src_licenses = {}\r
+    self.licenses(@src_host).each do |l|\r
+      @src_licenses[l['id'].to_i] = l\r
+    end\r
+    @dest_licenses = {}\r
+    self.licenses(@dest_host).each do |l|\r
+      @dest_licenses[l['name']] = l\r
+    end\r
+    @src_speech_balloon_templates = {}\r
+    self.speech_balloon_templates(@src_host, @src_auth).each do |sb|\r
+      @src_speech_balloon_templates[sb['id'].to_i] = sb\r
+    end\r
+    @dest_speech_balloon_templates = {}\r
+    self.speech_balloon_templates(@dest_host, @dest_auth).each do |sb|\r
+      @dest_speech_balloon_templates[sb['name']] = sb\r
+    end\r
+    @src_writing_formats = {}\r
+    self.writing_formats(          @dest_host, @dest_auth).each do |wf|\r
+  #  self.writing_formats(@src_host, @src_auth).each do |wf|\r
+      @src_writing_formats[wf['id'].to_i] = wf\r
+    end\r
+    @dest_writing_formats = {}\r
+    self.writing_formats(@dest_host, @dest_auth).each do |wf|\r
+      @dest_writing_formats[wf['name']] = wf\r
+    end\r
+    @src_system_pictures = {}\r
+    self.system_pictures(@src_host, @src_auth).each do |sp|\r
+      @src_system_pictures[sp['id'].to_i] = sp\r
+    end\r
+    @dest_system_pictures = {}\r
+    self.system_pictures(@dest_host, @dest_auth).each do |sp|\r
+      @dest_system_pictures[sp['md5']] = sp\r
+    end\r
+  end\r
+  \r
+  def licenses host\r
+    res = {}\r
+    u = host + 'licenses.json'\r
+    r = RestClient.get(u, :params => {:page_size  => 100})\r
+    JSON.parse r\r
+  end\r
+  \r
+  def license_groups host\r
+    res = {}\r
+    u = host + 'license_groups.json'\r
+    r = RestClient.get(u, :params => {:page_size  => 100})\r
+    ary = JSON.parse r\r
+    ary.each do |l|\r
+      res[l['id'].to_i] = l\r
+    end\r
+    res\r
+  end\r
+  \r
+  def speech_balloon_templates host, auth\r
+    res = {}\r
+    u = host + 'speech_balloon_templates.json'\r
+    r = RestClient.get(u, :params => {:page_size  => 100, :auth_token => auth})\r
+    JSON.parse r\r
+  end\r
+  \r
+  def writing_formats host, auth\r
+    res = {}\r
+    u = host + 'writing_formats.json'\r
+    r = RestClient.get(u, :params => {:page_size  => 100, :auth_token => auth})\r
+    JSON.parse r\r
+  end\r
+  \r
+  def system_pictures host, auth\r
+    res = {}\r
+    u = host + 'system_pictures.json'\r
+    r = RestClient.get(u, :params => {:page_size  => 100, :auth_token => auth})\r
+    JSON.parse r\r
+  end\r
+  \r
+  def panels host, auth\r
+    res = {}\r
+    u = host + 'home/panels.json'\r
+    r = RestClient.get(u, :params => {:page_size  => 100, :auth_token => auth})\r
+    ary = JSON.parse r\r
+    ary.each do |panel|\r
+      res[panel['id'].to_i] = panel\r
+    end\r
+    res\r
+  end\r
+  \r
+  def resource_picture md5, host, auth\r
+    res = {}\r
+    u = host + 'pictures/search.json'\r
+    r = RestClient.get(u, :params => {:md5 => md5, :auth_token => auth})\r
+    JSON.parse r\r
+  end\r
+  \r
+  def each_panel\r
+    self.panels(@src_host, @src_auth).each do |key, panel_json|\r
+      puts 'source panel:' + key.to_s\r
+      # 今はAPIの仕様が変わっているので、そのうち書き直す\r
+      elements = panel_json['elements']\r
+      panel_json.delete 'elements'\r
+      c = true\r
+      elements.each do |e|\r
+        if e['link']\r
+          element_name = 'panel_pictures'\r
+          puts 'pp:' + e['id'].to_s\r
+          rps = self.resource_picture e['picture']['md5'], @dest_host, @dest_auth\r
+          if rps.any?\r
+            rp = rps.first\r
+            puts 'picture ok(' + rp['id'].to_s + ')'\r
+          else\r
+            puts 'no picture'\r
+            c = false\r
+            break\r
+          end\r
+          src_ls_name = @src_licenses[e['picture']['license_id']]['name'].gsub /License\:/, 'Licenses:'\r
+          puts 'license:' + e['picture']['license_id'].to_s + '(' + src_ls_name + ')'\r
+          if dl = @dest_licenses[src_ls_name]\r
+            puts 'license ok(' + dl['id'].to_s + ')'\r
+          else\r
+            puts 'no license'\r
+            c = false\r
+            break\r
+          end\r
+          e['picture_id'] = rp['id']\r
+          e.delete 'picture'\r
+          e.delete 'license'\r
+        elsif e['classname']\r
+          element_name = 'speech_balloons'\r
+          puts 'sb:' + e['id'].to_s\r
+          src_sb_name = @src_speech_balloon_templates[e['speech_balloon_template_id']]['name']\r
+          puts 'speech_balloon_template:' + e['speech_balloon_template_id'].to_s + '(' + src_sb_name + ')'\r
+          if dsb = @dest_speech_balloon_templates[src_sb_name]\r
+            puts 'speech_balloon_template ok(' + dsb['id'].to_s + ')'\r
+          else\r
+            puts 'no speech_balloon_template'\r
+            c = false\r
+            break\r
+          end\r
+          src_sp_md5 = @src_system_pictures[e['balloon']['system_picture_id']]['md5']\r
+          puts 'balloon picture:' + e['balloon']['system_picture_id'].to_s + '(' + src_sp_md5 + ')'\r
+          if dsp = @dest_system_pictures[src_sp_md5]\r
+            puts 'balloon picture ok(' + dsp['id'].to_s + ')'\r
+          else\r
+            puts 'no balloon picture'\r
+            c = false\r
+            break\r
+          end\r
+          src_wf_name = @src_writing_formats[e['speech']['writing_format_id']]['name']\r
+          puts 'speech writing_format:' + e['speech']['writing_format_id'].to_s + '(' + src_wf_name + ')'\r
+          if dwf = @dest_writing_formats[src_wf_name]\r
+            puts 'speech writing_format ok(' + dwf['id'].to_s + ')'\r
+          else\r
+            puts 'no speech writing_format'\r
+            c = false\r
+            break\r
+          end\r
+          e['speech_balloon_template_id'] = dsb['id']\r
+          e["speech_balloon_template_settings"] = e["settings"]\r
+          e.delete 'settings'\r
+          e["speech_balloon_template_classname"] = dsb["classname"]\r
+          e.delete 'classname'\r
+          #e.delete 'speech_balloon_template'\r
+          balloon = e['balloon']\r
+          e.delete 'balloon'\r
+          balloon.delete 'id'\r
+          balloon.delete 'speech_balloon_id'\r
+          balloon["speech_balloon_template_settings"] = e["settings"]\r
+          balloon.delete 'settings'\r
+          balloon['system_picture_id'] = dsp['id']\r
+          balloon['speech_balloon_template_id'] = dsb['id']\r
+          balloon["speech_balloon_template_classname"] = dsb["classname"]\r
+          \r
+          speech = e['speech']\r
+          e.delete 'speech'\r
+          speech.delete 'id'\r
+          speech.delete 'speech_balloon_id'\r
+          speech["speech_balloon_template_settings"] = e["settings"]\r
+          speech.delete 'settings'\r
+          speech['speech_balloon_template_id'] = dsb['id']\r
+          speech["speech_balloon_template_classname"] = dsb["classname"]\r
+          speech['writing_format_id'] = dwf['id']\r
+    #      speech["writing_format_classname"] = 'Pettanr' + dwf["classname"]\r
+          speech["writing_format_classname"] = dwf["classname"]\r
+          \r
+          e['balloon_attributes'] = balloon\r
+          e['speech_attributes'] = speech\r
+        elsif e['code']\r
+          element_name = 'ground_colors'\r
+          puts 'gc:' + e['id'].to_s\r
+        elsif e['repeat']\r
+          element_name = 'ground_pictures'\r
+          puts 'gp:' + e['id'].to_s\r
+          rps = self.resource_picture e['picture']['md5'], @dest_host, @dest_auth\r
+          if rps.any?\r
+            rp = rps.first\r
+            puts 'picture ok(' + rp['id'].to_s + ')'\r
+          else\r
+            puts 'no picture'\r
+            c = false\r
+            break\r
+          end\r
+          #e['license_id'] = dl['id']\r
+          e['picture_id'] = rp['id']\r
+          #e.delete 'license'\r
+        else\r
+          c = false\r
+          break\r
+        end\r
+        eid = e['id']\r
+        e.delete 'id'\r
+        e.delete 'panel_id'\r
+        panel_json[element_name + '_attributes'] ||= {}\r
+        panel_json[element_name + '_attributes']['new' + eid.to_s] = e\r
+      end\r
+      next unless c\r
+      puts '============ importable'\r
+      panel_json.delete 'id'\r
+      panel_json.delete 'author'\r
+      panel_json.delete 'author_id'\r
+      panel_json.delete "created_at"\r
+      panel_json.delete 'updated_at'\r
+      yield panel_json\r
+    end\r
+  end\r
+  \r
+  def each_opset \r
+    self.each_subdir do |filename|\r
+      imgfile = nil\r
+      lsname = nil\r
+      formname = nil\r
+      attr  = nil\r
+      Dir.glob(filename + '/*') do |fn|\r
+        ext = File.extname(fn).downcase\r
+        case ext\r
+        when '.json'\r
+          json = JSON.parse(File.open(fn).read)\r
+          lsname = json["license_name"]\r
+          formname = json["formname"]\r
+          attr = json["attributes"]\r
+        when '.png', '.gif', '.jpeg'\r
+          imgfile = fn\r
+        end\r
+      end\r
+      if imgfile and lsname and formname and attr\r
+        yield imgfile, lsname, formname, attr\r
+      end\r
+    end\r
+  end\r
+  \r
+  def upload fn\r
+    oid = nil\r
+    b = Base64.encode64(File.open(fn, 'rb').read)\r
+    u = @host + 'original_pictures'\r
+    begin\r
+      r = RestClient.post(u, \r
+        {:original_picture => {:file  => b}, :auth_token => @auth}.to_json, \r
+        :content_type => :json, :accept => :json\r
+      )\r
+      o = JSON.parse r\r
+      oid = o['id']\r
+    rescue\r
+      puts ' failed: ' + r.to_s\r
+    end\r
+    oid\r
+  end\r
+  \r
+  def publish oid, lgid, rp\r
+    res = nil\r
+    u = @host + 'resource_pictures'\r
+    attr = {\r
+      :original_picture_id => oid, \r
+      :original_picture_license_group => {\r
+        :original_picture_id => oid, :license_group_id => lgid\r
+      }, \r
+      :resource_picture => {\r
+        :original_picture_id => oid, \r
+        :license_id => rp['license_id'], \r
+        :artist_name => rp['artist_name'], \r
+        :system_picture_id => rp['system_picture_id'], \r
+        :license_group_classname => rp['license_group_classname'], \r
+        :license_group_settings => rp['license_group_settings'], \r
+        :credit_picture_settings => rp['credit_picture_settings'], \r
+        :license_settings => rp['license_settings']\r
+      }, \r
+      :auth_token => @auth \r
+    }\r
+    begin\r
+      r = RestClient.post(u, \r
+        attr.to_json,\r
+        :content_type => :json, :accept => :json\r
+      )\r
+      res = JSON.parse r\r
+    rescue\r
+      puts ' failed: ' + r.to_s\r
+    end\r
+    res\r
+  end\r
+  \r
+  def publish_all\r
+    each_opset do |imgfile, lsname, formname, attr|\r
+      puts 'uploading: ' + imgfile\r
+      oid = self.upload imgfile\r
+      next unless oid\r
+      puts 'success: ' + oid.to_s\r
+      ls = @licenses[lsname]\r
+      unless ls\r
+        puts 'not detect licenses: ' + lsname.to_s\r
+        next\r
+      end\r
+      lsid = ls['id']\r
+      lgid = ls['license_group_id'].to_i\r
+      lg = @license_groups[lgid]\r
+      en = lg['classname']\r
+      puts 'building: ' + formname\r
+      rp = self.resource_picture oid, lgid, lsid, en, formname, attr\r
+      next unless rp\r
+      puts 'publishing: ' + lsname\r
+      r = self.publish oid, lgid, rp\r
+      puts 'success: ' + r['id'].to_s\r
+    end\r
+  end\r
+  \r
+end\r
+\r
+u = Importer.new src_host, src_auth, dest_host, dest_auth\r
+\r
+u.each_panel do |panel_json|\r
+    u = dest_host + 'panels'\r
+ File.open('/Sites/panel_create.json', 'w') do |f|\r
+   f.write JSON.pretty_generate(panel_json)\r
+ end\r
+    begin\r
+      r = RestClient.post(u, \r
+        {:json => panel_json, :auth_token => dest_auth}.to_json, \r
+        :content_type => :json, :accept => :json\r
+      )\r
+      res = JSON.parse r\r
+    rescue\r
+      puts ' failed: ' + r.to_s\r
+    end\r
+   # break\r
+end\r
+\r
+\r