renalware-core 2.0.69 → 2.0.70

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.
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