OSDN Git Service

1410b1153ab81be5c99abad328b51502b2b92148
[pettanr/pettanr.git] / app / models / story.rb
1 #ストーリー
2 class Story < Peta::Binder
3   load_manifest
4   has_many :comic_stories
5   has_many :story_sheets
6   belongs_to :author
7   
8   validates :title, :presence => true, :length => {:maximum => 100}
9   validates :visible, :presence => true, :numericality => true, :inclusion => {:in => 0..1}
10   validates :author_id, :presence => true, :numericality => true, :existence => {:both => false}
11   
12   def supply_default
13     self.visible = 0 if self.visible.blank?
14   end
15   
16   def overwrite operators
17     return false unless operators.author
18     self.author_id = operators.author.id
19     super()
20   end
21   
22   def visible? operators
23     case super
24     when nil # super return
25       return true
26     when false
27       return false
28     else
29       self.visible > 0
30     end
31   end
32   
33   def story_sheets_count
34     StorySheet.where(['story_sheets.story_id = ?', self.id]).count
35   end
36   
37   def self.public_list_where
38     'stories.visible > 0'
39   end
40   
41   def self.list_order
42     'stories.updated_at desc'
43   end
44   
45   def self.list_opt
46     {:comic_stories => {:comic => {}}, :author => {} }
47   end
48   
49   def self.list_json_opt
50     {:include => {:comic_stories => {:include => {:comic => {}}}, :author => {}}}
51   end
52   
53   def self.show_opt
54     {:include => {:comic_stories => {:comic => {}}, :author => {}}}
55   end
56   
57   def self.show_json_opt
58     {:include => {:comic_stories => {:include => {:comic => {}}}, :author => {}}}
59   end
60   
61   def self.visible_count
62     Story.count 'visible > 0'
63   end
64   
65   def destroy_with_story_sheet
66     res = false
67     Story.transaction do
68       self.story_sheets.each do |story_sheet|
69         raise ActiveRecord::Rollback unless story_sheet.destroy
70       end
71       raise ActiveRecord::Rollback unless self.destroy
72       res = true
73     end
74     res
75   end
76   
77   def parts_element
78     self.leafs_items
79   end
80   
81   def zorderd_elements
82     res = []
83     self.parts_element.each do |e|
84       res[e.z-1] = e
85     end
86     res
87   end
88   
89   def story_elements
90     res = []
91     self.parts_element.each do |e|
92       res[e.t] = e
93     end
94     res
95   end
96   
97   def self.collect_element_value elements, name
98     elements.map {|e|
99       if e['_destroy'] or e[:_destroy]
100         nil
101       else
102         e[name]
103       end
104     }
105   end
106   
107   def self.validate_serial ary, offset = 0
108     i = offset
109     ary.compact.sort.each do |n|
110       break false unless n == i
111       i += 1
112     end
113     ary.compact.size == i - offset
114   end
115   
116   def self.validate_element_serial elements, name, offset = 0
117     self.validate_serial(self.collect_element_value(elements, name), offset)
118   end
119   
120   def self.validate_elements_serial c
121     c.map {|conf|
122       self.validate_element_serial(conf[:elements], conf[:name], conf[:offset]) ? nil : false
123     }.compact.empty?
124   end
125   
126   def validate_serial_list
127     [
128       {:elements => self.leafs_items, :name => :t, :offset => 0}, 
129       {:elements => self.leafs_items, :name => :z, :offset => 1}
130     ]
131   end
132   def validate_child
133 #    r1 = Panel.validate_elements_id validate_id_list
134     self.class.validate_elements_serial validate_serial_list
135   end
136   
137   def store attr, operators
138     if attr == false
139       self.errors.add :base, I18n.t('errors.invalid_json')
140       return false
141     end
142     self.attributes = attr
143     self.overwrite operators
144     res = false
145     Story.transaction do
146       self.story_elements.each do |elm|
147         elm.new_story = self
148         elm.boost operators
149       end
150       res = self.save
151       unless validate_child
152         res = false
153         self.errors.add :base, I18n.t('errors.invalid_t')
154         raise ActiveRecord::Rollback
155       end
156     end
157     res
158   end
159   
160   def destroy_and_shorten
161     res = false
162     Story.transaction do
163       Story.update_all('t = t - 1', ['comic_id = ? and (t > ?)', self.comic_id, self.t])
164       raise ActiveRecord::Rollback unless self.destroy_with_story_sheet
165       res = true
166     end
167     res
168   end
169   
170   
171 end