OSDN Git Service

t30350#:fix destroy
[pettanr/pettanr.git] / app / models / resource_picture.rb
1 #素材
2 class ResourcePicture < ActiveRecord::Base
3   belongs_to :artist
4   belongs_to :license
5   belongs_to :picture
6   has_many :panel_pictures
7   belongs_to :original_picture
8   
9   validates :ext, :presence => true, :length => {:maximum => 4}, :inclusion => {:in => ['png', 'jpeg', 'gif']}
10   validates :width, :presence => true, :numericality => true, :natural_number => true
11   validates :height, :presence => true, :numericality => true, :natural_number => true
12   validates :filesize, :presence => true, :numericality => {:greater_than => 0, :less_than_or_equal_to => 2000000}, :natural_number => true
13   validates :md5, :presence => true, :length => {:minimum => 32, :maximum => 32}
14   validates :artist_id, :presence => true, :numericality => true, :existence => {:both => false}
15   validates :license_id, :presence => true, :numericality => true, :existence => {:both => false}
16   validates :original_picture_id, :presence => true, :numericality => true, :existence => {:both => false}
17   validates :artist_name, :presence => true
18   validates :classname, :presence => true, :length => {:maximum => 50}
19   validates :picture_id, :presence => true, :numericality => true, :existence => {:both => false}
20   
21   def supply_default
22   end
23   
24   def overwrite op
25     attr = {:width => op.width, :height => op.height, :ext => op.ext, :filesize => op.filesize, 
26       :original_picture_id => op.id, :artist_id => op.artist_id, :md5 => op.md5
27     }
28     self.attributes = attr
29   end
30   
31   def own? ar
32     return false unless ar.is_a?(Artist)
33     ar.id == self.artist_id
34   end
35   
36   def visible? au
37     if au == nil
38       return false if MagicNumber['run_mode'] == 1
39     elsif au.is_a?(Author)
40       return true
41     else
42       return false
43     end
44     true
45   end
46   
47   def filename
48     "#{self.id}.#{self.ext}"
49   end
50   
51   def gifname
52     "#{self.id}.gif"
53   end
54   
55   def mime_type
56     "image/#{self.ext}"
57   end
58   
59   def url subdir = nil
60     '/resource_pictures/' + (subdir.to_s.empty? ? '' : subdir.to_s + '/' ) + filename
61   end
62   
63   def to_gif?
64     self.ext == 'png' and self.flag_gif_convert >= 0
65   end
66   
67   def thumbnail(imager)
68     tw, th = ResourcePicture.fix_size_both(MagicNumber['thumbnail_width'], MagicNumber['thumbnail_height'], rimg.columns, rimg.rows)
69     ResourcePicture.resize(rimg.to_blob, tw, th).to_blob
70   end
71   
72   def tmb_opt_img_tag
73     tw, th = PettanImager.thumbnail_size(self.width, self.height)
74     {:src => self.url, :width => tw, :height => th}
75   end
76   
77   def opt_img_tag
78     {:src => self.url('full'), :width => self.width, :height => self.height}
79   end
80   
81   def self.default_page_size
82     25
83   end
84   
85   def self.max_page_size
86     100
87   end
88   
89   def self.page prm = nil
90     page = prm.to_i
91     page = 1 if page < 1
92     page
93   end
94   
95   def self.page_size prm = self.default_page_size
96     page_size = prm.to_i
97     page_size = self.max_page_size if page_size > self.max_page_size
98     page_size = self.default_page_size if page_size < 1
99     page_size
100   end
101   
102   def self.list page = 1, page_size = self.default_page_size
103     opt = {}
104     opt.merge!(self.list_opt)
105     opt.merge!({:limit => page_size, :offset => (page -1) * page_size}) if page_size > 0
106     opt.merge!({:order => 'updated_at desc'})
107     ResourcePicture.find(:all, opt)
108   end
109   
110   def self.list_opt
111     {:include => {:license => {}, :artist => {}, :picture => {}} }
112   end
113   
114   def self.list_json_opt
115     {:include => {:license => {}, :artist => {}, :picture => {}} }
116   end
117   
118   def self.show rid, au
119     opt = {}
120     opt.merge!(self.show_opt)
121     r = ResourcePicture.find(rid, opt)
122     raise ActiveRecord::Forbidden unless r.visible?(au)
123     r
124   end
125   
126   def self.show_opt
127     {:include => {:license => {}, :artist => {}, :picture => {}} }
128   end
129   
130   def self.show_json_opt
131     {:include => {:license => {}, :artist => {}, :picture => {}} }
132   end
133   
134   def self.edit rid, ar
135     opt = {}
136     opt.merge!(self.show_opt)
137     r = ResourcePicture.find(rid, opt)
138     raise ActiveRecord::Forbidden unless r.own?(ar)
139     r
140   end
141   
142   def new_picture imager
143     pc = Picture.new
144     pc.supply_default
145     pc.overwrite self
146     r = pc.store imager
147     return pc if r
148     self.errors.add :base, Picture.model_name.human + I18n.t('errors.not_create')
149     false
150   end
151   
152   def store imager
153     return false unless imager
154     res = false
155     self.overwrite self.original_picture
156     ResourcePicture.transaction do
157       pc = self.new_picture imager
158       if pc
159         self.picture_id = pc.id
160         if res = self.save
161           res = self.store_picture_with_gif(imager)
162         end
163       else
164       end
165       raise ActiveRecord::Rollback unless res
166     end
167     res
168   end
169   
170   def store_picture_with_gif(imager)
171     if res = self.store_picture(imager, self.filename)
172       if self.to_gif?
173         if gifimager = imager.to_gif
174           if res = self.store_picture(gifimager, self.gifname)
175           else
176             self.errors.add :base, I18n.t('picture_io.error')
177           end
178         else
179           self.errors.add :base, I18n.t('errors.not_convert')
180           res = false
181         end
182       end
183     else
184       self.errors.add :base, I18n.t('picture_io.error')
185     end
186     res
187   end
188   
189   def store_picture(imager, fn)
190     res = false
191     thumbnail_imager = self.flag_thumbnail >= 0 ? imager.to_thumbnail : imager
192     return false unless thumbnail_imager
193     begin
194       PictureIO.resource_picture_io.put(thumbnail_imager.binary, fn)
195       PictureIO.resource_picture_io.put(imager.binary, fn, 'full')
196       res = true
197     rescue PictureIO::Error
198       res = false
199     end
200     res
201   end
202   
203   def restore(subdir = nil)
204     PictureIO.resource_picture_io.get self.filename, subdir
205   end
206   
207   def unpublish
208     res = false
209     ResourcePicture.transaction do
210       begin
211         if res = self.destroy
212           PictureIO.resource_picture_io.delete(self.filename)
213           PictureIO.resource_picture_io.delete(self.filename, 'full')
214           res = true
215         end
216       rescue PictureIO::Error
217         res = false
218         raise ActiveRecord::Rollback
219       end
220     end
221     res
222   end
223   
224   def self.visible_count
225     ResourcePicture.count
226   end
227   
228   def credit_template
229     "#{self.classname.tableize}/attributes/credit"
230   end
231   
232   def full_credit_template
233     "#{self.classname.tableize}/attributes/full_credit"
234   end
235   
236   def credit_data
237     begin
238       @credit_data = JSON.parse(self.credit) unless @credit_data
239     rescue 
240     end
241     @credit_data
242   end
243   
244   def flags
245     begin
246       @flags = JSON.parse(self.settings) unless @flags
247     rescue 
248     end
249     @flags
250   end
251   
252   def flags=(s)
253     @flags = s
254   end
255   
256   def flag_open
257     @flag_open = flags["open"] unless @flag_open
258     @flag_open
259   end
260   
261   def flag_commercial
262     @flag_commercial = flags["commercial"] unless @flag_commercial
263     @flag_commercial
264   end
265   
266   def flag_official
267     @flag_official = flags["official"] unless @flag_official
268     @flag_official
269   end
270   
271   def flag_attribution
272     @flag_attribution = flags["attribution"] unless @flag_attribution
273     @flag_attribution
274   end
275   
276   def flag_derive
277     @flag_derive = flags["derive"] unless @flag_derive
278     @flag_derive
279   end
280   
281   def flag_thumbnail
282     @flag_thumbnail = flags["thumbnail"] unless @flag_thumbnail
283     @flag_thumbnail
284   end
285   
286   def flag_gif_convert
287     @flag_gif_convert = flags["gif_convert"] unless @flag_gif_convert
288     @flag_gif_convert
289   end
290   
291   def flag_reverse
292     @flag_reverse = flags["reverse"] unless @flag_reverse
293     @flag_reverse
294   end
295   
296   def flag_resize
297     @flag_resize = flags["resize"] unless @flag_resize
298     @flag_resize
299   end
300   
301   def flag_sync_vh
302     @flag_sync_vh = flags["sync_vh"] unless @flag_sync_vh
303     @flag_sync_vh
304   end
305   
306   def flag_overlap
307     @flag_overlap = flags["overlap"] unless @flag_overlap
308     @flag_overlap
309   end
310   
311 end