OSDN Git Service

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