renalware-core 2.0.69 → 2.0.70

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/renalware/events/events_controller.rb +61 -22
  3. data/app/controllers/renalware/session_timeout_controller.rb +1 -0
  4. data/app/helpers/renalware/application_helper.rb +1 -1
  5. data/app/jobs/renalware/events/save_pdf_event_to_file_job.rb +30 -0
  6. data/app/models/renalware/events/create_event.rb +28 -0
  7. data/app/models/renalware/events/update_event.rb +27 -0
  8. data/app/models/renalware/patient.rb +2 -1
  9. data/app/pdfs/renalware/events/event_pdf.rb +124 -0
  10. data/app/presenters/renalware/events/event_pdf_presenter.rb +30 -0
  11. data/app/presenters/renalware/ukrdc/patient_presenter.rb +2 -1
  12. data/app/views/renalware/accesses/plans/new.html.slim +2 -1
  13. data/app/views/renalware/admissions/requests/_form.html.slim +1 -1
  14. data/app/views/renalware/api/ukrdc/patients/lab_orders/_lab_order.xml.builder +1 -1
  15. data/app/views/renalware/api/ukrdc/patients/lab_orders/_result_item.xml.builder +20 -14
  16. data/app/views/renalware/events/events/show.pdf.slim +9 -0
  17. data/app/views/renalware/hd/preference_sets/_form.html.slim +2 -1
  18. data/app/views/renalware/letters/letters/_form.html.slim +1 -1
  19. data/app/views/renalware/modalities/modalities/new.html.slim +2 -1
  20. data/app/views/renalware/patients/patients/_form.html.slim +1 -1
  21. data/app/views/renalware/pd/regimes/_form.html.slim +2 -1
  22. data/app/views/renalware/pd/training_sessions/_form.html.slim +2 -1
  23. data/app/views/renalware/problems/notes/_form.html.slim +1 -1
  24. data/app/views/renalware/problems/problems/edit.html.slim +1 -1
  25. data/app/views/renalware/problems/problems/new.html.slim +1 -1
  26. data/app/views/renalware/renal/profiles/_form.html.slim +3 -1
  27. data/config/initializers/delayed_job.rb +1 -1
  28. data/config/initializers/renalware.rb +4 -2
  29. data/config/routes.rb +3 -0
  30. data/db/migrate/20190218142207_add_filename_prefix_to_event_types.rb +6 -0
  31. data/db/migrate/20190225103005_add_info_to_hospital_centres.rb +7 -0
  32. data/lib/renalware/engine.rb +1 -0
  33. data/lib/renalware/version.rb +1 -1
  34. data/lib/tasks/db.rake +1 -1
  35. metadata +24 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 163a7c7878bbd1480f5900ac489915e6f6b9616d3e5c7bbe70f3b0df53d103da
4
- data.tar.gz: 29b152cce1ee8bd3948ab72ea17ae5c09b0bbeb8885d2b1a805c3d2be2334b56
3
+ metadata.gz: 352f76d3ec23a7f2706d34b5852d8ce258815e6cc22715b67a27a568d7eb689c
4
+ data.tar.gz: 9ad9a5a56ada56b791d0890d952948f978a5bf76eb3311458ce157803409b588
5
5
  SHA512:
6
- metadata.gz: f8eecf19c3c134d811c20990f3a91e718242fd98a82ead06628ddb50075a84e522d8724eee3723b785c045d89fced233a41c0a13d8c0490bb9455d22337361c8
7
- data.tar.gz: 929e42ec1986252c87388dc0367d289d02061aeb87a003ebfd08b7bf4b570878e57cc1c4976d5c6c6cec2ccda5b70687dd63583f8449402fd0c18a22f3bc5357
6
+ metadata.gz: 8085fb62067b61c714387e07d4be44525fdd133deb3a80ff7d41784b7ac6ebeff9c6a8e56ad87252a13c7069a9105bcf16a1c7a71729ef26214cd717ec0ac743
7
+ data.tar.gz: e81d0c7a65bf99133e0ca5097b9680f9524beed3489087047ac8254a59aa4caace983ff538774667329acc8a6913090defdd4eafd1c2447b03c9badad7944a73
@@ -2,35 +2,40 @@
2
2
 
3
3
  # rubocop:disable Metrics/ClassLength
4
4
  require_dependency "renalware/events"
5
+ require "attr_extras"
5
6
 
6
7
  module Renalware
7
8
  module Events
