X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=app%2Fmodels%2Fresource_picture.rb;h=dec37a05bc2e269f1874f318669dc68d430d239a;hb=cd7625bb17399ae415247f48b1aa0758518d425d;hp=5e1b4f753c38a18d658a213090146b99c52ae373;hpb=fdb854aced6083b382f28f8afb5e7db5622ac94f;p=pettanr%2Fpettanr.git diff --git a/app/models/resource_picture.rb b/app/models/resource_picture.rb index 5e1b4f75..dec37a05 100644 --- a/app/models/resource_picture.rb +++ b/app/models/resource_picture.rb @@ -10,55 +10,51 @@ class ResourcePicture < ActiveRecord::Base 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 :artist_id, :presence => true, :numericality => true, :existence => true - validates :license_id, :presence => true, :numericality => true, :existence => true - validates :original_picture_id, :presence => true, :numericality => true, :existence => true + validates :md5, :presence => true, :length => {:minimum => 32, :maximum => 32} + validates :artist_id, :presence => true, :numericality => true, :existence => {:both => false} + validates :license_id, :presence => true, :numericality => true, :existence => {:both => false} + validates :original_picture_id, :presence => true, :numericality => true, :existence => {:both => false} validates :artist_name, :presence => true validates :classname, :presence => true, :length => {:maximum => 50} - validates :picture_id, :presence => true, :numericality => true, :existence => true + validates :picture_id, :presence => true, :numericality => true, :existence => {:both => false} - before_destroy :destroy_with_file + before_validation :valid_encode - def destroy_with_file - PictureIO.resource_picture_io.delete self.filename - PictureIO.resource_picture_io.class.subdirs.each do |d| - next if d.empty? - PictureIO.resource_picture_io.delete(self.filename, d) if PictureIO.resource_picture_io.exist?(self.filename, d) + def valid_encode + ['artist_name', 'classname', 'credit', 'settings'].each do |a| + next if attributes[a] == nil + raise Pettanr::BadRequest unless attributes[a].valid_encoding? end end - def self.resize(data, dw, dh) - Magick::Image.from_blob(data).shift.resize(dw, dh) + def supply_default end - #サイズの調整(limw,limhに必ず収まるように合わせる) - def self.fix_size_both(limw, limh, w, h) - wr = if w > limw - limw*100/w - else - 100 - end - hr = if h > limh - limh*100/h - else - 100 - end - res = if wr < hr - #幅の方が圧縮率が高い - [w*wr/100, h*wr/100] - else - #高さの方が圧縮率が高い - [w*hr/100, h*hr/100] - end - res + def overwrite op + attr = {:width => op.width, :height => op.height, :ext => op.ext, :filesize => op.filesize, + :original_picture_id => op.id, :artist_id => op.artist_id, :md5 => op.md5 + } + self.attributes = attr end - def dext - self.ext.downcase + def own? roles + roles = [roles] unless roles.respond_to?(:each) + ar = ResourcePicture.get_artist_from_roles roles + return false unless ar + self.artist_id == ar.id + end + + def visible? roles + if MagicNumber['run_mode'] == 0 + return false unless guest_role_check(roles) + else + return false unless resource_reader_role_check(roles) + end + true end def filename - "#{self.id}.#{self.dext}" + "#{self.id}.#{self.ext}" end def gifname @@ -66,180 +62,203 @@ class ResourcePicture < ActiveRecord::Base end def mime_type - "image/#{self.dext}" + "image/#{self.ext}" end def url subdir = nil '/resource_pictures/' + (subdir.to_s.empty? ? '' : subdir.to_s + '/' ) + filename end - def thumbnail(rimg) + def to_gif? + self.ext == 'png' and self.flag_gif_convert >= 0 + end + + def thumbnail(imager) tw, th = ResourcePicture.fix_size_both(MagicNumber['thumbnail_width'], MagicNumber['thumbnail_height'], rimg.columns, rimg.rows) ResourcePicture.resize(rimg.to_blob, tw, th).to_blob end - def copy_data(op) - attr = {:width => op.width, :height => op.height, :ext => op.ext, :filesize => op.filesize, - :original_picture_id => op.id, :artist_id => op.artist_id - } - self.attributes = attr + def tmb_opt_img_tag + tw, th = PettanImager.thumbnail_size(self.width, self.height) + {:src => self.url, :width => tw, :height => th} end - def data_to_mgk picture_data - begin - mgk = Magick::Image.from_blob(picture_data).shift - rescue - self.errors.add :base, 'magick failed' - return false - end - mgk + def opt_img_tag + {:src => self.url('full'), :width => self.width, :height => self.height} end - def op_mgk - d = self.original_picture.restore - return false unless d - self.data_to_mgk d + def self.default_page_size + 125 end - def new_picture mgk - pc = Picture.new - pc.copy_data self - pc.store mgk - pc + def self.max_page_size + 100 end + def self.page prm = nil + page = prm.to_i + page = 1 if page < 1 + page + end - def to_gif? - self.dext == 'png' and self.flag_gif_convert >= 0 + def self.page_size prm = self.default_page_size + page_size = prm.to_i + page_size = self.max_page_size if page_size > self.max_page_size + page_size = self.default_page_size if page_size < 1 + page_size 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 self.list page = 1, page_size = self.default_page_size + opt = {} + opt.merge!(self.list_opt) + opt.merge!({:limit => page_size, :offset => (page -1) * page_size}) if page_size > 0 + opt.merge!({:order => 'updated_at desc'}) + ResourcePicture.find(:all, opt) + end + + def self.list_opt + {:include => {:license => {}, :artist => {}, :picture => {}} } + end + + def self.list_json_opt + {:include => {:license => {}, :artist => {}, :picture => {}} } + end + + def self.mylist ar, page = 1, page_size = Author.default_resource_picture_page_size + opt = {} + opt.merge!(ResourcePicture.list_opt) + opt.merge!({:limit => page_size, :offset => (page -1) * page_size}) if page_size > 0 + opt.merge!({:conditions => ['resource_pictures.artist_id = ?', ar.id], :order => 'resource_pictures.updated_at desc'}) + ResourcePicture.find(:all, opt) + end + + def self.show rid, roles + opt = {} + opt.merge!(self.show_opt) + r = ResourcePicture.find(rid, opt) + raise ActiveRecord::Forbidden unless r.visible?(roles) + r + end + + def self.show_opt + {:include => {:license => {}, :artist => {}, :picture => {}} } end - def store + def self.show_json_opt + {:include => {:license => {}, :artist => {}, :picture => {}} } + end + + def self.edit rid, ar + opt = {} + opt.merge!(self.show_opt) + r = ResourcePicture.find(rid, opt) + raise ActiveRecord::Forbidden unless r.own?(ar) + r + end + + def new_picture imager + pc = Picture.new + pc.supply_default + pc.overwrite self + r = pc.store imager + return pc if r + self.errors.add :base, Picture.model_name.human + I18n.t('errors.not_create') + false + end + + def store imager + return false unless imager res = false - self.copy_data self.original_picture - mgk = self.op_mgk - return false unless mgk - OriginalPicture.transaction do - pc = self.new_picture mgk - if res = pc.valid? + self.overwrite self.original_picture + ResourcePicture.transaction do + self.original_picture.published_at = Time.now + self.original_picture.stopped_at = nil + raise ActiveRecord::Rollback unless self.original_picture.save + pc = self.new_picture imager + if pc self.picture_id = pc.id if res = self.save - res = self.store_picture_with_gif(mgk) + res = self.store_picture_with_gif(imager) end else - self.errors.add :base, 'picture does not create' end raise ActiveRecord::Rollback unless res end res end - def store_picture_with_gif(mgk) - if res = self.store_picture(mgk, self.filename) + def store_picture_with_gif(imager) + if res = self.store_picture(imager, self.filename) if self.to_gif? - if gifmgk = ResourcePicture.png_to_gif(mgk.to_blob) - res = self.store_picture(gifmgk, self.gifname) + if gifimager = imager.to_gif + if res = self.store_picture(gifimager, self.gifname) + else + self.errors.add :base, I18n.t('picture_io.error') + end else - self.errors.add :base, 'picture data can not conv to gif' + self.errors.add :base, I18n.t('errors.not_convert') res = false end end else - self.errors.add :base, 'resource picture io does not work' + self.errors.add :base, I18n.t('picture_io.error') end res end - def store_picture(mgk, fn) + def store_picture(imager, fn) res = false - tdata = self.flag_thumbnail >= 0 ? thumbnail(mgk) : mgk.to_blob - fdata = mgk.to_blob - return false unless PictureIO.resource_picture_io.put(tdata, fn) - PictureIO.resource_picture_io.put(fdata, fn, 'full') + thumbnail_imager = self.flag_thumbnail >= 0 ? imager.to_thumbnail : imager + return false unless thumbnail_imager + begin + PictureIO.resource_picture_io.put(thumbnail_imager.binary, fn) + PictureIO.resource_picture_io.put(imager.binary, fn, 'full') + res = true + rescue PictureIO::Error + res = false + end + res end def restore(subdir = nil) PictureIO.resource_picture_io.get self.filename, subdir end - def self.default_page_size - 25 - end - - def self.max_page_size - 100 - end - - def self.page prm = nil - page = prm.to_i - page = 1 if page < 1 - page - end - - def self.page_size prm = self.default_page_size - page_size = prm.to_i - page_size = self.max_page_size if page_size > self.max_page_size - page_size = self.default_page_size if page_size < 1 - page_size - end - - def self.offset cnt, prm = nil - offset = prm.to_i - offset = cnt - 1 if offset >= cnt - offset = cnt - offset.abs if offset < 0 - offset = 0 if offset < 0 - offset - end - - def self.list opt = {}, page = 1, page_size = self.default_page_size - opt.merge!(self.list_opt) unless opt[:include] - opt.merge!({:order => 'updated_at desc', :limit => page_size, :offset => (page -1) * page_size}) - ResourcePicture.find(:all, opt) - end - - def self.list_opt - {:include => [:license, :artist]} - end - - def self.list_json_opt - {:include => [:license, :artist]} - end - - def self.show rid, opt = {} - r = ResourcePicture.find(rid, :include => self.show_include_opt(opt)) -# raise ActiveRecord::Forbidden unless c.visible?(au) - r - end - - def self.show_include_opt opt = {} - res = [:license, :artist] - res.push(opt[:include]) if opt[:include] + def unpublish + res = false + ResourcePicture.transaction do + self.original_picture.published_at = nil + self.original_picture.stopped_at = Time.now + raise ActiveRecord::Rollback unless self.original_picture.save + begin + PictureIO.resource_picture_io.delete(self.filename) if PictureIO.resource_picture_io.exist?(self.filename) + PictureIO.resource_picture_io.delete(self.filename, 'full') if PictureIO.resource_picture_io.exist?(self.filename, 'full') + rescue PictureIO::Error + res = false + raise ActiveRecord::Rollback + end + res = self.destroy + raise ActiveRecord::Rollback unless res + end res end - def self.show_json_include_opt - {:include => [:license, :artist]} - end - def self.visible_count ResourcePicture.count end + def picture_data + Base64.encode64(self.restore 'full') + end + def credit_template "#{self.classname.tableize}/attributes/credit" end + def full_credit_template + "#{self.classname.tableize}/attributes/full_credit" + end + def credit_data begin @credit_data = JSON.parse(self.credit) unless @credit_data