govuk_content_models 31.0.0 → 31.1.0
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -0
- data/app/models/business_support_edition.rb +1 -0
- data/app/models/edition.rb +42 -22
- data/lib/govuk_content_models/version.rb +1 -1
- data/test/models/business_support_edition_test.rb +108 -54
- data/test/models/edition_test.rb +15 -0
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 3bb0e2f37d9ec79613e1e92088da6d20b8f221f4
|
|
4
|
+
data.tar.gz: 83b14b0586ef58599e8b466336d109aa54e25753
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 720600bc3dadd0332f123af6b84cd9dfd65d4a3f1ac32a039e844fecb201e4a46d4b5710813205023fde049fcea3d3d5b31062dd4a87f6a71c3c14c464d02f70
|
|
7
|
+
data.tar.gz: 0b05a4bbf7acd75fdb9f947a1f8c8d1eb0f70d3c0dd5324745c004342738d198e1b7119ad47480cb3e98300c6781f43be5699b4cfcc92dd6f1c9aa3871aa193d
|
data/CHANGELOG.md
CHANGED
|
@@ -29,6 +29,7 @@ class BusinessSupportEdition < Edition
|
|
|
29
29
|
field :start_date, type: Date
|
|
30
30
|
field :end_date, type: Date
|
|
31
31
|
field :areas, type: Array, default: []
|
|
32
|
+
field :area_gss_codes, type: Array, default: []
|
|
32
33
|
|
|
33
34
|
GOVSPEAK_FIELDS = [:body, :eligibility, :evaluation, :additional_information]
|
|
34
35
|
|
data/app/models/edition.rb
CHANGED
|
@@ -171,20 +171,11 @@ class Edition
|
|
|
171
171
|
# we are changing the type of the edition, any fields other than the base
|
|
172
172
|
# fields will likely be meaningless.
|
|
173
173
|
def fields_to_copy(target_class)
|
|
174
|
-
return_value = [
|
|
175
|
-
:title,
|
|
176
|
-
:panopticon_id,
|
|
177
|
-
:overview,
|
|
178
|
-
:slug,
|
|
179
|
-
:browse_pages,
|
|
180
|
-
:primary_topic,
|
|
181
|
-
:additional_topics
|
|
182
|
-
]
|
|
183
174
|
if target_class == self.class
|
|
184
|
-
|
|
185
|
-
|
|
175
|
+
base_field_keys + type_specific_field_keys
|
|
176
|
+
else
|
|
177
|
+
base_field_keys
|
|
186
178
|
end
|
|
187
|
-
return_value
|
|
188
179
|
end
|
|
189
180
|
|
|
190
181
|
def build_clone(target_class=nil)
|
|
@@ -209,21 +200,33 @@ class Edition
|
|
|
209
200
|
# Where the type is not changing, the body will already have been copied
|
|
210
201
|
# above.
|
|
211
202
|
#
|
|
212
|
-
# We don't need to copy parts between Parted types here, because the
|
|
213
|
-
# module does that.
|
|
214
|
-
if target_class != self.class
|
|
215
|
-
|
|
216
|
-
new_edition.parts.build(title: "Part One", body: whole_body, slug: "part-one")
|
|
217
|
-
elsif new_edition.respond_to?(:more_information=)
|
|
218
|
-
new_edition.more_information = whole_body
|
|
219
|
-
elsif new_edition.respond_to?(:body=)
|
|
220
|
-
new_edition.body = whole_body
|
|
221
|
-
end
|
|
203
|
+
# We don't need to copy parts between Parted types here, because the
|
|
204
|
+
# Parted module does that.
|
|
205
|
+
if target_class != self.class && !cloning_between_parted_types?(new_edition)
|
|
206
|
+
new_edition.clone_whole_body_from(self)
|
|
222
207
|
end
|
|
223
208
|
|
|
224
209
|
new_edition
|
|
225
210
|
end
|
|
226
211
|
|
|
212
|
+
def clone_whole_body_from(origin_edition)
|
|
213
|
+
if self.respond_to?(:parts)
|
|
214
|
+
self.parts.build(title: "Part One", body: origin_edition.whole_body, slug: "part-one")
|
|
215
|
+
elsif self.respond_to?(:more_information=)
|
|
216
|
+
self.more_information = origin_edition.whole_body
|
|
217
|
+
elsif self.respond_to?(:body=)
|
|
218
|
+
self.body = origin_edition.whole_body
|
|
219
|
+
elsif self.respond_to?(:licence_overview=)
|
|
220
|
+
self.licence_overview = origin_edition.whole_body
|
|
221
|
+
else
|
|
222
|
+
raise "Nowhere to copy whole_body content for conversion from: #{origin_edition.class} to: #{self.class}"
|
|
223
|
+
end
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
def cloning_between_parted_types?(new_edition)
|
|
227
|
+
self.respond_to?(:parts) && new_edition.respond_to?(:parts)
|
|
228
|
+
end
|
|
229
|
+
|
|
227
230
|
def self.find_or_create_from_panopticon_data(panopticon_id, importing_user)
|
|
228
231
|
existing_publication = Edition.where(panopticon_id: panopticon_id)
|
|
229
232
|
.order_by([:version_number, :desc]).first
|
|
@@ -321,4 +324,21 @@ class Edition
|
|
|
321
324
|
Artefact.find(self.panopticon_id).destroy
|
|
322
325
|
end
|
|
323
326
|
end
|
|
327
|
+
|
|
328
|
+
private
|
|
329
|
+
def base_field_keys
|
|
330
|
+
[
|
|
331
|
+
:title,
|
|
332
|
+
:panopticon_id,
|
|
333
|
+
:overview,
|
|
334
|
+
:slug,
|
|
335
|
+
:browse_pages,
|
|
336
|
+
:primary_topic,
|
|
337
|
+
:additional_topics,
|
|
338
|
+
]
|
|
339
|
+
end
|
|
340
|
+
|
|
341
|
+
def type_specific_field_keys
|
|
342
|
+
(self.fields.keys - Edition.fields.keys).map(&:to_sym)
|
|
343
|
+
end
|
|
324
344
|
end
|
|
@@ -7,7 +7,10 @@ class BusinessSupportEditionTest < ActiveSupport::TestCase
|
|
|
7
7
|
end
|
|
8
8
|
|
|
9
9
|
should "have custom fields" do
|
|
10
|
-
support = FactoryGirl.create(
|
|
10
|
+
support = FactoryGirl.create(
|
|
11
|
+
:business_support_edition,
|
|
12
|
+
panopticon_id: @artefact.id,
|
|
13
|
+
)
|
|
11
14
|
support.short_description = "The short description"
|
|
12
15
|
support.body = "The body"
|
|
13
16
|
support.eligibility = "The eligibility"
|
|
@@ -23,6 +26,7 @@ class BusinessSupportEditionTest < ActiveSupport::TestCase
|
|
|
23
26
|
|
|
24
27
|
support.priority = 2
|
|
25
28
|
support.areas = ["123","345","45","9"]
|
|
29
|
+
support.area_gss_codes = ["G123","G345","G45","G9"]
|
|
26
30
|
support.business_sizes << "up-to-249"
|
|
27
31
|
support.business_types << "charity"
|
|
28
32
|
support.locations = ["scotland", "england"]
|
|
@@ -52,6 +56,7 @@ class BusinessSupportEditionTest < ActiveSupport::TestCase
|
|
|
52
56
|
assert_equal 2, support.priority
|
|
53
57
|
|
|
54
58
|
assert_equal ["123","345","45","9"], support.areas
|
|
59
|
+
assert_equal ["G123","G345","G45","G9"], support.area_gss_codes
|
|
55
60
|
assert_equal ["up-to-249"], support.business_sizes
|
|
56
61
|
assert_equal ["charity"], support.business_types
|
|
57
62
|
assert_equal ["scotland", "england"], support.locations
|
|
@@ -64,7 +69,10 @@ class BusinessSupportEditionTest < ActiveSupport::TestCase
|
|
|
64
69
|
end
|
|
65
70
|
|
|
66
71
|
should "not allow max_value to be less than min_value" do
|
|
67
|
-
support = FactoryGirl.create(
|
|
72
|
+
support = FactoryGirl.create(
|
|
73
|
+
:business_support_edition,
|
|
74
|
+
panopticon_id: @artefact.id,
|
|
75
|
+
)
|
|
68
76
|
support.min_value = 100
|
|
69
77
|
support.max_value = 50
|
|
70
78
|
|
|
@@ -106,7 +114,10 @@ class BusinessSupportEditionTest < ActiveSupport::TestCase
|
|
|
106
114
|
context "continuation_link validation" do
|
|
107
115
|
|
|
108
116
|
setup do
|
|
109
|
-
@bs = FactoryGirl.create(
|
|
117
|
+
@bs = FactoryGirl.create(
|
|
118
|
+
:business_support_edition,
|
|
119
|
+
panopticon_id: @artefact.id,
|
|
120
|
+
)
|
|
110
121
|
end
|
|
111
122
|
|
|
112
123
|
should "not validate the continuation link when blank" do
|
|
@@ -125,31 +136,34 @@ class BusinessSupportEditionTest < ActiveSupport::TestCase
|
|
|
125
136
|
end
|
|
126
137
|
|
|
127
138
|
should "clone extra fields when cloning edition" do
|
|
128
|
-
support = FactoryGirl.create(
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
139
|
+
support = FactoryGirl.create(
|
|
140
|
+
:business_support_edition,
|
|
141
|
+
:panopticon_id => @artefact.id,
|
|
142
|
+
:state => "published",
|
|
143
|
+
:short_description => "Short description of support format",
|
|
144
|
+
:body => "Body to be cloned",
|
|
145
|
+
:min_value => 1,
|
|
146
|
+
:max_value => 2,
|
|
147
|
+
:max_employees => 3,
|
|
148
|
+
:organiser => "Organiser to be cloned",
|
|
149
|
+
:eligibility => "Eligibility to be cloned",
|
|
150
|
+
:evaluation => "Evaluation to be cloned",
|
|
151
|
+
:additional_information => "Additional info to be cloned",
|
|
152
|
+
:will_continue_on => "Continuation text to be cloned",
|
|
153
|
+
:continuation_link => "http://www.gov.uk",
|
|
154
|
+
:contact_details => "Contact details to be cloned",
|
|
155
|
+
:priority => 2,
|
|
156
|
+
:areas => ['123','9999'],
|
|
157
|
+
:area_gss_codes => ['G123','G9999'],
|
|
158
|
+
:business_sizes => ['up-to-249'],
|
|
159
|
+
:locations => ['london'],
|
|
160
|
+
:purposes => ['start-up'],
|
|
161
|
+
:sectors => ['agriculture','manufacturing'],
|
|
162
|
+
:stages => ['grow-and-sustain'],
|
|
163
|
+
:support_types => ['grant','loan'],
|
|
164
|
+
:start_date => 1.year.ago(Date.today),
|
|
165
|
+
:end_date => 1.year.since(Date.today),
|
|
166
|
+
)
|
|
153
167
|
|
|
154
168
|
new_support = support.build_clone
|
|
155
169
|
|
|
@@ -168,6 +182,7 @@ class BusinessSupportEditionTest < ActiveSupport::TestCase
|
|
|
168
182
|
|
|
169
183
|
assert_equal support.priority, new_support.priority
|
|
170
184
|
assert_equal support.areas, new_support.areas
|
|
185
|
+
assert_equal support.area_gss_codes, new_support.area_gss_codes
|
|
171
186
|
assert_equal support.business_sizes, new_support.business_sizes
|
|
172
187
|
assert_equal support.locations, new_support.locations
|
|
173
188
|
assert_equal support.purposes, new_support.purposes
|
|
@@ -180,47 +195,82 @@ class BusinessSupportEditionTest < ActiveSupport::TestCase
|
|
|
180
195
|
|
|
181
196
|
context "for facets" do
|
|
182
197
|
setup do
|
|
183
|
-
@e1 = FactoryGirl.create(
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
198
|
+
@e1 = FactoryGirl.create(
|
|
199
|
+
:business_support_edition,
|
|
200
|
+
:areas => ['2345', '1234'],
|
|
201
|
+
:area_gss_codes => ['G2345', 'G1234'],
|
|
202
|
+
:business_sizes => ['1', 'up-to-1000000'],
|
|
203
|
+
:locations => ['narnia'],
|
|
204
|
+
:purposes => ['world-domination'],
|
|
205
|
+
:sectors => ['agriculture', 'healthcare'],
|
|
206
|
+
:stages => ['pivoting'],
|
|
207
|
+
:support_types => ['award', 'grant', 'loan'],
|
|
208
|
+
)
|
|
209
|
+
@e2 = FactoryGirl.create(
|
|
210
|
+
:business_support_edition,
|
|
211
|
+
:areas => ['1212', '1234', '999'],
|
|
212
|
+
:area_gss_codes => ['G1212', 'G1234', 'G999'],
|
|
213
|
+
:business_sizes => ['1', 'up-to-1000000'],
|
|
214
|
+
:locations => ['hades', 'narnia'],
|
|
215
|
+
:purposes => ['business-growth-and-expansion'],
|
|
216
|
+
:sectors => ['education', 'healthcare'],
|
|
217
|
+
:stages => ['start-up', 'pivoting'],
|
|
218
|
+
:support_types => ['grant', 'loan', 'equity'],
|
|
219
|
+
)
|
|
220
|
+
@e3 = FactoryGirl.create(
|
|
221
|
+
:business_support_edition,
|
|
222
|
+
:areas => ['1234'],
|
|
223
|
+
:area_gss_codes => ['G1234'],
|
|
224
|
+
:business_sizes => ['up-to-249', 'up-to-1000000'],
|
|
225
|
+
:locations => ['hades', 'chicken-town'],
|
|
226
|
+
:purposes => ['making-the-most-of-the-internet'],
|
|
227
|
+
:sectors => ['utilities'],
|
|
228
|
+
:stages => ['start-up'],
|
|
229
|
+
:support_types => ['grant'],
|
|
230
|
+
)
|
|
200
231
|
end
|
|
201
232
|
|
|
202
233
|
should "only return editions matching the facet values provided" do
|
|
203
|
-
editions = BusinessSupportEdition.for_facets({
|
|
234
|
+
editions = BusinessSupportEdition.for_facets({
|
|
235
|
+
:purposes => 'business-growth-and-expansion',
|
|
236
|
+
:support_types => 'equity',
|
|
237
|
+
})
|
|
204
238
|
assert_equal [@e2], editions
|
|
205
|
-
editions = BusinessSupportEdition.for_facets({
|
|
239
|
+
editions = BusinessSupportEdition.for_facets({
|
|
240
|
+
:business_sizes => '1,up-to-1000000',
|
|
241
|
+
:locations => 'narnia',
|
|
242
|
+
})
|
|
206
243
|
assert_equal [@e1, @e2], editions
|
|
207
244
|
end
|
|
208
245
|
should "support searching with all the facet values" do
|
|
209
|
-
editions = BusinessSupportEdition.for_facets({
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
246
|
+
editions = BusinessSupportEdition.for_facets({
|
|
247
|
+
:areas => '1234',
|
|
248
|
+
:area_gss_codes => 'G1234',
|
|
249
|
+
:business_sizes => 'up-to-1000000',
|
|
250
|
+
:locations => 'narnia,hades,chicken-town',
|
|
251
|
+
:purposes => 'business-growth-and-expansion,making-the-most-of-the-internet,world-domination',
|
|
252
|
+
:sectors => 'agriculture,healthcare,utilities',
|
|
253
|
+
:stages => 'pivoting,start-up',
|
|
254
|
+
:support_types => 'award,grant,loan',
|
|
255
|
+
})
|
|
213
256
|
assert_equal [@e1, @e2, @e3], editions
|
|
214
257
|
end
|
|
215
258
|
should "return nothing where no facet values match" do
|
|
216
|
-
editions = BusinessSupportEdition.for_facets({
|
|
259
|
+
editions = BusinessSupportEdition.for_facets({
|
|
260
|
+
:business_sizes => 'up-to-a-bizillion',
|
|
261
|
+
:locations => 'ecclefechan',
|
|
262
|
+
})
|
|
217
263
|
assert_empty editions
|
|
218
264
|
end
|
|
219
265
|
end
|
|
220
266
|
|
|
221
267
|
context "scheme dates" do
|
|
222
268
|
should "should have year with 4 digits length" do
|
|
223
|
-
invalid_edition = FactoryGirl.build(
|
|
269
|
+
invalid_edition = FactoryGirl.build(
|
|
270
|
+
:business_support_edition,
|
|
271
|
+
start_date: Date.new(99, 12, 31),
|
|
272
|
+
end_date: Date.new(99, 12, 31),
|
|
273
|
+
)
|
|
224
274
|
|
|
225
275
|
refute invalid_edition.valid?
|
|
226
276
|
|
|
@@ -230,7 +280,11 @@ class BusinessSupportEditionTest < ActiveSupport::TestCase
|
|
|
230
280
|
end
|
|
231
281
|
|
|
232
282
|
should "have start date earlier than end date" do
|
|
233
|
-
invalid_edition = FactoryGirl.build(
|
|
283
|
+
invalid_edition = FactoryGirl.build(
|
|
284
|
+
:business_support_edition,
|
|
285
|
+
start_date: 1.week.ago,
|
|
286
|
+
end_date: 2.weeks.ago,
|
|
287
|
+
)
|
|
234
288
|
|
|
235
289
|
refute invalid_edition.valid?
|
|
236
290
|
assert_includes invalid_edition.errors.full_messages, "Start date can't be later than end date"
|
data/test/models/edition_test.rb
CHANGED
|
@@ -198,6 +198,21 @@ class EditionTest < ActiveSupport::TestCase
|
|
|
198
198
|
end
|
|
199
199
|
|
|
200
200
|
# test cloning into different edition types
|
|
201
|
+
Edition.subclasses.permutation(2).each do |source_class, destination_class|
|
|
202
|
+
test "it should be possible to clone from a #{source_class} to a #{destination_class}" do
|
|
203
|
+
# Note that the new edition won't necessarily be valid - for example the
|
|
204
|
+
# new type might have required fields that the old just doesn't have.
|
|
205
|
+
# This is OK because when Publisher saves the clone, it already skips
|
|
206
|
+
# validations. The user will then be required to populate those values
|
|
207
|
+
# before they save the edition again.
|
|
208
|
+
source_edition = FactoryGirl.create(:edition, _type: source_class.to_s, state: "published")
|
|
209
|
+
|
|
210
|
+
assert_nothing_raised do
|
|
211
|
+
new_edition = source_edition.build_clone(destination_class)
|
|
212
|
+
end
|
|
213
|
+
end
|
|
214
|
+
end
|
|
215
|
+
|
|
201
216
|
test "Cloning from GuideEdition into AnswerEdition" do
|
|
202
217
|
edition = FactoryGirl.create(
|
|
203
218
|
:guide_edition,
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: govuk_content_models
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 31.
|
|
4
|
+
version: 31.1.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Paul Battley
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2015-09-
|
|
11
|
+
date: 2015-09-14 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bson_ext
|