8
9
  class EventsController < BaseController
9
10
  include Renalware::Concerns::Pageable
11
+ include Renalware::Concerns::PdfRenderable
12
+
13
+ # Render a PDF of the event
14
+ def show
15
+ event = load_and_authorize_event_for_edit_or_update
16
+ respond_to do |format|
17
+ format.pdf do
18
+ pdf = EventPdf.new(EventPdfPresenter.new(event))
19
+ send_data pdf.render, type: "application/pdf", disposition: "inline"
20
+ end
21
+ end
22
+ end
10
23
 
11
24
  # HTML GET when rendering the new form
12
25
  # JS GET after user selects event type, prompting us to return event-specific form fields
13
26
  def new
14
27
  save_path_to_return_to
15
- render locals: {
16
- patient: patient,
17
- event: build_new_event,
18
- event_types: event_types
19
- }
28
+ render_new(build_new_event)
20
29
  end
21
30
 
22
31
  def create
23
32
  event = new_event_for_patient(event_params)
24
33
 
25
- if event.save_by(current_user)
34
+ if CreateEvent.call(event: event, by: current_user)
26
35
  redirect_to return_url, notice: t(".success", model_name: "event")
27
36
  else
28
37
  flash.now[:error] = t(".failed", model_name: "event")
29
- render :new, locals: {
30
- patient: patient,
31
- event: event,
32
- event_types: event_types
33
- }
38
+ render_new(event)
34
39
  end
35
40
  end
36
41
 
@@ -47,29 +52,43 @@ module Renalware
47
52
  end
48
53
 
49
54
  def edit
50
- render locals: {
51
- patient: patient,
52
- event: load_and_authorize_event_for_edit_or_update,
53
- event_types: []
54
- }
55
+ render_edit(load_and_authorize_event_for_edit_or_update)
55
56
  end
56
57
 
57
58
  def update
58
59
  event = load_and_authorize_event_for_edit_or_update
59
- if event.update_by(current_user, event_params)
60
+
61
+ if UpdateEvent.call(event: event, params: event_params, by: current_user)
60
62
  redirect_to return_url, notice: t(".success", model_name: "event")
61
63
  else
62
64
  flash.now[:error] = failed_msg_for("event type")
63
- render :edit, locals: {
64
- patient: patient,
65
- event: event,
66
- event_types: []
67
- }
65
+ render_edit(event)
68
66
  end
69
67
  end
70
68
 
69
+ def destroy
70
+ load_and_authorize_event_for_edit_or_update.destroy!
71
+ redirect_to patient_events_path
72
+ end
73
+
71
74
  protected
72
75
 
76
+ def render_new(event)
77
+ render :new, locals: {
78
+ patient: patient,
79
+ event: event,
80
+ event_types: event_types
81
+ }
82
+ end
83
+
84
+ def render_edit(event)
85
+ render :edit, locals: {
86
+ patient: patient,
87
+ event: event,
88
+ event_types: []
89
+ }
90
+ end
91
+
73
92
  def save_path_to_return_to
74
93
  return unless request.format == :html
75
94
 
@@ -169,6 +188,26 @@ module Renalware
169
188
  end
170
189
  end
171
190
 
191
+ # Returns an array of objects defininig each category, with that category's types within it.
192
+ # rubocop:disable Metrics/MethodLength
193
+ def event_types_new
194
+ Events::Category.order(:position).map do |category|
195
+ types = category.types.order(:name).map do |event_type|
196
+ [
197
+ event_type.name,
198
+ event_type.id,
199
+ {
200
+ data: {
201
+ source: new_patient_event_path(patient, event_type_id: event_type.id, format: :js)
202
+ }
203
+ }
204
+ ]
205
+ end
206
+ OpenStruct.new(name: category.name, id: category.id, types: types)
207
+ end
208
+ end
209
+ # rubocop:enable Metrics/MethodLength
210
+
172
211
  def query_params
173
212
  params.fetch(:q, {})
174
213
  end
@@ -13,6 +13,7 @@ module Renalware
13
13
  class SessionTimeoutController < BaseController
14
14
  prepend_before_action :skip_timeout, only: :has_user_timed_out
15
15
  skip_before_action :authenticate_user!, only: :has_user_timed_out
16
+ skip_before_action :track_ahoy_visit, only: :has_user_timed_out
16
17
  protect_from_forgery except: [:has_user_timed_out, :reset_user_clock]
17
18
 
