OSDN Git Service

94c43c182c959cbc7cb0f5b3466dd9a3853a88fc
[pettanr/pettanr.git] / app / models / resource_picture.rb
1 #素材
2 class ResourcePicture < ActiveRecord::Base
3   belongs_to :artist
4   belongs_to :license
5   belongs_to :picture
6   has_many :panel_pictures
7   belongs_to :original_picture
8   
9   validates :ext, :presence => true, :length => {:maximum => 4}, :inclusion => {:in => ['png', 'jpeg', 'gif']}
10   validates :width, :presence => true, :numericality => true, :natural_number => true
11   validates :height, :presence => true, :numericality => true, :natural_number => true
12   validates :filesize, :presence => true, :numericality => {:greater_than => 0, :less_than_or_equal_to => 2000000}, :natural_number => true
13   validates :md5, :presence => true, :length => {:minimum => 32, :maximum => 32}
14   validates :artist_id, :presence => true, :numericality => true, :existence => true
15   validates :license_id, :presence => true, :numericality => true, :existence => true
16   validates :original_picture_id, :presence => true, :numericality => true, :existence => true
17   validates :artist_name, :presence => true
18   validates :classname, :presence => true, :length => {:maximum => 50}
19   validates :picture_id, :presence => true, :numericality => true, :existence => true
20   
21   before_destroy :destroy_with_file
22   
23   def destroy_with_file
24     PictureIO.resource_picture_io.delete self.filename
25     PictureIO.resource_picture_io.class.subdirs.each do |d|
26       next if d.empty?
27       PictureIO.resource_picture_io.delete(self.filename, d) if PictureIO.resource_picture_io.exist?(self.filename, d)
28     end
29   end
30   
31   def supply_default
32   end
33   
34   def overwrite op
35     attr = {:width => op.width, :height => op.height, :ext => op.ext, :filesize => op.filesize, 
36       :original_picture_id => op.id, :artist_id => op.artist_id, :md5 => op.md5
37     }
38     self.attributes = attr
39   end
40   
41   def own? author
42     return false
43   end
44   
45   def visible? author
46     true
47   end
48   
49   def filename
50     "#{self.id}.#{self.ext}"
51   end
52   
53   def gifname
54     "#{self.id}.gif"
55   end
56   
57   def mime_type
58     "image/#{self.ext}"
59   end
60   
61   def url subdir = nil
62     '/resource_pictures/' + (subdir.to_s.empty? ? '' : subdir.to_s + '/' ) + filename
63   end
64   
65   def to_gif?
66     self.ext == 'png' and self.flag_gif_convert >= 0
67   end
68   
69   def thumbnail(imager)
70     tw, th = ResourcePicture.fix_size_both(MagicNumber['thumbnail_width'], MagicNumber['thumbnail_height'], rimg.columns, rimg.rows)
71     ResourcePicture.resize(rimg.to_blob, tw, th).to_blob
72   end
73   
74   def opt_img_tag
75     tw, th = ResourcePicture.fix_size_both(MagicNumber['thumbnail_width'], MagicNumber['thumbnail_height'], self.width, self.height)
76     {:src => self.url, :width => tw, :height => th}
77   end
78   
79   def self.default_page_size
80     25
81   end
82   
83   def self.max_page_size
84     100
85   end
86   
87   def self.page prm = nil
88     page = prm.to_i
89     page = 1 if page < 1
90     page
91   end
92   
93   def self.page_size prm = self.default_page_size
94     page_size = prm.to_i
95     page_size = self.max_page_size if page_size > self.max_page_size
96     page_size = self.default_page_size if page_size < 1
97     page_size
98   end
99   
100   def self.list page = 1, page_size = self.default_page_size
101     opt = {}
102     opt.merge!(self.list_opt)
103     opt.merge!({:limit => page_size, :offset => (page -1) * page_size}) if page_size > 0
104     opt.merge!({:order => 'updated_at desc'})
105     ResourcePicture.find(:all, opt)
106   end
107   
108   def self.list_opt
109     {:include => {:license => {}, :artist => {}, :picture => {}} }
110   end
111   
112   def self.list_json_opt
113     {:include => {:license => {}, :artist => {}, :picture => {}} }
114   end
115   
116   def self.show rid, au
117     opt = {}
118     opt.merge!(self.show_opt)
119     r = ResourcePicture.find(rid, opt)
120     raise ActiveRecord::Forbidden unless r.visible?(au)
121     r
122   end
123   
124   def self.show_opt
125     {:include => {:license => {}, :artist => {}, :picture => {}} }
126   end
127   
128   def self.show_json_opt
129     {:include => {:license => {}, :artist => {}, :picture => {}} }
130   end
131   
132   def new_picture imager
133     pc = Picture.new
134     pc.supply_default
135     pc.overwrite self
136     r = pc.store imager
137     return pc if r
138     self.errors.add :base, 'picture does not create' + pc.errors.full_messages.join("\n")
139     false
140   end
141   
142   def store imager
143     return false unless imager
144     res = false
145     self.overwrite self.original_picture
146     ResourcePicture.transaction do
147       pc = self.new_picture imager
148       if pc
149         self.picture_id = pc.id
150         if res = self.save
151           res = self.store_picture_with_gif(imager)
152         end
153       else
154       end
155       raise ActiveRecord::Rollback unless res
156     end
157     res
158   end
159   
160   def store_picture_with_gif(imager)
161     if res = self.store_picture(imager, self.filename)
162       if self.to_gif?
163         if gifimager = imager.to_gif
164           res = self.store_picture(gifimager, self.gifname)
165         else
166           self.errors.add :base, 'picture data can not conv to gif'
167           res = false
168         end
169       end
170     else
171       self.errors.add :base, 'resource picture io does not work'
172     end
173     res
174   end
175   
176   def store_picture(imager, fn)
177     res = false
178     thumbnail_imager = self.flag_thumbnail >= 0 ? imager.to_thumbnail : imager
179     return false unless thumbnail_imager
180     return false unless PictureIO.resource_picture_io.put(thumbnail_imager.binary, fn)
181     return false unless PictureIO.resource_picture_io.put(imager.binary, fn, 'full')
182     true
183   end
184   
185   def restore(subdir = nil)
186     PictureIO.resource_picture_io.get self.filename, subdir
187   end
188   
189   def self.visible_count
190     ResourcePicture.count
191   end
192   
193   def credit_template
194     "#{self.classname.tableize}/attributes/credit"
195   end
196   
197   def credit_data
198     begin
199       @credit_data = JSON.parse(self.credit) unless @credit_data
200     rescue 
201     end
202     @credit_data
203   end
204   
205   def flags
206     begin
207       @flags = JSON.parse(self.settings) unless @flags
208     rescue 
209     end
210     @flags
211   end
212   
213   def flags=(s)
214     @flags = s
215   end
216   
217   def flag_open
218     @flag_open = flags["open"] unless @flag_open
219     @flag_open
220   end
221   
222   def flag_commercial
223     @flag_commercial = flags["commercial"] unless @flag_commercial
224     @flag_commercial
225   end
226   
227   def flag_official
228     @flag_official = flags["official"] unless @flag_official
229     @flag_official
230   end
231   
232   def flag_attribution
233     @flag_attribution = flags["attribution"] unless @flag_attribution
234     @flag_attribution
235   end
236   
237   def flag_derive
238     @flag_derive = flags["derive"] unless @flag_derive
239     @flag_derive
240   end
241   
242   def flag_thumbnail
243     @flag_thumbnail = flags["thumbnail"] unless @flag_thumbnail
244     @flag_thumbnail
245   end
246   
247   def flag_gif_convert
248     @flag_gif_convert = flags["gif_convert"] unless @flag_gif_convert
249     @flag_gif_convert
250   end
251   
252   def flag_reverse
253     @flag_reverse = flags["reverse"] unless @flag_reverse
254     @flag_reverse
255   end
256   
257   def flag_resize
258     @flag_resize = flags["resize"] unless @flag_resize
259     @flag_resize
260   end
261   
262   def flag_sync_vh
263     @flag_sync_vh = flags["sync_vh"] unless @flag_sync_vh
264     @flag_sync_vh
265   end
266   
267   def flag_overlap
268     @flag_overlap = flags["overlap"] unless @flag_overlap
269     @flag_overlap
270   end
271   
272 end