OSDN Git Service

t#29174#28986:license gemnized
[pettanr/pettanr.git] / app / models / original_picture.rb
1 class OriginalPicture < ActiveRecord::Base
2   belongs_to :artist
3   belongs_to :original_picture_license_group
4   has_one :resource_picture
5   
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   
12   before_destroy :destroy_with_file
13   
14   def supply_default art
15   end
16   
17   def self.default_page_size
18     25
19   end
20   
21   def self.max_page_size
22     100
23   end
24   
25   def self.page prm = nil
26     page = prm.to_i
27     page = 1 if page < 1
28     page
29   end
30   
31   def self.page_size prm = self.default_page_size
32     page_size = prm.to_i
33     page_size = self.max_page_size if page_size > self.max_page_size
34     page_size = self.default_page_size if page_size < 1
35     page_size
36   end
37   
38   def self.list artist_id, opt = {}, page = 1, page_size = self.default_page_size
39     opt.merge!(self.list_opt) unless opt[:include]
40     opt.merge!({:conditions => ['artist_id = ?', artist_id], 
41       :order => 'updated_at desc', :limit => page_size, :offset => (page -1) * page_size}
42     )
43     OriginalPicture.find(:all, opt)
44   end
45   
46   def self.list_opt
47     {:include => {:resource_picture => {}}}
48   end
49   
50   def self.list_json_opt
51     {:include => {:resource_picture => {}}}
52   end
53   
54   def self.show cid, artist, opt = {}
55     pic = OriginalPicture.find(cid, :include => self.show_include_opt(opt))
56     raise ActiveRecord::Forbidden unless pic.own?(artist)
57     pic
58   end
59   
60   def self.edit cid, artist, opt = {}
61     pic = OriginalPicture.find(cid, :include => self.show_include_opt(opt))
62     raise ActiveRecord::Forbidden unless pic.own?(artist)
63     pic
64   end
65   
66   def self.show_include_opt opt = {}
67     res = {:resource_picture => {}}
68     res.merge!(opt[:include]) if opt[:include]
69     res
70   end
71   
72   def self.show_json_include_opt
73     {:include => {:resource_picture => {}}}
74   end
75   
76   def destroy_with_file
77     PictureIO.original_picture_io.delete self.filename
78     self.resource_picture.destroy
79   end
80   
81   def dext
82     self.ext.downcase
83   end
84   
85   def filename
86     "#{self.id}.#{self.dext}"
87   end
88   
89   def mime_type
90     "image/#{self.dext}"
91   end
92   
93   def url
94     '/original_pictures/' + filename
95   end
96   
97   def data_to_mgk picture_data
98     begin
99       mgk = Magick::Image.from_blob(picture_data).shift
100     rescue 
101       self.errors.add :base, 'magick failed'
102       return false
103     end
104     mgk
105   end
106   
107   def store(picture_data, art)
108     mgk = data_to_mgk picture_data
109     return false unless mgk
110     res = false
111     self.attributes = {:ext => mgk.format.downcase, :width => mgk.columns, :height => mgk.rows, 
112       :filesize => mgk.filesize, :artist_id => art.id
113     }
114     OriginalPicture.transaction do
115       if res = self.save
116         if res = PictureIO.original_picture_io.put(picture_data, self.filename)
117           res = true
118         else
119           self.errors.add :base, 'original picture io does not work'
120           raise ActiveRecord::Rollback
121         end
122       end
123     end
124     res
125   end
126   
127   def restore(subdir = nil)
128     PictureIO.original_picture_io.get self.filename, subdir
129   end
130   
131   def own? art
132     return false unless art
133     self.artist_id == art.id
134   end
135   
136 end