• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

benwbrum / fromthepage / 15444021197

04 Jun 2025 01:45PM UTC coverage: 60.722% (-0.01%) from 60.733%
15444021197

push

github

web-flow
Merge pull request #4643 from benwbrum/3936-option-to-include-notes-in-pdf-exports

3936 - Option to include notes in pdf exports

1605 of 3234 branches covered (49.63%)

Branch coverage included in aggregate %.

7 of 19 new or added lines in 6 files covered. (36.84%)

7 existing lines in 4 files now uncovered.

7380 of 11563 relevant lines covered (63.82%)

78.65 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

28.57
/app/controllers/work_controller.rb
1
class WorkController < ApplicationController
1✔
2
  # require 'ftools'
3
  include XmlSourceProcessor
1✔
4
  include ElasticSearchable
1✔
5

6
  protect_from_forgery :except => [:set_work_title,
1✔
7
                                   :set_work_description,
8
                                   :set_work_physical_description,
9
                                   :set_work_document_history,
10
                                   :set_work_permission_description,
11
                                   :set_work_location_of_composition,
12
                                   :set_work_author,
13
                                   :set_work_transcription_conventions]
14
  # tested
15
  before_action :authorized?, only: [
1✔
16
    :edit,
17
    :pages_tab,
18
    :delete,
19
    :new,
20
    :create,
21
    :edit_scribes,
22
    :add_scribe,
23
    :remove_scribe,
24
    :search_scribes
25
  ]
26

27
  # no layout if xhr request
28
  layout Proc.new { |controller| controller.request.xhr? ? false : nil }, only: [:new, :create, :configurable_printout, :edit_scribes, :remove_scribe]
6!
29

30
  def metadata_overview_monitor
1✔
31
    @is_monitor_view = true
×
32
    render :template => "transcribe/monitor_view"
×
33
  end
34

35
  def configurable_printout
1✔
36
    @bulk_export = BulkExport.new
×
37
    @bulk_export.collection = @collection
×
38
    @bulk_export.work = @work
×
39
    @bulk_export.text_pdf_work = true
×
40
    @bulk_export.report_arguments['include_contributors'] = true
×
41
    @bulk_export.report_arguments['include_metadata'] = true
×
NEW
42
    @bulk_export.report_arguments['include_notes'] = true
×
UNCOV
43
    @bulk_export.report_arguments['preserve_linebreaks'] = false
×
44
  end
45

46
  def search
1✔
47
    search_page = (search_params[:page] || 1).to_i
×
48
    @search_string = search_params[:term]
×
49
    @breadcrumb_scope={work: true}
×
50

51
    page_size = 10
×
52

53
  # call elasticsearch with the work scope to get the results
54
    query_config = {
55
      type: 'work',
×
56
      work_id: @work.id
57
    }
58
    search_data = elastic_search_results(
×
59
      @search_string,
60
      search_page,
61
      page_size,
62
      search_params[:filter],
63
      query_config
64
    )
65

66
    if search_data
×
67
      inflated_results = search_data[:inflated]
×
68
      @full_count = search_data[:full_count] # Used by All tab
×
69
      @type_counts = search_data[:type_counts]
×
70

71
      # Used for pagination, currently capped at 10k
72
      #
73
      # TODO: ES requires a scroll/search_after query for result sets larger
74
      #       than 10k.
75
      #
76
      #       To setup support we just need to add a composite tiebreaker field
77
      #       to the schemas
78
      @filtered_count = [ 10000, search_data[:filtered_count] ].min
×
79

80
      @search_results = WillPaginate::Collection.create(
×
81
        search_page,
82
        page_size,
83
        @filtered_count) do |pager|
84
          pager.replace(inflated_results)
×
85
        end
86
    end
87

88
  end
89

90
  def describe
1✔
91
    @layout_mode = cookies[:transcribe_layout_mode] || @collection.default_orientation
×
92
    @metadata_array = JSON.parse(@work.metadata_description || '[]')
×
93
  end
94

95
  def needs_review_checkbox_checked
