X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=lib%2Fpeta%2Froot.rb;h=d2fd10092870a27f280d256ef398705038af092c;hb=cb811687cd15adff98b30f841617e35b8e3ccb85;hp=0bcfb35c9add68f19a7a60d209134f4b5df263ef;hpb=610257311287236d2abb7d13d048d51e7701cbbd;p=pettanr%2Fpettanr.git diff --git a/lib/peta/root.rb b/lib/peta/root.rb index 0bcfb35c..d2fd1009 100644 --- a/lib/peta/root.rb +++ b/lib/peta/root.rb @@ -1,32 +1,155 @@ module Peta - class Root < Content + class Root < ElementNestableContent self.abstract_class = true # Dynamic Methods - def self._element_tree_name - self.my_manifest.peta.element_tree_name - end - def self.load_manifest super # Class Methods - n = self._element_tree_name - define_singleton_method("element_tree_name") do - n - end # Instance Methods - define_method("element_items") do |element_model| - self.__send__ self.class.my_manifest.associations.child_element_name(element_model) + end + + # Class Methods + + def self.show_json_opt_for_root + r = (self.build_json_opt(self)) + r[:include].merge!(:author => {}) + r + end + + def self.build_json_opt my_model + if my_model.child_models.empty? + {} + else + r = {} + my_model.child_models.each do |child_model| + r[my_model.my_manifest.associations.child_element_name(child_model).to_sym] = self.build_json_opt(child_model) + end + {:include => r} + end + end + + # Instance Methods + def copy_attributes opt = {} + r = self.attributes + r.delete 'id' + r.delete 'author_id' + r.delete 'created_at' + r.delete 'updated_at' + r + end + + def parts_element + r = [] + self.class.child_models.each do |k| + r += (self.element_items(k) || []) end - define_method("elements_items") do - self.class.child_models(self.class.element_tree_name).map {|child_model| - self.element_items child_model - }.flatten + r + end + + def zorderd_elements + res = [] + self.parts_element.each do |e| + res[e.z-1] = e end + res end - # Class Methods + def scenario_elements + res = [] + self.parts_element.each do |e| + res[e.t] = e + end + res + end + + def new_t + self.scenario_elements.size + end + + def new_z + self.scenario_elements.size + 1 + end + + def self.collect_element_value elements, name + elements.map {|e| + if e['_destroy'] or e[:_destroy] + nil + else + e[name] + end + } + end + + 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 self.validate_element_serial elements, name, offset = 0 + self.validate_serial(self.collect_element_value(elements, name), offset) + end + + def self.validate_elements_serial c + c.map {|conf| + self.validate_element_serial(conf[:elements], conf[:name], conf[:offset]) ? nil : false + }.compact.empty? + end + + def validate_serial_list + [ + {:elements => self.elements_items, :name => :t, :offset => 0}, + {:elements => self.elements_items, :name => :z, :offset => 1} + ] + end + + def validate_child + # r1 = Panel.validate_elements_id validate_id_list + self.class.validate_elements_serial validate_serial_list + end + + def store attr, operators + if attr == false + self.errors.add :base, I18n.t('errors.invalid_json') + return false + end + self.attributes = attr + self.overwrite operators + res = false + self.class.transaction do + self.boosts 'post' + res = self.save + unless validate_child + res = false + self.errors.add :base, I18n.t('errors.invalid_t') + raise ActiveRecord::Rollback + end + end + res + end + + def destroy_with_elements + res = false + self.class.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 self.panelize panel + attr = panel.attributes + attr.delete 'id' + attr + end end end