X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=app%2Fmodels%2Fpicture.rb;h=9701cf8faf6f26453ab2814f2122230f68f1b92a;hb=a0e7869980e9d497d325fddc7d4f5a3feea56738;hp=214b1c8b921edd22da2e41e509e34e00f9345e78;hpb=63b71e8877287f1392ce62086f3c4edea5e7ced2;p=pettanr%2Fpettanr.git diff --git a/app/models/picture.rb b/app/models/picture.rb index 214b1c8b..9701cf8f 100644 --- a/app/models/picture.rb +++ b/app/models/picture.rb @@ -1,3 +1,4 @@ +#実素材 class Picture < ActiveRecord::Base belongs_to :original_picture belongs_to :license @@ -6,78 +7,90 @@ class Picture < ActiveRecord::Base validates :original_picture_id, :presence => true, :numericality => true, :existence => true validates :revision, :presence => true, :numericality => true - validates :ext, :presence => true, :length => {:maximum => 4}, :inclusion => {:in => ['png', 'jpeg', 'gif']} + validates :ext, :presence => true, :length => {:maximum => 4}, :inclusion => {:in => ['png', 'jpeg', 'gif']} validates :width, :presence => true, :numericality => true, :natural_number => true validates :height, :presence => true, :numericality => true, :natural_number => true validates :filesize, :presence => true, :numericality => {:greater_than => 0, :less_than_or_equal_to => 2000000}, :natural_number => true + validates :md5, :presence => true, :length => {:minimum => 32, :maximum => 32} validates :license_id, :presence => true, :numericality => true, :existence => true validates :artist_id, :presence => true, :numericality => true, :existence => true validates :artist_name, :presence => true + validates :classname, :presence => true, :length => {:maximum => 50} - def dext - self.ext.downcase + def supply_default end - def filename - "#{self.id}.#{self.dext}" + def overwrite rp + attr = {:revision => self.new_revision,:width => rp.width, :height => rp.height, :ext => rp.ext, :filesize => rp.filesize, + :original_picture_id => rp.original_picture_id, :license_id => rp.license_id, :artist_id => rp.artist_id, + :md5 => rp.md5, :artist_name => rp.artist_name, :classname => rp.classname, :credit => rp.credit, :settings => rp.settings + } + self.attributes = attr end - def mime_type - "image/#{self.dext}" + def own? author + return false end - def new_revision - Picture.maximum(:revision, :conditions => ['original_picture_id = ?', self.original_picture_id]).to_i + 1 + def visible? author + true end - def v(rimg) - rimg.flip.to_blob + def filename + "#{self.id}.#{self.ext}" end - def h(rimg) - rimg.flop.to_blob + def gifname + "#{self.id}.gif" end - def vh(rimg) - rimg.flip.flop.to_blob + def mime_type + "image/#{self.ext}" end - def to_gif? - self.dext == 'png' and self.flag_gif_convert >= 0 + def url + '/pictures/' + filename end - def self.png_to_gif(data) - res = nil - begin - mgk = Magick::Image.from_blob(data).shift - mgk.format = 'gif' - res = mgk - rescue - res = false - end - res + def new_revision + Picture.maximum(:revision, :conditions => ['original_picture_id = ?', self.original_picture_id]).to_i + 1 + end + + def head? + r = self.resource_picture + r ? true : false + end + + def to_gif? + self.ext == 'png' and self.flag_gif_convert >= 0 end def subdirs flag_reverse < 0 ? [''] : ['', 'v', 'h', 'vh'] end - def copy_data(rp) - attr = {:width => rp.width, :height => rp.height, :ext => rp.ext, :filesize => rp.filesize, - :original_picture_id => rp.original_picture_id, :license_id => rp.license_id, :artist_id => rp.artist_id, - :artist_name => rp.artist_name, :credit => rp.credit, :settings => rp.settings - } - self.attributes = attr + def self.list_by_md5 md5, opid + r = Picture.find :all, :conditions => ['pictures.md5 = ? and pictures.original_picture_id <> ?', md5, opid], :order => 'pictures.updated_at desc' + end + + def self.exist_by_md5 md5, opid + Picture.list_by_md5(md5, opid).empty? ? false : true end - def store(mgk) + def self.show rid, au + opt = {} + r = Picture.find(rid, opt) + raise ActiveRecord::Forbidden unless r.visible?(au) + r + end + + def store(imager) res = false - self.revision = self.new_revision if res = self.save - if res = self.store_picture(mgk) + if res = self.store_picture(imager, self.filename) if self.to_gif? - if gifmgk = Picture.png_to_gif(mgk.to_blob) - res = self.store_picture(gifmgk) + if gifimager = imager.to_gif + res = self.store_picture(gifimager, self.gifname) else res = false end @@ -87,25 +100,39 @@ class Picture < ActiveRecord::Base res end - def store_picture(mgk) + def store_picture(imager, fn) res = false subdirs.each do |d| - picdata = d.empty? ? mgk.to_blob : self.__send__(d, mgk) - res = PictureIO.picture_io.put(picdata, "#{self.id}.#{mgk.format}", d) + picdata = d.empty? ? imager.binary : imager.__send__(d) + res = PictureIO.picture_io.put(picdata, fn, d) break unless res end res end def restore(subdir = nil) - PictureIO.resource_picture_io.get self.filename, subdir + PictureIO.picture_io.get self.filename, subdir + end + + def credit_template + "#{self.classname.tableize}/attributes/credit" + end + + def credit_data + begin + @credit_data = JSON.parse(self.credit) unless @credit_data + rescue + end + @credit_data end def flags + return @flags if @flags begin - @flags = JSON.parse(self.settings) unless @flags + @flags = JSON.parse(self.settings) rescue end + @flags = {} unless @flags @flags end @@ -114,57 +141,57 @@ class Picture < ActiveRecord::Base end def flag_open - @flag_open = flags["open"] unless @flag_open + @flag_open = (flags["open"] || -1) unless @flag_open @flag_open end def flag_commercial - @flag_commercial = flags["commercial"] unless @flag_commercial + @flag_commercial = (flags["commercial"] || -1) unless @flag_commercial @flag_commercial end def flag_official - @flag_official = flags["official"] unless @flag_official + @flag_official = (flags["official"] || -1) unless @flag_official @flag_official end def flag_attribution - @flag_attribution = flags["attribution"] unless @flag_attribution + @flag_attribution = (flags["attribution"] || -1) unless @flag_attribution @flag_attribution end def flag_derive - @flag_derive = flags["derive"] unless @flag_derive + @flag_derive = (flags["derive"] || -1) unless @flag_derive @flag_derive end def flag_thumbnail - @flag_thumbnail = flags["thumbnail"] unless @flag_thumbnail + @flag_thumbnail = (flags["thumbnail"] || -1) unless @flag_thumbnail @flag_thumbnail end def flag_gif_convert - @flag_gif_convert = flags["gif_convert"] unless @flag_gif_convert + @flag_gif_convert = (flags["gif_convert"] || -1) unless @flag_gif_convert @flag_gif_convert end def flag_reverse - @flag_reverse = flags["reverse"] unless @flag_reverse + @flag_reverse = (flags["reverse"] || -1) unless @flag_reverse @flag_reverse end def flag_resize - @flag_resize = flags["resize"] unless @flag_resize + @flag_resize = (flags["resize"] || -1) unless @flag_resize @flag_resize end def flag_sync_vh - @flag_sync_vh = flags["sync_vh"] unless @flag_sync_vh + @flag_sync_vh = (flags["sync_vh"] || -1) unless @flag_sync_vh @flag_sync_vh end def flag_overlap - @flag_overlap = flags["overlap"] unless @flag_overlap + @flag_overlap = (flags["overlap"] || -1) unless @flag_overlap @flag_overlap end