OSDN Git Service

t#29400:itr3?
[pettanr/pettanr.git] / app / models / system_picture.rb
1 class SystemPicture < ActiveRecord::Base
2   has_many :balloons
3   has_many :balloon_templates
4   has_many :licenses
5   
6   validates :ext, :presence => true, :length => {:maximum => 4}, :inclusion => {:in => ['png', 'jpeg', 'gif']}
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 :md5, :presence => true, :length => {:minimum => 32, :maximum => 32}
11   
12   before_destroy :destroy_with_file
13   
14   def destroy_with_file
15     PictureIO.system_picture_io.delete self.filename
16   end
17   
18   def supply_default
19   end
20   
21   def overwrite
22   end
23   
24   def own? ad
25     true
26   end
27   
28   def visible? ad
29     true
30   end
31   
32   def filename
33     "#{self.id}.#{self.ext}"
34   end
35   
36   def mime_type
37     "image/#{self.ext}"
38   end
39   
40   def url
41     '/system_pictures/' + filename
42   end
43   
44   def self.default_page_size
45     25
46   end
47   
48   def self.max_page_size
49     100
50   end
51   
52   def self.page prm = nil
53     page = prm.to_i
54     page = 1 if page < 1
55     page
56   end
57   
58   def self.page_size prm = self.default_page_size
59     page_size = prm.to_i
60     page_size = self.max_page_size if page_size > self.max_page_size
61     page_size = self.default_page_size if page_size < 1
62     page_size
63   end
64   
65   def self.list page = 1, page_size = self.default_page_size
66     opt = {}
67     opt.merge!(self.list_opt)
68     opt.merge!({:limit => page_size, :offset => (page -1) * page_size}) if page_size > 0
69     opt.merge!({:order => 'system_pictures.updated_at desc'})
70     SystemPicture.find(:all, opt)
71   end
72   
73   def self.list_opt
74     {}
75   end
76   
77   def self.list_json_opt
78     {}
79   end
80   
81   def self.show sid, ad
82     opt = {}
83     opt.merge!(self.show_opt)
84     res = SystemPicture.find(sid, opt)
85     raise ActiveRecord::Forbidden unless res.visible?(ad)
86     res
87   end
88   
89   def self.show_opt
90     {}
91   end
92   
93   def self.show_json_opt
94     {}
95   end
96   
97   def store(imager)
98     unless imager
99       self.errors.add :base, 'illegal picture data'
100       return false
101     end
102     res = false
103     SystemPicture.transaction do
104       if res = self.save
105         if res = PictureIO.system_picture_io.put(imager.binary, self.filename)
106           res = true
107         else
108           self.errors.add :base, 'system picture io does not work'
109           raise ActiveRecord::Rollback
110         end
111       end
112     end
113     res
114   end
115   
116   def self.store(imager)
117     attr = {:ext => imager.ext, :width => imager.width, :height => imager.height, :filesize => imager.filesize, :md5 => imager.md5}
118     sp = SystemPicture.modify_object(imager.md5, attr, 'md5')
119     res = sp.store imager
120     res ? sp : nil
121   end
122   
123   def restore(subdir = nil)
124     PictureIO.system_picture_io.get self.filename, subdir
125   end
126   
127 end