OSDN Git Service

remove importer
[pettanr/pettanr.git] / lib / peta / item.rb
1 module Peta
2   class Item < ActiveRecord::Base
3     self.abstract_class = true
4     attr :boosters
5     
6     # Dynamic ClassMethods
7     
8     def self._dev?
9       Rails.env == "development"
10     end
11     
12     def self._skip_load?
13       if self._dev?
14         return true unless self.my_manifest
15         return true unless Manifest.manifest.items
16         return true unless Manifest.manifest.models
17       end
18       false
19     end
20     
21     def self.load_manifest
22       return nil if self._skip_load?
23       vc = self.my_manifest.valid_encode_columns
24       define_singleton_method("valid_encode_columns") do 
25         vc
26       end
27       cm = self.my_manifest.child_models
28       define_singleton_method("child_models") do
29         cm
30       end
31       cen = self.my_manifest.child_element_names
32       define_singleton_method("child_element_names") do
33         cen
34       end
35       # Instance Methods
36     end
37     
38     # ClassMethods
39     # class_name
40     # table_name
41     
42     before_validation :valid_encode
43     
44     def self.my_peta
45       return nil unless Manifest.manifest.items
46       Manifest.manifest.items[self.item_name]
47     end
48     
49     def self.my_manifest
50       return nil unless Manifest.manifest.models
51       Manifest.manifest.models[self.item_name]
52     end
53     
54     def self.singular
55       self.to_s
56     end
57     
58     def self.plural
59       self.singular.pluralize
60     end
61     
62     def self.item_name
63       self.singular.underscore
64     end
65     
66     def self.item?
67       true
68     end
69     
70     def self.content?
71       false
72     end
73     
74     def self.element?
75       false
76     end
77     
78     def self.root?
79       false
80     end
81     
82     def self.parent_model
83       nil
84     end
85     
86     def self.path_name with_engine = false
87       self.plural.underscore
88     end
89     
90     def self.find_boost_name column_name
91       self.my_peta.find_boost_name column_name
92     end
93     
94     def self.extend_column? column_name
95       self.my_peta.extend_column? column_name
96     end
97     
98     def self.list_where
99       ''
100     end
101     
102     def self.list_order
103       self.table_name + '.updated_at desc'
104     end
105     
106     def self.list_opt
107       {}
108     end
109     
110     def self.list_json_opt
111       {}
112     end
113     
114     def self.show item_id, operators
115       opt = {}
116       opt.merge!(self.show_opt)
117       item = self.find(item_id, opt)
118       item.boosts 'read'
119       raise ActiveRecord::Forbidden if item.visible?(operators) == false
120       item
121     end
122     
123     def self.show_opt
124       {}
125     end
126     
127     def self.show_json_opt
128       {}
129     end
130     
131     def self.fold_extend_settings attr
132       self.my_peta.boost.each do |name, manifest|
133         my_settings = attr[manifest.settings_column_name]
134         if my_settings.is_a?(Hash)
135           attr[manifest.settings_column_name] = my_settings.to_json
136         end
137       end
138     end
139     
140     #InstanceMethods
141     
142     def item_name
143       self.class.item_name
144     end
145     
146     def model_name
147       self.item_name
148     end
149     
150     def table_name
151       self.class.table_name
152     end
153     
154     def path_name with_engine = false
155       self.class.path_name(with_engine)
156     end
157     
158     def form_template with_engine = false
159       self.path_name(with_engine) + '/form'
160     end
161     
162     def form_name
163       self.extend_column ? self.attributes[self.extend_column] : self.item_name
164     end
165     
166     def valid_encode
167       self.class.valid_encode_columns.each do |a|
168         next if attributes[a] == nil
169         raise Pettanr::BadRequest unless self.attributes[a].valid_encoding?
170       end
171     end
172     
173     def boosts level
174       self.class.my_peta.boost.each do |boost_name, boost_manifest|
175         next if level == 'read' and boost_manifest.level == 'post'
176         self.boost boost_manifest
177       end
178     end
179     
180     def boost boost_manifest
181       @boosters ||= {}
182       @boosters[boost_manifest.name] ||= Locmare::Booster.new(boost_manifest, self)
183     end
184     
185     def boosters
186       @boosters ||= {}
187     end
188     
189     def extend_column? column_name
190       self.class.extend_column? column_name
191     end
192     
193     def supply_default
194       self.boosters.each do |boost_name, booster|
195         booster.supply_default
196       end
197     end
198     
199     def overwrite 
200       self.boosters.each do |boost_name, booster|
201         booster.overwrite
202       end
203     end
204     
205     def user_visible? operators
206       if Manifest.manifest.magic_numbers['run_mode'] == 0
207         return false unless operators.guest?
208       else
209         return false unless operators.resource_reader?
210       end
211       true
212     end
213     
214     def visible? operators
215       return false unless self.user_visible? operators
216       true
217     end
218     
219     def editize?
220       self.respond_to? :editor
221     end
222     
223     def dom_id
224       self.id.to_s
225     end
226     
227     def dom_pool_type
228       self.new_record? ? 'stored' : 'new'
229     end
230     
231     def merge_dom_item_id attr, name = nil
232       if self.editize?
233         attr.merge({'id' => self.dom_item_id(name)})
234       else
235         attr
236       end
237     end
238     
239     def tag_attributes name = nil, opt = {}
240       r = {
241         'data-pool_type' => self.dom_pool_type, 'data-id' => self.dom_id, 
242         'data-item_name' => self.item_name
243       }
244       r = self.merge_dom_item_id r, name
245       r.merge!(opt)
246       r
247     end
248     
249     def field_tag_attributes column_name, opt = {}
250       self.tag_attributes(column_name, opt).merge(
251         {'data-column_name' => column_name}
252       )
253     end
254     
255     def post_attribute_key
256       self.dom_id
257     end
258     
259     ##################################################################
260     # importer
261     ##################################################################
262     
263     def self.each_import data
264       data.each do |n, d|
265         yield n, d
266       end
267     end
268     
269     def self.import_system_picture attr
270       d = attr["text"]
271       return false if d.blank?
272       imager = PettanImager.load(Base64.decode64(d.to_s))
273       return false unless imager
274       sp = SystemPicture.store(imager)
275       return false unless sp
276       sp.id
277     end
278     
279     def self.replace_system_picture attr
280       attr.each do |name, value|
281         if value.is_a? Hash
282           r = if name.to_s =~ /_id$/
283             self.import_system_picture value
284           else
285             self.replace_system_picture value
286           end
287           return false unless r
288           attr[name] = r
289         end
290       end
291     end
292     
293     def self.modify_object(name, attr, key = 'name')
294       c = 'find_by_' + key.to_s
295       r = self.__send__ c, name
296       if r
297         r.attributes = attr
298       else
299         r = self.new attr
300         r[key] = name
301       end
302       r
303     end
304     
305     def self.import_list(attrs, &blk)
306       res = []
307       self.transaction do
308         attrs.each do |name, item|
309           m = blk.call(name, item)
310           res.push(m) unless m.valid?
311         end
312         raise ActiveRecord::Rollback unless res.empty?
313       end
314       res
315     end
316     
317     def self.import_text(text, &blk)
318       attrs = JSON.parse(text)
319       self.import_list attrs, &blk
320     end
321     
322     def self.import_file(filename, &blk)
323       text = File.open(filename, 'r').read
324       self.import_text text, &blk
325     end
326     
327     def self.import_url(url, &blk)
328       text = open(url).read
329       self.import_text text, &blk
330     end
331     
332     def self.import_urls(urls, &blk)
333       r = {}
334       urls.each do |url|
335         h = {}
336         begin
337           h[:validations] = self.import_url(url, &blk)
338         rescue
339           h[:exception] = {:location => $@, :message => $!}
340         end
341         r[url] = h
342       end
343       r
344     end
345     
346   end
347 end