Browse Source

Merge branch 'main' into CLDC-571-allow-users-to-login-and-change-password

pull/81/head
Matthew Phelan 3 years ago
parent
commit
438b3dacda
  1. 8
      app/controllers/case_logs_controller.rb
  2. 10
      app/models/bulk_upload.rb
  3. 1
      app/models/case_log.rb
  4. 21
      app/validations/date_validations.rb
  5. 2
      app/views/case_logs/edit.html.erb
  6. 2
      app/views/case_logs/index.html.erb
  7. 2
      app/views/form/check_answers.html.erb
  8. 2
      app/views/form/page.html.erb
  9. 25
      app/views/layouts/application.html.erb
  10. 14
      config/forms/2021_2022.json
  11. 11
      db/migrate/20211116102527_change_datetime.rb
  12. 4
      db/schema.rb
  13. 2
      spec/controllers/case_logs_controller_spec.rb
  14. 52
      spec/features/case_log_spec.rb
  15. 2
      spec/fixtures/forms/test_form.json

8
app/controllers/case_logs_controller.rb

@ -109,9 +109,13 @@ private
day = params["case_log"]["#{question_key}(3i)"] day = params["case_log"]["#{question_key}(3i)"]
month = params["case_log"]["#{question_key}(2i)"] month = params["case_log"]["#{question_key}(2i)"]
year = params["case_log"]["#{question_key}(1i)"] year = params["case_log"]["#{question_key}(1i)"]
next unless day.present? && month.present? && year.present? next unless [day, month, year].any?(&:present?)
result[question_key] = Date.new(year.to_i, month.to_i, day.to_i) result[question_key] = if day.to_i.between?(1, 31) && month.to_i.between?(1, 12) && year.to_i.between?(2000, 2200)
Date.new(year.to_i, month.to_i, day.to_i)
else
Date.new(0, 1, 1)
end
end end
next unless question_params next unless question_params

10
app/models/bulk_upload.rb

@ -26,12 +26,14 @@ class BulkUpload
else else
data_range = FIRST_DATA_ROW..last_row data_range = FIRST_DATA_ROW..last_row
data_range.map do |row_num| data_range.map do |row_num|
case_log = CaseLog.create case_log = CaseLog.create!
map_row(sheet.row(row_num)).each do |attr_key, attr_val| map_row(sheet.row(row_num)).each do |attr_key, attr_val|
begin update = case_log.update(attr_key => attr_val)
case_log.update_attribute(attr_key, attr_val) unless update
rescue ArgumentError # TODO: determine what to do when a bulk upload contains field values that don't pass validations
end end
rescue ArgumentError
# TODO: determine what we want to do when bulk upload contains totally invalid data for a field.
end end
end end
end end

1
app/models/case_log.rb

@ -5,6 +5,7 @@ class CaseLogValidator < ActiveModel::Validator
include PropertyValidations include PropertyValidations
include FinancialValidations include FinancialValidations
include TenancyValidations include TenancyValidations
include DateValidations
def validate(record) def validate(record)
# If we've come from the form UI we only want to validate the specific fields # If we've come from the form UI we only want to validate the specific fields

21
app/validations/date_validations.rb

@ -0,0 +1,21 @@
module DateValidations
def validate_property_major_repairs(record)
date_valid?("mrcdate", record)
end
def validate_tenancy_start_date(record)
date_valid?("startdate", record)
end
def validate_sale_completion_date(record)
date_valid?("sale_completion_date", record)
end
private
def date_valid?(question, record)
if record[question].is_a?(ActiveSupport::TimeWithZone) && record[question].year.zero?
record.errors.add question, "Please enter a valid date"
end
end
end

2
app/views/case_logs/edit.html.erb

@ -1,6 +1,6 @@
<%= turbo_frame_tag "case_log_form", target: "_top" do %> <%= turbo_frame_tag "case_log_form", target: "_top" do %>
<div class="govuk-grid-row"> <div class="govuk-grid-row">
<div class="govuk-grid-column-two-thirds"> <div class="govuk-grid-column-two-thirds-from-desktop">
<h1 class="govuk-heading-xl">Tasklist for log <h1 class="govuk-heading-xl">Tasklist for log
<%= @case_log.id %></h1> <%= @case_log.id %></h1>

2
app/views/case_logs/index.html.erb

@ -2,7 +2,7 @@
<div class="govuk-grid-column-full"> <div class="govuk-grid-column-full">
<h1 class="govuk-heading-xl">Your logs</h1> <h1 class="govuk-heading-xl">Your logs</h1>
</div> </div>
<div class="govuk-grid-column-two-thirds"> <div class="govuk-grid-column-two-thirds-from-desktop">
<%= link_to "Create new log", case_logs_path, method: :post, class: "govuk-button" %> <%= link_to "Create new log", case_logs_path, method: :post, class: "govuk-button" %>

