OSDN Git Service

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