X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=app%2Fmodels%2Fscroll_panel.rb;h=e70bc5d8f961e968da2beb213fa0cd2360e287d4;hb=07c57b2b6d0d2e8c1e0c0d55dd8266cf62c7c05c;hp=f1314b42f20c30712265402440a7c5c2bff135cb;hpb=02ea4fc4bbe7a54dd576c1cd700aa9e32710abf8;p=pettanr%2Fpettanr.git diff --git a/app/models/scroll_panel.rb b/app/models/scroll_panel.rb index f1314b42..e70bc5d8 100644 --- a/app/models/scroll_panel.rb +++ b/app/models/scroll_panel.rb @@ -1,4 +1,5 @@ -class ScrollPanel < ActiveRecord::Base +class ScrollPanel < Peta::Leaf + load_manifest belongs_to :author belongs_to :panel belongs_to :scroll @@ -14,132 +15,35 @@ class ScrollPanel < ActiveRecord::Base self.t = nil end - def overwrite au - return false unless au - self.author_id = au.id + def overwrite operators + return false unless operators.author + self.author_id = operators.author.id end - def own? roles - roles = [roles] unless roles.respond_to?(:each) - au = ScrollPanel.get_author_from_roles roles - return false unless au - self.author_id == au.id - end - - def visible? roles - if MagicNumber['run_mode'] == 0 - return false unless guest_role_check(roles) - else - return false unless reader_role_check(roles) - end - return true if self.scroll.own?(roles) - self.scroll.visible? roles - end - - def self.default_panel_size - 30 - end - - def self.max_panel_size - 200 - end - - def self.offset cnt, prm = nil - offset = prm.to_i - offset = cnt - 1 if offset >= cnt - offset = cnt - offset.abs if offset < 0 - offset = 0 if offset < 0 - offset - end - - def self.panel_count cnt, prm = self.default_panel_size - count = prm.to_i - count = self.max_panel_size if count > self.max_panel_size - count = self.default_panel_size if count < 1 - count - end - - def self.default_page_size - 25 - end - - def self.max_page_size - 100 - end - - def self.page prm = nil - page = prm.to_i - page = 1 if page < 1 - page - end - - def self.page_size prm = self.default_page_size - page_size = prm.to_i - page_size = self.max_page_size if page_size > self.max_page_size - page_size = self.default_page_size if page_size < 1 - page_size - end - - def self.play_list_where cid - ['scroll_panels.scroll_id = ?', cid] + def self.public_list_order + 'scroll_panels.updated_at desc' end def self.list_where 'scrolls.visible > 0' end - def self.mylist_where au - ['scroll_panels.author_id = ?', au.id] + def self.by_author_list_includes + { + :scroll => { + :author => {} + } + } end - def self.himlist_where au - ['scroll_panels.author_id = ? and scrolls.visible > 0', au.id] + def self.play_list_where cid + ['scroll_panels.scroll_id = ?', cid] end def self.play_list scroll, author, offset = 0, limit = ScrollPanel.default_panel_size ScrollPanel.where(self.play_list_where(scroll.id)).includes(ScrollPanel.list_opt).order('scroll_panels.t').offset(offset).limit(limit) end - def self.list page = 1, page_size = self.default_page_size - ScrollPanel.where(self.list_where()).includes(ScrollPanel.list_opt).order('scroll_panels.updated_at desc').offset((page -1) * page_size).limit(page_size) - end - - def self.mylist au, page = 1, page_size = Author.default_scroll_panel_page_size - ScrollPanel.where(self.mylist_where(au)).includes(ScrollPanel.list_opt).order('scroll_panels.updated_at desc').offset((page -1) * page_size).limit(page_size) - end - - def self.himlist au, page = 1, page_size = Author.default_scroll_panel_page_size - ScrollPanel.where(self.himlist_where(au)).includes(ScrollPanel.list_opt).order('scroll_panels.updated_at desc').offset((page -1) * page_size).limit(page_size) - end - - def self.list_paginate page = 1, page_size = self.default_page_size - Kaminari.paginate_array(Array.new(ScrollPanel.where(self.list_where()).includes(ScrollPanel.list_opt).count, nil)).page(page).per(page_size) - end - - def self.mylist_paginate au, page = 1, page_size = Author.default_scroll_panel_page_size - Kaminari.paginate_array(Array.new(ScrollPanel.where(self.mylist_where(au)).includes(ScrollPanel.list_opt).count, nil)).page(page).per(page_size) - end - - def self.himlist_paginate au, page = 1, page_size = Author.default_scroll_panel_page_size - Kaminari.paginate_array(Array.new(ScrollPanel.where(self.himlist_where(au)).includes(ScrollPanel.list_opt).count, nil)).page(page).per(page_size) - end - - def self.list_by_scroll_where scroll_id - ['scroll_panels.scroll_id = ?', scroll_id] - end - - def self.list_by_scroll scroll_id, roles, page = 1, page_size = self.default_page_size - self.where(self.list_by_scroll_where(scroll_id)).includes(self.list_opt).order('scroll_panels.updated_at desc').offset((page -1) * page_size).limit(page_size) - end - - def self.list_by_panel_where panel_id - ['scroll_panels.panel_id = ?', panel_id] - end - - def self.list_by_panel panel_id, roles, page = 1, page_size = self.default_page_size - self.where(self.list_by_panel_where(panel_id)).includes(self.list_opt).order('scroll_panels.updated_at desc').offset((page -1) * page_size).limit(page_size) - end - def self.list_opt { :author => {}, @@ -168,22 +72,6 @@ class ScrollPanel < ActiveRecord::Base }} end - def self.show spid, roles - opt = {} - opt.merge!(ScrollPanel.show_opt) - res = ScrollPanel.find spid, opt - raise ActiveRecord::Forbidden unless res.visible?(roles) - res - end - - def self.edit spid, au - opt = {} - opt.merge!(ScrollPanel.show_opt) - res = ScrollPanel.find spid, opt - raise ActiveRecord::Forbidden unless res.own?(au) - res - end - def self.show_opt {:include => { :author => {}, @@ -223,85 +111,15 @@ class ScrollPanel < ActiveRecord::Base r end - def self.new_t scroll_id - r = ScrollPanel.max_t(scroll_id) - r.blank? ? 0 : r.to_i + 1 - end - - def self.max_t scroll_id - ScrollPanel.maximum(:t, :conditions => ['scroll_id = ?', scroll_id]) - end - - def self.find_t scroll_id, t - ScrollPanel.find(:first, :conditions => ['scroll_id = ? and t = ?', scroll_id, t]) - end - - def self.collect_t scroll_panel - r = ScrollPanel.find(:all, :conditions => ['scroll_id = ?', scroll_panel.scroll_id], :order => 't') - r.map {|sp| sp.t} - end - - def self.serial? ary - i = 0 - ary.compact.sort.each do |t| - break false unless t == i - i += 1 - end - ary.compact.size == i - end - - def self.validate_t scroll_panel - ScrollPanel.serial?(ScrollPanel.collect_t(scroll_panel)) - end - - def insert_shift - ScrollPanel.update_all('t = t + 1', ['scroll_id = ? and t >= ?', self.scroll_id, self.t]) - end - - def lesser_shift old_t - self.t = 0 if self.t < 0 - ScrollPanel.update_all('t = t + 1', ['scroll_id = ? and (t >= ? and t < ?)', self.scroll_id, self.t, old_t]) - end - - def higher_shift old_t - nf = ScrollPanel.find_t(self.scroll_id, self.t) - max_t = ScrollPanel.max_t(self.scroll_id).to_i - self.t = max_t if self.t > max_t - ScrollPanel.update_all('t = t - 1', ['scroll_id = ? and (t > ? and t <= ?)', self.scroll_id, old_t, self.t]) - end - - def update_shift old_t - if self.t > old_t - higher_shift old_t - else - lesser_shift old_t - end - end - - def rotate old_t = nil - if self.new_record? - if self.t.blank? - self.t = ScrollPanel.new_t self.scroll_id - else - self.insert_shift - end - else - if self.t.blank? - else - self.update_shift old_t - end - end - end - - def allow? + def allow? operators return nil if self.scroll_id == nil or self.panel_id == nil - self.scroll.own?(self.author) and self.panel.usable?(self.author) + self.scroll.own?(operators) and self.panel.usable?(operators) end - def store old_t = nil + def store operators, old_t = nil res = false ScrollPanel.transaction do - case self.allow? + case self.allow? operators when true self.rotate old_t when false @@ -310,7 +128,7 @@ class ScrollPanel < ActiveRecord::Base end res = self.save raise ActiveRecord::Rollback unless res - res = ScrollPanel.validate_t(self) + res = ScrollPanel.validate_t(self.scroll_id) unless res self.errors.add :t, 'unserialized' raise ActiveRecord::Rollback @@ -319,14 +137,4 @@ class ScrollPanel < ActiveRecord::Base res end - def destroy_and_shorten - res = false - ScrollPanel.transaction do - ScrollPanel.update_all('t = t - 1', ['scroll_id = ? and (t > ?)', self.scroll_id, self.t]) - raise ActiveRecord::Rollback unless self.destroy - res = true - end - res - end - end