OSDN Git Service

fix profiler extend system
[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._valid_encode_columns
9       self.my_manifest.valid_encode_columns
10     end
11     
12     def self.load_manifest
13       return nil unless self.my_manifest
14       r = self._valid_encode_columns
15       define_singleton_method("valid_encode_columns") do 
16         r
17       end
18       r = self.my_manifest.child_models
19       define_singleton_method("child_models") do
20         r
21       end
22       r = self.my_manifest.child_element_names
23       define_singleton_method("child_element_names") do
24         r
25       end
26       # Instance Methods
27     end
28     
29     # ClassMethods
30     # class_name
31     # table_name
32     
33     before_validation :valid_encode
34     
35     def self.my_peta
36       Manifest.manifest.items[self.item_name]
37     end
38     
39     def self.my_manifest
40       Manifest.manifest.models[self.item_name]
41     end
42     
43     def self.singular
44       self.to_s
45     end
46     
47     def self.plural
48       self.singular.pluralize
49     end
50     
51     def self.item_name
52       self.singular.underscore
53     end
54     
55     def self.item?
56       true
57     end
58     
59     def self.content?
60       false
61     end
62     
63     def self.element?
64       false
65     end
66     
67     def self.root?
68       false
69     end
70     
71     def self.parent_model
72       nil
73     end
74     
75     def self.path_name with_engine = false
76       self.plural.underscore
77     end
78     
79     def self.extend_column? column_name
80       self.my_peta.extend_column? column_name
81     end
82     
83     def self.visible_count_options
84       nil
85     end
86     
87     def self.list_where
88       ''
89     end
90     
91     def self.list_order
92       ''
93     end
94     
95     def self.list_opt
96       {}
97     end
98     
99     def self.list_json_opt
100       {}
101     end
102     
103     def self.show item_id, operators
104       opt = {}
105       opt.merge!(self.show_opt)
106       item = self.find(item_id, opt)
107       item.boosts 'read'
108       raise ActiveRecord::Forbidden unless item.visible?(operators)
109       item
110     end
111     
112     def self.show_opt
113       {}
114     end
115     
116     def self.show_json_opt
117       {}
118     end
119     
120     def self.fold_extend_settings params
121       self.my_peta.boost.each do |name, manifest|
122         my_settings = params[self.item_name][manifest.settings_column_name]
123         if my_settings.is_a?(Hash)
124           params[self.item_name][manifest.settings_column_name] = my_settings.to_json
125         end
126       end
127       self.child_models.each do |child_model|
128         child_model.fold_extend_settings params
129       end
130     end
131     
132     #InstanceMethods
133     
134     def item_name
135       self.class.item_name
136     end
137     
138     def model_name
139       self.item_name
140     end
141     
142     def table_name
143       self.class.table_name
144     end
145     
146     def path_name with_engine = false
147       self.class.path_name(with_engine)
148     end
149     
150     def form_template with_engine = false
151       self.path_name(with_engine) + '/form'
152     end
153     
154     def form_name
155       self.extend_column ? self.attributes[self.extend_column] : self.item_name
156     end
157     
158     def valid_encode
159       self.class.valid_encode_columns.each do |a|
160         next if attributes[a] == nil
161         raise Pettanr::BadRequest unless attributes[a].valid_encoding?
162       end
163     end
164     
165     def boosts level
166       self.class.my_peta.boost.each do |boost_name, boost_manifest|
167         next unless boost_manifest.level == level
168         self.boost boost_manifest
169       end
170     end
171     
172     def boost boost_manifest
173       @boosters ||= {}
174       @boosters[boost_manifest.name] = Locmare::Booster.new(boost_manifest, self)
175     end
176     
177     def extend_column? column_name
178       self.class.extend_column? column_name
179     end
180     
181     def supply_default
182       self.class.my_peta.supply_defaults self
183     end
184     
185     def overwrite 
186     end
187     
188     def visible? operators
189       if Manifest.manifest.magic_numbers['run_mode'] == 0
190         return false unless operators.guest?
191       else
192         return false unless operators.resource_reader?
193       end
194       true
195     end
196     
197     def editize?
198       self.respond_to? :editor
199     end
200     
201     def dom_id
202       self.id.to_s
203     end
204     
205     def dom_pool_type
206       self.new_record? ? 'stored' : 'new'
207     end
208     
209     def merge_dom_item_id attr, name = nil
210       if self.editize?
211         attr.merge({'id' => self.dom_item_id(name)})
212       else
213         attr
214       end
215     end
216     
217     def tag_attributes name = nil, opt = {}
218       r = {
219         'data-pool_type' => self.dom_pool_type, 'data-id' => self.dom_id, 
220         'data-item_name' => self.item_name
221       }
222       r = self.merge_dom_item_id r, name
223       r.merge!(opt)
224       r
225     end
226     
227     def field_tag_attributes column_name, opt = {}
228       self.tag_attributes(column_name, opt).merge(
229         {'data-column_name' => column_name}
230       )
231     end
232     
233     def post_attribute_key
234       self.dom_id
235     end
236     
237   end
238 end