X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=app%2Fmodels%2Fpanel.rb;h=bbdf9ed17941d5b4965c1966cce25ce57f2ffc11;hb=0174862d186425888ff64ffe1fa52c6266708049;hp=4328e91dc179af35620c26eb880cfa69d2e171e1;hpb=b7f9906380e4b62096d776fe9ad15ba3c4fd4ba4;p=pettanr%2Fpettanr.git diff --git a/app/models/panel.rb b/app/models/panel.rb index 4328e91d..bbdf9ed1 100644 --- a/app/models/panel.rb +++ b/app/models/panel.rb @@ -1,257 +1,294 @@ #コマ -class Panel < ActiveRecord::Base +class Panel < Peta::Root + load_manifest belongs_to :author - belongs_to :resource_picture -# belongs_to :background_picture, :class_name => 'ResourcePicture' - has_many :stories + has_many :scroll_panels + has_many :sheet_panels has_many :panel_pictures, :dependent => :destroy has_many :speech_balloons, :dependent => :destroy + has_many :ground_pictures, :dependent => :destroy + has_many :ground_colors, :dependent => :destroy accepts_nested_attributes_for :panel_pictures, :allow_destroy => true accepts_nested_attributes_for :speech_balloons, :allow_destroy => true + accepts_nested_attributes_for :ground_pictures, :allow_destroy => true + accepts_nested_attributes_for :ground_colors, :allow_destroy => true validates :width, :presence => true, :numericality => true, :natural_number => true validates :height, :presence => true, :numericality => true, :natural_number => true validates :border, :presence => true, :numericality => {:greater_than_or_equal_to => 0} - validates :x, :numericality => {:allow_blank => true} - validates :y, :numericality => {:allow_blank => true} - validates :z, :numericality => {:allow_blank => true, :greater_than => 0} - validates :author_id, :presence => true, :numericality => true, :existence => true + validates :author_id, :presence => true, :numericality => true, :existence => {:both => false} + validates :publish, :presence => true, :numericality => true def supply_default self.border = 2 + self.publish = 0 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 self.collect_element_value elements, name, ex_nil = false - e = elements.map {|e| - e.map {|o| - o[name] - } - }.flatten - e = e.compact if ex_nil - e + def visible? operators + case super + when nil # super return + return true + when false + return false + else + return true if self.new_record? + self.publish? + end end - def self.validate_id ary, pid - ary.map {|v| - if pid - (v == pid or v == nil) ? nil : false - else - v ? false : nil - end - }.compact.empty? + def usable? operators + self.visible? operators end - def self.validate_element_id elements, name, pid - Panel.validate_id(Panel.collect_element_value(elements, name), pid) + def publish? + self.publish > 0 end - def self.validate_elements_id c - c.map {|conf| - Panel.validate_element_id(conf[:elements], conf[:name], conf[:parent_id]) ? nil : false - }.compact.empty? + def style + { + 'width' => self.width.to_s + 'px', 'height' => self.height.to_s + 'px', + 'border-style' => 'solid', 'border-width' => self.border.to_s + 'px', + 'border-color' => 'black', 'background-color' => 'white' + } end - def self.validate_t ary - i = 0 - ary.compact.sort.each do |t| - break false unless t == i - i += 1 - end - ary.compact.size == i + # ground_picture element template + def style_wh + { + 'width' => self.width.to_s + 'px', 'height' => self.height.to_s + 'px' + } end - def self.validate_element_t elements, name - Panel.validate_t(Panel.collect_element_value(elements, name, true)) + def self.public_list_where + 'panels.publish > 0' end - def self.validate_elements_t c - c.map {|conf| - Panel.validate_element_t(conf[:elements], conf[:name]) ? nil : false - }.compact.empty? + def self.list_order + 'panels.updated_at desc' end - def validate_id_list - r = self.speech_balloons.map {|sb| - {:elements => [sb.speeches, sb.balloons], :name => :speech_balloon_id, :parent_id => sb.id} + def self.list_opt + r = { + :author => {} } - r.unshift({:elements => [self.panel_pictures, self.speech_balloons], :name => :panel_id, :parent_id => self.id}) + self.child_models.each do |child_model| + r.merge!(child_model.list_opt_for_panel) + end r end - def validate_child - r1 = Panel.validate_elements_id validate_id_list - r2 = Panel.validate_elements_t [ - {:elements => [self.panel_pictures, self.speech_balloons], :name => :t} - ] - r1 and r2 + def self.show_opt + r = { + :author => {} + } + self.child_models.each do |child_model| + r.merge!(child_model.show_opt_for_panel) + end + {:include => r} end - def store - res = false - Panel.transaction do - unless validate_child - self.errors.add :base , 'invalid time' - raise ActiveRecord::Rollback - end - res = self.save - end - res + def parts_element + self.elements_items end - def self.default_page_size - 25 + def zorderd_elements + res = [] + self.parts_element.each do |e| + res[e.z-1] = e + end + res end - def self.max_page_size - 100 + def panel_elements + res = [] + self.parts_element.each do |e| + res[e.t] = e + end + res end - def self.page prm = nil - page = prm.to_i - page = 1 if page < 1 - page + def elements + self.panel_elements.map {|e| + #(-_-;)<... kore wa hidoi + JSON.parse e.to_json({:include => e.class.json_opt_for_panel}) + } 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 + def panel_elements_as_json + self.to_json({:include => {:author => {}}, :methods => :elements}) 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 + def self.list_as_json_text ary + '[' + ary.map {|i| i.panel_elements_as_json }.join(',') + ']' end - def self.list opt = {}, page = 1, page_size = self.default_page_size - opt.merge!(self.list_opt) unless opt[:include] - opt.merge!({:conditions => 'panels.publish > 0', :order => 'panels.updated_at desc', :limit => page_size, :offset => (page -1) * page_size}) - Panel.find(:all, opt) + def new_t + self.panel_elements.size end - def self.list_opt - {:include => { - :panel_pictures => { - :picture => {:artist => {}, :license => {}} - }, - :speech_balloons => {:balloons => {}, :speeches => {}}, - :author => {} - }} + def new_z + self.panel_elements.size + 1 end - def self.list_json_opt - {:include => { - :panel_pictures => { - :picture => {:artist => {}, :license => {}} - }, - :speech_balloons => {:balloons => {}, :speeches => {}}, - :author => {} - }} + def scenario + panel_elements.map { |e| + e.scenario + }.join end - def self.mylist au, opt = {}, page = 1, panel_page_size = Author.default_panel_page_size - opt.merge!(self.list_opt) unless opt[:include] - opt.merge!({:conditions => ['panels.author_id = ?', au.id], :order => 'panels.updated_at desc', :limit => panel_page_size, :offset => (page -1) * page_size}) - Panel.find(:all, opt) + def plain_scenario + panel_elements.map { |e| + e.plain_scenario + }.join end - def self.show rid, au, opt = {} - r = Panel.find(rid, :include => self.show_include_opt(opt)) - raise ActiveRecord::Forbidden unless r.visible?(au) + def licensed_pictures + r = {} + self.panel_elements.each do |elm| + next unless elm.class.has_picture? + r[elm.picture_id] = elm.picture unless r[elm.picture_id] + end r end - def self.edit rid, au, opt = {} - r = Panel.find(rid, :include => self.show_include_opt(opt)) - raise ActiveRecord::Forbidden unless r.own?(au) - r + def self.visible_count + Panel.count end - def self.show_include_opt opt = {} - res = { - :panel_pictures => { - :picture => {:artist => {}, :license => {}} - }, - :speech_balloons => {:balloons => {}, :speeches => {}}, - :author => {} + def self.collect_element_value elements, name + elements.map {|e| + if e['_destroy'] or e[:_destroy] + nil + else + e[name] + end } - res.merge!(opt[:include]) if opt[:include] - res end - def self.show_json_include_opt - {:include => { - :panel_pictures => { - :picture => {:artist => {}, :license => {}} - }, - :speech_balloons => {:balloons => {}, :speeches => {}}, - :author => {} - }} + def self.validate_serial ary, offset = 0 + i = offset + ary.compact.sort.each do |n| + break false unless n == i + i += 1 + end + ary.compact.size == i - offset end - def visible? au - return false unless au - self.own?(au) or self.publish? + def self.validate_element_serial elements, name, offset = 0 + Panel.validate_serial(Panel.collect_element_value(elements, name), offset) end - def own? author - return false unless author - self.author_id == author.id + def self.validate_elements_serial c + c.map {|conf| + Panel.validate_element_serial(conf[:elements], conf[:name], conf[:offset]) ? nil : false + }.compact.empty? end - def usable? au - visible? au + def validate_serial_list + [ + {:elements => self.elements_items, :name => :t, :offset => 0}, + {:elements => self.elements_items, :name => :z, :offset => 1} + ] end - - def publish? - self.publish > 0 + def validate_child +# r1 = Panel.validate_elements_id validate_id_list + Panel.validate_elements_serial validate_serial_list end - def sort_by_time - pe = [] - self.panel_pictures.each do |picture| - pe[picture.t] = picture + def store attr, operators + if attr == false + self.errors.add :base, I18n.t('errors.invalid_json') + return false end - self.speech_balloons.each do |sb| - pe[sb.t] = sb + self.attributes = attr + self.overwrite operators + res = false + Panel.transaction do + self.boosts 'post' +#self.publish = nil + res = self.save + unless validate_child + res = false + self.errors.add :base, I18n.t('errors.invalid_t') + raise ActiveRecord::Rollback + end end - pe + res end - def each_element - self.sort_by_time.each do |e| - yield e + def remove_element target, operators + ct = target.t + cz = target.z + panel_attributes = {} + self.panel_elements.each do |elm| + attr = elm.attributes + if elm == target + attr['_destroy'] = true + end + if elm.t > ct + attr['t'] -= 1 + end + if elm.z > cz + attr['z'] -= 1 + end + panel_attributes[elm.class.to_s.tableize + '_attributes'] ||= {} + panel_attributes[elm.class.to_s.tableize + '_attributes'][elm.id] = attr end + self.store(panel_attributes, operators) end - def panel_elements - res = [] - self.each_element do |elm| - if elm.kind_of?(PanelPicture) - res[elm.t] = elm.to_json({:include => :resource_picture}) - end - if elm.kind_of?(SpeechBalloon) - res[elm.t] = elm.to_json({:include => {:balloons => {}, :speeches => {}}}) + def destroy_with_elements + res = false + Panel.transaction do + self.parts_element.each do |element| + raise ActiveRecord::Rollback unless element.destroy end + raise ActiveRecord::Rollback unless self.destroy + res = true end res end - def to_json_play - self.to_json :methods => :panel_elements + def self.panelize panel + attr = panel.attributes + attr.delete 'id' + attr end - def self.visible_count - Panel.count + +=begin + def self.validate_id ary, pid + ary.map {|v| + if pid + (v == pid or v == nil) ? nil : false + else + v ? false : nil + end + }.compact.empty? + end + + def self.validate_element_id elements, name, pid + Panel.validate_id(Panel.collect_element_value(elements, name), pid) + end + + def self.validate_elements_id c + c.map {|conf| + Panel.validate_element_id(conf[:elements], conf[:name], conf[:parent_id]) ? nil : false + }.compact.empty? + end + + def validate_id_list + r = self.speech_balloons.map {|sb| + {:elements => [sb.speeches, sb.balloons], :name => :speech_balloon_id, :parent_id => sb.id} + } + r.unshift({:elements => [self.panel_pictures, self.speech_balloons], :name => :panel_id, :parent_id => self.id}) + r end +=end end