18
19
  # Note this action will NOT update the session activity (thus keeping the session alive)
@@ -110,7 +110,7 @@ module Renalware
110
110
  end
111
111
 
112
112
  def semantic_app_version
113
- "#{VERSION}+sha.#{GitCommitSha.current}"
113
+ "#{Renalware::VERSION}+sha.#{GitCommitSha.current}"
114
114
  end
115
115
  end
116
116
  end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_dependency "renalware/events"
4
+ require "fileutils"
5
+
6
+ module Renalware
7
+ module Events
8
+ # Used for example in a host app like renalware-kch to generate a PDF event for saving to
9
+ # the electronic public register
10
+ class SavePdfEventToFileJob < ApplicationJob
11
+ queue_as :pdf_generation
12
+ queue_with_priority 1
13
+
14
+ def perform(event:, file_path:)
15
+ file_path = Pathname(file_path)
16
+ create_folder_if_not_exists(file_path)
17
+ File.open(file_path, "wb") { |file| file << pdf_data_for(event) }
18
+ end
19
+
20
+ def pdf_data_for(event)
21
+ decorated_event = EventPdfPresenter.new(event)
22
+ EventPdf.new(decorated_event).render
23
+ end
24
+
25
+ def create_folder_if_not_exists(path)
26
+ FileUtils.mkdir_p(path.dirname)
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_dependency "renalware/events"
4
+ require "attr_extras"
5
+
6
+ module Renalware
7
+ module Events
8
+ # A wrapper around the creation of an Event to allow is to broadcast a Wisper event to the
9
+ # 'world' (or rather just whoever has been configured in the broadcast subscription map).
10
+ class CreateEvent
11
+ include Broadcasting
12
+ pattr_initialize [:event!, :by!]
13
+
14
+ # Returns the boolean result of event.save_by
15
+ def self.call(**args)
16
+ new(**args)
17
+ .broadcasting_to_configured_subscribers
18
+ .call
19
+ end
20
+
21
+ def call
22
+ event.save_by(by).tap do |success|
23
+ broadcast(:event_created, event) if success
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_dependency "renalware/events"
4
+
5
+ module Renalware
6
+ module Events
7
+ # A wrapper around the updating of an Event to allow is to broadcast a Wisper event to anyone
8
+ # configure to listen in the broadcast subscription map.
9
+ class UpdateEvent
10
+ include Broadcasting
11
+ pattr_initialize [:event!, :params!, :by!]
12
+
13
+ # Returns the boolean result of event.update_by
14
+ def self.call(**args)
15
+ new(**args)
16
+ .broadcasting_to_configured_subscribers
17
+ .call
18
+ end
19
+
20
+ def call
21
+ event.update_by(by, params).tap do |success|
22
+ broadcast(:event_updated, event) if success
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -120,9 +120,10 @@ module Renalware
120
120
  def to_s(format = :default)
121
121
  title_suffix = " (#{title})" if has_title?
122
122
  formatted_name = "#{family_name.upcase}, #{given_name}#{title_suffix}"
123
+ formatted_nhs_number = " (#{nhs_number})" if nhs_number.present?
123
124
  case format
124
125
  when :default then formatted_name
125
- when :long then "#{formatted_name} (#{nhs_number})"
126
+ when :long then "#{formatted_name}#{formatted_nhs_number}"
126
127
  else full_name
127
128
  end
128
129
  end
