X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=app%2Fmodels%2Fpicture.rb;h=a2c8f49d59bc4eb6896d1e20e4d66ee08875ae54;hb=b8bd6a66f23bb46aae1e57da1eb6899a75240994;hp=f62ecbe48ebb8aae92831495e2a32eeec38c8a45;hpb=c952cb16dc5e99208d9b520fa95076092af5edde;p=pettanr%2Fpettanr.git diff --git a/app/models/picture.rb b/app/models/picture.rb index f62ecbe4..a2c8f49d 100644 --- a/app/models/picture.rb +++ b/app/models/picture.rb @@ -1,2 +1,222 @@ -class Picture < ActiveRecord::Base +#実素材 +class Picture < Peta::Content + load_manifest + belongs_to :original_picture + belongs_to :license + belongs_to :system_picture + belongs_to :artist + has_one :resource_picture + + validates :original_picture_id, :presence => true, :numericality => true, :existence => {:both => false} + validates :revision, :presence => true, :numericality => true + 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 => {:both => false} + validates :system_picture_id, :presence => true, :numericality => true, :existence => {:both => false} + validates :artist_id, :presence => true, :numericality => true, :existence => {:both => false} + validates :artist_name, :presence => true + validates :license_group_module_name, :presence => true, :length => {:maximum => 50} + + def supply_default + end + + def overwrite 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, + :system_picture_id => rp.system_picture_id, :artist_id => rp.artist_id, + :md5 => rp.md5, :artist_name => rp.artist_name, + :license_group_module_name => rp.license_group_module_name, + :license_group_settings => rp.license_group_settings, + :credit_picture_settings => rp.credit_picture_settings, + :license_settings => rp.license_settings + } + self.attributes = attr + self.revision = self.new_revision #Do not move to attr. new_revision reffernces self.original_picture_id + end + + def visible? operators + return true + end + + def showable? operators = nil + return false unless self.original_picture + return true if self.own?(operators) + self.enable? and self.head? + end + + def filename + "#{self.id}.#{self.ext}" + end + + def gifname + "#{self.id}.gif" + end + + def mime_type + "image/#{self.ext}" + end + + def url + '/pictures/' + filename + end + + def opt_img_tag + {:src => self.url, :width => self.width, :height => self.height} + end + + def tmb_opt_img_tag + tw, th = PettanImager.thumbnail_size(self.width, self.height) + {:src => self.url, :width => tw, :height => th} + end + + def tail_opt_img_tag img + {:src => img, :width => self.width, :height => self.height} + end + + def tail_tmb_opt_img_tag img + tw, th = PettanImager.thumbnail_size(self.width, self.height) + {:src => img, :width => tw, :height => th} + end + + def alt_name + self.license.license_group.caption.to_s + '[' + self.license.caption.to_s + ']' + end + + def symbol_option + self.tmb_opt_img_tag + end + + def new_revision + Picture.maximum(:revision, :conditions => ['original_picture_id = ?', self.original_picture_id]).to_i + 1 + end + + def enable? + r = self.head.resource_picture + r ? true : false + end + + def self.head opid + Picture.find(:first, :conditions => ['original_picture_id = ?', opid], :order => 'pictures.revision desc') + end + + def head + Picture.head(self.original_picture_id) + end + + def head? + self == head + end + + def to_gif? + self.ext == 'png' and self.license_extend.gif_convert >= 0 + end + + def subdirs + self.license_extend.reverse < 0 ? [''] : ['', 'v', 'h', 'vh'] + end + + def self.find_by_md5 md5 + r = Picture.find :all, :conditions => ['pictures.md5 = ?', md5], :order => 'pictures.updated_at desc' + end + + def self.list_by_md5 md5, opid = nil + cond = if opid.blank? + ['pictures.md5 = ?', md5] + else + ['pictures.md5 = ? and pictures.original_picture_id <> ?', md5, opid] + end + r = Picture.find :all, :conditions => cond, :order => 'pictures.updated_at desc' + end + + def self.exist_by_md5 md5, opid + Picture.list_by_md5(md5, opid).empty? ? false : true + end + + def self.list_by_original_picture_where original_picture_id + ['pictures.original_picture_id = ?', original_picture_id] + end + + def self.list_by_original_picture original_picture_id, roles, page = 1, page_size = self.default_page_size + self.where(self.list_by_original_picture_where(original_picture_id)).includes(self.list_opt).order('pictures.revision desc').offset((page -1) * page_size).limit(page_size) + end + + def self.list_opt + {:license => {}, :artist => {}} + end + + def self.list_json_opt + {:include => {:license => {}, :artist => {}} } + end + + def store(imager) + res = false + if res = self.save + if res = self.store_picture(imager, self.filename) + if self.to_gif? + if gifimager = imager.to_gif + res = self.store_picture(gifimager, self.gifname) + else + res = false + end + end + end + end + res + end + + def store_picture(imager, fn) + res = false + subdirs.each do |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.picture_io.get self.filename, subdir + end + + def self.export(dt = nil) + opt = {} + cond = if dt + ['artists.author_id is not null and pictures.updated_at >= ?', dt] + else + 'artists.author_id is not null' + end + opt.merge!({:conditions => cond}) + opt.merge!({:include => {:artist => {}}, :order => 'pictures.updated_at desc'}) + Picture.find(:all, opt) + end + + def self.list_as_json_text ary + '[' + ary.map {|i| i.to_json_with_picture_data }.join(',') + ']' + end + + def picture_data + Base64.encode64(self.restore) + end + + def to_json_with_picture_data + self.to_json({:methods => :picture_data}) + end + + def unpublish + imager = PettanImager.load(File.open(Rails.root + 'app/assets/images/error.png', 'rb').read) + return false unless imager + self.store imager + end + + def credit_template + "#{self.license_group_module_name.tableize}/attributes/credit" + end + + def full_credit_template + "#{self.license_group_module_name.tableize}/attributes/full_credit" + end + end