OSDN Git Service

t#32046:add sheet
[pettanr/pettanr.git] / app / models / comic.rb
1 #コミック
2 class Comic < ActiveRecord::Base
3   has_many :stories, :order => 't'
4   belongs_to :author
5   
6   validates :title, :presence => true, :length => {:maximum => 100}
7   validates :visible, :presence => true, :numericality => true, :inclusion => {:in => 0..1}
8   validates :author_id, :presence => true, :numericality => true, :existence => {:both => false}
9   
10   before_validation :valid_encode
11   
12   def valid_encode
13     ['title', 'description'].each do |a|
14       next if attributes[a] == nil
15       raise Pettanr::BadRequest unless attributes[a].valid_encoding?
16     end
17   end
18   
19   def supply_default
20     self.visible = 0 if self.visible.blank?
21   end
22   
23   def overwrite au
24     return false unless au
25     self.author_id = au.id
26   end
27   
28   def own? roles
29     roles = [roles] unless roles.respond_to?(:each)
30     au = Comic.get_author_from_roles roles
31     return false unless au
32     self.author_id == au.id
33   end
34   
35   def visible? roles
36     if MagicNumber['run_mode'] == 0
37       return false unless guest_role_check(roles)
38     else
39       return false unless reader_role_check(roles)
40     end
41     return true if self.own?(roles)
42     self.visible > 0
43   end
44   
45   def self.default_page_size
46     25
47   end
48   
49   def self.max_page_size
50     100
51   end
52   
53   def self.default_panel_size
54     30
55   end
56   
57   def self.max_panel_size
58     200
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_where
75     'comics.visible > 0'
76   end
77   
78   def self.mylist_where au
79     ['comics.author_id = ?', au.id]
80   end
81   
82   def self.himlist_where au
83     ['comics.author_id = ? and comics.visible > 0', au.id]
84   end
85   
86   def self.list page = 1, page_size = self.default_page_size
87     Comic.where(self.list_where()).includes(Comic.list_opt).order('comics.updated_at desc').offset((page -1) * page_size).limit(page_size)
88   end
89   
90   def self.mylist au, page = 1, page_size = Author.default_comic_page_size
91     Comic.where(self.mylist_where(au)).includes(Comic.list_opt).order('comics.updated_at desc').offset((page -1) * page_size).limit(page_size)
92   end
93   
94   def self.himlist au, page = 1, page_size = Author.default_comic_page_size
95     Comic.where(self.himlist_where(au)).includes(Comic.list_opt).order('comics.updated_at desc').offset((page -1) * page_size).limit(page_size)
96   end
97   
98   def self.list_paginate page = 1, page_size = self.default_page_size
99     Kaminari.paginate_array(Array.new(Comic.where(self.list_where()).count, nil)).page(page).per(page_size)
100   end
101   
102   def self.mylist_paginate au, page = 1, page_size = Author.default_comic_page_size
103     Kaminari.paginate_array(Array.new(Comic.where(self.mylist_where(au)).count, nil)).page(page).per(page_size)
104   end
105   
106   def self.himlist_paginate au, page = 1, page_size = Author.default_comic_page_size
107     Kaminari.paginate_array(Array.new(Comic.where(self.himlist_where(au)).count, nil)).page(page).per(page_size)
108   end
109   
110   def self.list_opt
111     {:stories => {}, :author => {} }
112   end
113   
114   def self.list_json_opt
115     {:include => {:stories => {}, :author => {}} }
116   end
117   
118   def self.show cid, roles
119     opt = {}
120     opt.merge!(Comic.show_opt)
121     res = Comic.find(cid, opt)
122     raise ActiveRecord::Forbidden unless res.visible?(roles)
123     res
124   end
125   
126   def self.edit cid, au
127     opt = {}
128     opt.merge!(Comic.show_opt)
129     res = Comic.find(cid, opt)
130     raise ActiveRecord::Forbidden unless res.own?(au)
131     res
132   end
133   
134   def self.show_opt
135     {:include => {:stories => {}, :author => {}} }
136   end
137   
138   def self.show_json_opt
139     {:include => {:stories => {}, :author => {}} }
140   end
141   
142   def self.visible_count
143     Comic.count 'visible > 0'
144   end
145   
146   def destroy_with_story
147     res = false
148     Comic.transaction do
149       self.stories.each do |story|
150         raise ActiveRecord::Rollback unless story.destroy_and_shorten
151       end
152       raise ActiveRecord::Rollback unless self.destroy
153       res = true
154     end
155     res
156   end
157   
158   def scenario
159     panels.map {|panel|
160       panel.scenario
161     }.join
162   end
163   
164   def plain_scenario
165     panels.map {|panel|
166       panel.plain_scenario
167     }.join
168   end
169   
170 end