X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=app%2Fmodels%2Fspeech_balloon.rb;h=367af4ad552594b64ccf75037a35563bb7d32ee1;hb=0ead3a286b925e86845cf8211982a7985e522813;hp=06e1881ffb953cbcede7dfc9abbf142ee4861b04;hpb=1ae8f4622fb56a3de063ff69a0ae263fec090672;p=pettanr%2Fpettanr.git diff --git a/app/models/speech_balloon.rb b/app/models/speech_balloon.rb index 06e1881f..367af4ad 100644 --- a/app/models/speech_balloon.rb +++ b/app/models/speech_balloon.rb @@ -1,45 +1,53 @@ -class SpeechBalloon < ActiveRecord::Base - include Element - include ElementInspire +class SpeechBalloon < Peta::Element + load_manifest has_one :balloon, :dependent => :destroy has_one :speech, :dependent => :destroy belongs_to :speech_balloon_template belongs_to :panel - accepts_nested_attributes_for :balloon - accepts_nested_attributes_for :speech + accepts_nested_attributes_for :balloon, :allow_destroy => true + accepts_nested_attributes_for :speech, :allow_destroy => true validates :panel_id, :numericality => {:allow_blank => true} validates :speech_balloon_template_id, :presence => true, :numericality => true, :existence => {:both => false} - validates :classname, :presence => true, :length => {:maximum => 50} + validates :speech_balloon_template_module_name, :presence => true, :length => {:maximum => 50} validates :z, :presence => true, :numericality => {:greater_than => 0} validates :t, :presence => true, :numericality => {:greater_than_or_equal_to => 0} - validates :settings, :extend_speech_balloon => true + validates :speech_balloon_template_settings, :boost => {:boost_name => :speech_balloon_template} - before_validation :valid_encode + scope :with_panel, -> do + includes(:panel) + end - def valid_encode - ['caption', 'classname', 'settings'].each do |a| - next if attributes[a] == nil - raise Pettanr::BadRequest unless attributes[a].valid_encoding? - end + scope :with_speech_balloon_template, -> do + includes(:speech_balloon_template) end - def self.list_opt_for_panel - { - :speech_balloons => {:balloon => {}, :speech => {}} - } + scope :find_index, -> do + with_panel.where(Panel.arel_table[:publish].gt 0).references(:panel) end - def self.show_opt_for_panel - { - :speech_balloons => {:balloon => {}, :speech => {}} - } + scope :find_private, -> (operators) do + with_panel.where(Panel.arel_table[:author_id].eq operators.author.id).references(:panel) + end + + scope :find_by_panel, -> (panel_id) do + find_index.where(panel_id: panel_id).references(:panel) + end + + scope :find_by_speech_balloon_template, -> (speech_balloon_template_id) do + find_index.where(speech_balloon_template_id: speech_balloon_template_id).references(:panel) + end + + scope :find_by_author, -> (author_id) do + find_index.where(Panel.arel_table[:author_id].eq author_id).references(:panel) end - def self.json_opt_for_panel + def self.by_author_list_includes { - :balloon => {}, :speech => {} + :panel => { + :author => {} + } } end @@ -58,212 +66,22 @@ class SpeechBalloon < ActiveRecord::Base self.panel_id = pid 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.panel.own?(roles) - self.panel.visible? roles - end - - def new_sballoon - @new_balloon - end - - def new_balloon= v - @new_balloon = v + def symbol_option + self.speech_balloon_template.symbol_option end - def get_balloon - self.balloon || @new_balloon + def filer_caption + self.plain_scenario end - def new_speech - @new_speech - end - - def new_speech= v - @new_speech = v - end - - def get_speech - self.speech || @new_speech - end - - def boost - self.extend self.speech_balloon_template.engine_speech_balloon_module - if self.balloon - else - self.new_balloon = self.build_balloon - self.new_speech = self.build_speech - end - self.balloon.extend self.speech_balloon_template.engine_balloon_module - self.speech.extend self.speech_balloon_template.engine_speech_module - self.balloon.new_parent = self - self.speech.new_parent = self - self.extend_speech_balloon = if self.settings.blank? - {} - else - JSON.parse(self.settings) - end - self.balloon.extend_balloon = if self.balloon.settings.blank? - {} - else - JSON.parse(self.get_balloon.settings) - end - self.speech.extend_speech = if self.speech.settings.blank? - {} - else - JSON.parse(self.get_speech.settings) - end - end - - def self.fold_extend_settings params - speech_balloon_settings = params[:speech_balloon][:settings] - if speech_balloon_settings.is_a?(Hash) - params[:speech_balloon][:settings] = speech_balloon_settings.to_json - end - balloon_settings = params[:speech_balloon][:balloon_attributes][:settings] - if balloon_settings.is_a?(Hash) - params[:speech_balloon][:balloon_attributes][:settings] = balloon_settings.to_json - end - speech_settings = params[:speech_balloon][:speech_attributes][:settings] - if speech_settings.is_a?(Hash) - params[:speech_balloon][:speech_attributes][:settings] = speech_settings.to_json - end - end - - def tag_element_type - 'speech_balloon' - 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.list_where + def self.public_list_where list 'panels.publish > 0' end - def self.mylist_where au - ['panels.author_id = ?', au.id] - end - - def self.himlist_where au - ['panels.author_id = ? and panels.publish > 0', au.id] - end - - def self.list page = 1, page_size = self.default_page_size - SpeechBalloon.where(self.list_where()).includes(SpeechBalloon.list_opt).order('speech_balloons.updated_at desc').offset((page -1) * page_size).limit(page_size) - end - - def self.mylist au, page = 1, page_size = Author.default_speech_balloon_page_size - SpeechBalloon.where(self.mylist_where(au)).includes(SpeechBalloon.list_opt).order('speech_balloons.updated_at desc').offset((page -1) * page_size).limit(page_size) - end - - def self.himlist au, page = 1, page_size = Author.default_speech_balloon_page_size - SpeechBalloon.where(self.himlist_where(au)).includes(SpeechBalloon.list_opt).order('speech_balloons.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(SpeechBalloon.where(self.list_where()).includes(SpeechBalloon.list_opt).count, nil)).page(page).per(page_size) - end - - def self.mylist_paginate au, page = 1, page_size = Author.default_speech_balloon_page_size - Kaminari.paginate_array(Array.new(SpeechBalloon.where(self.mylist_where(au)).includes(SpeechBalloon.list_opt).count, nil)).page(page).per(page_size) - end - - def self.himlist_paginate au, page = 1, page_size = Author.default_speech_balloon_page_size - Kaminari.paginate_array(Array.new(SpeechBalloon.where(self.himlist_where(au)).includes(SpeechBalloon.list_opt).count, nil)).page(page).per(page_size) - end - - def self.list_opt - {:panel => {:author => {}}, :balloon => {}, :speech => {}, :speech_balloon_template => {} } - end - - def self.list_json_opt - {:include => {:panel => {:include => {:author => {} }}, :balloon => {}, :speech => {}, :speech_balloon_template => {} }} - end - - def self.show cid, au - opt = {} - opt.merge!(SpeechBalloon.show_opt) - res = SpeechBalloon.find(cid, opt) - raise ActiveRecord::Forbidden unless res.visible?(au) - res - end - def self.show_opt {:include => {:panel => {:author => {}}, :balloon => {}, :speech => {}, :speech_balloon_template => {} }} end - def self.show_json_opt - {:include => {:panel => {:include => {:author => {} }}, :balloon => {}, :speech => {}, :speech_balloon_template => {} }} - end - - def store au, attr - if self.new_record? - sb = self.panel.speech_balloons.build - sb.attributes = attr - else - self.panel.speech_balloons.each do |speech_balloon| - next unless speech_balloon == self - attr.delete 'id' - speech_balloon.attributes = attr - break - end - end - self.panel.store({}, au) - end - - def remove au - self.panel.remove_element(self, au) - end - - def parts - @parts ||= [self.balloon, self.speech] - end - - def engine_path_name - self.speech_balloon_template.engine_name + '/' - end - - def path_name with_engine = false - (with_engine ? self.engine_path_name : '') + - self.class.path_name - end - - def form_template with_engine = false - self.path_name(true) + '/form' - end - - def speech_form_template with_engine = false - self.engine_path_name + 'speeches/form' - end - - def balloon_form_template with_engine = false - self.engine_path_name + 'balloons/form' - end - def scenario_template with_engine = false self.path_name(true) + '/scenario' end