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.
- data/app/controllers/constructor_pages/fields_controller.rb +1 -1
- data/app/models/constructor_pages/field.rb +24 -21
- data/app/models/constructor_pages/page.rb +49 -32
- data/app/models/constructor_pages/template.rb +1 -1
- data/app/views/constructor_pages/fields/types/_boolean.haml +1 -1
- data/app/views/constructor_pages/fields/types/_date.haml +1 -1
- data/app/views/constructor_pages/fields/types/_float.haml +1 -1
- data/app/views/constructor_pages/fields/types/_html.haml +1 -1
- data/app/views/constructor_pages/fields/types/_image.haml +3 -3
- data/app/views/constructor_pages/fields/types/_integer.haml +1 -1
- data/app/views/constructor_pages/fields/types/_string.haml +1 -1
- data/app/views/constructor_pages/fields/types/_text.haml +1 -1
- data/spec/models/constructor_pages/page_model_spec.rb +117 -12
- metadata +5 -4
@@ -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.
|
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
|
-
|
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
|
29
|
+
def type_class; "constructor_pages/types/#{type_value}_type".classify.constantize end
|
30
30
|
|
31
|
-
#
|
32
|
-
def
|
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
|
-
|
35
|
-
|
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
|
-
|
38
|
-
end
|
37
|
+
def find_or_create_type_object(page); find_type_object(page) || create_type_object(page) end
|
39
38
|
|
40
|
-
|
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
|
-
|
43
|
-
|
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
|
46
|
-
|
47
|
-
|
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|
|
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
|
-
|
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
|
-
#
|
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
|
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
|
42
|
-
|
49
|
+
def find_page_in_branch_template(code_name)
|
50
|
+
_template = Template.find_by_code_name code_name.singularize
|
43
51
|
|
44
|
-
if
|
45
|
-
|
46
|
-
|
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
|
-
|
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
|
73
|
-
|
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
|
-
|
79
|
-
|
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
|
83
|
-
|
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
|
-
|
88
|
-
|
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.
|
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.
|
1
|
+
= check_box_tag "fields[#{field.code_name}]", nil, page.get_field_value(field.code_name)
|
@@ -1 +1 @@
|
|
1
|
-
= date_select "fields[#{field.
|
1
|
+
= date_select "fields[#{field.code_name}]", "date", default: page.get_field_value(field.code_name)
|
@@ -1 +1 @@
|
|
1
|
-
= text_field_tag "fields[#{field.
|
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.
|
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.
|
1
|
+
- image = page.get_field_value(field.code_name)
|
2
2
|
|
3
3
|
- if image
|
4
|
-
= image_tag image.value.thumb(
|
4
|
+
= image_tag image.value.thumb('200x200').url
|
5
5
|
|
6
6
|
%br/
|
7
|
-
= file_field_tag "fields[#{field.
|
7
|
+
= file_field_tag "fields[#{field.code_name}]", :class => 'span6'
|
@@ -1 +1 @@
|
|
1
|
-
= text_field_tag "fields[#{field.
|
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.
|
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.
|
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 :
|
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
|
-
|
18
|
-
page.valid?.should be_true
|
17
|
+
Page.create.valid?.should be_true
|
19
18
|
end
|
20
19
|
|
21
|
-
describe '.
|
22
|
-
|
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
|
-
|
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 '
|
31
|
-
it 'should
|
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'
|
173
|
-
|
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.
|
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-
|
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.
|
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.
|
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:
|