Skip to content

Commit 4736959

Browse files
authored
Merge pull request #2717 from govuk-forms/add-separate-make-live-confirmations-for-each-language
Add separate make live confirmations for each language
2 parents 89cd3e2 + 86bb118 commit 4736959

28 files changed

Lines changed: 1609 additions & 135 deletions
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
module Forms
2+
class MakeLanguageLiveController < FormsController
3+
def new
4+
authorize current_form, :can_make_language_live?
5+
return redirect_to form_path(form_id: current_form.id) unless current_form.can_make_language_live?(language: params[:language])
6+
7+
@make_language_live_input = MakeLiveInput.new(form: current_form)
8+
9+
render_new
10+
end
11+
12+
def create
13+
authorize current_form, :can_make_language_live?
14+
15+
@make_language_live_input = MakeLiveInput.new(**make_language_live_input_params)
16+
17+
return render_new(status: :unprocessable_content) unless @make_language_live_input.valid?
18+
return redirect_to form_path(@make_language_live_input.form.id) unless @make_language_live_input.confirmed?
19+
return redirect_to form_path(form_id: current_form.id) unless current_form.can_make_language_live?(language: params[:language])
20+
21+
@make_form_live_service = MakeFormLiveService.call(current_form:, current_user:, language: params[:language])
22+
@make_form_live_service.make_language_live
23+
24+
if current_form.state_previously_changed?
25+
OrgAdminAlertsService.new(form: current_form, current_user:).form_made_live
26+
end
27+
28+
redirect_to make_language_live_show_confirmation_path
29+
end
30+
31+
def show_confirmation
32+
authorize current_form, :can_make_language_live?
33+
@go_to_make_welsh_live_input = GoToMakeWelshLiveInput.new
34+
35+
render_confirmation
36+
end
37+
38+
def submit_confirmation
39+
authorize current_form, :can_make_language_live?
40+
41+
@go_to_make_welsh_live_input = GoToMakeWelshLiveInput.new(**go_to_make_welsh_live_input_params)
42+
43+
return render_confirmation(status: :unprocessable_content) unless @go_to_make_welsh_live_input.valid?
44+
45+
if @go_to_make_welsh_live_input.confirmed?
46+
redirect_to make_language_live_path(language: "cy")
47+
else
48+
redirect_to form_path
49+
end
50+
end
51+
52+
private
53+
54+
def make_language_live_input_params
55+
params.require(:forms_make_live_input).permit(:confirm).merge(form: current_form, language: params[:language])
56+
end
57+
58+
def render_new(status: :ok)
59+
render "new", status:, locals: { current_form:, language: params[:language] }
60+
end
61+
62+
def render_confirmation(status: :ok)
63+
@make_form_live_service = MakeFormLiveService.call(current_form:, current_user:, language: params[:language])
64+
65+
render "confirmation", status:, locals: {
66+
current_form:,
67+
confirmation_page_title: @make_form_live_service.page_title,
68+
confirmation_page_body: @make_form_live_service.confirmation_page_body,
69+
language: params[:language],
70+
}
71+
end
72+
73+
def go_to_make_welsh_live_input_params
74+
params.require(:forms_go_to_make_welsh_live_input).permit(:confirm)
75+
end
76+
end
77+
end

app/controllers/forms/make_live_controller.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ def make_live_input_params
3131
end
3232

3333
def render_new(status: :ok)
34-
if current_form.live_welsh_form_document.present? && current_form.task_statuses[:welsh_language_status] == :in_progress
34+
if current_form.live_welsh_form_document.present? && current_form.all_task_statuses[:welsh_language_status] == :in_progress
3535
render "make_your_changes_to_english_live", status:, locals: { current_form: }
3636
elsif current_form.is_live?
3737
render "make_your_changes_live", status:, locals: { current_form: }
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
class Forms::GoToMakeWelshLiveInput < ConfirmActionInput
2+
end
Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
class Forms::MakeLiveInput < ConfirmActionInput
2-
attr_accessor :form
2+
attr_accessor :form, :language
33

44
validate :required_parts_of_form_completed
55

@@ -8,12 +8,17 @@ class Forms::MakeLiveInput < ConfirmActionInput
88
def required_parts_of_form_completed
99
# we are valid and didn't need to save
1010
return unless confirmed?
11-
return if form.all_ready_for_live?
11+
return if form.all_ready_for_live?(ignore_missing_welsh:)
1212

13-
form.all_incomplete_tasks.each do |section|
13+
form.all_incomplete_tasks(ignore_missing_welsh:).each do |section|
1414
errors.add(:confirm, section.to_sym)
1515
end
1616

1717
errors.empty?
1818
end
19+
20+
def ignore_missing_welsh
21+
# Ignore missing Welsh if we're only making the English version live
22+
language == "en"
23+
end
1924
end

app/models/form.rb

