OSDN Git Service

clean
[pettanr/pettanr.git] / lib / peta / root.rb
1 module Peta
2   class Root < ElementNestableContent
3     self.abstract_class = true
4     
5     # Dynamic Methods
6     
7     def self.load_manifest
8       super
9       # Class Methods
10       # Instance Methods
11     end
12     
13     # Class Methods
14     
15     # Instance Methods
16     def copy_attributes opt = {}
17       r = self.attributes
18       r.delete 'id'
19       r.delete 'author_id'
20       r.delete 'created_at'
21       r.delete 'updated_at'
22       r
23     end
24     
25     def parts_element
26       r = []
27       self.class.child_models.each do |k|
28         r += (self.element_items(k) || [])
29       end
30       r
31     end
32     
33     def zorderd_elements
34       res = []
35       self.parts_element.each do |e|
36         res[e.z-1] = e
37       end
38       res
39     end
40     
41     def scenario_elements
42       res = []
43       self.parts_element.each do |e|
44         res[e.t] = e
45       end
46       res
47     end
48     
49     def elements
50       self.scenario_elements.map {|e|
51         #(-_-;)<... kore wa hidoi
52         JSON.parse e.to_json({:include => e.class.json_opt_for_panel})
53       }
54     end
55     
56     def scenario_elements_as_json
57       self.to_json({:include => {:author => {}}, :methods => :elements})
58     end
59     
60   def self.list_as_json_text ary
61     '[' + ary.map {|i| i.panel_elements_as_json }.join(',') + ']'
62   end
63   
64     def new_t
65       self.scenario_elements.size
66     end
67     
68     def new_z
69       self.scenario_elements.size + 1
70     end
71     
72     def self.collect_element_value elements, name
73       elements.map {|e|
74         if e['_destroy'] or e[:_destroy]
75           nil
76         else
77           e[name]
78         end
79       }
80     end
81     
82     def self.validate_serial ary, offset = 0
83       i = offset
84       ary.compact.sort.each do |n|
85         break false unless n == i
86         i += 1
87       end
88       ary.compact.size == i - offset
89     end
90     
91     def self.validate_element_serial elements, name, offset = 0
92       self.validate_serial(self.collect_element_value(elements, name), offset)
93     end
94     
95     def self.validate_elements_serial c
96       c.map {|conf|
97         self.validate_element_serial(conf[:elements], conf[:name], conf[:offset]) ? nil : false
98       }.compact.empty?
99     end
100     
101     def validate_serial_list
102       [
103         {:elements => self.elements_items, :name => :t, :offset => 0}, 
104         {:elements => self.elements_items, :name => :z, :offset => 1}
105       ]
106     end
107     
108     def validate_child
109   #    r1 = Panel.validate_elements_id validate_id_list
110       self.class.validate_elements_serial validate_serial_list
111     end
112     
113     def store attr, operators
114       if attr == false
115         self.errors.add :base, I18n.t('errors.invalid_json')
116         return false
117       end
118       self.attributes = attr
119       self.overwrite operators
120       res = false
121       self.class.transaction do
122         self.boosts 'post'
123         res = self.save
124         unless validate_child
125           res = false
126           self.errors.add :base, I18n.t('errors.invalid_t')
127           raise ActiveRecord::Rollback
128         end
129       end
130       res
131     end
132     
133     def destroy_with_elements
134       res = false
135       self.class.transaction do
136         self.parts_element.each do |element|
137           raise ActiveRecord::Rollback unless element.destroy
138         end
139         raise ActiveRecord::Rollback unless self.destroy
140         res = true
141       end
142       res
143     end
144     
145     def self.panelize panel
146       attr = panel.attributes
147       attr.delete 'id'
148       attr
149     end
150     
151   end
152 end
153