OSDN Git Service

temp
[pettanr/pettanr.git] / lib / item.rb
1 class Pettanr::Item < ActiveRecord::Base
2   self.abstract_class = true
3   # ClassMethods
4   # class_name
5   # table_name
6   
7   before_validation :valid_encode
8   
9   cattr_accessor :valid_encode_columns, :default_page_size, :max_page_size, :visible_count_options
10   @@valid_encode_columns = []
11   @@default_page_size = 25
12   @@max_page_size = 100
13   @@visible_count_options = {}
14   cattr_reader :singular, :plural
15   @@singular = 'Item'
16   @@plural = 'Items'
17   
18   def self.item_name
19     self.singular.underscore
20   end
21   
22   def self.path_name with_engine = false
23     self.plural.underscore
24   end
25   
26   def self.page_number prm = nil
27     page = prm.to_i
28     page = 1 if page < 1
29     page
30   end
31   
32   def self.page_size prm = self.default_page_size
33     page_size = prm.to_i
34     page_size = self.max_page_size if page_size > self.max_page_size
35     page_size = self.default_page_size if page_size < 1
36     page_size
37   end
38   
39   def self.list_where
40     ''
41   end
42   
43   def self.list_order
44     ''
45   end
46   
47   def self.list page = 1, page_size = self.default_page_size
48     self.where(self.list_where()).includes(self.list_opt).order(self.list_order).offset((page -1) * page_size).limit(page_size)
49   end
50   
51   def self.list_paginate page = 1, page_size = self.default_page_size
52     Kaminari.paginate_array(
53       Array.new(self.where(self.list_where()).includes(self.list_opt).count, nil)
54     ).page(page).per(page_size)
55   end
56   
57   def self.list_opt
58     {}
59   end
60   
61   def self.list_json_opt
62     {}
63   end
64   
65   def self.show item_id, operators
66     opt = {}
67     opt.merge!(self.show_opt)
68     item = self.find(item_id, opt)
69     raise ActiveRecord::Forbidden unless item.visible?(operators)
70     item
71   end
72   
73   def self.show_opt
74     {}
75   end
76   
77   def self.show_json_opt
78     {}
79   end
80   
81   def self.visible_count
82     self.count self.visible_count_options
83   end
84   
85   #InstanceMethods
86   
87   def item_name
88     self.class.item_name
89   end
90   
91   def valid_encode
92     self.class.valid_encode_columns.each do |a|
93       next if attributes[a] == nil
94       raise Pettanr::BadRequest unless attributes[a].valid_encoding?
95     end
96   end
97   
98   def supply_default
99   end
100   
101   def overwrite 
102   end
103   
104   def visible? operators
105     if MagicNumber['run_mode'] == 0
106       return false unless operators.guest?
107     else
108       return false unless operators.resource_reader?
109     end
110     true
111   end
112   
113   def dom_id_item 
114     self.new_record? ? '0' : self.id.to_s
115   end
116   
117   def tag_item_id c = nil
118     self.item_name + self.item_id + c.to_s
119   end
120   
121   def dom_id_item_field field_name
122     self.tag_item_id + field_name.to_s
123   end
124   
125   def path_name with_engine = false
126     self.class.path_name(with_engine)
127   end
128   
129   def form_template with_engine = false
130     self.path_name(with_engine) + '/form'
131   end
132   
133   def tag_item_attributes column = nil, opt = {}
134     {
135       :id => self.field_tag_id(column), :panel_id => self.tag_panel_id, 
136       :element_id => self.tag_element_id, :element_type => self.tag_element_type
137     }.merge(opt)
138   end
139   
140   def field_tag_attributes column, no_attr, opt = {}
141     self.tag_attributes(column).merge(
142       {:column => column, :new_index => self.tag_new_index, :no_attr => no_attr}
143     ).merge(opt)
144   end
145   
146   #render element by body
147   def any_tag_attributes name = nil, opt = {}
148     r = self.tag_attributes(name)
149     r.merge!(
150       {:new_index => self.tag_new_index}
151     ) if self.new_index
152     r.merge(opt)
153   end
154   
155   def select_tag_attributes(selected, column, no_attr)
156     [
157       :last, :first, 
158       {:html => {:selected => selected}}, 
159       self.field_tag_attributes(column, no_attr)
160     ]
161   end
162   
163   def tag_attr column = nil, opt = {}
164     self.tag_attributes(column, opt).to_attr
165   end
166   
167   def field_tag_attr column, no_attr, opt = {}
168     self.field_tag_attributes(column, no_attr, opt).to_attr
169   end
170   
171   def any_tag_attr name = nil, opt = {}
172     self.any_tag_attributes(name, opt).to_attr
173   end
174   
175 end