@@ -0,0 +1,124 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_dependency "renalware/events"
4
+
5
+ # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
6
+ module Renalware
7
+ module Events
8
+ # We have used wicked_pdf (which shells out to wkhtmltopdf) up to know, but using prawn here
9
+ # as it Event PDFs are somewhat simpler, and there is no extant html equivalent we can render.
10
+ # Its also a useful test to see if this is a better approach all round. It is certainly much
11
+ # quicker and less resource intensive to create the PDFs.
12
+ class EventPdf
13
+ include Prawn::View
14
+ attr_reader :event
15
+ delegate :patient, :event_type, to: :event
16
+
17
+ def initialize(event)
18
+ @event = event
19
+ build
20
+ end
21
+
22
+ def build
23
+ render_hospital_centre_info
24
+ render_patient_identifiers
25
+ render_common_event_fields
26
+ render_specific_event_fields(event.document)
27
+ render_notes
28
+ self
29
+ end
30
+
31
+ def render_header
32
+ font_size 12
33
+ text title
34
+ move_down 10
35
+ text event.patient.to_s, style: :bold
36
+ move_down 10
37
+ end
38
+
39
+ def render_patient_identifiers
40
+ move_cursor_to 675
41
+ font_size 10
42
+ bounding_box([0, cursor], width: 340) do
43
+ render_header
44
+ font_size 10
45
+ text "DOB: #{I18n.l(patient.born_on)}"
46
+ text "NHS: #{patient.nhs_number}"
47
+ patient.hospital_identifiers.all.each do |key, value|
48
+ text "#{key}: #{value}"
49
+ end
50
+ move_down 10
51
+ end
52
+ end
53
+
54
+ def render_common_event_fields
55
+ text "Date: #{I18n.l(event.date_time)}"
56
+ move_down 10
57
+ if event.respond_to?(:description)
58
+ text "<u>Description</u>", inline_format: true
59
+ move_down 5
60
+ text event.description
61
+ move_down 10
62
+ end
63
+ end
64
+
65
+ def render_specific_event_fields(document)
66
+ document.attributes.each do |name, value|
67
+ # could handle recursive documents here but none exists ATM even in HEROIC
68
+ text "#{document.class.human_attribute_name(name)}: #{value}"
69
+ end
70
+ move_down 10
71
+ end
72
+
73
+ def render_notes
74
+ text "<u>Notes</u>", inline_format: true
75
+ move_down 5
76
+ output_html_as_text_but_preserving_paragraph_breaks(text: event.notes)
77
+ end
78
+
79
+ def render_hospital_centre_info
80
+ bounding_box([340, cursor], width: 200) do
81
+ image_path = "app/assets/images/renalware/nhs_a4_letter_logo_black.png"
82
+ image Renalware::Engine.root.join(image_path), height: 30, position: :right
83
+ move_down 10
84
+ text event.hospital_centre_trust_name, align: :right
85
+ text event.hospital_centre_trust_caption, align: :right
86
+ font_size 8
87
+ output_html_as_text_but_preserving_paragraph_breaks(
88
+ text: interpret_new_lines_in(event.hospital_centre_info),
89
+ strip_tags: false,
90
+ align: :right,
91
+ inline_format: true
92
+ )
93
+ font_size 10
94
+ end
95
+ end
96
+
97
+ # Ensure any new line characters in a string are interpreted as actual new lines.
98
+ # This lets use /n in seed data and in the database.
99
+ def interpret_new_lines_in(text)
100
+ text&.gsub('\n', "\n")
101
+ end
102
+
103
+ # Create new line if there is a <br>.
104
+ # If there is an empty line (caused by <br><br>) move down to indicate a new paragraph.
105
+ def output_html_as_text_but_preserving_paragraph_breaks(text:, strip_tags: true, **args)
106
+ return if text.blank?
107
+
108
+ text.split("<br>").each do |paragraph|
109
+ if strip_tags
110
+ text ActionView::Base.full_sanitizer.sanitize(paragraph), **args
111
+ else
112
+ text paragraph, **args
113
+ end
114
+ move_down(10) if ActionView::Base.full_sanitizer.sanitize(paragraph).blank?
115
+ end
116
+ end
117
+
118
+ def title
119
+ event_type.title || event_type.name
120
+ end
121
+ end
122
+ end
123
+ end
124
+ # rubocop:enable Metrics/AbcSize, Metrics/MethodLength
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_dependency "renalware/events"
4
+
5
+ module Renalware
6
+ module Events
7
+ class EventPdfPresenter < SimpleDelegator
8
+ class DefaultHospitalCentreNotFoundError < StandardError; end
9
+ class DefaultHospitalCentreNotSetError < StandardError; end
10
+
11
+ delegate :info,
12
+ :trust_name,
13
+ :trust_caption,
14
+ to: :hospital_centre, prefix: true, allow_nil: true
15
+
16
+ private
17
+
18
+ def hospital_centre
19
+ @hospital_centre ||= begin
20
+ centre = Renalware::Hospitals::Centre.find_by(code: default_hospital_centre_code)
21
+ centre.presence || raise(DefaultHospitalCentreNotFoundError, default_hospital_centre_code)
22
+ end
23
+ end
24
+
25
+ def default_hospital_centre_code
26
+ Renalware.config.ukrdc_site_code.presence || raise(DefaultHospitalCentreNotSetError)
27
+ end
28
+ end
29
+ end
30
+ end
@@ -60,6 +60,7 @@ module Renalware
60
60
  letters_patient
61
61
  .letters
