OSDN Git Service

Merge branch 'v06' of git.sourceforge.jp:/gitroot/pettanr/pettanr into v06
[pettanr/pettanr.git] / app / models / scroll.rb
1 class Scroll < Pettanr::Item
2   has_many :scroll_panels
3   belongs_to :author
4   
5   validates :title, :presence => true, :length => {:maximum => 100}
6   validates :visible, :presence => true, :numericality => true, :inclusion => {:in => 0..1}
7   validates :author_id, :presence => true, :numericality => true, :existence => {:both => false}
8
9   def self.singular
10     'Scroll'
11   end
12   
13   def self.plural
14     'Scrolls'
15   end
16   
17   def self.owner_type
18     :author
19   end
20   
21   def supply_default
22     self.visible = 0 if self.visible.blank?
23   end
24   
25   def overwrite operators
26     return false unless operators.author
27     self.author_id = operators.author.id
28   end
29   
30   def own? roles
31     roles = [roles] unless roles.respond_to?(:each)
32     au = Scroll.get_author_from_roles roles
33     return false unless au
34     self.author_id == au.id
35   end
36   
37   def visible? operators
38     return false unless super
39     self.visible > 0
40   end
41   
42   def scroll_panels_count
43     ScrollPanel.where(['scroll_panels.scroll_id = ?', self.id]).count
44   end
45   
46   def self.list_order
47     'scrolls.updated_at desc'
48   end
49   
50   def self.list_where
51     'scrolls.visible > 0'
52   end
53   
54   def self.list_opt
55     {:scroll_panels => {:panel => {}}, :author => {} }
56   end
57   
58   def self.list_json_opt
59     {:include => {:scroll_panels => {:include => {:panel => {}}}, :author => {}}}
60   end
61   
62   def self.show sid, operators
63     opt = {}
64     opt.merge!(Scroll.show_opt)
65     res = Scroll.find(sid, opt)
66     raise ActiveRecord::Forbidden unless res.visible?(operators)
67     res
68   end
69   
70   def self.edit sid, au
71     opt = {}
72     opt.merge!(Scroll.show_opt)
73     res = Scroll.find(sid, opt)
74     raise ActiveRecord::Forbidden unless res.own?(au)
75     res
76   end
77   
78   def self.show_opt
79     {:include => {:scroll_panels => {:panel => {}}, :author => {}}}
80   end
81   
82   def self.show_json_opt
83     {:include => {:scroll_panels => {:include => {:panel => {}}}, :author => {}}}
84   end
85   
86   def self.visible_count
87     Scroll.count 'visible > 0'
88   end
89   
90   def destroy_with_scroll_panel
91     res = false
92     Scroll.transaction do
93       self.scroll_panels.each do |scroll_panel|
94         raise ActiveRecord::Rollback unless scroll_panel.destroy
95       end
96       raise ActiveRecord::Rollback unless self.destroy
97       res = true
98     end
99     res
100   end
101   
102   def scenario
103     panels.map {|panel|
104       panel.scenario
105     }.join
106   end
107   
108   def plain_scenario
109     panels.map {|panel|
110       panel.plain_scenario
111     }.join
112   end
113   
114 end