constructor-pages 0.5.5 → 0.5.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -26,7 +26,7 @@ module ConstructorPages
26
26
  @field = Field.find params[:id]
27
27
 
28
28
  if @field.type_value != params[:field][:type_value]
29
- @field.type_model.where(:field_id => @field.id).each do |field|
29
+ @field.type_class.where(:field_id => @field.id).each do |field|
30
30
  new_field = "constructor_pages/types/#{params[:field][:type_value]}_type".classify.constantize.new(
31
31
  :field_id => @field.id,
32
32
  :page_id => field.page_id)
@@ -16,7 +16,7 @@ module ConstructorPages
16
16
 
17
17
  TYPES.each do |t|
18
18
  class_eval %{
19
- has_one :#{t}_type, class_name: 'Types::#{t.titleize}Type'
19
+ has_many :#{t}_types, class_name: 'Types::#{t.titleize}Type'
20
20
  }
21
21
  end
22
22
 
@@ -26,34 +26,37 @@ module ConstructorPages
26
26
  default_scope order: :position
27
27
 
28
28
  # return constant of model by type_value
29
- def type_model; "constructor_pages/types/#{type_value}_type".classify.constantize end
29
+ def type_class; "constructor_pages/types/#{type_value}_type".classify.constantize end
30
30
 
31
- # remove all type_fields values for specified page
32
- def remove_values_for(page); type_model.destroy_all field_id: id, page_id: page.id end
31
+ # return object of type_value
32
+ def find_type_object(page); type_class.find_by_field_id_and_page_id(id, page.id) end
33
33
 
34
- def update_value(page, params)
35
- _type_model = type_model.where(field_id: id, page_id: page.id).first_or_create
34
+ # return created object of type_value
35
+ def create_type_object(page); type_class.create(field_id: id, page_id: page.id) end
36
36
 
37
- update_type_model(_type_model, type_value, params) if params
38
- end
37
+ def find_or_create_type_object(page); find_type_object(page) || create_type_object(page) end
39
38
 
40
- private
39
+ # get value from type_field for specified page
40
+ def get_value_for(page)
41
+ _type_object = find_type_object(page)
42
+ _type_object ? _type_object.value : nil
43
+ end
41
44
 
42
- def update_type_model(type_model, type_value, params)
43
- type_model.value = 0 if type_value == 'boolean'
45
+ # set value type_field for specified page
46
+ def set_value_for(page, value)
47
+ _type_object = find_type_object(page)
44
48
 
45
- if params[type_value]
46
- if type_value == 'date'
47
- value = params[type_value][id.to_s]
48
- type_model.value = Date.new(value['date(1i)'].to_i, value['date(2i)'].to_i, value['date(3i)'].to_i).to_s
49
- else
50
- type_model.value = params[type_value][id.to_s]
51
- end
49
+ if _type_object
50
+ _type_object.value = value
51
+ _type_object.save!
52
52
  end
53
-
54
- type_model.save
55
53
  end
56
54
 
55
+ # remove all type_fields values for specified page
56
+ def remove_values_for(page); type_class.destroy_all field_id: id, page_id: page.id end
57
+
58
+ private
59
+
57
60
  def method_uniqueness
58
61
  if Page.first.respond_to?(code_name) \
59
62
  or Page.first.respond_to?(code_name.pluralize) \
@@ -69,7 +72,7 @@ module ConstructorPages
69
72
  %w{create destroy_all}.each do |m|
