OSDN Git Service

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