OSDN Git Service

fix editor
[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     def self.show_json_opt_for_root
16       r = (self.build_json_opt(self))
17       r[:include].merge!(:author => {})
18       r
19     end
20       
21     def self.build_json_opt my_model
22       if my_model.child_models.empty?
23         {}
24       else
25         r = {}
26         my_model.child_models.each do |child_model|
27           r[my_model.my_manifest.associations.child_element_name(child_model).to_sym] = self.build_json_opt(child_model)
28         end
29         {:include => r}
30       end
31     end
32     
33     # Instance Methods
34     def copy_attributes opt = {}
35       r = self.attributes
36       r.delete 'id'
37       r.delete 'author_id'
38       r.delete 'created_at'
39       r.delete 'updated_at'
40       r
41     end
42     
43     def parts_element
44       r = []
45       self.class.child_models.each do |k|
46         r += (self.element_items(k) || [])
47       end
48       r
49     end
50     
51     def zorderd_elements
52       res = []
53       self.parts_element.each do |e|
54         res[e.z-1] = e
55       end
56       res
57     end
58     
59     def scenario_elements
60       res = []
61       self.parts_element.each do |e|
62         res[e.t] = e
63       end
64       res
65     end
66     
67     def new_t
68       self.scenario_elements.size
69     end
70     
71     def new_z
72       self.scenario_elements.size + 1
73     end
74     
75     def self.collect_element_value elements, name
76       elements.map {|e|
77         if e['_destroy'] or e[:_destroy]
78           nil
79         else
80           e[name]
81         end
82       }
83     end
84     
85     def self.validate_serial ary, offset = 0
86       i = offset
87       ary.compact.sort.each do |n|
88         break false unless n == i
89         i += 1
90       end
91       ary.compact.size == i - offset
92     end
93     
94     def self.validate_element_serial elements, name, offset = 0
95       self.validate_serial(self.collect_element_value(elements, name), offset)
96     end
97     
98     def self.validate_elements_serial c
99       c.map {|conf|
100         self.validate_element_serial(conf[:elements], conf[:name], conf[:offset]) ? nil : false
101       }.compact.empty?
102     end
103     
104     def validate_serial_list
105       [
106         {:elements => self.elements_items, :name => :t, :offset => 0}, 
107         {:elements => self.elements_items, :name => :z, :offset => 1}
108       ]
109     end
110     
111     def validate_child
112   #    r1 = Panel.validate_elements_id validate_id_list
113       self.class.validate_elements_serial validate_serial_list
114     end
115     
116     def store attr, operators
117       if attr == false
118         self.errors.add :base, I18n.t('errors.invalid_json')
119         return false
120       end
121       self.attributes = attr
122       self.overwrite operators
123       res = false
124       self.class.transaction do
125         self.boosts 'post'
126         res = self.save
127         unless validate_child
128           res = false
129           self.errors.add :base, I18n.t('errors.invalid_t')
130           raise ActiveRecord::Rollback
131         end
132       end
133       res
134     end
135     
136     def destroy_with_elements
137       res = false
138       self.class.transaction do
139         self.parts_element.each do |element|
140           raise ActiveRecord::Rollback unless element.destroy
141         end
142         raise ActiveRecord::Rollback unless self.destroy
143         res = true
144       end
145       res
146     end
147     
148     def self.panelize panel
149       attr = panel.attributes
150       attr.delete 'id'
151       attr
152     end
153     
154   end
155 end
156