OSDN Git Service

t#29677:
[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.list_as_json_text ary
193     '[' + ary.map {|i| i.panel_elements_as_json }.join(',') + ']'
194   end
195   
196   def self.visible_count
197     Panel.count
198   end
199   
200   def self.collect_element_value elements, name
201     elements.map {|e|
202       e.map {|o|
203         o[name]
204       }
205     }.flatten
206   end
207   
208   def self.validate_t ary
209     i = 0
210     ary.compact.sort.each do |t|
211       break false unless t == i
212       i += 1
213     end
214     ary.compact.size == i
215   end
216   
217   def self.validate_element_t elements, name
218     Panel.validate_t(Panel.collect_element_value(elements, name))
219   end
220   
221   def self.validate_elements_t c
222     c.map {|conf|
223       Panel.validate_element_t(conf[:elements], conf[:name]) ? nil : false
224     }.compact.empty?
225   end
226   
227   def validate_t_list
228     [
229       {:elements => [self.panel_pictures, self.speech_balloons], :name => :t}
230     ]
231   end
232   def validate_child
233 #    r1 = Panel.validate_elements_id validate_id_list
234     Panel.validate_elements_t validate_t_list
235   end
236   
237   def store attr, au
238     if attr == false
239       self.errors.add :base, 'invalid json'
240       return false
241     end
242     self.attributes = attr
243     self.overwrite au
244     res = false
245     Panel.transaction do
246       unless validate_child
247         self.errors.add :base , 'invalid time'
248         raise ActiveRecord::Rollback
249       end
250       res = self.save
251     end
252     res
253   end
254   
255 =begin\r
256   def self.validate_id ary, pid
257     ary.map {|v|
258       if pid
259         (v == pid or v == nil) ? nil : false
260       else
261         v ? false : nil
262       end
263     }.compact.empty?
264   end
265   
266   def self.validate_element_id elements, name, pid
267     Panel.validate_id(Panel.collect_element_value(elements, name), pid)
268   end
269   
270   def self.validate_elements_id c
271     c.map {|conf|
272       Panel.validate_element_id(conf[:elements], conf[:name], conf[:parent_id]) ? nil : false
273     }.compact.empty?
274   end
275   
276   def validate_id_list
277     r = self.speech_balloons.map {|sb|
278       {:elements => [sb.speeches, sb.balloons], :name => :speech_balloon_id, :parent_id => sb.id}
279     }
280     r.unshift({:elements => [self.panel_pictures, self.speech_balloons], :name => :panel_id, :parent_id => self.id})
281     r
282   end
283 =end
284   
285 end