OSDN Git Service

fix update
[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       vc = self._valid_encode_columns
15       define_singleton_method("valid_encode_columns") do 
16         vc
17       end
18       cm = self.my_manifest.child_models
19       define_singleton_method("child_models") do
20         cm
21       end
22       cen = self.my_manifest.child_element_names
23       define_singleton_method("child_element_names") do
24         cen
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.find_boost_name column_name
80       self.my_peta.find_boost_name column_name
81     end
82     
83     def self.extend_column? column_name
84       self.my_peta.extend_column? column_name
85     end
86     
87     def self.visible_count_options
88       nil
89     end
90     
91     def self.list_where
92       ''
93     end
94     
95     def self.list_order
96       ''
97     end
98     
99     def self.list_opt
100       {}
101     end
102     
103     def self.list_json_opt
104       {}
105     end
106     
107     def self.show item_id, operators
108       opt = {}
109       opt.merge!(self.show_opt)
110       item = self.find(item_id, opt)
111       item.boosts 'read'
112       raise ActiveRecord::Forbidden unless item.visible?(operators)
113       item
114     end
115     
116     def self.show_opt
117       {}
118     end
119     
120     def self.show_json_opt
121       {}
122     end
123     
124     def self.fold_extend_settings attr
125       self.my_peta.boost.each do |name, manifest|
126         my_settings = attr[manifest.settings_column_name]
127         if my_settings.is_a?(Hash)
128           attr[manifest.settings_column_name] = my_settings.to_json
129         end
130       end
131     end
132     
133     #InstanceMethods
134     
135     def item_name
136       self.class.item_name
137     end
138     
139     def model_name
140       self.item_name
141     end
142     
143     def table_name
144       self.class.table_name
145     end
146     
147     def path_name with_engine = false
148       self.class.path_name(with_engine)
149     end
150     
151     def form_template with_engine = false
152       self.path_name(with_engine) + '/form'
153     end
154     
155     def form_name
156       self.extend_column ? self.attributes[self.extend_column] : self.item_name
157     end
158     
159     def valid_encode
160       self.class.valid_encode_columns.each do |a|
161         next if attributes[a] == nil
162         raise Pettanr::BadRequest unless self.attributes[a].valid_encoding?
163       end
164     end
165     
166     def boosts level
167       self.class.my_peta.boost.each do |boost_name, boost_manifest|
168         next if level == 'read' and boost_manifest.level == 'post'
169         self.boost boost_manifest
170       end
171     end
172     
173     def boost boost_manifest
174       @boosters ||= {}
175       @boosters[boost_manifest.name] ||= Locmare::Booster.new(boost_manifest, self)
176     end
177     
178     def boosters
179       @boosters
180     end
181     
182     def extend_column? column_name
183       self.class.extend_column? column_name
184     end
185     
186     def supply_default
187       self.class.my_peta.supply_defaults self
188     end
189     
190     def overwrite 
191       self.class.my_peta.overwrites self
192     end
193     
194     def user_visible? operators
195       if Manifest.manifest.magic_numbers['run_mode'] == 0
196         return false unless operators.guest?
197       else
198         return false unless operators.resource_reader?
199       end
200       true
201     end
202     
203     def visible? operators
204       return false unless self.user_visible? operators
205       true
206     end
207     
208     def editize?
209       self.respond_to? :editor
210     end
211     
212     def dom_id
213       self.id.to_s
214     end
215     
216     def dom_pool_type
217       self.new_record? ? 'stored' : 'new'
218     end
219     
220     def merge_dom_item_id attr, name = nil
221       if self.editize?
222         attr.merge({'id' => self.dom_item_id(name)})
223       else
224         attr
225       end
226     end
227     
228     def tag_attributes name = nil, opt = {}
229       r = {
230         'data-pool_type' => self.dom_pool_type, 'data-id' => self.dom_id, 
231         'data-item_name' => self.item_name
232       }
233       r = self.merge_dom_item_id r, name
234       r.merge!(opt)
235       r
236     end
237     
238     def field_tag_attributes column_name, opt = {}
239       self.tag_attributes(column_name, opt).merge(
240         {'data-column_name' => column_name}
241       )
242     end
243     
244     def post_attribute_key
245       self.dom_id
246     end
247     
248   end
249 end