1 class ResourcePicture < ActiveRecord::Base
4 has_many :panel_pictures
5 belongs_to :original_picture
7 validates :ext, :presence => true, :length => {:maximum => 4}, :inclusion => {:in => ['png', 'jpeg', 'gif']}
\r
8 validates :width, :presence => true, :numericality => true, :natural_number => true
9 validates :height, :presence => true, :numericality => true, :natural_number => true
10 validates :filesize, :presence => true, :numericality => {:greater_than => 0, :less_than_or_equal_to => 2000000}, :natural_number => true
11 validates :artist_id, :presence => true, :numericality => true, :existence => true
12 validates :license_id, :presence => true, :numericality => true, :existence => true
13 validates :original_picture_id, :presence => true, :numericality => true, :existence => true
15 before_destroy :destroy_with_file
18 PictureIO.resource_picture_io.delete self.filename
19 PictureIO.resource_picture_io.class.subdirs.each do |d|
21 PictureIO.resource_picture_io.delete(self.filename, d) if PictureIO.resource_picture_io.exist?(self.filename, d)
25 def self.resize(data, dw, dh)
26 Magick::Image.from_blob(data).shift.resize(dw, dh)
29 #サイズの調整(limw,limhに必ず収まるように合わせる)
30 def self.fix_size_both(limw, limh, w, h)
56 "#{self.id}.#{self.dext}"
72 rimg.flip.flop.to_blob
76 '/resource_pictures/' + (subdir.to_s.empty? ? '' : subdir.to_s + '/' ) + filename
80 tw, th = ResourcePicture.fix_size_both(64, 64, rimg.columns, rimg.rows)
81 ResourcePicture.resize(rimg.to_blob, tw, th).to_blob
84 def self.update_picture(op)
85 res = op.resource_picture || ResourcePicture.new
86 res.attributes = {:width => op.width, :height => op.height, :ext => op.ext, :filesize => op.filesize,
87 :original_picture_id => op.id, :artist_id => op.artist_id, :license_id => op.license_id
93 self.dext == 'png' and self.license.no_convert == 0
96 def self.png_to_gif(data)
99 mgk = Magick::Image.from_blob(data).shift
111 if res = self.store_picture(mgk)
113 if gifmgk = ResourcePicture.png_to_gif(mgk.to_blob)
114 res = self.store_picture(gifmgk)
124 def store_picture(mgk)
126 PictureIO.resource_picture_io.class.subdirs.each do |d|
127 picdata = d.empty? ? mgk.to_blob : self.__send__(d, mgk)
128 res = PictureIO.resource_picture_io.put(picdata, "#{self.id}.#{mgk.format}", d)
134 def restore(subdir = nil)
135 PictureIO.resource_picture_io.get self.filename, subdir
138 def self.default_page_size
142 def self.max_page_size
146 def self.page prm = nil
152 def self.page_size prm = self.default_page_size
154 page_size = self.max_page_size if page_size > self.max_page_size
155 page_size = self.default_page_size if page_size < 1
159 def self.offset cnt, prm = nil
161 offset = cnt - 1 if offset >= cnt
162 offset = cnt - offset.abs if offset < 0
163 offset = 0 if offset < 0
167 def self.list opt = {}, page = 1, page_size = self.default_page_size
168 opt.merge!(self.list_opt) unless opt[:include]
169 opt.merge!({:order => 'updated_at desc', :limit => page_size, :offset => (page -1) * page_size})
170 ResourcePicture.find(:all, opt)
174 {:include => [:artist, :license]}
177 def self.list_json_opt
178 {:include => [:artist, :license]}
181 def self.show rid, opt = {}
182 r = ResourcePicture.find(rid, :include => self.show_include_opt(opt))
183 # raise ActiveRecord::Forbidden unless c.visible?(au)
187 def self.show_include_opt opt = {}
188 res = [:artist, :license]
189 res.push(opt[:include]) if opt[:include]
193 def self.show_json_include_opt
194 {:include => [:artist, :license]}
197 def self.visible_count
198 ResourcePicture.count