OSDN Git Service

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