OSDN Git Service

19c993d21f8c9e384b9ebdf1f47f9ab1ffbc9ce9
[pettanr/pettanr.git] / app / models / original_picture.rb
1 class OriginalPicture < ActiveRecord::Base
2   belongs_to :artist
3   has_one :resource_picture
4   
5   validates :ext, :presence => true, :length => {:maximum => 4}, :inclusion => {:in => ['png', 'jpeg', 'gif']}\r
6   validates :width, :presence => true, :numericality => true, :natural_number => true
7   validates :height, :presence => true, :numericality => true, :natural_number => true
8   validates :filesize, :presence => true, :numericality => {:greater_than => 0, :less_than_or_equal_to => 2000000}, :natural_number => true
9   validates :artist_id, :presence => true, :numericality => true, :existence => true
10   
11   before_destroy :destroy_with_file
12   
13   def supply_default art
14   end
15   
16   def self.default_page_size
17     25
18   end
19   
20   def self.max_page_size
21     100
22   end
23   
24   def self.page prm = nil
25     page = prm.to_i
26     page = 1 if page < 1
27     page
28   end
29   
30   def self.page_size prm = self.default_page_size
31     page_size = prm.to_i
32     page_size = self.max_page_size if page_size > self.max_page_size
33     page_size = self.default_page_size if page_size < 1
34     page_size
35   end
36   
37   def self.list artist_id, opt = {}, page = 1, page_size = self.default_page_size
38     opt.merge!(self.list_opt) unless opt[:include]
39     opt.merge!({:conditions => ['artist_id = ?', artist_id], 
40       :order => 'updated_at desc', :limit => page_size, :offset => (page -1) * page_size}
41     )
42     OriginalPicture.find(:all, opt)
43   end
44   
45   def self.list_opt
46     {:include => {:resource_picture => {}}}
47   end
48   
49   def self.list_json_opt
50     {:include => {:resource_picture => {}}}
51   end
52   
53   def self.show cid, artist, opt = {}
54     pic = OriginalPicture.find(cid, :include => self.show_include_opt(opt))
55     raise ActiveRecord::Forbidden unless pic.own?(artist)
56     pic
57   end
58   
59   def self.edit cid, artist, opt = {}
60     pic = OriginalPicture.find(cid, :include => self.show_include_opt(opt))
61     raise ActiveRecord::Forbidden unless pic.own?(artist)
62     pic
63   end
64   
65   def self.show_include_opt opt = {}
66     res = {:resource_picture => {}}
67     res.merge!(opt[:include]) if opt[:include]
68     res
69   end
70   
71   def self.show_json_include_opt
72     {:include => {:resource_picture => {}}}
73   end
74   
75   def destroy_with_file
76     PictureIO.original_picture_io.delete self.filename
77     self.resource_picture.destroy
78   end
79   
80   def dext
81     self.ext.downcase
82   end
83   
84   def filename
85     "#{self.id}.#{self.dext}"
86   end
87   
88   def mime_type
89     "image/#{self.dext}"
90   end
91   
92   def url
93     '/original_pictures/' + filename
94   end
95   
96   def data_to_mgk picture_data
97     begin
98       mgk = Magick::Image.from_blob(picture_data).shift
99     rescue 
100       self.errors.add :base, 'magick failed'
101       return false
102     end
103     mgk
104   end
105   
106   def store(picture_data, art)
107     mgk = data_to_mgk picture_data
108     return false unless mgk
109     res = false
110     self.attributes = {:ext => mgk.format.downcase, :width => mgk.columns, :height => mgk.rows, 
111       :filesize => mgk.filesize, :artist_id => art.id
112     }
113     OriginalPicture.transaction do
114       if res = self.save
115         if res = PictureIO.original_picture_io.put(picture_data, self.filename)
116           res = true
117         else
118           self.errors.add :base, 'original picture io does not work'
119           raise ActiveRecord::Rollback
120         end
121       end
122     end
123     res
124   end
125   
126   def restore(subdir = nil)
127     PictureIO.original_picture_io.get self.filename, subdir
128   end
129   
130   def own? art
131     return false unless art
132     self.artist_id == art.id
133   end
134   
135 end