OSDN Git Service

fix:error dlg
[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)
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 my_manifest
158       self.class.my_manifest
159     end
160     
161     def singular
162       self.class.singular
163     end
164     
165     def plural
166       self.class.plural
167     end
168     
169     def item_name
170       self.class.item_name
171     end
172     
173     def model_name
174       self.item_name
175     end
176     
177     def table_name
178       self.class.table_name
179     end
180     
181     def path_name with_engine = false
182       self.class.path_name(with_engine)
183     end
184     
185     def pickup_item_name
186       self.class.pickup_item_name
187     end
188     
189     def pickup_column_name
190       self.class.pickup_column_name
191     end
192     
193     def pickup_id
194       self.attributes[self.pickup_column_name]
195     end
196     
197     def form_template with_engine = false
198       self.path_name(with_engine) + '/form'
199     end
200     
201     def form_name
202       self.extend_column ? self.attributes[self.extend_column] : self.item_name
203     end
204     
205     def valid_encode
206       self.class.valid_encode_columns.each do |a|
207         next if attributes[a] == nil
208         raise Pettanr::BadRequest unless self.attributes[a].valid_encoding?
209       end
210     end
211     
212     def boosts level
213       self.class.my_peta.boost.each do |boost_name, boost_manifest|
214         next if level == 'read' and boost_manifest.level == 'post'
215         self.boost boost_manifest
216       end
217     end
218     
219     def boost boost_manifest
220       @boosters ||= {}
221       @boosters[boost_manifest.name] ||= Locmare::Booster.new(boost_manifest, self)
222     end
223     
224     def boosters
225       @boosters ||= {}
226     end
227     
228     def extend_column? column_name
229       self.class.extend_column? column_name
230     end
231     
232     def supply_default
233       self.boosters.each do |boost_name, booster|
234         booster.supply_default
235       end
236     end
237     
238     def overwrite 
239       self.boosters.each do |boost_name, booster|
240         booster.overwrite
241       end
242     end
243     
244     def user_visible? operators
245       if Manifest.manifest.magic_numbers['run_mode'] == 0
246         return false unless operators.guest?
247       else
248         return false unless operators.resource_reader?
249       end
250       true
251     end
252     
253     def visible? operators
254       return false unless self.user_visible? operators
255       true
256     end
257     
258     def permit_params params
259       attrs = self.class.permit_attributes
260       params.require(self.item_name.to_sym).permit(attrs)
261     end
262     
263     def self.permit_attributes
264       attrs = self.my_manifest.attributes.keys
265       self.child_models.each do |element_model|
266         name = self.my_manifest.associations.child_element_name(element_model) + '_attributes'
267         child_attrs = {}
268         child_attrs[name] = element_model.permit_attributes
269         attrs.push child_attrs
270       end
271       attrs
272     end
273     
274     def editize?
275       self.respond_to? :editor
276     end
277     
278     def dom_id
279       self.id.to_s
280     end
281     
282     def dom_pool_type
283       self.new_record? ? 'stored' : 'new'
284     end
285     
286     def merge_dom_item_id attr, name = nil
287       if self.editize?
288         attr.merge({'id' => self.dom_item_id(name)})
289       else
290         attr
291       end
292     end
293     
294     def tag_attributes name = nil, opt = {}
295       r = {
296         'data-pool_type' => self.dom_pool_type, 'data-id' => self.dom_id, 
297         'data-item_name' => self.item_name
298       }
299       r = self.merge_dom_item_id r, name
300       r.merge!(opt)
301       r
302     end
303     
304     def tag_attr column = nil, opt = {}
305       self.tag_attributes(column, opt).to_attr
306     end
307     
308     def field_tag_attributes column_name, opt = {}
309       self.tag_attributes(column_name, opt).merge(
310         {'data-column_name' => column_name}
311       )
312     end
313     
314     def post_attribute_key
315       self.dom_id
316     end
317     
318     ##################################################################
319     # importer
320     ##################################################################
321     
322     def self.each_import data
323       data.each do |n, d|
324         yield n, d
325       end
326     end
327     
328     def self.import_system_picture attr
329       d = attr["text"]
330       return false if d.blank?
331       imager = PettanImager.load(Base64.decode64(d.to_s))
332       return false unless imager
333       sp = SystemPicture.store(imager)
334       return false unless sp
335       sp.id
336     end
337     
338     def self.replace_system_picture attr
339       attr.each do |name, value|
340         if value.is_a? Hash
341           r = if name.to_s =~ /_id$/
342             self.import_system_picture value
343           else
344             self.replace_system_picture value
345           end
346           return false unless r
347           attr[name] = r
348         end
349       end
350     end
351     
352     def self.modify_object(name, attr, key = 'name')
353       c = 'find_by_' + key.to_s
354       r = self.__send__ c, name
355       if r
356         r.attributes = attr
357       else
358         r = self.new attr
359         r[key] = name
360       end
361       r
362     end
363     
364     def self.import_list(attrs, &blk)
365       res = []
366       self.transaction do
367         attrs.each do |name, item|
368           m = blk.call(name, item)
369           res.push(m) unless m.valid?
370         end
371         raise ActiveRecord::Rollback unless res.empty?
372       end
373       res
374     end
375     
376     def self.import_text(text, &blk)
377       attrs = JSON.parse(text)
378       self.import_list attrs, &blk
379     end
380     
381     def self.import_file(filename, &blk)
382       text = File.open(filename, 'r').read
383       self.import_text text, &blk
384     end
385     
386     def self.import_url(url, &blk)
387       text = open(url).read
388       self.import_text text, &blk
389     end
390     
391     def self.import_urls(urls, &blk)
392       r = {}
393       urls.each do |url|
394         h = {}
395         begin
396           h[:validations] = self.import_url(url, &blk)
397         rescue
398           h[:exception] = {:location => $@, :message => $!}
399         end
400         r[url] = h
401       end
402       r
403     end
404     
405   end
406 end