62
62
  .approved_or_completed
63
+ .includes(:updated_by, :author, :letterhead, :archive)
63
64
  .where("updated_at > ?", changes_since),
64
65
  Renalware::Letters::LetterPresenterFactory
65
66
  )
@@ -68,7 +69,7 @@ module Renalware
68
69
  def finished_hd_sessions
69
70
  hd_patient
70
71
  .finished_hd_sessions
71
- .includes(:patient, :dialysate)
72
+ .includes(:patient, :dialysate, :updated_by)
72
73
  .where("hd_sessions.updated_at > ?", changes_since)
73
74
  end
74
75
 
@@ -7,7 +7,8 @@
7
7
 
8
8
  = f.association :plan_type,
9
9
  collection: Renalware::Accesses::PlanType.ordered,
10
- wrapper: :horizontal_medium
10
+ wrapper: :horizontal_medium,
11
+ autofocus: true
11
12
  = f.input :notes,
12
13
  as: :text,
13
14
  wrapper: :horizontal_large
@@ -17,7 +17,7 @@
17
17
  strong= request.patient.to_s(:long)
18
18
 
19
19
  = f.input :patient_id, as: :hidden
20
- = f.input :reason_id, collection: reasons, wrapper: :horizontal_medium
20
+ = f.input :reason_id, collection: reasons, wrapper: :horizontal_medium, autofocus: true
21
21
  = f.input :priority, wrapper: :horizontal_small
22
22
  = f.input :hospital_unit_id, collection: hospital_units, wrapper: :horizontal_medium
23
23
  = f.input :notes, as: :text, wrapper: :horizontal_large, input_html: { rows: 5 }
@@ -45,7 +45,7 @@ xml.LabOrder do
45
45
 
46
46
  xml.ResultItems do
47
47
  render partial: "renalware/api/ukrdc/patients/lab_orders/result_item",
48
- collection: request.observations.having_a_loinc_code,
48
+ collection: request.observations,
49
49
  as: :observation,
50
50
  locals: { builder: builder, patient: patient }
51
51
  end
@@ -3,21 +3,27 @@
3
3
  xml = builder
4
4
  observation = Renalware::Pathology::ObservationPresenter.new(observation)
5
5
  observation = Renalware::UKRDC::PathologyObservationPresenter.new(observation)
6
+ result = observation.result || ""
6
7
 
7
- xml.ResultItem do
8
- xml.EnteredOn observation.updated_at&.iso8601
9
- xml.PrePost observation.pre_post(patient_is_on_hd: patient.current_modality_hd?)
10
- xml.ServiceId do
11
- if observation.description_loinc_code.present?
12
- xml.CodingStandard "PV"
13
- xml.Code observation.description_loinc_code
14
- else
15
- xml.CodingStandard "LOCAL"
16
- xml.Code observation.description_code
8
+ # The UKRDC XSD Schema specifies that observations cannot be longer than 20 characters.
9
+ # KCH regularly get notes in the result, saying things like "No recent Urea result" - which in this
10
+ # case exceeds 20 characters. We need to skip these.
11
+ if result.length <= 20
12
+ xml.ResultItem do
13
+ xml.EnteredOn observation.updated_at&.iso8601
14
+ xml.PrePost observation.pre_post(patient_is_on_hd: patient.current_modality_hd?)
15
+ xml.ServiceId do
16
+ if observation.description_loinc_code.present?
17
+ xml.CodingStandard "PV"
18
+ xml.Code observation.description_loinc_code
19
+ else
20
+ xml.CodingStandard "LOCAL"
21
+ xml.Code observation.description_code
22
+ end
23
+ xml.Description observation.description_name
17
24
  end
18
- xml.Description observation.description_name
25
+ xml.ResultValue observation.result
26
+ xml.ResultValueUnits observation.measurement_unit_name
27
+ xml.ObservationTime observation.observed_at&.iso8601
19
28
  end
20
- xml.ResultValue observation.result
21
- xml.ResultValueUnits observation.measurement_unit_name
22
- xml.ObservationTime observation.observed_at&.iso8601
23
29
  end
@@ -0,0 +1,9 @@
1
+ - patient = event.patient
2
+
3
+ h1= event.patient
4
+ = "NHS: #{patient.nhs_number}"
5
+ br
6
+ = patient.hospital_identifiers.to_s_multiline
7
+ p= l(event.date_time)
8
+ p= event.description
9
+ p= raw(event.notes)
@@ -7,7 +7,8 @@ ruby:
7
7
 
