OSDN Git Service

Merge branch 'v06' of git.sourceforge.jp:/gitroot/pettanr/pettanr into v06
[pettanr/pettanr.git] / app / models / panel_picture.rb
1 class PanelPicture < ActiveRecord::Base
2   include Element
3   include ElementInspire
4   belongs_to :panel
5   belongs_to :picture
6   
7   validates :panel_id, :numericality => {:allow_blank => true}
8   validates :picture_id, :numericality => true, :existence => {:both => false}
9   validates :link, :length => {:maximum => 200}, :url => {:allow_blank => true, :message => I18n.t('errors.messages.url')}
10   validates :x, :presence => true, :numericality => true
11   validates :y, :presence => true, :numericality => true
12   validates :width, :presence => true, :numericality => true, :not_zero => true, :reverse => true, :resize => true, :sync_vh => true
13   validates :height, :presence => true, :numericality => true, :not_zero => true, :reverse => true, :resize => true, :sync_vh => true
14   validates :z, :presence => true, :numericality => {:greater_than => 0}
15   validates :t, :presence => true, :numericality => {:greater_than_or_equal_to => 0}
16   
17   before_validation :valid_encode
18   
19   def valid_encode
20     ['link', 'caption'].each do |a|
21       next if attributes[a] == nil
22       raise Pettanr::BadRequest unless attributes[a].valid_encoding?
23     end
24   end
25   
26   def self.list_opt_for_panel
27     {
28       :panel_pictures => {
29         :picture => {:artist => {}, :license => {}}
30       }
31     }
32   end
33   
34   def self.show_opt_for_panel
35     {
36       :panel_pictures => {
37         :picture => {:artist => {}, :license => {}}
38       }
39     }
40   end
41   
42   def self.json_opt_for_panel
43     {
44       :picture => {:artist => {}, :license => {}}
45     }
46   end
47   
48   def self.has_picture?
49     true
50   end
51   
52   def visible? roles
53     if MagicNumber['run_mode'] == 0
54       return false unless guest_role_check(roles)
55     else
56       return false unless reader_role_check(roles)
57     end
58     return true if self.panel.own?(roles)
59     self.panel.visible? roles
60   end
61   
62   def supply_default
63     self.x = 0
64     self.y = 0
65     if self.picture
66       self.width = self.picture.width 
67       self.height = self.picture.height 
68     end
69     if self.panel
70       self.t = self.panel.new_t 
71       self.z = self.panel.new_z 
72     end
73   end
74   
75   def overwrite  pid
76     self.panel_id = pid
77   end
78   
79   def flip
80     res = (self.height > 0 ? '' : 'v') + (self.width > 0 ? '' : 'h')
81     res += '/' unless res.empty?
82     res
83   end
84   
85   def filename
86     self.flip + self.picture.filename
87   end
88   
89   def url
90     '/pictures/' + self.filename
91   end
92   
93   def opt_div_style
94     "top:#{self.y}px; left:#{self.x}px; z-index:#{self.z}; position: absolute;"
95   end
96   
97   def opt_img_tag spot = nil, opacity = 20
98     o = (spot and spot != self) ? "opacity: #{opacity.to_f/100}; filter:alpha(opacity=#{opacity});" : ''
99     {:id => self.tag_id(:img), :panel_id => self.tag_panel_id, :element_id => self.tag_element_id, :element_type => self.tag_element_type,
100     :class => "panel-picture", :vPicture => self.id, 
101     :src => self.url, :width => self.width.abs, :height => self.height.abs, :picture_id => self.picture_id, :ext => self.picture.ext, :alt => self.caption, 
102     :style => "#{o}"}
103   end
104   
105   def tmb_opt_img_tag
106     tw, th = PettanImager.thumbnail_size(self.width.abs, self.height.abs)
107     {:src => self.url, :width => tw, :height => th, :alt => self.caption}
108   end
109   
110   def new_index
111     @new_index
112   end
113   
114   def new_index= v
115     @new_index = v
116   end
117   
118   def new_panel
119     @new_panel
120   end
121   
122   def new_panel= v
123     @new_panel = v
124   end
125   
126   def get_panel
127     self.panel || @new_panel
128   end
129   
130   def boost
131   end
132   
133   def tag_id c = nil
134     'panel' + tag_panel_id + 'panel_picture' + tag_element_id + c.to_s
135   end
136   
137   def field_tag_id f
138     self.tag_id + f.to_s
139   end
140   
141   def tag_panel_id
142     self.get_panel.new_record? ? '0' : self.get_panel.id.to_s
143   end
144   
145   def tag_element_id
146     self.new_record? ? '0' : self.id.to_s
147   end
148   
149   def tag_element_type
150     'panel_picture'
151   end
152   
153   def tag_new_index
154     self.new_index.to_s
155   end
156   
157   def self.default_page_size
158     25
159   end
160   
161   def self.max_page_size
162     100
163   end
164   
165   def self.page prm = nil
166     page = prm.to_i
167     page = 1 if page < 1
168     page
169   end
170   
171   def self.page_size prm = self.default_page_size
172     page_size = prm.to_i
173     page_size = self.max_page_size if page_size > self.max_page_size
174     page_size = self.default_page_size if page_size < 1
175     page_size
176   end
177   
178   def self.list_where
179     'panels.publish > 0'
180   end
181   
182   def self.mylist_where au
183     ['panels.author_id = ?', au.id]
184   end
185   
186   def self.himlist_where au
187     ['panels.author_id = ? and panels.publish > 0', au.id]
188   end
189   
190   def self.list page = 1, page_size = self.default_page_size
191     PanelPicture.where(self.list_where()).includes(PanelPicture.list_opt).order('panel_pictures.updated_at desc').offset((page -1) * page_size).limit(page_size)
192   end
193   
194   def self.mylist au, page = 1, page_size = Author.default_panel_picture_page_size
195     PanelPicture.where(self.mylist_where(au)).includes(PanelPicture.list_opt).order('panel_pictures.updated_at desc').offset((page -1) * page_size).limit(page_size)
196   end
197   
198   def self.himlist au, page = 1, page_size = Author.default_panel_picture_page_size
199     PanelPicture.where(self.himlist_where(au)).includes(PanelPicture.list_opt).order('panel_pictures.updated_at desc').offset((page -1) * page_size).limit(page_size)
200   end
201   
202   def self.list_paginate page = 1, page_size = self.default_page_size
203     Kaminari.paginate_array(Array.new(PanelPicture.where(self.list_where()).includes(PanelPicture.list_opt).count, nil)).page(page).per(page_size)
204   end
205   
206   def self.mylist_paginate au, page = 1, page_size = Author.default_panel_picture_page_size
207     Kaminari.paginate_array(Array.new(PanelPicture.where(self.mylist_where(au)).includes(PanelPicture.list_opt).count, nil)).page(page).per(page_size)
208   end
209   
210   def self.himlist_paginate au, page = 1, page_size = Author.default_panel_picture_page_size
211     Kaminari.paginate_array(Array.new(PanelPicture.where(self.himlist_where(au)).includes(PanelPicture.list_opt).count, nil)).page(page).per(page_size)
212   end
213   
214   def self.list_opt
215     {:panel => {:author => {}}, :picture => {:artist => {}, :license => {}} }
216   end
217   
218   def self.list_json_opt
219     {:include => {:panel => {:include => {:author => {}}}, :picture => {:include => {:artist => {}, :license => {}}} }}
220   end
221   
222   def self.show cid, au
223     opt = {}
224     opt.merge!(PanelPicture.show_opt)
225     res = PanelPicture.find(cid, opt)
226     raise ActiveRecord::Forbidden unless res.visible?(au)
227     res
228   end
229   
230   def self.show_opt
231     {:include => {:panel => {:author => {}}, :picture => {:artist => {}, :license => {}}}}
232   end
233   
234   def self.show_json_opt
235     {:include => {:panel => {:include => {:author => {}}}, :picture => {:include => {:artist => {}, :license => {}}} }}
236   end
237   
238   def store au
239     if self.new_record?
240       self.panel.panel_pictures.build(self.attributes)
241     else
242       self.panel.panel_pictures.each do |panel_picture|
243         next unless panel_picture == self
244         attr = self.attributes
245         attr.delete 'id'
246         panel_picture.attributes = attr
247         break
248       end
249     end
250     self.panel.store({}, au)
251   end
252   
253   def remove au
254     self.panel.remove_element(self, au)
255   end
256   
257   def scenario
258     if caption.blank?
259       ''
260     else
261       '<p>' + ERB::Util.html_escape(self.caption) + '</p>'
262     end
263   end
264   
265   def plain_scenario
266     if caption.blank?
267       ''
268     else
269       self.caption + "\n"
270     end
271   end
272   
273 end