OSDN Git Service

fix player
[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     
41     before_validation :valid_encode
42     
43     def self.my_peta
44       return nil unless Manifest.manifest.items
45       Manifest.manifest.items[self.item_name]
46     end
47     
48     def self.my_controller
49       return nil unless Manifest.manifest.controllers
50       Manifest.manifest.controllers[self.table_name]
51     end
52     
53     def self.my_manifest
54       return nil unless Manifest.manifest.models
55       Manifest.manifest.models[self.item_name]
56     end
57     
58     def self.singular
59       self.to_s
60     end
61     
62     def self.plural
63       table_name = Manifest.manifest.pluralize self.item_name
64       table_name.camelize
65     end
66     
67     def self.item_name
68       self.singular.underscore
69     end
70     
71     # self.model_name
72     # => "PanelPicture"
73     
74     # self.table_name
75     # => "panel_picture"
76     
77     def self.item?
78       true
79     end
80     
81     def self.content?
82       false
83     end
84     
85     def self.element?
86       false
87     end
88     
89     def self.root?
90       false
91     end
92     
93     def self.parent_model
94       nil
95     end
96     
97     def self.path_name with_engine = false
98       self.table_name
99     end
100     
101     def self.pickup_item_name
102       self.item_name
103     end
104     
105     def self.pickup_column_name
106       'id'
107     end
108     
109     def self.find_boost_name column_name
110       self.my_peta.find_boost_name column_name
111     end
112     
113     def self.extend_column? column_name
114       self.my_peta.extend_column? column_name
115     end
116     
117     def self.index_list_where list
118       nil
119     end
120     
121     def self.list_opt
122       {}
123     end
124     
125     def self.list_json_opt
126       {}
127     end
128     
129     def self.show item_id, operators = nil
130       opt = {}
131       opt.merge!(self.show_opt)
132       item = self.find(item_id, opt)
133       item.boosts 'read'
134       raise ActiveRecord::Forbidden if operators and item.visible?(operators) == false
135       item
136     end
137     
138     def self.show_opt
139       {}
140     end
141     
142     def self.show_json_opt
143       {}
144     end
145     
146     def self.fold_extend_settings attr
147       self.my_peta.boost.each do |name, manifest|
148         my_settings = attr[manifest.settings_column_name]
149         if my_settings.is_a?(Hash)
150           attr[manifest.settings_column_name] = my_settings.to_json
151         end
152       end
153     end
154     
155     #InstanceMethods
156     
157     def singular
158       self.class.singular
159     end
160     
161     def plural
162       self.class.plural
163     end
164     
165     def item_name
166       self.class.item_name
167     end
168     
169     def model_name
170       self.item_name
171     end
172     
173     def table_name
174       self.class.table_name
175     end
176     
177     def path_name with_engine = false
178       self.class.path_name(with_engine)
179     end
180     
181     def pickup_item_name
182       self.class.pickup_item_name
183     end
184     
185     def pickup_column_name
186       self.class.pickup_column_name
187     end
188     
189     def pickup_id
190       self.attributes[self.pickup_column_name]
191     end
192     
193     def form_template with_engine = false
194       self.path_name(with_engine) + '/form'
195     end
196     
197     def form_name
198       self.extend_column ? self.attributes[self.extend_column] : self.item_name
199     end
200     
201     def valid_encode
202       self.class.valid_encode_columns.each do |a|
203         next if attributes[a] == nil
204         raise Pettanr::BadRequest unless self.attributes[a].valid_encoding?
205       end
206     end
207     
208     def boosts level
209       self.class.my_peta.boost.each do |boost_name, boost_manifest|
210         next if level == 'read' and boost_manifest.level == 'post'
211         self.boost boost_manifest
212       end
213     end
214     
215     def boost boost_manifest
216       @boosters ||= {}
217       @boosters[boost_manifest.name] ||= Locmare::Booster.new(boost_manifest, self)
218     end
219     
220     def boosters
221       @boosters ||= {}
222     end
223     
224     def extend_column? column_name
225       self.class.extend_column? column_name
226     end
227     
228     def supply_default
229       self.boosters.each do |boost_name, booster|
230         booster.supply_default
231       end
232     end
233     
234     def overwrite 
235       self.boosters.each do |boost_name, booster|
236         booster.overwrite
237       end
238     end
239     
240     def user_visible? operators
241       if Manifest.manifest.magic_numbers['run_mode'] == 0
242         return false unless operators.guest?
243       else
244         return false unless operators.resource_reader?
245       end
246       true
247     end
248     
249     def visible? operators
250       return false unless self.user_visible? operators
251       true
252     end
253     
254     def editize?
255       self.respond_to? :editor
256     end
257     
258     def dom_id
259       self.id.to_s
260     end
261     
262     def dom_pool_type
263       self.new_record? ? 'stored' : 'new'
264     end
265     
266     def merge_dom_item_id attr, name = nil
267       if self.editize?
268         attr.merge({'id' => self.dom_item_id(name)})
269       else
270         attr
271       end
272     end
273     
274     def tag_attributes name = nil, opt = {}
275       r = {
276         'data-pool_type' => self.dom_pool_type, 'data-id' => self.dom_id, 
277         'data-item_name' => self.item_name
278       }
279       r = self.merge_dom_item_id r, name
280       r.merge!(opt)
281       r
282     end
283     
284     def tag_attr column = nil, opt = {}
285       self.tag_attributes(column, opt).to_attr
286     end
287     
288     def field_tag_attributes column_name, opt = {}
289       self.tag_attributes(column_name, opt).merge(
290         {'data-column_name' => column_name}
291       )
292     end
293     
294     def post_attribute_key
295       self.dom_id
296     end
297     
298     ##################################################################
299     # importer
300     ##################################################################
301     
302     def self.each_import data
303       data.each do |n, d|
304         yield n, d
305       end
306     end
307     
308     def self.import_system_picture attr
309       d = attr["text"]
310       return false if d.blank?
311       imager = PettanImager.load(Base64.decode64(d.to_s))
312       return false unless imager
313       sp = SystemPicture.store(imager)
314       return false unless sp
315       sp.id
316     end
317     
318     def self.replace_system_picture attr
319       attr.each do |name, value|
320         if value.is_a? Hash
321           r = if name.to_s =~ /_id$/
322             self.import_system_picture value
323           else
324             self.replace_system_picture value
325           end
326           return false unless r
327           attr[name] = r
328         end
329       end
330     end
331     
332     def self.modify_object(name, attr, key = 'name')
333       c = 'find_by_' + key.to_s
334       r = self.__send__ c, name
335       if r
336         r.attributes = attr
337       else
338         r = self.new attr
339         r[key] = name
340       end
341       r
342     end
343     
344     def self.import_list(attrs, &blk)
345       res = []
346       self.transaction do
347         attrs.each do |name, item|
348           m = blk.call(name, item)
349           res.push(m) unless m.valid?
350         end
351         raise ActiveRecord::Rollback unless res.empty?
352       end
353       res
354     end
355     
356     def self.import_text(text, &blk)
357       attrs = JSON.parse(text)
358       self.import_list attrs, &blk
359     end
360     
361     def self.import_file(filename, &blk)
362       text = File.open(filename, 'r').read
363       self.import_text text, &blk
364     end
365     
366     def self.import_url(url, &blk)
367       text = open(url).read
368       self.import_text text, &blk
369     end
370     
371     def self.import_urls(urls, &blk)
372       r = {}
373       urls.each do |url|
374         h = {}
375         begin
376           h[:validations] = self.import_url(url, &blk)
377         rescue
378           h[:exception] = {:location => $@, :message => $!}
379         end
380         r[url] = h
381       end
382       r
383     end
384     
385   end
386 end