2
app/views/form/check_answers.html.erb

@ -1,6 +1,6 @@
<%= turbo_frame_tag "case_log_form", target: "_top" do %> <%= turbo_frame_tag "case_log_form", target: "_top" do %>
<div class="govuk-grid-row"> <div class="govuk-grid-row">
<div class="govuk-grid-column-two-thirds-from-desktop"> <div class="govuk-grid-column-three-quarters-from-desktop">
<h1 class="govuk-heading-l">Check the answers you gave for <%= subsection.humanize(capitalize: false) %></h1> <h1 class="govuk-heading-l">Check the answers you gave for <%= subsection.humanize(capitalize: false) %></h1>
<%= display_answered_questions_summary(subsection, @case_log, form) %> <%= display_answered_questions_summary(subsection, @case_log, form) %>
<% form.pages_for_subsection(subsection).each do |page, page_info| %> <% form.pages_for_subsection(subsection).each do |page, page_info| %>

2
app/views/form/page.html.erb

@ -4,7 +4,7 @@
<%= turbo_frame_tag "case_log_form", target: "_top" do %> <%= turbo_frame_tag "case_log_form", target: "_top" do %>
<div class="govuk-grid-row"> <div class="govuk-grid-row">
<div class="govuk-grid-column-two-thirds"> <div class="govuk-grid-column-two-thirds-from-desktop">
<% if page_info["header"].present? %> <% if page_info["header"].present? %>
<h1 class="govuk-heading-xl"> <h1 class="govuk-heading-xl">
<%= page_info["header"] %> <%= page_info["header"] %>

25
app/views/layouts/application.html.erb

