OSDN Git Service

fix panel editor
[pettanr/pettanr.git] / vendor / plugins / pettan_importer / lib / pettan_importer.rb
1 #インポート処理
2 require 'open-uri'
3 require 'common'
4
5 module ActiveRecord
6   class Base
7     module PettanImporter
8       def self.included(base)
9         base.extend(ClassMethods)
10         base.__send__ :include, InstanceMethods
11       end
12       
13       module ClassMethods
14         def each_import data
15           data.each do |n, d|
16             yield n, d
17           end
18         end
19         
20         def import_system_picture attr
21           d = attr["text"]
22           return false if d.blank?
23           imager = PettanImager.load(Base64.decode64(d.to_s))
24           return false unless imager
25           sp = SystemPicture.store(imager)
26           return false unless sp
27           sp.id
28         end
29         
30         def replace_system_picture attr
31           attr.each do |name, value|
32             if value.is_a? Hash
33               r = if name.to_s =~ /_id$/
34                 self.import_system_picture value
35               else
36                 self.replace_system_picture value
37               end
38               return false unless r
39               attr[name] = r
40             end
41           end
42         end
43         
44         def modify_object(name, attr, key = 'name')
45           c = 'find_by_' + key.to_s
46           r = self.__send__ c, name
47           if r
48             r.attributes = attr
49           else
50             r = self.new attr
51             r[key] = name
52           end
53           r
54         end
55         
56         def import_list(attrs, &blk)
57           res = []
58           self.transaction do
59             attrs.each do |name, item|
60               m = blk.call(name, item)
61               res.push(m) unless m.valid?
62             end
63             raise ActiveRecord::Rollback unless res.empty?
64           end
65           res
66         end
67         
68         def import_text(text, &blk)
69           attrs = JSON.parse(text)
70           import_list attrs, &blk
71         end
72         
73         def import_file(filename, &blk)
74           text = File.open(filename, 'r').read
75           self.import_text text, &blk
76         end
77         
78         def import_url(url, &blk)
79           text = open(url).read
80           self.import_text text, &blk
81         end
82         
83         def import_urls(urls, &blk)
84           r = {}
85           urls.each do |url|
86             h = {}
87             begin
88               h[:validations] = import_url(url, &blk)
89             rescue
90               h[:exception] = {:location => $@, :message => $!}
91             end
92             r[url] = h
93           end
94           r
95         end
96         
97       end
98       
99       module InstanceMethods
100         private
101         
102         public
103         
104       end
105       
106     end
107     include PettanImporter
108   end
109 end
110