diff --git a/Dockerfile b/Dockerfile index 624b9c20..6d4803fb 100644 --- a/Dockerfile +++ b/Dockerfile @@ -53,7 +53,7 @@ RUN DATABASE_PASSWORD=required-to-run-but-not-used \ bundle exec rails assets:precompile # Cleanup to save space in the production image -RUN rm -rf node_modules log/* tmp/* /tmp && \ +RUN rm -rf log/* tmp/* /tmp && \ rm -rf /usr/local/bundle/cache && \ rm -rf .env && \ find /usr/local/bundle/gems -name "*.c" -delete && \ @@ -85,6 +85,17 @@ COPY --from=builder /usr/local/bundle/ /usr/local/bundle/ ARG COMMIT_SHA ENV GIT_SHA=$COMMIT_SHA ENV SHA=$GIT_SHA +# Set up puppeteer (for PDF generation) +# https://pptr.dev/troubleshooting#running-on-alpine +RUN apk add --no-cache \ + chromium \ + nss \ + freetype \ + harfbuzz \ + ca-certificates \ + ttf-freefont \ + nodejs +ENV PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium-browser CMD bundle exec rails db:migrate:ignore_concurrent_migration_exceptions && \ bundle exec rails data:migrate:ignore_concurrent_migration_exceptions && \ diff --git a/app/assets/builds/certificates.css b/app/assets/builds/certificates.css new file mode 100644 index 00000000..4e93a0ce --- /dev/null +++ b/app/assets/builds/certificates.css @@ -0,0 +1,65 @@ +body { + margin: 0; + padding: 0; +} + +.container { + position: absolute; + top: 0px; + left: 0px; + margin: 0; + padding: 0; + width: 100%; +} + +.content { + position: absolute; + top: 350px; + left: 100px; + width: 100%; +} + +.header-image { + position: absolute; + top: 0px; + left: 0px; + width: 100%; +} + +.heading { + font-size: 82px; + font-family: Helvetica; + color: #063961; +} + +.text { + font-size: 18px; + font-family: Helvetica; + color: #231f20; +} + +.content-npq { + position: absolute; + top: 350px; + left: 85px; + width: 100%; +} + +.text-npq { + font-size: 32px; + font-family: Arial; + color: #231f20; +} + +.heading-npq { + font-size: 48px; + font-family: Arial; + color: #231f20; +} + +.name-heading-npq { + max-width: 70%; + text-align: left; + font-size: clamp(16px, 4vw, 40px); + white-space: nowrap; +} diff --git a/app/assets/stylesheets/certificates.scss b/app/assets/stylesheets/certificates.scss index 2dc9626d..78dfbd43 100644 --- a/app/assets/stylesheets/certificates.scss +++ b/app/assets/stylesheets/certificates.scss @@ -32,3 +32,25 @@ body { font-family: Helvetica; color: #231f20; } +.content-npq { + position: absolute; + top: 350px; + left: 85px; + width: 100%; +} +.text-npq { + font-size: 32px; + font-family: Arial; + color: #231f20; +} +.heading-npq { + font-size: 48px; + font-family: Arial; + color: #231f20; +} +.name-heading-npq { + max-width: 70%; + text-align: left; + font-size: clamp(16px, 4vw, 40px); + white-space: nowrap; +} diff --git a/app/components/induction_summary_component.rb b/app/components/induction_summary_component.rb index 79bffbef..681a90c9 100644 --- a/app/components/induction_summary_component.rb +++ b/app/components/induction_summary_component.rb @@ -5,7 +5,7 @@ class InductionSummaryComponent < ViewComponent::Base attr_accessor :qualification - delegate :awarded_at, :certificate_type, :details, :name, to: :qualification + delegate :awarded_at, :type, :details, :name, to: :qualification def detail_classes "app__induction-details" @@ -71,7 +71,7 @@ def rows } ] - if details.respond_to?(:certificate_url) && details.certificate_url.present? + if details.status == "Pass" @rows << { key: { text: "Certificate" @@ -80,7 +80,7 @@ def rows text: link_to( "Download Induction certificate", - qualifications_certificate_path(certificate_type, format: :pdf), + qualifications_certificate_path(:induction, format: :pdf), class: "govuk-link" ) } diff --git a/app/controllers/qualifications/certificates_controller.rb b/app/controllers/qualifications/certificates_controller.rb index a7f5d65f..7b922255 100644 --- a/app/controllers/qualifications/certificates_controller.rb +++ b/app/controllers/qualifications/certificates_controller.rb @@ -13,7 +13,7 @@ def show formats: [:html], locals: { teacher: @teacher, qualification: @qualification }, layout: "layouts/certificate") - grover = Grover.new(html, format: 'A4', display_url: request.base_url) + grover = Grover.new(html, format: 'A4', display_url: ENV["HOSTING_DOMAIN"]) pdf = grover.to_pdf send_data pdf, filename: "#{@teacher.name}_#{@qualification.type.downcase}_certificate.pdf", type: 'application/pdf', disposition: 'attachment' @@ -22,7 +22,12 @@ def show private def client - @client ||= QualificationsApi::Client.new(token: session[:identity_user_token]) + token = if FeatureFlags::FeatureFlag.active?(:one_login) + :onelogin_user_token + else + :identity_user_token + end + @client ||= QualificationsApi::Client.new(token: session[token]) end def teacher diff --git a/app/views/qualifications/certificates/_eyts.html.erb b/app/views/qualifications/certificates/_eyts.html.erb index 4345063f..22457e16 100644 --- a/app/views/qualifications/certificates/_eyts.html.erb +++ b/app/views/qualifications/certificates/_eyts.html.erb @@ -1,7 +1,7 @@ Department for Education
-

Early years
Teacher Status

+

Early Years
Teacher Status