@ -35,25 +35,12 @@
<a href="#main-content" class="govuk-skip-link">Skip to main content</a> <a href="#main-content" class="govuk-skip-link">Skip to main content</a>
<header class="govuk-header" role="banner" data-module="govuk-header"> <header class="govuk-header" role="banner" data-module="govuk-header">
<div class="govuk-header__container govuk-width-container"> <%= render GovukComponent::HeaderComponent.new(
<div class="govuk-header__logo"> logotype: 'GOV.UK',
<%= link_to "/", class: "govuk-header__link govuk-header__link--homepage" do %> service_name: 'Share Lettings and Sales for Social Housing in England Data with DLUHC',
<span class="govuk-header__logotype"> service_url: '/'
<svg role="presentation" focusable="false" class="govuk-header__logotype-crown" xmlns="http://www.w3.org/2000/svg" viewbox="0 0 132 97" height="32" width="36"> )
<path fill="currentColor" fill-rule="evenodd" d="M25 30.2c3.5 1.5 7.7-.2 9.1-3.7 1.5-3.6-.2-7.8-3.9-9.2-3.6-1.4-7.6.3-9.1 3.9-1.4 3.5.3 7.5 3.9 9zM9 39.5c3.6 1.5 7.8-.2 9.2-3.7 1.5-3.6-.2-7.8-3.9-9.1-3.6-1.5-7.6.2-9.1 3.8-1.4 3.5.3 7.5 3.8 9zM4.4 57.2c3.5 1.5 7.7-.2 9.1-3.8 1.5-3.6-.2-7.7-3.9-9.1-3.5-1.5-7.6.3-9.1 3.8-1.4 3.5.3 7.6 3.9 9.1zm38.3-21.4c3.5 1.5 7.7-.2 9.1-3.8 1.5-3.6-.2-7.7-3.9-9.1-3.6-1.5-7.6.3-9.1 3.8-1.3 3.6.4 7.7 3.9 9.1zm64.4-5.6c-3.6 1.5-7.8-.2-9.1-3.7-1.5-3.6.2-7.8 3.8-9.2 3.6-1.4 7.7.3 9.2 3.9 1.3 3.5-.4 7.5-3.9 9zm15.9 9.3c-3.6 1.5-7.7-.2-9.1-3.7-1.5-3.6.2-7.8 3.7-9.1 3.6-1.5 7.7.2 9.2 3.8 1.5 3.5-.3 7.5-3.8 9zm4.7 17.7c-3.6 1.5-7.8-.2-9.2-3.8-1.5-3.6.2-7.7 3.9-9.1 3.6-1.5 7.7.3 9.2 3.8 1.3 3.5-.4 7.6-3.9 9.1zM89.3 35.8c-3.6 1.5-7.8-.2-9.2-3.8-1.4-3.6.2-7.7 3.9-9.1 3.6-1.5 7.7.3 9.2 3.8 1.4 3.6-.3 7.7-3.9 9.1zM69.7 17.7l8.9 4.7V9.3l-8.9 2.8c-.2-.3-.5-.6-.9-.9L72.4 0H59.6l3.5 11.2c-.3.3-.6.5-.9.9l-8.8-2.8v13.1l8.8-4.7c.3.3.6.7.9.9l-5 15.4v.1c-.2.8-.4 1.6-.4 2.4 0 4.1 3.1 7.5 7 8.1h.2c.3 0 .7.1 1 .1.4 0 .7 0 1-.1h.2c4-.6 7.1-4.1 7.1-8.1 0-.8-.1-1.7-.4-2.4V34l-5.1-15.4c.4-.2.7-.6 1-.9zM66 92.8c16.9 0 32.8 1.1 47.1 3.2 4-16.9 8.9-26.7 14-33.5l-9.6-3.4c1 4.9 1.1 7.2 0 10.2-1.5-1.4-3-4.3-4.2-8.7L108.6 76c2.8-2 5-3.2 7.5-3.3-4.4 9.4-10 11.9-13.6 11.2-4.3-.8-6.3-4.6-5.6-7.9 1-4.7 5.7-5.9 8-.5 4.3-8.7-3-11.4-7.6-8.8 7.1-7.2 7.9-13.5 2.1-21.1-8 6.1-8.1 12.3-4.5 20.8-4.7-5.4-12.1-2.5-9.5 6.2 3.4-5.2 7.9-2 7.2 3.1-.6 4.3-6.4 7.8-13.5 7.2-10.3-.9-10.9-8-11.2-13.8 2.5-.5 7.1 1.8 11 7.3L80.2 60c-4.1 4.4-8 5.3-12.3 5.4 1.4-4.4 8-11.6 8-11.6H55.5s6.4 7.2 7.9 11.6c-4.2-.1-8-1-12.3-5.4l1.4 16.4c3.9-5.5 8.5-7.7 10.9-7.3-.3 5.8-.9 12.8-11.1 13.8-7.2.6-12.9-2.9-13.5-7.2-.7-5 3.8-8.3 7.1-3.1 2.7-8.7-4.6-11.6-9.4-6.2 3.7-8.5 3.6-14.7-4.6-20.8-5.8 7.6-5 13.9 2.2 21.1-4.7-2.6-11.9.1-7.7 8.8 2.3-5.5 7.1-4.2 8.1.5.7 3.3-1.3 7.1-5.7 7.9-3.5.7-9-1.8-13.5-11.2 2.5.1 4.7 1.3 7.5 3.3l-4.7-15.4c-1.2 4.4-2.7 7.2-4.3 8.7-1.1-3-.9-5.3 0-10.2l-9.5 3.4c5 6.9 9.9 16.7 14 33.5 14.8-2.1 30.8-3.2 47.7-3.2z"></path> %>
<image src="<%= asset_pack_path('media/images/govuk-logotype-crown.png') %>" class="govuk-header__logotype-crown-fallback-image"></image>
</svg>
<span class="govuk-header__logotype-text">
GOV.UK
</span>
</span>
<% end %>
</div>
<div class="govuk-header__content">
<%= link_to "Share Lettings and Sales for Social Housing in England Data with DLUHC", "/", class: "govuk-header__link govuk-header__link--service-name" %>
</div>
</div>
</header> </header>
<aside class="govuk-width-container"> <aside class="govuk-width-container">

14
config/forms/2021_2022.json