Lines changed: 34 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -115,17 +115,13 @@ def marking_complete_with_errors
115115
errors.add(:base, :has_validation_errors, message: "Form has routing validation errors") if question_section_completed && has_routing_errors
116116
end
117117

118-
def ready_for_live
119-
task_status_service.mandatory_tasks_completed?
118+
def all_ready_for_live?(ignore_missing_welsh: false)
119+
task_status_service.mandatory_tasks_completed?(ignore_missing_welsh:)
120120
end
121121

122-
def all_ready_for_live?
123-
ready_for_live
124-
end
125-
126-
delegate :incomplete_tasks, to: :task_status_service
122+
delegate :all_incomplete_tasks, to: :task_status_service
127123

128-
delegate :task_statuses, to: :task_status_service
124+
delegate :all_task_statuses, to: :task_status_service
129125

130126
def group
131127
group_form&.group
@@ -149,14 +145,6 @@ def has_no_remaining_routes_available?
149145
qualifying_route_pages.none? && has_routing_conditions
150146
end
151147

152-
def all_incomplete_tasks
153-
incomplete_tasks
154-
end
155-
156-
def all_task_statuses
157-
task_statuses
158-
end
159-
160148
def page_number(page)
161149
return pages.length + 1 if page.nil?
162150
return pages.length + 1 if page.id.nil?
@@ -238,6 +226,12 @@ def next_page_after(current_page)
238226
pair&.last
239227
end
240228

229+
def can_make_language_live?(language:)
230+
return can_make_english_version_live? if language == "en"
231+
232+
can_make_welsh_version_live? if language == "cy"
233+
end
234+
241235
private
242236

243237
def set_external_id
@@ -281,6 +275,30 @@ def after_make_live
281275
FormDocumentSyncService.new(self).synchronize_live_form
282276
end
283277

278+
def before_make_english_live
279+
before_make_live
280+
end
281+
282+
def after_make_english_live
283+
FormDocumentSyncService.new(self).synchronize_only_live_english_form
284+
end
285+
286+
def before_make_welsh_live
287+
before_make_live
288+
end
289+
290+
def after_make_welsh_live
291+
FormDocumentSyncService.new(self).synchronize_only_live_welsh_form
292+
end
293+
294+
def can_make_english_version_live?
295+
has_draft_version && all_ready_for_live?(ignore_missing_welsh: true) && live_welsh_form_document.blank?
296+
end
297+
298+
def can_make_welsh_version_live?
299+
has_live_version && all_ready_for_live? && welsh_completed? && live_form_document.present? && live_welsh_form_document.blank?
300+
end
301+
284302
def after_archive
285303
FormDocumentSyncService.new(self).synchronize_archived_form
286304
end

app/policies/form_policy.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,12 @@ def can_make_form_live?
3030
false
3131
end
3232

33+
def can_make_language_live?
34+
return can_view_form? if form.group&.active? && can_administer_group?
35+
36+
false
37+
end
38+
3339
def can_administer_group?
3440
user.super_admin? || user.is_organisations_admin?(form.group&.organisation) || user.is_group_admin?(form.group)
3541
end

app/services/form_document_sync_service.rb

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,44 @@ def synchronize_archived_welsh_form
5252
end
5353
end
5454

55+
def synchronize_only_live_english_form
56+
FormDocument.transaction do
57+
# If we've already made the Welsh version live, changes to the Welsh version must be made live at the same time by calling a different method
58+
raise ActiveRecord::RecordNotFound, "Cannot make changes to only the live English form if there is already a live Welsh version." if FormDocument.where(form:, tag: LIVE_TAG, language: "cy").exists?
59+
60+
content = form_content("en", live_at: form.updated_at)
61+
update_or_create_form_document(LIVE_TAG, content, "en")
62+
63+
# Update the content of the live English version to to not include Welsh in available_languages
64+
FormDocument.where(form:, tag: [LIVE_TAG], language: "en").find_each do |live_document|
65+
live_document.content["available_languages"] = %w[en]
66+
live_document.save!
67+
end
68+
69+
# A new live version replaces any previous archived version
70+
delete_form_documents_by_tag(ARCHIVED_TAG)
71+
end
72+
end
73+
74+
def synchronize_only_live_welsh_form
75+
FormDocument.transaction do
76+
# Ensure we only make Welsh version live if there is already an existing live English version
77+
raise ActiveRecord::RecordNotFound, "Cannot make Welsh version live unless there is already a live English version." unless FormDocument.where(form:, tag: LIVE_TAG, language: "en").exists?
78+
79+
content = form_content("cy", live_at: form.updated_at)
80+
update_or_create_form_document(LIVE_TAG, content, "cy")
81+
82+
# Update the content of the live English version to show that it now supports Welsh
83+
FormDocument.where(form:, tag: [LIVE_TAG], language: "en").find_each do |live_document|
84+
live_document.content["available_languages"] = %w[en cy]
85+
live_document.save!
86+
end
87+
88+
# A new live version replaces any previous archived version
89+
delete_form_documents_by_tag(ARCHIVED_TAG)
90+
end
91+
end
92+
5593
def update_draft_form_document
5694
synchronize_documents_for_tag(DRAFT_TAG)
5795
end
@@ -79,6 +117,7 @@ def update_or_create_form_document(tag, content, language)
79117
language:,
80118
)
81119
form_document.content = content
120+
82121
form_document.save!
83122
end
84123