This is to certify that: <%= teacher.name %>

Teacher Reference Number: <%= teacher.trn %>

 

diff --git a/app/views/qualifications/certificates/_induction.html.erb b/app/views/qualifications/certificates/_induction.html.erb index 65eb7675..e90d0293 100644 --- a/app/views/qualifications/certificates/_induction.html.erb +++ b/app/views/qualifications/certificates/_induction.html.erb @@ -1,7 +1,7 @@ Department for Education
-

Induction

+

Induction

This is to certify that: <%= teacher.name %>

Teacher Reference Number: <%= teacher.trn %>

 

@@ -11,9 +11,9 @@ institution. The holder of this certificate is a qualified teacher and has obtained the required
qualifications and completed the necessary training for the profession of school teacher in England.

 

-

Date Induction Completed: <%= qualification.awarded_at.to_fs(:long_uk) %>

+

Date Induction Completed: <%= qualification.details.periods.first.end_date.to_date.to_fs(:long_uk) %>

 

Congratulations and best wishes for your future career.

 

-

Any potential employer can independently confirm your teacher status online at:
https://teacherservices.education.gov.uk

+

Any potential employer can independently confirm your teacher status online at:
https://www.gov.uk/guidance/check-a-teachers-record

\ No newline at end of file diff --git a/app/views/qualifications/certificates/_npq.html.erb b/app/views/qualifications/certificates/_npq.html.erb index a098eb41..2f0e1d36 100644 --- a/app/views/qualifications/certificates/_npq.html.erb +++ b/app/views/qualifications/certificates/_npq.html.erb @@ -2,7 +2,7 @@

This is to certify that:

-

<%= teacher.name %>

+

<%= teacher.name %>

has been awarded the

diff --git a/app/views/qualifications/certificates/_qts.html.erb b/app/views/qualifications/certificates/_qts.html.erb index fee2966e..11fb0002 100644 --- a/app/views/qualifications/certificates/_qts.html.erb +++ b/app/views/qualifications/certificates/_qts.html.erb @@ -1,7 +1,7 @@ Department for Education
-

Qualified
Teacher Status

+

Qualified
Teacher Status

This is to certify that: <%= teacher.name %>

Teacher Reference Number: <%= teacher.trn %>

 

@@ -19,5 +19,5 @@

 

Congratulations and best wishes for your future career

 

-

Any potential employer can independently confirm your teacher status online at:
https://teacherservices.education.gov.uk

+

Any potential employer can independently confirm your teacher status online at:
https://www.gov.uk/guidance/check-a-teachers-record

diff --git a/config/database.yml b/config/database.yml index 508fa0d6..8448bb56 100644 --- a/config/database.yml +++ b/config/database.yml @@ -1,7 +1,7 @@ default: &default adapter: postgresql encoding: unicode - url: <%= ENV.fetch('DATABASE_URL', 'postgres://postgres@localhost:5432') %> + url: <%= ENV.fetch('DATABASE_URL', 'postgres://postgres@localhost:5434') %> development: <<: *default diff --git a/config/initializers/grover.rb b/config/initializers/grover.rb index d9777f62..96f12806 100644 --- a/config/initializers/grover.rb +++ b/config/initializers/grover.rb @@ -6,7 +6,8 @@ bottom: "0", left: "0", right: "0" - } + }, + launch_args: ["--no-sandbox", "--disable-setuid-sandbox"], } config.use_jpeg_middleware = false config.use_png_middleware = false diff --git a/public/eyts-certificate.jpg b/public/eyts-certificate.jpg index 33c4ccc6..ea682813 100644 Binary files a/public/eyts-certificate.jpg and b/public/eyts-certificate.jpg differ diff --git a/public/induction-certificate.jpg b/public/induction-certificate.jpg index 0411a252..7554d482 100644 Binary files a/public/induction-certificate.jpg and b/public/induction-certificate.jpg differ diff --git a/public/npq-certificate.jpg b/public/npq-certificate.jpg index 6cd64617..20e0b191 100644 Binary files a/public/npq-certificate.jpg and b/public/npq-certificate.jpg differ diff --git a/public/qts-certificate.jpg b/public/qts-certificate.jpg index 458038f6..2b464323 100644 Binary files a/public/qts-certificate.jpg and b/public/qts-certificate.jpg differ diff --git a/spec/components/induction_summary_component_spec.rb b/spec/components/induction_summary_component_spec.rb index daef2c2e..0f62eb13 100644 --- a/spec/components/induction_summary_component_spec.rb +++ b/spec/components/induction_summary_component_spec.rb @@ -57,17 +57,5 @@ expect(rendered.css(".govuk-summary-list__key").map(&:text)).not_to include("Completed") expect(rendered.css(".govuk-summary-list__key").map(&:text)).not_to include("End date") end - - context "when the certificate URL is missing" do - let(:induction) do - fake_quals_data.fetch("induction").tap do |data| - data.delete(:certificate_url) - end - end - - it "does not render the certificate row when certificate URL is missing" do - expect(rendered.css(".govuk-summary-list__key").map(&:text)).not_to include("Certificate") - end - end end end diff --git a/spec/rails_helper.rb b/spec/rails_helper.rb index f6f4a6ed..e7e7e32f 100644 --- a/spec/rails_helper.rb +++ b/spec/rails_helper.rb @@ -17,7 +17,7 @@ WebMock.disable_net_connect!(allow_localhost: true) Capybara.register_driver(:cuprite) do |app| - Capybara::Cuprite::Driver.new(app, timeout: 30, process_timeout: 40, window_size: [1200, 800]) + Capybara::Cuprite::Driver.new(app, timeout: 200, process_timeout: 120, window_size: [1200, 800]) end Capybara.default_driver = :cuprite Capybara.javascript_driver = :cuprite