@ -1028,18 +1028,6 @@
"tenancy_information": { "tenancy_information": {
"label": "Tenancy information", "label": "Tenancy information",
"pages": { "pages": {
"tenancy_code": {
"header": "",
"description": "",
"questions": {
"tenancy_code": {
"check_answer_label": "What is the tenancy code?",
"header": "What is the tenancy code?",
"hint_text": "",
"type": "text"
}
}
},
"starter_tenancy": { "starter_tenancy": {
"header": "", "header": "",
"description": "", "description": "",
@ -1088,7 +1076,7 @@
"4": "Other" "4": "Other"
}, },
"conditional_for": { "conditional_for": {
"other_tenancy_type": ["Other"] "tenancyother": ["Other"]
} }
}, },
"tenancyother": { "tenancyother": {

11
db/migrate/20211116102527_change_datetime.rb

@ -1,5 +1,5 @@
class ChangeDatetime < ActiveRecord::Migration[6.1] class ChangeDatetime < ActiveRecord::Migration[6.1]
def change def up
change_table :case_logs, bulk: true do |t| change_table :case_logs, bulk: true do |t|
t.remove :sale_completion_date t.remove :sale_completion_date
t.column :sale_completion_date, :datetime t.column :sale_completion_date, :datetime
@ -7,4 +7,13 @@ class ChangeDatetime < ActiveRecord::Migration[6.1]
t.column :startdate, :datetime t.column :startdate, :datetime
end end
end end
def down
change_table :case_logs, bulk: true do |t|
t.remove :sale_completion_date
t.column :sale_completion_date, :string
t.remove :startdate
t.column :startdate, :string
end
end
end end

4
db/schema.rb

@ -121,6 +121,8 @@ ActiveRecord::Schema.define(version: 2021_11_16_102527) do
t.integer "rp_dontknow" t.integer "rp_dontknow"
t.datetime "discarded_at" t.datetime "discarded_at"
t.string "tenancyother" t.string "tenancyother"
t.integer "override_net_income_validation"
t.string "net_income_known"
t.string "gdpr_acceptance" t.string "gdpr_acceptance"
t.string "gdpr_declined" t.string "gdpr_declined"
t.string "property_owner_organisation" t.string "property_owner_organisation"
@ -131,8 +133,6 @@ ActiveRecord::Schema.define(version: 2021_11_16_102527) do
t.string "intermediate_rent_product_name" t.string "intermediate_rent_product_name"
t.string "needs_type" t.string "needs_type"
t.string "purchaser_code" t.string "purchaser_code"
t.integer "override_net_income_validation"
t.string "net_income_known"
t.integer "reason" t.integer "reason"
t.string "propcode" t.string "propcode"
t.integer "majorrepairs" t.integer "majorrepairs"

2
spec/controllers/case_logs_controller_spec.rb

@ -186,7 +186,7 @@ RSpec.describe CaseLogsController, type: :controller do
"mrcdate(1i)": "2021", "mrcdate(1i)": "2021",
"mrcdate(2i)": "05", "mrcdate(2i)": "05",
"mrcdate(3i)": "04", "mrcdate(3i)": "04",
page: "major_repairs_date", page: "property_major_repairs",
} }
end end
it "saves full and partial dates" do it "saves full and partial dates" do

52
spec/features/case_log_spec.rb

@ -493,4 +493,56 @@ RSpec.describe "Form Features" do
expect(page).to have_current_path("/case_logs/#{id}/rent") expect(page).to have_current_path("/case_logs/#{id}/rent")
end end
end end
describe "date validation", js: true do
def fill_in_date(case_log_id, question, day, month, year, path)
visit("/case_logs/#{case_log_id}/#{path}")
fill_in("#{question}_1i", with: year)
fill_in("#{question}_2i", with: month)
fill_in("#{question}_3i", with: day)
end
it "does not allow out of range dates to be submitted" do
fill_in_date(id, "case_log_mrcdate", 3100, 12, 2000, "property_major_repairs")
click_button("Save and continue")
expect(page).to have_current_path("/case_logs/#{id}/property_major_repairs")
fill_in_date(id, "case_log_mrcdate", 12, 1, 20_000, "property_major_repairs")
click_button("Save and continue")
expect(page).to have_current_path("/case_logs/#{id}/property_major_repairs")
fill_in_date(id, "case_log_mrcdate", 13, 100, 2020, "property_major_repairs")
click_button("Save and continue")
expect(page).to have_current_path("/case_logs/#{id}/property_major_repairs")
fill_in_date(id, "case_log_mrcdate", 21, 11, 2020, "property_major_repairs")
click_button("Save and continue")
expect(page).to have_current_path("/case_logs/#{id}/local_authority/check_answers")
end
it "does not allow non numeric inputs to be submitted" do
fill_in_date(id, "case_log_mrcdate", "abc", "de", "ff", "property_major_repairs")
click_button("Save and continue")
expect(page).to have_current_path("/case_logs/#{id}/property_major_repairs")
end
it "does not allow partial inputs to be submitted" do
fill_in_date(id, "case_log_mrcdate", 21, 12, nil, "property_major_repairs")
click_button("Save and continue")
expect(page).to have_current_path("/case_logs/#{id}/property_major_repairs")
fill_in_date(id, "case_log_mrcdate", 12, nil, 2000, "property_major_repairs")
click_button("Save and continue")
expect(page).to have_current_path("/case_logs/#{id}/property_major_repairs")
fill_in_date(id, "case_log_mrcdate", nil, 10, 2020, "property_major_repairs")
click_button("Save and continue")
expect(page).to have_current_path("/case_logs/#{id}/property_major_repairs")
end
it "allows valid inputs to be submitted" do
fill_in_date(id, "case_log_mrcdate", 21, 11, 2020, "property_major_repairs")
click_button("Save and continue")
expect(page).to have_current_path("/case_logs/#{id}/local_authority/check_answers")
end
end
end end

2
spec/fixtures/forms/test_form.json vendored

@ -511,7 +511,7 @@
} }
} }
}, },
"major_repairs_date": { "property_major_repairs": {
"questions": { "questions": {
"mrcdate": { "mrcdate": {
"check_answer_label": "What was the major repairs completion date?", "check_answer_label": "What was the major repairs completion date?",

Loading…
Cancel
Save