OSDN Git Service

conflict
[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, default_permit_attributes = []
259       attrs = self.class.permit_attributes(default_permit_attributes)
260       params.require(self.item_name.to_sym).permit(attrs)
261     end
262     
263     def self.permit_attributes default_permit_attributes = []
264       attrs = self.my_manifest.attributes.keys
265       attrs.concat(default_permit_attributes)
266       attrs
267     end
268     
269     def editize?
270       self.respond_to? :editor
271     end
272     
273     def dom_id
274       self.id.to_s
275     end
276     
277     def dom_pool_type
278       self.new_record? ? 'stored' : 'new'
279     end
280     
281     def merge_dom_item_id attr, name = nil
282       if self.editize?
283         attr.merge({'id' => self.dom_item_id(name)})
284       else
285         attr
286       end
287     end
288     
289     def tag_attributes name = nil, opt = {}
290       r = {
291         'data-pool_type' => self.dom_pool_type, 'data-id' => self.dom_id, 
292         'data-item_name' => self.item_name
293       }
294       r = self.merge_dom_item_id r, name
295       r.merge!(opt)
296       r
297     end
298     
299     def tag_attr column = nil, opt = {}
300       self.tag_attributes(column, opt).to_attr
301     end
302     
303     def field_tag_attributes column_name, opt = {}
304       self.tag_attributes(column_name, opt).merge(
305         {'data-column_name' => column_name}
306       )
307     end
308     
309     def post_attribute_key
310       self.dom_id
311     end
312     
313     ##################################################################
314     # importer
315     ##################################################################
316     
317     def self.each_import data
318       data.each do |n, d|
319         yield n, d
320       end
321     end
322     
323     def self.import_system_picture attr
324       d = attr["text"]
325       return false if d.blank?
326       imager = PettanImager.load(Base64.decode64(d.to_s))
327       return false unless imager
328       sp = SystemPicture.store(imager)
329       return false unless sp
330       sp.id
331     end
332     
333     def self.replace_system_picture attr
334       attr.each do |name, value|
335         if value.is_a? Hash
336           r = if name.to_s =~ /_id$/
337             self.import_system_picture value
338           else
339             self.replace_system_picture value
340           end
341           return false unless r
342           attr[name] = r
343         end
344       end
345     end
346     
347     def self.modify_object(name, attr, key = 'name')
348       c = 'find_by_' + key.to_s
349       r = self.__send__ c, name
350       if r
351         r.attributes = attr
352       else
353         r = self.new attr
354         r[key] = name
355       end
356       r
357     end
358     
359     def self.import_list(attrs, &blk)
360       res = []
361       self.transaction do
362         attrs.each do |name, item|
363           m = blk.call(name, item)
364           res.push(m) unless m.valid?
365         end
366         raise ActiveRecord::Rollback unless res.empty?
367       end
368       res
369     end
370     
371     def self.import_text(text, &blk)
372       attrs = JSON.parse(text)
373       self.import_list attrs, &blk
374     end
375     
376     def self.import_file(filename, &blk)
377       text = File.open(filename, 'r').read
378       self.import_text text, &blk
379     end
380     
381     def self.import_url(url, &blk)
382       text = open(url).read
383       self.import_text text, &blk
384     end
385     
386     def self.import_urls(urls, &blk)
387       r = {}
388       urls.each do |url|
389         h = {}
390         begin
391           h[:validations] = self.import_url(url, &blk)
392         rescue
393           h[:exception] = {:location => $@, :message => $!}
394         end
395         r[url] = h
396       end
397       r
398     end
399     
400   end
401 end