OSDN Git Service

Item Dynamic ClassMethods
[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     end
18     
19     # ClassMethods
20     # class_name
21     # table_name
22     
23     before_validation :valid_encode
24     
25     def self.my_manifest
26       Manifest.manifest.models[self.item_name]
27     end
28     
29     def self.singular
30       self.to_s
31     end
32     
33     def self.plural
34       self.singular.pluralize
35     end
36     
37     def self.item_name
38       self.singular.underscore
39     end
40     
41     def self.item?
42       true
43     end
44     
45     def self.content?
46       false
47     end
48     
49     def self.path_name with_engine = false
50       self.plural.underscore
51     end
52     
53     def self.visible_count_options
54       nil
55     end
56     
57     def self.list_where
58       ''
59     end
60     
61     def self.list_order
62       ''
63     end
64     
65     def self.list_opt
66       {}
67     end
68     
69     def self.list_json_opt
70       {}
71     end
72     
73     def self.show item_id, operators
74       opt = {}
75       opt.merge!(self.show_opt)
76       item = self.find(item_id, opt)
77       raise ActiveRecord::Forbidden unless item.visible?(operators)
78       item
79     end
80     
81     def self.show_opt
82       {}
83     end
84     
85     def self.show_json_opt
86       {}
87     end
88     
89     def self.visible_count
90       self.count self.visible_count_options
91     end
92     
93     def self.visible_count_options
94       []
95     end
96     
97     #InstanceMethods
98     
99     def item_name
100       self.class.item_name
101     end
102     
103     def model_name
104       self.item_name
105     end
106     
107     def table_name
108       self.class.table_name
109     end
110     
111     def path_name with_engine = false
112       self.class.path_name(with_engine)
113     end
114     
115     def form_template with_engine = false
116       self.path_name(with_engine) + '/form'
117     end
118     
119     def extend_column
120       nil
121     end
122     
123     def extend_item_name
124       self.extend_column ? self.attributes[self.extend_column] : self.item_name
125     end
126     
127     def form_name
128       self.extend_item_name
129     end
130     
131     def valid_encode
132       self.class.valid_encode_columns.each do |a|
133         next if attributes[a] == nil
134         raise Pettanr::BadRequest unless attributes[a].valid_encoding?
135       end
136     end
137     
138     def supply_default
139     end
140     
141     def overwrite 
142     end
143     
144     def visible? operators
145       if Manifest.manifest.magic_numbers['run_mode'] == 0
146         return false unless operators.guest?
147       else
148         return false unless operators.resource_reader?
149       end
150       true
151     end
152     
153     def pool
154       @pool
155     end
156     
157     def dom_id
158       self.new_record? ? '1' : self.id.to_s
159     end
160     
161     def dom_pool_type
162       self.new_record? ? 'stored' : 'new'
163     end
164     
165     def dom_item_id column_name = nil
166       r = self.dom_pool_type + '-' + self.item_name + '-' + self.dom_id
167       r += '-' + column_name.to_s if column_name
168       r
169     end
170     
171     def tag_attributes column_name = nil, opt = {}
172       r = {
173         'data-pool_type' => self.dom_pool_type, 'data-id' => self.dom_id, 
174         'data-item_name' => self.item_name
175       }
176       r.merge!({'id' => self.dom_item_id(column_name)}) if self.pool
177  #  'data-parent_dom_id' => self.parent.dom_item_id
178       r.merge!(opt)
179       r
180     end
181     
182     def field_tag_attributes column_name, opt = {}
183       self.tag_attributes(column_name, opt).merge(
184         {'data-column_name' => column_name}
185       )
186     end
187     
188     #render element by body
189     def any_tag_attributes name = nil, opt = {}
190       r = self.tag_attributes(name)
191       r.merge!(
192         {:new_index => self.tag_new_index}
193       ) if self.new_index
194       r.merge(opt)
195     end
196     
197   end
198 end