OSDN Git Service

temp
[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 symbol_option
57     self.tmb_opt_img_tag
58   end
59   
60   def self.default_page_size
61     25
62   end
63   
64   def self.max_page_size
65     100
66   end
67   
68   def self.page prm = nil
69     page = prm.to_i
70     page = 1 if page < 1
71     page
72   end
73   
74   def self.page_size prm = self.default_page_size
75     page_size = prm.to_i
76     page_size = self.max_page_size if page_size > self.max_page_size
77     page_size = self.default_page_size if page_size < 1
78     page_size
79   end
80   
81   def self.list_where
82     nil
83   end
84   
85   def self.list page = 1, page_size = self.default_page_size
86     SystemPicture.where(self.list_where()).includes(SystemPicture.list_opt).order('system_pictures.updated_at desc').offset((page -1) * page_size).limit(page_size)
87   end
88   
89   def self.list_paginate page = 1, page_size = self.default_page_size
90     Kaminari.paginate_array(Array.new(SystemPicture.where(self.list_where()).count, nil)).page(page).per(page_size)
91   end
92   
93   def self.list_opt
94     {}
95   end
96   
97   def self.list_json_opt
98     {}
99   end
100   
101   def self.show sid, ad
102     opt = {}
103     opt.merge!(self.show_opt)
104     res = SystemPicture.find(sid, opt)
105     raise ActiveRecord::Forbidden unless res.visible?(ad)
106     res
107   end
108   
109   def self.show_opt
110     {}
111   end
112   
113   def self.show_json_opt
114     {}
115   end
116   
117   def store(imager)
118     unless imager
119       self.errors.add :base, 'illegal picture data'
120       return false
121     end
122     res = false
123     SystemPicture.transaction do
124       if res = self.save
125         begin
126           res = PictureIO.system_picture_io.put(imager.binary, self.filename)
127         rescue PictureIO::Error
128           res = false
129           self.errors.add :base, I18n.t('picture_io.error')
130           raise ActiveRecord::Rollback
131         end
132       end
133     end
134     res
135   end
136   
137   def self.store(imager)
138     attr = {:ext => imager.ext, :width => imager.width, :height => imager.height, :filesize => imager.filesize, :md5 => imager.md5}
139     sp = SystemPicture.modify_object(imager.md5, attr, 'md5')
140     res = sp.store imager
141     res ? sp : nil
142   end
143   
144   def restore(subdir = nil)
145     PictureIO.system_picture_io.get self.filename, subdir
146   end
147   
148 end