1✔
96
    params[:work] && params[:work]['needs_review'] == '1'
×
97
  end
98

99
  def save_description
1✔
100
    @field_cells = request.params[:fields]
×
101
    @metadata_array = @work.process_fields(@field_cells)
×
102
    @layout_mode = cookies[:transcribe_layout_mode] || @collection.default_orientation
×
103

104
    if params['save_to_incomplete'] && !needs_review_checkbox_checked
×
105
      @work.description_status = Work::DescriptionStatus::INCOMPLETE
×
106
    elsif params['save_to_needs_review'] || needs_review_checkbox_checked
×
107
      @work.description_status = Work::DescriptionStatus::NEEDS_REVIEW
×
108
    elsif (params['save_to_transcribed'] && !needs_review_checkbox_checked) || params['approve_to_transcribed']
×
109
      @work.description_status = Work::DescriptionStatus::DESCRIBED
×
110
    else
111
      # unexpected state
112
    end
113

114

115

116
    if @work.save
×
117
      # TODO record_description_deed(@work)
×
118
      if @work.saved_change_to_description_status?
×
119
        record_deed(@work, DeedType::DESCRIBED_METADATA, current_user)
×
120
      else
×
121
        record_deed(@work, DeedType::EDITED_METADATA, current_user)
×
122
      end
123

124
      flash[:notice] = t('.work_described')
×
125
      render :describe
×
126
    else
×
127
      render :describe
×
128
    end
129

130
  end
131

132
  def description_versions
1✔
133
    # @selected_version = @page_version.present? ? @page_version : @page.page_versions.first
134
    # @previous_version = params[:compare_version_id] ? PageVersion.find(params[:compare_version_id]) : @selected_version.prev
135
    selected_version_id = params[:metadata_description_version_id]
×
136
    if selected_version_id
×
137
      @selected_version= MetadataDescriptionVersion.find(selected_version_id)
×
138
    else
×
139
      @selected_version= @work.metadata_description_versions.first
×
140
    end
141
    # NB: Unlike in page versions (which are created when we first create the page), metadata description versions may be nil
142
    compare_version_id = params[:compare_version_id]
×
143
    if compare_version_id
×
144
      @previous_version = MetadataDescriptionVersion.find(compare_version_id)
×
145
    else
×
146
      if @selected_version.version_number > 1
×
147
        @previous_version = @work.metadata_description_versions.second
×
148
      else
×
149
        @previous_version = @selected_version
×
150
      end
151
    end
152
    # again, both may be blank here
153
  end
154

155
  def delete
1✔
156
    @work.destroy
2✔
157
    redirect_to dashboard_owner_path
2✔
158
  end
159

160
  def edit
1✔
161
    @collections = current_user.collections
27✔
162
    # set subjects to true if there are any articles/page_article_links
163
    @subjects = !@work.articles.blank?
27✔
164
    @scribes = @work.scribes
27✔
165
  end
166

167
  def edit_scribes
1✔
168
    @scribes = @work.scribes
5✔
169
    @nonscribes = User.where.not(id: @scribes.pluck(:id)).limit(100)
5✔
170
  end
171

172
  def search_scribes
1✔
173
    query = "%#{params[:term].to_s.downcase}%"
×
174
    excluded_ids = @work.scribes.pluck(:id) + [@work.owner.id]
×
175
    users = User.where('LOWER(real_name) LIKE :search OR LOWER(email) LIKE :search', search: query)
×
176
                .where.not(id: excluded_ids)
177
                .limit(100)
178

179
    render json: { results: users.map { |u| { text: "#{u.display_name} #{u.email}", id: u.id } } }
×
180
  end
181

182
  def add_scribe
1✔
183
    scribe = User.find_by(id: params[:scribe_id])
2✔
184
    @work.scribes << scribe
2✔
185

186
    if scribe.notification.add_as_collaborator && SMTP_ENABLED
2✔
187
      begin
188
        UserMailer.work_collaborator(scribe, @work).deliver!
1✔
189
      # :nocov:
190
      rescue StandardError => e
191
        print "SMTP Failed: Exception: #{e.message}"
