OSDN Git Service

fix anything
[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       r = self._valid_encode_columns
15       define_singleton_method("valid_encode_columns") do 
16         r
17       end
18       r = self.my_manifest.child_models
19       define_singleton_method("child_models") do
20         r
21       end
22       r = self.my_manifest.child_element_names
23       define_singleton_method("child_element_names") do
24         r
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 params
125       self.my_peta.boost.each do |name, manifest|
126         my_settings = params[self.item_name][manifest.settings_column_name]
127         if my_settings.is_a?(Hash)
128           params[self.item_name][manifest.settings_column_name] = my_settings.to_json
129         end
130       end
131       self.child_models.each do |child_model|
132         child_model.fold_extend_settings params
133       end
134     end
135     
136     #InstanceMethods
137     
138     def item_name
139       self.class.item_name
140     end
141     
142     def model_name
143       self.item_name
144     end
145     
146     def table_name
147       self.class.table_name
148     end
149     
150     def path_name with_engine = false
151       self.class.path_name(with_engine)
152     end
153     
154     def form_template with_engine = false
155       self.path_name(with_engine) + '/form'
156     end
157     
158     def form_name
159       self.extend_column ? self.attributes[self.extend_column] : self.item_name
160     end
161     
162     def valid_encode
163       self.class.valid_encode_columns.each do |a|
164         next if attributes[a] == nil
165         raise Pettanr::BadRequest unless attributes[a].valid_encoding?
166       end
167     end
168     
169     def boosts level
170       self.class.my_peta.boost.each do |boost_name, boost_manifest|
171         next unless boost_manifest.level == level
172         self.boost boost_manifest
173       end
174     end
175     
176     def boost boost_manifest
177       @boosters ||= {}
178       @boosters[boost_manifest.name] = Locmare::Booster.new(boost_manifest, self)
179     end
180     
181     def extend_column? column_name
182       self.class.extend_column? column_name
183     end
184     
185     def supply_default
186       self.class.my_peta.supply_defaults self
187     end
188     
189     def overwrite 
190     end
191     
192     def visible? operators
193       if Manifest.manifest.magic_numbers['run_mode'] == 0
194         return false unless operators.guest?
195       else
196         return false unless operators.resource_reader?
197       end
198       true
199     end
200     
201     def editize?
202       self.respond_to? :editor
203     end
204     
205     def dom_id
206       self.id.to_s
207     end
208     
209     def dom_pool_type
210       self.new_record? ? 'stored' : 'new'
211     end
212     
213     def merge_dom_item_id attr, name = nil
214       if self.editize?
215         attr.merge({'id' => self.dom_item_id(name)})
216       else
217         attr
218       end
219     end
220     
221     def tag_attributes name = nil, opt = {}
222       r = {
223         'data-pool_type' => self.dom_pool_type, 'data-id' => self.dom_id, 
224         'data-item_name' => self.item_name
225       }
226       r = self.merge_dom_item_id r, name
227       r.merge!(opt)
228       r
229     end
230     
231     def field_tag_attributes column_name, opt = {}
232       self.tag_attributes(column_name, opt).merge(
233         {'data-column_name' => column_name}
234       )
235     end
236     
237     def post_attribute_key
238       self.dom_id
239     end
240     
241   end
242 end