OSDN Git Service

pass test: Picture.store
[pettanr/pettanr.git] / app / models / picture.rb
1 class Picture < ActiveRecord::Base
2   belongs_to :original_picture
3   belongs_to :license
4   belongs_to :artist
5   
6   validates :original_picture_id, :presence => true, :numericality => true, :existence => true
7   validates :revision, :presence => true, :numericality => true
8   validates :ext, :presence => true, :length => {:maximum => 4}, :inclusion => {:in => ['png', 'jpeg', 'gif']}\r
9   validates :width, :presence => true, :numericality => true, :natural_number => true
10   validates :height, :presence => true, :numericality => true, :natural_number => true
11   validates :filesize, :presence => true, :numericality => {:greater_than => 0, :less_than_or_equal_to => 2000000}, :natural_number => true
12   validates :license_id, :presence => true, :numericality => true, :existence => true
13   validates :artist_id, :presence => true, :numericality => true, :existence => true
14   validates :artist_name, :presence => true
15   
16   def dext
17     self.ext.downcase
18   end
19   
20   def filename
21     "#{self.id}.#{self.dext}"
22   end
23   
24   def mime_type
25     "image/#{self.dext}"
26   end
27   
28   def new_revision
29     Picture.maximum(:revision, :conditions => ['original_picture_id = ?', self.original_picture_id]).to_i + 1
30   end
31   
32   def v(rimg)
33     rimg.flip.to_blob
34   end
35   
36   def h(rimg)
37     rimg.flop.to_blob
38   end
39   
40   def vh(rimg)
41     rimg.flip.flop.to_blob
42   end
43   
44   def to_gif?
45     self.dext == 'png' and self.flag_gif_convert >= 0
46   end
47   
48   def self.png_to_gif(data)
49     res = nil
50     begin
51       mgk = Magick::Image.from_blob(data).shift
52       mgk.format = 'gif'
53       res = mgk
54     rescue
55       res = false
56     end
57     res
58   end
59   
60   def subdirs
61     flag_reverse < 0 ? [''] : ['', 'v', 'h', 'vh']
62   end
63   
64   def store(mgk)
65     res = false
66     self.revision = self.new_revision
67     if res = self.save
68       if res = self.store_picture(mgk)
69         if self.to_gif?
70           if gifmgk = Picture.png_to_gif(mgk.to_blob)
71             res = self.store_picture(gifmgk)
72           else
73             res = false
74           end
75         end
76       end
77     end
78     res
79   end
80   
81   def store_picture(mgk)
82     res = false
83     subdirs.each do |d|
84       picdata = d.empty? ? mgk.to_blob : self.__send__(d, mgk)
85       res = PictureIO.picture_io.put(picdata, "#{self.id}.#{mgk.format}", d)
86       break unless res
87     end
88     res
89   end
90   
91   def restore(subdir = nil)
92     PictureIO.resource_picture_io.get self.filename, subdir
93   end
94   
95   def flags
96     begin
97       @flags = JSON.parse(self.settings) unless @flags
98     rescue 
99     end
100     @flags
101   end
102   
103   def flags=(s)
104     @flags = s
105   end
106   
107   def flag_open
108     @flag_open = flags["open"] unless @flag_open
109     @flag_open
110   end
111   
112   def flag_commercial
113     @flag_commercial = flags["commercial"] unless @flag_commercial
114     @flag_commercial
115   end
116   
117   def flag_official
118     @flag_official = flags["official"] unless @flag_official
119     @flag_official
120   end
121   
122   def flag_attribution
123     @flag_attribution = flags["attribution"] unless @flag_attribution
124     @flag_attribution
125   end
126   
127   def flag_derive
128     @flag_derive = flags["derive"] unless @flag_derive
129     @flag_derive
130   end
131   
132   def flag_thumbnail
133     @flag_thumbnail = flags["thumbnail"] unless @flag_thumbnail
134     @flag_thumbnail
135   end
136   
137   def flag_gif_convert
138     @flag_gif_convert = flags["gif_convert"] unless @flag_gif_convert
139     @flag_gif_convert
140   end
141   
142   def flag_reverse
143     @flag_reverse = flags["reverse"] unless @flag_reverse
144     @flag_reverse
145   end
146   
147   def flag_resize
148     @flag_resize = flags["resize"] unless @flag_resize
149     @flag_resize
150   end
151   
152   def flag_sync_vh
153     @flag_sync_vh = flags["sync_vh"] unless @flag_sync_vh
154     @flag_sync_vh
155   end
156   
157   def flag_overlap
158     @flag_overlap = flags["overlap"] unless @flag_overlap
159     @flag_overlap
160   end
161   
162 end