8
8
  = f.input :schedule_definition_id,
9
9
  collection: Renalware::HD::ScheduleDefinition.ordered,
10
- wrapper: :horizontal_small
10
+ wrapper: :horizontal_small,
11
+ autofocus: true
11
12
  = f.input :other_schedule,
12
13
  input_html: { class: "small-input" }
13
14
  = f.association :hospital_unit,
@@ -15,7 +15,7 @@ ruby:
15
15
  header
16
16
  h2 Header
17
17
 
18
- = f.association :letterhead
18
+ = f.association :letterhead, autofocus: true
19
19
  = f.input :description,
20
20
  input_html: { \
21
21
  data: { \
@@ -17,7 +17,8 @@
17
17
  collection: Renalware::Modalities::Description.where(hidden: false),
18
18
  input_html: { id: "modality-description-select" },
19
19
  label_method: :name, value_method: :id,
20
- wrapper: :horizontal_medium
20
+ wrapper: :horizontal_medium,
21
+ autofocus: true
21
22
 
22
23
  .hide-death
23
24
  = m.input :modal_change_type,
@@ -2,7 +2,7 @@
2
2
  = field_set_tag do
3
3
  legend Patient Demographics
4
4
 
5
- = f.input :nhs_number, wrapper: :horizontal_small
5
+ = f.input :nhs_number, wrapper: :horizontal_small, autofocus: true
6
6
 
7
7
  - Renalware.config.patient_hospital_identifiers.each do |key, field|
8
8
  = f.input field,
@@ -5,7 +5,8 @@
5
5
  = f.input :treatment,
6
6
  collection: available_pd_treatments_for(f.object),
7
7
  include_blank: t("collection.blank_option"),
8
- wrapper: :horizontal_medium
8
+ wrapper: :horizontal_medium,
9
+ autofocus: true
9
10
 
10
11
  - if f.object.apd?
11
12
  = f.input :assistance_type, wrapper: :horizontal_small, default: :none
@@ -9,7 +9,8 @@
9
9
  = f.input :ignore_me, as: :hidden
10
10
  = f.association :training_site,
11
11
  collection: Renalware::PD::TrainingSite.ordered,
12
- wrapper: :horizontal_small
12
+ wrapper: :horizontal_small,
13
+ autofocus: true
13
14
 
14
15
  = f.association :training_type,
15
16
  collection: Renalware::PD::TrainingType.ordered,
@@ -2,7 +2,7 @@
2
2
  = simple_form_for note, url: url,
3
3
  wrapper: :horizontal_form, remote: true do |f|
4
4
 
5
- = f.input :description, as: :text, input_html: { cols: 50, rows: 3 }
5
+ = f.input :description, as: :text, input_html: { cols: 50, rows: 3 }, autofocus: true
6
6
 
7
7
  .row
8
8
  .large-offset-3.large-7.columns
@@ -6,7 +6,7 @@
6
6
  url: patient_problem_path(patient, problem),
7
7
  html: { autocomplete: "off", class: "problem-form" } do |f|
8
8
 
9
- = f.input :description, as: :text
9
+ = f.input :description, as: :text, autofocus: true
10
10
  = f.button :button, "Save"
11
11
  span= " or "
12
12
  = link_to "cancel", patient_problems_path(patient)
@@ -4,7 +4,7 @@
4
4
  url: patient_problems_path(patient),
5
5
  html: { autocomplete: "off" } do |f|
6
6
 
7
- = f.input :description, as: :text
7
+ = f.input :description, as: :text, autofocus: true
8
8
 
9
9
  = f.button :submit
10
10
  span= " or "
@@ -5,7 +5,9 @@
5
5
  = render layout: "renalware/shared/fieldset",
6
6
  locals: { legend: "Diagnosis & ESRF Info", name: "diagnosis" } do
7
7
 
8
- = f.input :esrf_on, as: :date_picker, wrapper: :horizontal_datepicker
8
+ = f.input :esrf_on,
9
+ as: :date_picker,
10
+ wrapper: :horizontal_datepicker
9
11
  = f.input :weight_at_esrf, wrapper: :horizontal_small
10
12
  = f.input :modality_at_esrf,
11
13
  include_blank: "Select modality",
@@ -5,7 +5,7 @@ Delayed::Worker.destroy_failed_jobs = false
5
5
  Delayed::Worker.max_attempts = 10 # overridden e.g. in FeedJob
6
6
  Delayed::Worker.max_run_time = 2.hours
7
7
  Delayed::Worker.read_ahead = 10
8
- Delayed::Worker.sleep_delay = 15 # Also affects how long it takes delayed_job to stop on Crl+C
8
+ Delayed::Worker.sleep_delay = 8 # Also affects how long it takes delayed_job to stop on Crl+C
9
9
  Delayed::Worker.default_priority = 5 # use a lower number to get preferential treatment
10
10
  # Will only raise an exception on TERM signals but INT will wait for the current job to finish.
11
11
  Delayed::Worker.raise_signal_exceptions = :term
@@ -21,7 +21,7 @@ require_dependency "renalware"
21
21
  # end
22
22
  # end
23
23
  # As it stands its a bit too easy for the exposed subscription map hash to be overwritten by a host
24
- # application with confusing and undesirable outcomes.
24
+ # application with confusing and outcomes.
25
25
  Renalware.configure do |config|
26
26
  config.broadcast_subscription_map = {
27
27
  "Renalware::Modalities::ChangePatientModality" => [
@@ -39,7 +39,9 @@ Renalware.configure do |config|
39
39
  "Renalware::Letters::ResolveDefaultElectronicCCs" => [
40
40
  "Renalware::HD::PatientListener"
41
41
  ],
42
- "Renalware::Pathology::CreateObservationRequests" => []
42
+ "Renalware::Pathology::CreateObservationRequests" => [],
43
+ "Renalware::Events::CreateEvent" => [],
44
+ "Renalware::Events::UpdateEvent" => []
43
45
  }
44
46
  end
45
47
 
data/config/routes.rb CHANGED
@@ -330,6 +330,9 @@ Renalware::Engine.routes.draw do
330
330
 
331
331
  # Events
332
332
  resources :events, only: [:new, :create, :index], controller: "events/events"
333
+ constraints(format: /(pdf)/) do
334
+ resources :events, only: :show, controller: "events/events"
335
+ end
333
336
 
334
337
  resources :swabs,
335
338
  only: [:new, :create, :edit, :update],
@@ -0,0 +1,6 @@
1
+ class AddFilenamePrefixToEventTypes < ActiveRecord::Migration[5.2]
2
+ def change
3
+ add_column :event_types, :save_pdf_to_electronic_public_register, :boolean, null: false, default: 0
4
+ add_column :event_types, :title, :string
5
+ end
6
+ end
@@ -0,0 +1,7 @@
1
+ class AddInfoToHospitalCentres < ActiveRecord::Migration[5.2]
2
+ def change
3
+ add_column :hospital_centres, :info, :text, null: true
4
+ add_column :hospital_centres, :trust_name, :string, null: true
5
+ add_column :hospital_centres, :trust_caption, :string, null: true
6
+ end
7
+ end
@@ -35,6 +35,7 @@ require "nokogiri"
35
35
  require "paper_trail"
36
36
  require "paranoia"
37
37
  require "pg"
38
+ require "prawn"
38
39
  require "puma"
39
40
  require "pundit"
40
41
  require "ransack"
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Renalware
4
- VERSION = "2.0.69"
4
+ VERSION = "2.0.70"
5
5
  end
data/lib/tasks/db.rake CHANGED
@@ -14,7 +14,7 @@ namespace :db do
14
14
  namespace :demo do
15
15
  desc "Loads demo seed data from the renalware-core gem"
16
16
  task seed: :environment do
17
- if Rails.env.development?
17
+ if Rails.env.development? || ENV["ALLOW_DEMO_SEEDS"] == "1"
18
18
  require Renalware::Engine.root.join("spec/dummy/db/seeds")
19
19
  else
20
20
  puts "Task currently only possible in development environment"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: renalware-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.69
4
+ version: 2.0.70
5
5
  platform: ruby
6
6
  authors:
7
7
  - Airslie
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-01-22 00:00:00.000000000 Z
11
+ date: 2019-02-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: active_type
@@ -556,6 +556,20 @@ dependencies:
556
556
  - - "~>"
557
557
  - !ruby/object:Gem::Version
558
558
  version: 1.1.3
559
+ - !ruby/object:Gem::Dependency
560
+ name: prawn
561
+ requirement: !ruby/object:Gem::Requirement
562
+ requirements:
563
+ - - "~>"
564
+ - !ruby/object:Gem::Version
565
+ version: 2.2.2
566
+ type: :runtime
567
+ prerelease: false
568
+ version_requirements: !ruby/object:Gem::Requirement
569
+ requirements:
570
+ - - "~>"
571
+ - !ruby/object:Gem::Version
572
+ version: 2.2.2
559
573
  - !ruby/object:Gem::Dependency
560
574
  name: puma
561
575
  requirement: !ruby/object:Gem::Requirement
@@ -1314,6 +1328,7 @@ files:
1314
1328
  - app/jobs/feed_job.rb
1315
1329
  - app/jobs/hl7_message_example.yml
1316
1330
  - app/jobs/refresh_materialized_view_job.rb
1331
+ - app/jobs/renalware/events/save_pdf_event_to_file_job.rb
1317
1332
  - app/jobs/renalware/hd/generate_monthly_statistics.rb
1318
1333
  - app/jobs/renalware/hd/generate_monthly_statistics_for_patient_job.rb
1319
1334
  - app/jobs/renalware/hd/update_rolling_patient_statistics_job.rb
@@ -1408,6 +1423,7 @@ files:
1408
1423
  - app/models/renalware/drugs/type.rb
1409
1424
  - app/models/renalware/events.rb
1410
1425
  - app/models/renalware/events/biopsy.rb
1426
+ - app/models/renalware/events/create_event.rb
1411
1427
  - app/models/renalware/events/event.rb
1412
1428
  - app/models/renalware/events/event_query.rb
1413
1429
  - app/models/renalware/events/investigation.rb
@@ -1415,6 +1431,7 @@ files:
1415
1431
  - app/models/renalware/events/simple.rb
1416
1432
  - app/models/renalware/events/swab.rb
1417
1433
  - app/models/renalware/events/type.rb
1434
+ - app/models/renalware/events/update_event.rb
1418
1435
  - app/models/renalware/feeds.rb
1419
1436
  - app/models/renalware/feeds/file.rb
1420
1437
  - app/models/renalware/feeds/file_type.rb
@@ -1806,6 +1823,7 @@ files:
1806
1823
  - app/models/renalware/virology/vaccination.rb
1807
1824
  - app/models/renalware/virology/version.rb
1808
1825
  - app/models/renalware/zip_archive.rb
1826
+ - app/pdfs/renalware/events/event_pdf.rb
1809
1827
  - app/policies/application_policy.rb
1810
1828
  - app/policies/renalware/admin/cache_policy.rb
1811
1829
  - app/policies/renalware/admissions/admission_policy.rb
@@ -1896,6 +1914,7 @@ files:
1896
1914
  - app/presenters/renalware/country_presenter.rb
1897
1915
  - app/presenters/renalware/dashboard/dashboard_presenter.rb
1898
1916
  - app/presenters/renalware/directory/person_auto_complete_presenter.rb
1917
+ - app/presenters/renalware/events/event_pdf_presenter.rb
1899
1918
  - app/presenters/renalware/events/events_presenter.rb
1900
1919
  - app/presenters/renalware/events/summary_part.rb
1901
1920
  - app/presenters/renalware/hd/dashboard_presenter.rb
@@ -2173,6 +2192,7 @@ files:
2173
2192
  - app/views/renalware/events/events/inputs/_swab.html.slim
2174
2193
  - app/views/renalware/events/events/new.html.slim
2175
2194
  - app/views/renalware/events/events/new.js.erb
2195
+ - app/views/renalware/events/events/show.pdf.slim
2176
2196
  - app/views/renalware/events/events/simple/_event.html.slim
2177
2197
  - app/views/renalware/events/events/simple/_list.html.slim
2178
2198
  - app/views/renalware/events/events/simple/_table.html.slim
@@ -3384,6 +3404,8 @@ files:
3384
3404
  - db/migrate/20181126123745_refresh_hd_grouped_transmission_logs_view.rb
3385
3405
  - db/migrate/20181217124025_change_ukrdc_transmission_log_error_type.rb
3386
3406
  - db/migrate/20190104095254_create_active_storage_tables.active_storage.rb
3407
+ - db/migrate/20190218142207_add_filename_prefix_to_event_types.rb
3408
+ - db/migrate/20190225103005_add_info_to_hospital_centres.rb
3387
3409
  - db/seeds.rb
3388
3410
  - db/seeds/default/accesses/access_pd_catheter_insertion_techniques.csv
3389
3411
  - db/seeds/default/accesses/access_pd_catheter_insertion_techniques.rb