OSDN Git Service

t#29400
[pettanr/pettanr.git] / app / models / panel.rb
1 #コマ
2 class Panel < ActiveRecord::Base
3   belongs_to :author
4   belongs_to :resource_picture
5   has_many :stories
6   has_many :panel_pictures, :dependent => :destroy
7   has_many :speech_balloons, :dependent => :destroy
8   has_many :ground_pictures, :dependent => :destroy
9   has_many :ground_colors, :dependent => :destroy
10   has_many :panel_colors, :dependent => :destroy
11   accepts_nested_attributes_for :panel_pictures, :allow_destroy => true
12   accepts_nested_attributes_for :speech_balloons, :allow_destroy => true
13   accepts_nested_attributes_for :ground_pictures, :allow_destroy => true
14   accepts_nested_attributes_for :ground_colors, :allow_destroy => true
15   accepts_nested_attributes_for :panel_colors, :allow_destroy => true
16
17   validates :width, :presence => true, :numericality => true, :natural_number => true
18   validates :height, :presence => true, :numericality => true, :natural_number => true
19   validates :border, :presence => true, :numericality => {:greater_than_or_equal_to => 0}
20   validates :x, :numericality => {:allow_blank => true}
21   validates :y, :numericality => {:allow_blank => true}
22   validates :z, :numericality => {:allow_blank => true, :greater_than => 0}
23   validates :author_id, :presence => true, :numericality => true, :existence => true
24   validates :publish, :presence => true, :numericality => true
25   
26   def supply_default
27     self.border = 2
28     self.publish = 0
29   end
30   
31   def overwrite au
32     self.author_id = au.id
33   end
34   
35   def visible? au
36     return false unless au
37     self.own?(au) or self.publish?
38   end
39   
40   def own? au
41     return false unless au
42     self.author_id == au.id
43   end
44   
45   def usable? au
46     visible? au
47   end
48   
49   def publish?
50     self.publish > 0
51   end
52   
53   def self.default_page_size
54     25
55   end
56   
57   def self.max_page_size
58     100
59   end
60   
61   def self.page prm = nil
62     page = prm.to_i
63     page = 1 if page < 1
64     page
65   end
66   
67   def self.page_size prm = self.default_page_size
68     page_size = prm.to_i
69     page_size = self.max_page_size if page_size > self.max_page_size
70     page_size = self.default_page_size if page_size < 1
71     page_size
72   end
73   
74   def self.list page = 1, page_size = self.default_page_size
75     opt = {}
76     opt.merge!(self.list_opt)
77     opt.merge!({:limit => page_size, :offset => (page -1) * page_size}) if page_size > 0
78     opt.merge!({:conditions => 'panels.publish > 0', :order => 'panels.updated_at desc'})
79     Panel.find(:all, opt)
80   end
81   
82   def self.list_opt
83     {:include => {
84       :panel_pictures => {
85         :picture => {:artist => {}, :license => {}}
86       }, 
87       :speech_balloons => {:balloons => {}, :speeches => {}},
88       :ground_pictures => {
89         :picture => {:artist => {}, :license => {}}
90       }, 
91       :ground_colors => {
92         :color => {}
93       }, 
94       :panel_colors => {
95       }, 
96       :author => {}
97     }}
98   end
99   
100   def self.mylist au, page = 1, page_size = Author.default_panel_page_size
101     opt = {}
102     opt.merge!(self.list_opt)
103     opt.merge!({:limit => page_size, :offset => (page -1) * page_size}) if page_size > 0
104     opt.merge!({:conditions => ['panels.author_id = ?', au.id], :order => 'panels.updated_at desc'})
105     Panel.find(:all, opt)
106   end
107   
108   def self.show rid, au
109     opt = {}
110     opt.merge!(Panel.show_opt)
111     res = Panel.find(rid, opt)
112     raise ActiveRecord::Forbidden unless res.visible?(au)
113     res
114   end
115   
116   def self.edit rid, au
117     opt = {}
118     opt.merge!(Panel.show_opt)
119     res = Panel.find(rid, opt)
120     raise ActiveRecord::Forbidden unless res.own?(au)
121     res
122   end
123   
124   def self.show_opt
125     {:include => {
126       :panel_pictures => {
127         :picture => {:artist => {}, :license => {}}
128       }, 
129       :speech_balloons => {:balloons => {}, :speeches => {}},
130       :ground_pictures => {
131         :picture => {:artist => {}, :license => {}}
132       }, 
133       :ground_colors => {
134         :color => {}
135       }, 
136       :panel_colors => {
137       }, 
138       :author => {}
139     }}
140   end
141   
142   def parts_element
143     ((self.panel_pictures || []) + (self.speech_balloons || [])).compact
144   end
145   
146   def parts
147     res = []
148     self.parts_element.each do |e|
149       res[e.t] = e
150     end
151     res
152   end
153   
154   def grounds
155     ((self.ground_colors || []) + (self.ground_pictures || []) + (self.panel_colors || [])).compact
156   end
157   
158   def panel_elements
159     parts + grounds
160   end
161   
162   @@elm_json_opt = {
163     'PanelPicture' => {
164       :picture => {:artist => {}, :license => {}}
165     }, 
166     'SpeechBalloon' => {:balloons => {}, :speeches => {}},
167     'GroundPicture' => {
168       :picture => {:artist => {}, :license => {}}
169     }, 
170     'GroundColor' => {
171       :color => {}
172     }, 
173     'PanelColor' => {
174     } 
175   }
176   
177   def self.elm_json_opt e
178     @@elm_json_opt[e.class.to_s]
179   end
180   
181   def elements
182     self.panel_elements.map {|e|
183       #(-_-;)<... kore wa hidoi
184       JSON.parse e.to_json({:include => Panel.elm_json_opt(e)})
185     }
186   end
187   
188   def panel_elements_as_json
189     self.to_json({:include => {:author => {}}, :methods => :elements})
190   end
191   
192   def self.visible_count
193     Panel.count
194   end
195   
196   def self.collect_element_value elements, name
197     elements.map {|e|
198       e.map {|o|
199         o[name]
200       }
201     }.flatten
202   end
203   
204   def self.validate_t ary
205     i = 0
206     ary.compact.sort.each do |t|
207       break false unless t == i
208       i += 1
209     end
210     ary.compact.size == i
211   end
212   
213   def self.validate_element_t elements, name
214     Panel.validate_t(Panel.collect_element_value(elements, name))
215   end
216   
217   def self.validate_elements_t c
218     c.map {|conf|
219       Panel.validate_element_t(conf[:elements], conf[:name]) ? nil : false
220     }.compact.empty?
221   end
222   
223   def validate_t_list
224     [
225       {:elements => [self.panel_pictures, self.speech_balloons], :name => :t}
226     ]
227   end
228   def validate_child
229 #    r1 = Panel.validate_elements_id validate_id_list
230     Panel.validate_elements_t validate_t_list
231   end
232   
233   def store attr, au
234     if attr == false
235       self.errors.add :base, 'invalid json'
236       return false
237     end
238     self.attributes = attr
239     self.overwrite au
240     res = false
241     Panel.transaction do
242       unless validate_child
243         self.errors.add :base , 'invalid time'
244         raise ActiveRecord::Rollback
245       end
246       res = self.save
247     end
248     res
249   end
250   
251 =begin\r
252   def self.validate_id ary, pid
253     ary.map {|v|
254       if pid
255         (v == pid or v == nil) ? nil : false
256       else
257         v ? false : nil
258       end
259     }.compact.empty?
260   end
261   
262   def self.validate_element_id elements, name, pid
263     Panel.validate_id(Panel.collect_element_value(elements, name), pid)
264   end
265   
266   def self.validate_elements_id c
267     c.map {|conf|
268       Panel.validate_element_id(conf[:elements], conf[:name], conf[:parent_id]) ? nil : false
269     }.compact.empty?
270   end
271   
272   def validate_id_list
273     r = self.speech_balloons.map {|sb|
274       {:elements => [sb.speeches, sb.balloons], :name => :speech_balloon_id, :parent_id => sb.id}
275     }
276     r.unshift({:elements => [self.panel_pictures, self.speech_balloons], :name => :panel_id, :parent_id => self.id})
277     r
278   end
279 =end
280   
281 end