OSDN Git Service

38305a19fede7bf5a54bbc8510ed9ed3f31554d1
[pettanr/pettanr.git] / app / models / picture.rb
1 #実素材
2 class Picture < ActiveRecord::Base
3   belongs_to :original_picture
4   belongs_to :license
5   belongs_to :artist
6   has_one :resource_picture
7   
8   validates :original_picture_id, :presence => true, :numericality => true, :existence => true
9   validates :revision, :presence => true, :numericality => true
10   validates :ext, :presence => true, :length => {:maximum => 4}, :inclusion => {:in => ['png', 'jpeg', 'gif']}
11   validates :width, :presence => true, :numericality => true, :natural_number => true
12   validates :height, :presence => true, :numericality => true, :natural_number => true
13   validates :filesize, :presence => true, :numericality => {:greater_than => 0, :less_than_or_equal_to => 2000000}, :natural_number => true
14   validates :md5, :presence => true, :length => {:maximum => 32}
15   validates :license_id, :presence => true, :numericality => true, :existence => true
16   validates :artist_id, :presence => true, :numericality => true, :existence => true
17   validates :artist_name, :presence => true
18   validates :classname, :presence => true, :length => {:maximum => 50}
19   
20   def dext
21     self.ext.downcase
22   end
23   
24   def filename
25     "#{self.id}.#{self.dext}"
26   end
27   
28   def gifname
29     "#{self.id}.gif"
30   end
31   
32   def mime_type
33     "image/#{self.dext}"
34   end
35   
36   def dext
37     self.ext.downcase
38   end
39   
40   def url
41     '/pictures/' + filename
42   end
43   
44   def self.list_by_md5 md5, opid
45     r = Picture.find :all, :conditions => ['pictures.md5 = ? and pictures.original_picture_id <> ?', md5, opid], :order => 'pictures.updated_at desc'
46   end
47   
48   def self.exist_by_md5 md5, opid
49     Picture.list_by_md5(md5, opid).empty? ? false : true
50   end
51   
52   def head?
53     r = self.resource_picture
54     r ? true : false
55   end
56   
57   def new_revision
58     Picture.maximum(:revision, :conditions => ['original_picture_id = ?', self.original_picture_id]).to_i + 1
59   end
60   
61   def v(rimg)
62     rimg.flip.to_blob
63   end
64   
65   def h(rimg)
66     rimg.flop.to_blob
67   end
68   
69   def vh(rimg)
70     rimg.flip.flop.to_blob
71   end
72   
73   def to_gif?
74     self.dext == 'png' and self.flag_gif_convert >= 0
75   end
76   
77   def self.png_to_gif(data)
78     res = nil
79     begin
80       mgk = Magick::Image.from_blob(data).shift
81       mgk.format = 'gif'
82       res = mgk
83     rescue
84       res = false
85     end
86     res
87   end
88   
89   def subdirs
90     flag_reverse < 0 ? [''] : ['', 'v', 'h', 'vh']
91   end
92   
93   def copy_data(rp)
94     attr = {:width => rp.width, :height => rp.height, :ext => rp.ext, :filesize => rp.filesize, 
95       :original_picture_id => rp.original_picture_id, :license_id => rp.license_id, :artist_id => rp.artist_id, 
96       :md5 => rp.md5, :artist_name => rp.artist_name, :classname => rp.classname, :credit => rp.credit, :settings => rp.settings
97     }
98     self.attributes = attr
99   end
100   
101   def store(mgk)
102     res = false
103     self.revision = self.new_revision
104     if res = self.save
105       if res = self.store_picture(mgk, self.filename)
106         if self.to_gif?
107           if gifmgk = Picture.png_to_gif(mgk.to_blob)
108             res = self.store_picture(gifmgk, self.gifname)
109           else
110             res = false
111           end
112         end
113       end
114     end
115     res
116   end
117   
118   def store_picture(mgk, fn)
119     res = false
120     subdirs.each do |d|
121       picdata = d.empty? ? mgk.to_blob : self.__send__(d, mgk)
122       res = PictureIO.picture_io.put(picdata, fn, d)
123       break unless res
124     end
125     res
126   end
127   
128   def restore(subdir = nil)
129     PictureIO.picture_io.get self.filename, subdir
130   end
131   
132   def self.show pid
133     r = Picture.find(pid)
134 #    raise ActiveRecord::Forbidden unless c.visible?(au)
135     r
136   end
137   
138   def credit_template
139     "#{self.classname.tableize}/attributes/credit"
140   end
141   
142   def credit_data
143     begin
144       @credit_data = JSON.parse(self.credit) unless @credit_data
145     rescue 
146     end
147     @credit_data
148   end
149   
150   def flags
151     return @flags if @flags
152     begin
153       @flags = JSON.parse(self.settings)
154     rescue 
155     end
156     @flags = {} unless @flags
157     @flags
158   end
159   
160   def flags=(s)
161     @flags = s
162   end
163   
164   def flag_open
165     @flag_open = (flags["open"] || -1) unless @flag_open
166     @flag_open
167   end
168   
169   def flag_commercial
170     @flag_commercial = (flags["commercial"] || -1) unless @flag_commercial
171     @flag_commercial
172   end
173   
174   def flag_official
175     @flag_official = (flags["official"] || -1) unless @flag_official
176     @flag_official
177   end
178   
179   def flag_attribution
180     @flag_attribution = (flags["attribution"] || -1) unless @flag_attribution
181     @flag_attribution
182   end
183   
184   def flag_derive
185     @flag_derive = (flags["derive"] || -1) unless @flag_derive
186     @flag_derive
187   end
188   
189   def flag_thumbnail
190     @flag_thumbnail = (flags["thumbnail"] || -1) unless @flag_thumbnail
191     @flag_thumbnail
192   end
193   
194   def flag_gif_convert
195     @flag_gif_convert = (flags["gif_convert"] || -1) unless @flag_gif_convert
196     @flag_gif_convert
197   end
198   
199   def flag_reverse
200     @flag_reverse = (flags["reverse"] || -1) unless @flag_reverse
201     @flag_reverse
202   end
203   
204   def flag_resize
205     @flag_resize = (flags["resize"] || -1) unless @flag_resize
206     @flag_resize
207   end
208   
209   def flag_sync_vh
210     @flag_sync_vh = (flags["sync_vh"] || -1) unless @flag_sync_vh
211     @flag_sync_vh
212   end
213   
214   def flag_overlap
215     @flag_overlap = (flags["overlap"] || -1) unless @flag_overlap
216     @flag_overlap
217   end
218   
219 end