70
73
  class_eval %{
71
74
  def #{m}_page_fields
72
- template.pages.each {|page| type_model.#{m} page_id: page.id, field_id: id}
75
+ template.pages.each {|page| type_class.#{m} page_id: page.id, field_id: id}
73
76
  end
74
77
  }
75
78
  end
@@ -27,36 +27,50 @@ module ConstructorPages
27
27
 
28
28
  acts_as_nested_set
29
29
 
30
- def self.find_by_request_or_first(request)
30
+ # Used for find page by request. It return first page if no request given
31
+ def self.find_by_request_or_first(request = nil)
31
32
  request.nil? ? Page.first : Page.find_by_full_url('/' + request)
32
33
  end
33
34
 
34
- # generate full_url from parent page and url
35
+ # Generate full_url from parent page and url
35
36
  def self.full_url_generate(parent_id, url = '')
36
37
  Page.find(parent_id).self_and_ancestors.map {|c| c.url}.append(url).join('/')
37
38
  end
38
39
 
39
- def active?; active end
40
+ def field(code_name)
41
+ Field.find_by_code_name_and_template_id code_name, template_id
42
+ end
43
+
44
+ def get_field_value(code_name)
45
+ field = field(code_name)
46
+ field.get_value_for(self) if field
47
+ end
40
48
 
41
- def field(code_name, meth = 'value')
42
- field = Field.find_by_code_name_and_template_id code_name, template_id
49
+ def find_page_in_branch_template(code_name)
50
+ _template = Template.find_by_code_name code_name.singularize
43
51
 
44
- if field
45
- _field = field.type_model.find_by_field_id_and_page_id field.id, id
46
- _field.send(meth) if _field
52
+ if _template
53
+ result = []
54
+ result = descendants.where(template_id: _template.id) if code_name == code_name.pluralize
55
+ result = ancestors.find_by_template_id(_template.id) if result.empty?
56
+ result
47
57
  end
48
58
  end
49
59
 
60
+ alias_method :find_pages_in_branch_template, :find_page_in_branch_template
61
+
62
+ def set_field_value(code_name, value)
63
+ field = field(code_name)
64
+ field.set_value_for(self, value) if field
65
+ end
66
+
67
+ def active?; active end
68
+
50
69
  def as_json(options = {})
51
- options = {
52
- :name => self.name,
53
- :title => self.title
54
- }.merge options
70
+ options = {name: self.name, title: self.title}.merge options
55
71
 
56
- fields.each do |field|
57
- unless self.send(field.code_name)
58
- options = {field.code_name => self.send(field.code_name)}.merge options
59
- end
72
+ template.fields.each do |field|
73
+ options = {field.code_name.to_sym => field.get_value_for(self)}.merge options
60
74
  end
61
75
 
62
76
  options
@@ -68,27 +82,26 @@ module ConstructorPages
68
82
  end
69
83
 
70
84
  # update all type fields
71
- def update_fields_values(params)
72
- fields.each {|f| f.update_value(self, params)}
73
- end
74
-
75
- def method_missing(name, *args, &block)
76
- name = name.to_s
85
+ def update_fields_values(params, reset_booleans = true)
86
+ fields.each do |field|
87
+ value = params[field.code_name.to_sym]
77
88
 
78
- if field(name).nil?
79
- _template = Template.find_by_code_name name.singularize
80
- template_id = _template.id if _template
89
+ _type_object = field.find_or_create_type_object(self)
90
+ _type_object.value = 0 if field.type_value == 'boolean' and reset_booleans
81
91
 
82
- if template_id
83
- result = descendants.where(template_id: template_id) if name == name.pluralize
84
- result = ancestors.where(template_id: template_id).first if result.empty?
85
- result || []
92
+ if value
93
+ _type_object.value = field.type_value == 'date' ? parse_date(value).to_s : value
86
94
  end
87
- else
88
- field(name)
95
+
96
+ _type_object.save
89
97
  end
90
98
  end
91
99
 
100
+ def method_missing(name, *args, &block)
101
+ name = name.to_s
102
+ name[-1] == '=' ? set_field_value(name[0..-2], args[0]) : get_field_value(name) || find_pages_in_branch_template(name)
103
+ end
104
+
92
105
  # check if link specified
93
106
  def redirect?; url != link && !link.empty? end
94
107
 
@@ -99,6 +112,10 @@ module ConstructorPages
99
112
  self.url = ((auto_url || url.empty?) ? translit(name) : url).parameterize
100
113
  end
101
114
 
115
+ def parse_date(value)
116
+ Date.new(value['date(1i)'].to_i, value['date(2i)'].to_i, value['date(3i)'].to_i)
117
+ end
118
+
102
119
  # TODO: add more languages
103
120
  # translit to english
104
121
  def translit(str)
@@ -122,7 +139,7 @@ module ConstructorPages
122
139
  def descendants_update; descendants.map(&:save) end
123
140
 
124
141
  def create_fields
125
- fields.each {|field| field.type_model.create page_id: id, field_id: field.id}
142
+ fields.each {|field| field.type_class.create page_id: id, field_id: field.id}
126
143
  end
127
144
  end
128
145
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module ConstructorPages
4
4
  class Template < ActiveRecord::Base
5
- attr_accessible :name, :code_name, :child_id, :parent_id
5
+ attr_accessible :name, :code_name, :child_id, :parent_id, :parent
6
6
 
7
7
  validates_presence_of :name, :code_name
8
8
  validates_uniqueness_of :code_name
@@ -1 +1 @@
1
- = check_box_tag "fields[#{field.type_value}][#{field.id}]", nil, page.boolean_types.where(:field_id => field.id).first.value
1
+ = check_box_tag "fields[#{field.code_name}]", nil, page.get_field_value(field.code_name)
@@ -1 +1 @@
1
- = date_select "fields[#{field.type_value}][#{field.id}]", "date", :default => page.date_types.where(:field_id => field.id).first.value
1
+ = date_select "fields[#{field.code_name}]", "date", default: page.get_field_value(field.code_name)
@@ -1 +1 @@
1
- = text_field_tag "fields[#{field.type_value}][#{field.id}]", page.float_types.where(:field_id => field.id).first.value, :class => "span2"
1
+ = text_field_tag "fields[#{field.code_name}]", page.get_field_value(field.code_name), class: 'span2'
@@ -1 +1 @@
1
- = text_area_tag "fields[#{field.type_value}][#{field.id}]", page.html_types.where(:field_id => field.id).first.value, :rows => 10, :class => "span9 ckeditor"
1
+ = text_area_tag "fields[#{field.code_name}]", page.get_field_value(field.code_name), :rows => 10, :class => 'span9 ckeditor'
@@ -1,7 +1,7 @@
1
- - image = page.image_types.where(:field_id => field.id).first
1
+ - image = page.get_field_value(field.code_name)
2
2
 
3
3
  - if image
4
- = image_tag image.value.thumb("200x200").url
4
+ = image_tag image.value.thumb('200x200').url
5
5
 
6
6
  %br/
7
- = file_field_tag "fields[#{field.type_value}][#{field.id}]", :class => "span6"
7
+ = file_field_tag "fields[#{field.code_name}]", :class => 'span6'
@@ -1 +1 @@
1
- = text_field_tag "fields[#{field.type_value}][#{field.id}]", page.integer_types.where(:field_id => field.id).first.value, :class => "span2"
1
+ = text_field_tag "fields[#{field.code_name}]", page.get_field_value(field.code_name), :class => 'span2'
@@ -1 +1 @@
1
- = text_field_tag "fields[#{field.type_value}][#{field.id}]", page.string_types.where(:field_id => field.id).first.value, :class => "span6"
1
+ = text_field_tag "fields[#{field.code_name}]", page.get_field_value(field.code_name), :class => 'span6'
@@ -1 +1 @@
1
- = text_area_tag "fields[#{field.type_value}][#{field.id}]", page.text_types.where(:field_id => field.id).first.value, :rows => 10, :class => "span6"
1
+ = text_area_tag "fields[#{field.code_name}]", page.get_field_value(field.code_name), :rows => 10, :class => 'span6'
@@ -4,36 +4,81 @@ require 'spec_helper'
4
4
 
5
5
  module ConstructorPages
6
6
  describe Page do
7
- before :all do
7
+ before :each do
8
8
  Template.delete_all
9
9
  Template.create name: 'Page', code_name: 'page'
10
10
 
11
-
11
+ Page.delete_all
12
12
  Field.delete_all
13
13
  Types::TextType.delete_all
14
14
  end
15
15
 
16
16
  it 'should be valid' do
17
- page = Page.create
18
- page.valid?.should be_true
17
+ Page.create.valid?.should be_true
19
18
  end
20
19
 
21
- describe '.field' do
22
- it 'should get value from type_field' do
20
+ describe '.find_by_request_or_first' do
21
+ before :each do
22
+ @page = Page.create name: 'New page', url: 'new-page'
23
+ end
24
+
25
+ it 'should return page by given request path' do
26
+ Page.find_by_request_or_first('new-page').should == @page
27
+ end
28
+
29
+ it 'should return first page if no given request' do
30
+ Page.find_by_request_or_first.should == @page
31
+ end
32
+ end
33
+
34
+ describe '.full_url_generate' do
35
+ it 'should generate full_url from parent_id and url' do
36
+ end
37
+ end
38
+
39
+ describe '#set_field' do
40
+ it 'should set value for type_field' do
23
41
  template = Template.create name: 'Page template', code_name: 'page_template'
24
42
  page = Page.create name: 'Home page', template: template
25
43
  field = Field.create name: 'Content', code_name: 'desc', template: template, type_value: 'text'
26
- page.field('desc').should == field.text_type.value
44
+
45
+ page.set_field_value('desc', 'my world')
46
+
47
+ field.get_value_for(page).should == 'my world'
27
48
  end
28
49
  end
29
50
 
30
- describe '.full_url_generate' do
31
- it 'should generate full_url from parent_id and url' do
51
+ describe '#get_field' do
52
+ it 'should get value from type_field' do
53
+ template = Template.create name: 'Page template', code_name: 'page_template'
54
+ page = Page.create name: 'Home page', template: template
55
+ Field.create name: 'Content', code_name: 'desc', template: template, type_value: 'text'
56
+
57
+ page.set_field_value('desc', 'Hello world')
58
+ page.get_field_value('desc').should == 'Hello world'
59
+ end
60
+ end
61
+
62
+ describe '#find_page_in_branch_template' do
63
+ it 'should find page in one branch template by code_name' do
64
+ brand_template = Template.create name: 'Brand', code_name: 'brand'
65
+ series_template = Template.create name: 'Series', code_name: 'series', parent: brand_template
66
+
67
+ brand_page = Page.create name: 'Zanussi', template: brand_template
68
+ series_page = Page.create name: 'Fresco', template: series_template, parent: brand_page
69
+
70
+ series_page.find_page_in_branch_template('brand').should == brand_page
32
71
  end
33
72
  end
34
73
 
35
74
  describe '#as_json' do
36
- it 'should return page as json format with fields'
75
+ it 'should return page as json format with fields' do
76
+ template = Template.create name: 'JSON', code_name: 'json_template'
77
+ page = Page.create name: 'Hi json', template: template
78
+ Field.create name: 'Content', code_name: 'content', template: template, type_value: 'text'
79
+ page.content = 'Hello world'
80
+ page.as_json.should == {content: 'Hello world', name: page.name, title: page.title}
81
+ end
37
82
  end
38
83
 
39
84
  describe '#redirect?' do
@@ -105,6 +150,38 @@ module ConstructorPages
105
150
  end
106
151
  end
107
152
 
153
+ describe '#update_fields_values' do
154
+ it 'should update fields values with params' do
155
+ template = Template.create name: 'New template', code_name: 'brand'
156
+ Field.create name: 'Price', code_name: 'price', template: template, type_value: 'float'
157
+ Field.create name: 'Check', code_name: 'check', template: template, type_value: 'boolean'
158
+
159
+ page = Page.create name: 'New page', template: template
160
+
161
+ page.check = true
162
+ page.check.should be_true
163
+
164
+ page.update_fields_values({price: 1000})
165
+
166
+ page.price.should == 1000
167
+ page.check.should be_false
168
+ end
169
+ end
170
+
171
+ describe '#remove_fields_values' do
172
+ it 'should destroy all type_values fields' do
173
+ template = Template.create name: 'New template', code_name: 'template'
174
+ field = Field.create name: 'Price', code_name: 'price', template: template, type_value: 'float'
175
+ page = Page.create name: 'New page', template: template
176
+
177
+ page.price = 500
178
+ field.find_type_object(page).value.should == 500
179
+
180
+ page.remove_fields_values
181
+ field.find_type_object(page).should be_nil
182
+ end
183
+ end
184
+
108
185
  describe '#full_url' do
109
186
  it 'should be generated from url and ancestors' do
110
187
  page = Page.create name: 'Hello'
@@ -169,9 +246,37 @@ module ConstructorPages
169
246
  end
170
247
 
171
248
  describe 'create_fields' do
172
- it 'should create type_fields after update page' do
173
- page = Page.create name: 'Hello fields'
249
+ it 'should create type_fields after update page'
250
+ end
251
+
252
+ describe 'method_missing' do
253
+ it 'should return value of type_value for missing method' do
254
+ template = Template.create name: 'Page', code_name: 'page_template'
255
+ page = Page.create name: 'No method', template: template
256
+ field = Field.create name: 'Content', code_name: 'desc', template: template, type_value: 'text'
257
+ field.set_value_for(page, 'my world')
258
+
259
+ page.desc.should == 'my world'
260
+ end
261
+
262
+ it 'should set value for type_value for missing method' do
263
+ template = Template.create name: 'Page', code_name: 'page_templ'
264
+ page = Page.create name: 'No method', template: template
265
+ field = Field.create name: 'Content', code_name: 'desc', template: template, type_value: 'text'
266
+
267
+ page.desc = 'my world 2'
268
+ field.get_value_for(page).should == 'my world 2'
269
+ end
270
+
271
+ it 'should find page in branch template if no field found' do
272
+ Template.delete_all
273
+ brand_template = Template.create name: 'Brand', code_name: 'brand'
274
+ series_template = Template.create name: 'Series', code_name: 'series', parent: brand_template
275
+
276
+ brand_page = Page.create name: 'Zanussi', template: brand_template
277
+ series_page = Page.create name: 'Fresco', template: series_template, parent: brand_page
174
278
 
279
+ series_page.brand.should == brand_page
175
280
  end
176
281
  end
177
282
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: constructor-pages
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.5
4
+ version: 0.5.6
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-06-17 00:00:00.000000000 Z
12
+ date: 2013-06-18 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: constructor-core
@@ -18,7 +18,7 @@ dependencies:
18
18
  requirements:
19
19
  - - '='
20
20
  - !ruby/object:Gem::Version
21
- version: 0.5.5
21
+ version: 0.5.6
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
@@ -26,7 +26,7 @@ dependencies:
26
26
  requirements:
27
27
  - - '='
28
28
  - !ruby/object:Gem::Version
29
- version: 0.5.5
29
+ version: 0.5.6
30
30
  - !ruby/object:Gem::Dependency
31
31
  name: dragonfly
32
32
  requirement: !ruby/object:Gem::Requirement
@@ -246,3 +246,4 @@ test_files:
246
246
  - spec/models/constructor_pages/field_model_spec.rb
247
247
  - spec/models/constructor_pages/page_model_spec.rb
248
248
  - spec/models/constructor_pages/template_model_spec.rb
249
+ has_rdoc: