OSDN Git Service

fix edit extend_item
[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.boost 'show'
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 boost level
161       self.class.my_peta.boost.each do |boost_name, boost_manifest|
162         next unless boost_manifest.level == level
163         Locmare::Booster.new(boost_manifest, self)
164       end
165     end
166     
167     def extend_column? column_name
168       self.class.my_peta.extend_column? column_name
169     end
170     
171     def supply_default
172       self.class.my_peta.supply_defaults self
173     end
174     
175     def overwrite 
176     end
177     
178     def visible? operators
179       if Manifest.manifest.magic_numbers['run_mode'] == 0
180         return false unless operators.guest?
181       else
182         return false unless operators.resource_reader?
183       end
184       true
185     end
186     
187     def editize?
188       self.respond_to? :editor
189     end
190     
191     def dom_id
192       self.id.to_s
193     end
194     
195     def dom_pool_type
196       self.new_record? ? 'stored' : 'new'
197     end
198     
199     def merge_dom_item_id attr, name = nil
200       if self.editize?
201         attr.merge({'id' => self.dom_item_id(name)})
202       else
203         attr
204       end
205     end
206     
207     def tag_attributes name = nil, opt = {}
208       r = {
209         'data-pool_type' => self.dom_pool_type, 'data-id' => self.dom_id, 
210         'data-item_name' => self.item_name
211       }
212       r = self.merge_dom_item_id r, name
213       r.merge!(opt)
214       r
215     end
216     
217     def field_tag_attributes column_name, opt = {}
218       self.tag_attributes(column_name, opt).merge(
219         {'data-column_name' => column_name}
220       )
221     end
222     
223     def post_attribute_key
224       self.dom_id
225     end
226     
227   end
228 end