1 class OriginalPicture < ActiveRecord::Base
4 has_one :resource_picture
6 validates :ext, :presence => true, :length => {:maximum => 4}, :inclusion => {:in => ['png', 'jpeg', 'gif']}
\r
7 validates :width, :presence => true, :numericality => true, :natural_number => true
8 validates :height, :presence => true, :numericality => true, :natural_number => true
9 validates :filesize, :presence => true, :numericality => {:greater_than => 0, :less_than_or_equal_to => 2000000}, :natural_number => true
10 validates :artist_id, :presence => true, :numericality => true, :existence => true
11 validates :license_id, :presence => true, :numericality => true, :existence => true
13 before_destroy :destroy_with_file
15 def supply_default art
16 self.license_id = art.default_license_id if self.license_id.blank?
19 def self.default_page_size
23 def self.max_page_size
27 def self.page prm = nil
33 def self.page_size prm = self.default_page_size
35 page_size = self.max_page_size if page_size > self.max_page_size
36 page_size = self.default_page_size if page_size < 1
40 def self.list artist_id, opt = {}, page = 1, page_size = self.default_page_size
41 opt.merge!(self.list_opt) unless opt[:include]
42 opt.merge!({:conditions => ['artist_id = ?', artist_id],
43 :order => 'updated_at desc', :limit => page_size, :offset => (page -1) * page_size}
45 OriginalPicture.find(:all, opt)
49 {:include => [:license, :resource_picture]}
52 def self.list_json_opt
53 {:include => [:license, :resource_picture]}
56 def self.show cid, artist, opt = {}
57 pic = OriginalPicture.find(cid, :include => self.show_include_opt(opt))
58 raise ActiveRecord::Forbidden unless pic.own?(artist)
62 def self.edit cid, artist, opt = {}
63 pic = OriginalPicture.find(cid, :include => self.show_include_opt(opt))
64 raise ActiveRecord::Forbidden unless pic.own?(artist)
68 def self.show_include_opt opt = {}
69 res = [:license, :resource_picture]
70 res.push(opt[:include]) if opt[:include]
74 def self.show_json_include_opt
75 {:include => [:license, :resource_picture]}
79 PictureIO.original_picture_io.delete self.filename
80 self.resource_picture.destroy
88 "#{self.id}.#{self.dext}"
96 '/original_pictures/' + filename
99 def data_to_mgk picture_data
101 mgk = Magick::Image.from_blob(picture_data).shift
103 self.errors.add :base, 'magick failed'
109 def store(picture_data, art, lid = nil)
110 mgk = data_to_mgk picture_data
111 return false unless mgk
113 self.attributes = {:ext => mgk.format.downcase, :width => mgk.columns, :height => mgk.rows,
114 :filesize => mgk.filesize, :artist_id => art.id,
115 :license_id => lid.blank? ? art.default_license_id : lid.to_i
117 OriginalPicture.transaction do
119 if res = PictureIO.original_picture_io.put(picture_data, self.filename)
120 rp = ResourcePicture.update_picture(self)
123 PictureIO.original_picture_io.delete(self.filename)
124 self.errors.add :base, 'resource picture copying error'
125 raise ActiveRecord::Rollback
129 self.errors.add :base, 'original picture io does not work'
130 raise ActiveRecord::Rollback
137 def restore(subdir = nil)
138 PictureIO.original_picture_io.get self.filename, subdir
142 return false unless art
143 self.artist_id == art.id