app/services/make_form_live_service.rb

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,13 @@ def call(**args)
55
end
66
end
77

8-
def initialize(current_form:, current_user:)
8+
def initialize(current_form:, current_user:, language: nil)
99
@current_form = current_form
1010
@current_form_was_live = current_form.is_live?
1111
@current_form_was_archived = current_form.is_archived?
1212
@current_live_form = FormDocument::Content.from_form_document(current_form.live_form_document) if current_form.is_live?
1313
@current_user = current_user
14+
@language = language
1415
end
1516

1617
def make_live
@@ -26,9 +27,19 @@ def make_live
2627
end
2728
end
2829

30+
def make_language_live
31+
if @language == "en"
32+
make_english_live
33+
else
34+
make_welsh_live
35+
end
36+
end
37+
2938
def page_title
3039
return I18n.t("page_titles.your_form_is_live") if @current_form_was_archived
40+
return I18n.t("page_titles.your_welsh_form_is_live") if @current_form_was_live && @language == "cy"
3141
return I18n.t("page_titles.your_changes_are_live") if @current_form_was_live
42+
return I18n.t("page_titles.your_english_form_is_live") if @language == "en"
3243

3344
I18n.t("page_titles.your_form_is_live")
3445
end
@@ -37,13 +48,22 @@ def confirmation_page_body
3748
return I18n.t("make_changes_live.confirmation.body_html_cy").html_safe if @current_form_was_live && @current_form.has_welsh_translation?
3849
return I18n.t("make_changes_live.confirmation.body_html").html_safe if @current_form_was_live
3950

51+
return I18n.t("make_live.confirmation.body_individual_language_html").html_safe if @language.present?
4052
return I18n.t("make_live.confirmation.body_html_cy").html_safe if @current_form.has_welsh_translation?
4153

4254
I18n.t("make_live.confirmation.body_html").html_safe
4355
end
4456

4557
private
4658

59+
def make_english_live
60+
@current_form.make_english_version_live!
61+
end
62+
63+
def make_welsh_live
64+
@current_form.make_welsh_version_live!
65+
end
66+
4767
def live_form_submission_email_has_changed
4868
@current_form_was_live && @current_live_form.submission_email != @current_form.submission_email
4969
end

app/services/task_status_service.rb

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,12 @@ def initialize(form:, current_user:)
55
end
66

77
def mandatory_tasks_completed?(ignore_missing_welsh: false)
8-
if ignore_missing_welsh
9-
incomplete_tasks.reject { |task| task == :missing_welsh_translations }.empty?
10-
else
11-
incomplete_tasks.empty?
12-
end
8+
all_incomplete_tasks(ignore_missing_welsh:).empty?
139
end
1410

15-
def incomplete_tasks
11+
def all_incomplete_tasks(ignore_missing_welsh: false)
12+
keys_to_skip = [(:missing_welsh_translations if ignore_missing_welsh)]
13+
values_to_skip = %i[completed optional]
1614
{
1715
missing_pages: pages_status,
1816
missing_what_happens_next: what_happens_next_status,
@@ -21,10 +19,10 @@ def incomplete_tasks
2119
share_preview_not_completed: share_preview_status,
2220
missing_welsh_translations: welsh_language_status,
2321
missing_submission_email: submission_email_status,
24-
}.reject { |_k, v| %i[completed optional].include?(v) }.keys
22+
}.reject { |k, v| keys_to_skip.include?(k) || values_to_skip.include?(v) }.keys
2523
end
2624

27-
def task_statuses
25+
def all_task_statuses
2826
{
2927
name_status:,
3028
pages_status:,

app/state_machines/form_state_machine.rb

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,21 @@ module FormStateMachine
3030
before :before_make_live
3131
after :after_make_live
3232

33-
transitions from: %i[draft live_with_draft archived archived_with_draft], to: :live, guard: :ready_for_live
33+
transitions from: %i[draft live_with_draft archived archived_with_draft], to: :live, guard: :all_ready_for_live?
34+
end
35+
36+
event :make_english_version_live do
37+
before :before_make_english_live
38+
after :after_make_english_live
39+
40+
transitions from: %i[draft live live_with_draft archived_with_draft], to: :live, guard: :can_make_english_version_live?
41+
end
42+
43+
event :make_welsh_version_live do
44+
before :before_make_welsh_live
45+
after :after_make_welsh_live
46+
47+
transitions from: %i[live live_with_draft], to: :live, guard: :can_make_welsh_version_live?
3448
end
3549

3650
event :create_draft_from_live_form do

0 commit comments

Comments
 (0)