OSDN Git Service

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