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}"
64 '/resource_pictures/' + (subdir.to_s.empty? ? '' : subdir.to_s + '/' ) + filename
68 tw, th = ResourcePicture.fix_size_both(64, 64, rimg.columns, rimg.rows)
69 ResourcePicture.resize(rimg.to_blob, tw, th).to_blob
72 def self.update_picture(op)
73 res = op.resource_picture || ResourcePicture.new
74 res.attributes = {:width => op.width, :height => op.height, :ext => op.ext, :filesize => op.filesize,
75 :original_picture_id => op.id, :artist_id => op.artist_id, :license_id => op.license_id
81 self.dext == 'png' and self.license.no_convert == 0
84 def self.png_to_gif(data)
87 mgk = Magick::Image.from_blob(data).shift
99 if res = self.store_picture(mgk)
101 if gifmgk = ResourcePicture.png_to_gif(mgk.to_blob)
102 res = self.store_picture(gifmgk)
112 def store_picture(mgk)
114 PictureIO.resource_picture_io.class.subdirs.each do |d|
115 picdata = d.empty? ? mgk.to_blob : self.__send__(d, mgk)
116 res = PictureIO.resource_picture_io.put(picdata, "#{self.id}.#{mgk.format}", d)
122 def restore(subdir = nil)
123 PictureIO.resource_picture_io.get self.filename, subdir
126 def self.default_page_size
130 def self.max_page_size
134 def self.page prm = nil
140 def self.page_size prm = self.default_page_size
142 page_size = self.max_page_size if page_size > self.max_page_size
143 page_size = self.default_page_size if page_size < 1
147 def self.offset cnt, prm = nil
149 offset = cnt - 1 if offset >= cnt
150 offset = cnt - offset.abs if offset < 0
151 offset = 0 if offset < 0
155 def self.list opt = {}, page = 1, page_size = self.default_page_size
156 opt.merge!(self.list_opt) unless opt[:include]
157 opt.merge!({:order => 'updated_at desc', :limit => page_size, :offset => (page -1) * page_size})
158 ResourcePicture.find(:all, opt)
162 {:include => [:license, :artist]}
165 def self.list_json_opt
166 {:include => [:license, :artist]}
169 def self.show rid, opt = {}
170 r = ResourcePicture.find(rid, :include => self.show_include_opt(opt))
171 # raise ActiveRecord::Forbidden unless c.visible?(au)
175 def self.show_include_opt opt = {}
176 res = [:license, :artist]
177 res.push(opt[:include]) if opt[:include]
181 def self.show_json_include_opt
182 {:include => [:license, :artist]}
185 def self.visible_count
186 ResourcePicture.count