OSDN Git Service

Merge branch 'v06' of git.sourceforge.jp:/gitroot/pettanr/pettanr into v06
[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? roles
25     roles = [roles] unless roles.respond_to?(:each)
26     ad = SystemPicture.get_admin_from_roles roles
27     return false unless ad
28     true
29   end
30   
31   def visible? ad
32     true
33   end
34   
35   def filename
36     "#{self.id}.#{self.ext}"
37   end
38   
39   def mime_type
40     "image/#{self.ext}"
41   end
42   
43   def url
44     '/system_pictures/' + filename
45   end
46   
47   def opt_img_tag
48     {:src => self.url, :width => self.width, :height => self.height}
49   end
50   
51   def tmb_opt_img_tag
52     tw, th = PettanImager.thumbnail_size(self.width, self.height)
53     {:src => self.url, :width => tw, :height => th}
54   end
55   
56   def self.default_page_size
57     25
58   end
59   
60   def self.max_page_size
61     100
62   end
63   
64   def self.page prm = nil
65     page = prm.to_i
66     page = 1 if page < 1
67     page
68   end
69   
70   def self.page_size prm = self.default_page_size
71     page_size = prm.to_i
72     page_size = self.max_page_size if page_size > self.max_page_size
73     page_size = self.default_page_size if page_size < 1
74     page_size
75   end
76   
77   def self.list page = 1, page_size = self.default_page_size
78     opt = {}
79     opt.merge!(self.list_opt)
80     opt.merge!({:limit => page_size, :offset => (page -1) * page_size}) if page_size > 0
81     opt.merge!({:order => 'system_pictures.updated_at desc'})
82     SystemPicture.find(:all, opt)
83   end
84   
85   def self.list_opt
86     {}
87   end
88   
89   def self.list_json_opt
90     {}
91   end
92   
93   def self.show sid, ad
94     opt = {}
95     opt.merge!(self.show_opt)
96     res = SystemPicture.find(sid, opt)
97     raise ActiveRecord::Forbidden unless res.visible?(ad)
98     res
99   end
100   
101   def self.show_opt
102     {}
103   end
104   
105   def self.show_json_opt
106     {}
107   end
108   
109   def store(imager)
110     unless imager
111       self.errors.add :base, 'illegal picture data'
112       return false
113     end
114     res = false
115     SystemPicture.transaction do
116       if res = self.save
117         begin
118           res = PictureIO.system_picture_io.put(imager.binary, self.filename)
119         rescue PictureIO::Error
120           res = false
121           self.errors.add :base, I18n.t('picture_io.error')
122           raise ActiveRecord::Rollback
123         end
124       end
125     end
126     res
127   end
128   
129   def self.store(imager)
130     attr = {:ext => imager.ext, :width => imager.width, :height => imager.height, :filesize => imager.filesize, :md5 => imager.md5}
131     sp = SystemPicture.modify_object(imager.md5, attr, 'md5')
132     res = sp.store imager
133     res ? sp : nil
134   end
135   
136   def restore(subdir = nil)
137     PictureIO.system_picture_io.get self.filename, subdir
138   end
139   
140 end