OSDN Git Service

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