OSDN Git Service

temp
[pettanr/pettanr.git] / app / models / sheet.rb
1 class Sheet < Pettanr::Content
2   has_many :sheet_panels
3   has_many :story_sheets
4   belongs_to :author
5   
6   validates :caption, :presence => true, :length => {:maximum => 100}
7   validates :width, :presence => true, :numericality => true, :natural_number => true
8   validates :height, :presence => true, :numericality => true, :natural_number => true
9   validates :visible, :presence => true, :numericality => true, :inclusion => {:in => 0..1}
10   accepts_nested_attributes_for :sheet_panels, :allow_destroy => true
11   
12   def self.valid_encode_columns
13     super + ['caption']
14   end
15   
16   def self.each_element_class_names
17     {'SheetPanel' => 'sheet_panels'}.each do |k, n|
18       yield k
19     end
20   end
21   
22   def self.class_name_to_class k
23     Object.const_get k
24   end
25   
26   def self.each_element_classes
27     self.each_element_class_names do |k|
28       e = self.class_name_to_class k
29       yield e
30     end
31   end
32   
33   def elements_by_class_name class_name
34     self.__send__ class_name.tableize
35   end
36   
37   def supply_default
38     self.visible = 0 if self.visible.blank?
39   end
40   
41   def overwrite au
42     return false unless au
43     self.author_id = au.id
44   end
45   
46   def visible? operators
47     return false unless super
48     return true if self.new_record?
49     self.visible > 0
50   end
51   
52   def usable? au
53     visible? au
54   end
55   
56   def symbol_filename
57   end
58   
59   def tag_id
60     'sheet' + self.tag_sheet_id
61   end
62   
63   def tag_sheet_id
64     self.new_record? ? '0' : self.id.to_s
65   end
66   
67   def field_tag_id f
68     self.tag_id + f.to_s
69   end
70   
71   def self.list_where
72     'sheets.visible > 0'
73   end
74   
75   def self.list_order
76     'sheets.updated_at desc'
77   end
78   
79   def self.list_opt
80     {:sheet_panels => {:panel => {}}, :author => {} }
81   end
82   
83   def self.list_json_opt
84     {:include => {:sheet_panels => {:include => {:panel => {}}}, :author => {}}}
85   end
86   
87   def self.show_opt
88     {:include => {:sheet_panels => {:panel => {}}, :author => {}}}
89   end
90   
91   def self.show_json_opt
92     {:include => {:sheet_panels => {:include => {:panel => {}}}, :author => {}}}
93   end
94   
95   def parts_element
96     r = []
97     self.class.each_element_class_names do |k|
98       r += (self.elements_by_class_name(k) || [])
99     end
100     r
101   end
102   
103   def zorderd_elements
104     res = []
105     self.parts_element.each do |e|
106       res[e.z-1] = e
107     end
108     res
109   end
110   
111   def sheet_elements
112     res = []
113     self.parts_element.each do |e|
114       res[e.t] = e
115     end
116     res
117   end
118   
119   def new_t
120     self.sheet_elements.size
121   end
122   
123   def new_z
124     self.sheet_elements.size + 1
125   end
126   
127   def self.visible_count
128     Sheet.count 'visible > 0'
129   end
130   
131   def self.collect_element_value elements, name
132     elements.map {|e|
133       e.map {|o|
134         if o['_destroy'] or o[:_destroy]
135           nil
136         else
137           o[name]
138         end
139       }.compact
140     }.flatten
141   end
142   
143   def self.validate_serial ary, offset = 0
144     i = offset
145     ary.compact.sort.each do |n|
146       break false unless n == i
147       i += 1
148     end
149     ary.compact.size == i - offset
150   end
151   
152   def self.validate_element_serial elements, name, offset = 0
153     Sheet.validate_serial(Sheet.collect_element_value(elements, name), offset)
154   end
155   
156   def self.validate_elements_serial c
157     c.map {|conf|
158       Sheet.validate_element_serial(conf[:elements], conf[:name], conf[:offset]) ? nil : false
159     }.compact.empty?
160   end
161   
162   def validate_serial_list
163     l = []
164     self.class.each_element_class_names do |k|
165       l << self.elements_by_class_name(k)
166     end
167 #    l = [self.sheet_panels]
168     [
169       {:elements => l, :name => :t, :offset => 0}, 
170       {:elements => l, :name => :z, :offset => 1}
171     ]
172   end
173   
174   def validate_child
175 #    r1 = Panel.validate_elements_id validate_id_list
176     Sheet.validate_elements_serial validate_serial_list
177   end
178   
179   def boost
180     @new_element_index = 0
181     self.panel_elements.each do |elm|
182       if elm.new_record?
183         elm.new_index = @new_element_index
184         @new_element_index += 1
185       end
186     end
187   end 
188   
189   def store attr, au
190     if attr == false
191       self.errors.add :base, I18n.t('errors.invalid_json')
192       return false
193     end
194     self.attributes = attr
195     self.overwrite au
196     res = false
197     Sheet.transaction do
198       self.sheet_elements.each do |elm|
199         elm.new_sheet = self
200         elm.boost au
201       end
202       res = self.save
203       unless validate_child
204         res = false
205         self.errors.add :base, I18n.t('errors.invalid_t')
206         raise ActiveRecord::Rollback
207       end
208     end
209     res
210   end
211   
212   def destroy_with_sheet_panel
213     res = false
214     Sheet.transaction do
215       self.sheet_panels.each do |sheet_panel|
216         raise ActiveRecord::Rollback unless sheet_panel.destroy
217       end
218       raise ActiveRecord::Rollback unless self.destroy
219       res = true
220     end
221     res
222   end
223   
224   def scenario
225     panels.map {|panel|
226       panel.scenario
227     }.join
228   end
229   
230   def plain_scenario
231     panels.map {|panel|
232       panel.plain_scenario
233     }.join
234   end
235   
236   def licensed_pictures
237     r = {}
238     self.sheet_elements.each do |elm|
239       r.merge!(elm.licensed_pictures)
240     end
241     r
242   end
243   
244   def copyable?
245     r = true
246     Sheet.each_element_class_names do |n|
247       self.elements_by_class_name(n).each do |elm|
248         next if elm.copyable?
249         r = false
250         break
251       end
252       break unless r
253     end
254     r
255   end
256   
257   def copy
258     attr = self.copy_attributes
259     Sheet.each_element_class_names do |n|
260       element_attr = Sheet.class_name_to_class(n).panelize(
261         self.elements_by_class_name(n).map {|elm|
262           elm.copy_attributes.merge elm.panel_attributes
263         }
264       )
265       attr.merge! element_attr
266     end
267     attr
268   end
269   
270   def copy_attributes
271     r = self.attributes
272     r.delete 'id'
273     r.delete 'author_id'
274     r.delete 'created_at'
275     r.delete 'updated_at'
276     r
277   end
278   
279   def self.panelize sheet
280     attr = sheet.attributes
281     attr.delete 'id'
282     attr
283   end
284   
285 end