192
      end
193
      # :cov:
194
    end
195

196
    redirect_to work_edit_scribes_path(@collection, @work)
197
  end
198

199
  def remove_scribe
200
    scribe = User.find_by(id: params[:scribe_id])
201
    @work.scribes.delete(scribe)
202

203
    redirect_to work_edit_scribes_path(@collection, @work)
204
  end
205

206
  def update_work
207
    @work.update(work_params)
208
    redirect_to work_edit_path(work_id: @work.id)
209
  end
210

211
  # tested
212
  def create
213
    @work = Work.new
214
    @work.title = params[:work][:title]
215
    @work.collection_id = params[:work][:collection_id]
216
    @work.description = params[:work][:description]
217
    @work.owner = current_user
218
    @collections = current_user.all_owner_collections
219

220
    if @work.save
221
      record_deed(@work, DeedType::WORK_ADDED, work.owner)
222
      flash[:notice] = t('.work_created')
223
      ajax_redirect_to(work_pages_tab_path(:work_id => @work.id, :anchor => 'create-page'))
224
    else
225
      render :new
226
    end
227
  end
228

229
  def update
230
    work = Work.find(params[:id])
231
    @collection ||= work.collection
232

233
    result = Work::Update.new(work: work, work_params: work_params).call
234

235
    @work = result.work
236
    if result.success?
237
      if result.original_collection_id != result.collection.id
238
        record_deed(@work, DeedType::WORK_ADDED, @work.owner)
239
        @collection = @work.collection
240
      end
241

242
      flash[:notice] = t('.work_updated')
243
      redirect_to edit_collection_work_path(@work.collection.owner, @collection, @work)
244
    else
245
      @scribes = @work.scribes
246
      @nonscribes = User.where.not(id: @scribes.select(:id))
247
      @collections = current_user.collections
248
      @subjects = @work.articles.any?
249

250
      render :edit, status: :unprocessable_entity
251
    end
252
  end
253

254
  def revert
255
    work = Work.find_by(id: params[:work_id])
256
    work.update_attribute(:transcription_conventions, nil)
257
    render :plain => work.collection.transcription_conventions
258
  end
259

260
  def update_featured_page
261
    @work.update(featured_page: params[:page_id])
262
    redirect_back fallback_location: @work
263
  end
264

265
  def document_sets_select
266
    document_sets = current_user.document_sets.where(collection_id: params[:collection_id])
267

268
    render partial: 'document_sets_select', locals: { document_sets: document_sets }
269
  end
270

271
  protected
272

273
  def record_deed(work, deed_type, user)
274
    deed = Deed.new
275
    deed.work = work
276
    deed.deed_type = deed_type
277
    deed.collection = work.collection
278
    deed.user = user
279
    deed.save!
280
    update_search_attempt_contributions
281
  end
282

283
  private
284

285
  def authorized?
286
    if !user_signed_in? || !current_user.owner
287
      ajax_redirect_to dashboard_path
288
    elsif @work && !current_user.like_owner?(@work)
289
      ajax_redirect_to dashboard_path
290
    end
291
  end
292

293
  def search_params
294
    params.permit(:term, :page, :filter, :work_id, :collection_id, :user_id)
295
  end
296

297
  def work_params
298
    params.require(:work).permit(
299
      :title,
300
      :description,
301
      :collection_id,
302
      :supports_translation,
303
      :slug,
304
      :ocr_correction,
305
      :transcription_conventions,
306
      :author,
307
      :recipient,
308
      :location_of_composition,
309
      :identifier,
310
      :pages_are_meaningful,
311
      :physical_description,
312
      :document_history,
313
      :permission_description,
314
      :translation_instructions,
315
      :scribes_can_edit_titles,
316
      :restrict_scribes,
317
      :picture,
318
      :genre,
319
      :source_location,
320
      :source_collection_name,
321
      :source_box_folder,
322
      :in_scope,
323
      :editorial_notes,
324
      :document_date,
325
      :term,
326
      document_set_ids: []
327
    )
328
  end
329

330
end
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc