Class: WorksController

Inherits:
ApplicationController show all
Includes:
ERB::Util
Defined in:
app/controllers/works_controller.rb

Overview

rubocop:disable Metrics/ClassLength

Instance Method Summary collapse

Methods inherited from ApplicationController

#new_session_path

Instance Method Details

#add_messageObject



179
180
181
182
183
184
185
186
187
188
# File 'app/controllers/works_controller.rb', line 179

def add_message
  work = Work.find(params[:id])
  if params["new-message"].present?
    new_message_param = params["new-message"]
    sanitized_new_message = html_escape(new_message_param)

    work.add_message(sanitized_new_message, current_user.id)
  end
  redirect_to work_path(id: params[:id])
end

#add_provenance_noteObject



190
191
192
193
194
195
196
197
198
199
200
# File 'app/controllers/works_controller.rb', line 190

def add_provenance_note
  work = Work.find(params[:id])
  if params["new-provenance-note"].present?
    new_date = params["new-provenance-date"]
    new_label = params["change_label"]
    new_note = html_escape(params["new-provenance-note"])

    work.add_provenance_note(new_date, new_note, current_user.id, new_label)
  end
  redirect_to work_path(id: params[:id])
end

#approveObject



138
139
140
141
142
143
# File 'app/controllers/works_controller.rb', line 138

def approve
  @work = Work.find(params[:id])
  @work.approve!(current_user)
  flash[:notice] = "Your files are being moved to the #{@work.files_mode_human} bucket in the background. Depending on the file sizes this may take some time."
  redirect_to work_path(@work)
end

#assign_curatorObject



164
165
166
167
168
169
170
171
172
173
174
175
176
177
# File 'app/controllers/works_controller.rb', line 164

def assign_curator
  work = Work.find(params[:id])
  work.change_curator(params[:uid], current_user)
  if work.errors.count > 0
    render json: { errors: work.errors.map(&:type) }, status: :bad_request
  else
    render json: {}
  end
rescue => ex
  # This is necessary for JSON responses
  Rails.logger.error("Error changing curator for work: #{work.id}. Exception: #{ex.message}")
  Honeybadger.notify("Error changing curator for work: #{work.id}. Exception: #{ex.message}")
  render(json: { errors: ["Cannot save dataset"] }, status: :bad_request)
end

#bibtexObject

Returns the raw BibTex citation information



225
226
227
228
229
230
231
# File 'app/controllers/works_controller.rb', line 225

def bibtex
  work = Work.find(params[:id])
  creators = work.resource.creators.map { |creator| "#{creator.family_name}, #{creator.given_name}" }
  citation = DatasetCitation.new(creators, [work.resource.publication_year], work.resource.titles.first.title, work.resource.resource_type, work.resource.publisher, work.resource.doi)
  bibtex = citation.bibtex
  send_data bibtex, filename: "#{citation.bibtex_id}.bibtex", type: "text/plain", disposition: "attachment"
end

#createObject

only non wizard mode



55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'app/controllers/works_controller.rb', line 55

def create
  @work = Work.new(created_by_user_id: current_user.id, group_id: params_group_id, user_entered_doi: params["doi"].present?)
  @work.resource = FormToResourceService.convert(params, @work)
  @work.resource.migrated = migrated?
  if @work.valid?
    @work.draft!(current_user)
    upload_service = WorkUploadsEditService.new(@work, current_user)
    upload_service.update_precurated_file_list(added_files_param, deleted_files_param)
    redirect_to work_url(@work), notice: "Work was successfully created."
  else
    @work_decorator = WorkDecorator.new(@work, current_user)
    @form_resource_decorator = FormResourceDecorator.new(@work, current_user)
    # return 200 so the loadbalancer doesn't capture the error
    render :new
  end
end

#dataciteObject

Outputs the Datacite XML representation of the work



203
204
205
206
# File 'app/controllers/works_controller.rb', line 203

def datacite
  work = Work.find(params[:id])
  render xml: work.to_xml
end

#datacite_validateObject



208
209
210
211
212
213
214
215
# File 'app/controllers/works_controller.rb', line 208

def datacite_validate
  @errors = []
  @work = Work.find(params[:id])
  validator = WorkValidator.new(@work)
  unless validator.valid_datacite?
    @errors = @work.errors.full_messages
  end
end

#editObject

GET /works/1/edit only non wizard mode



117
118
119
120
121
122
123
124
125
126
# File 'app/controllers/works_controller.rb', line 117

def edit
  @work = Work.find(params[:id])
  @work_decorator = WorkDecorator.new(@work, current_user)
  if validate_modification_permissions(work: @work,
                                       uneditable_message: "Can not update work: #{@work.id} is not editable by #{current_user.uid}",
                                       current_state_message: "Can not update work: #{@work.id} is not editable in current state by #{current_user.uid}")
    @uploads = @work.uploads
    @form_resource_decorator = FormResourceDecorator.new(@work, current_user)
  end
end

#file_listObject

only non wizard mode



94
95
96
97
98
99
100
101
102
103
# File 'app/controllers/works_controller.rb', line 94

def file_list
  if params[:id] == "NONE"
    # This is a special case when we render the file list for a work being created
    # (i.e. it does not have an id just yet)
    render json: file_list_ajax_response(nil)
  else
    work = Work.find(params[:id])
    render json: file_list_ajax_response(work)
  end
end

#indexObject



32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'app/controllers/works_controller.rb', line 32

def index
  if rss_index_request?
    rss_index
  elsif current_user.super_admin?
    @works = Work.all
    respond_to do |format|
      format.html
    end
  else
    flash[:notice] = "You do not have access to this page."
    redirect_to root_path
  end
end

#migrating?Boolean

Returns:

  • (Boolean)


217
218
219
220
221
# File 'app/controllers/works_controller.rb', line 217

def migrating?
  return @work.resource.migrated if @work&.resource && !params.key?(:migrate)

  params[:migrate]
end

#newObject

only non wizard mode



47
48
49
50
51
52
# File 'app/controllers/works_controller.rb', line 47

def new
  group = Group.find_by(code: params[:group_code]) || current_user.default_group
  @work = Work.new(created_by_user_id: current_user.id, group:)
  @work_decorator = WorkDecorator.new(@work, current_user)
  @form_resource_decorator = FormResourceDecorator.new(@work, current_user)
end

#resolve_arkObject



110
111
112
113
# File 'app/controllers/works_controller.rb', line 110

def resolve_ark
  @work = Work.find_by_ark(params[:ark])
  redirect_to @work
end

#resolve_doiObject



105
106
107
108
# File 'app/controllers/works_controller.rb', line 105

def resolve_doi
  @work = Work.find_by_doi(params[:doi])
  redirect_to @work
end

#resubmitObject



151
152
153
154
155
# File 'app/controllers/works_controller.rb', line 151

def resubmit
  @work = Work.find(params[:id])
  @work.resubmit!(current_user)
  redirect_to work_path(@work)
end

#revert_to_draftObject



157
158
159
160
161
162
# File 'app/controllers/works_controller.rb', line 157

def revert_to_draft
  @work = Work.find(params[:id])
  @work.revert_to_draft!(current_user)

  redirect_to work_path(@work)
end

#showObject

Show the information for the dataset with the given id When requested as .json, return the internal json resource



75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# File 'app/controllers/works_controller.rb', line 75

def show
  @work = Work.find(params[:id])
  UpdateSnapshotJob.perform_later(work_id: @work.id, last_snapshot_id: work.upload_snapshots.first&.id)
  @work_decorator = WorkDecorator.new(@work, current_user)

  respond_to do |format|
    format.html do
      # Ensure that the Work belongs to a Group
      group = @work_decorator.group
      raise(Work::InvalidGroupError, "The Work #{@work.id} does not belong to any Group") unless group

      @can_curate = current_user.can_admin?(group)
      @work.mark_new_notifications_as_read(current_user.id)
    end
    format.json { render json: @work.to_json }
  end
end

#updateObject

PATCH /works/1 only non wizard mode



130
131
132
133
134
135
136
# File 'app/controllers/works_controller.rb', line 130

def update
  @work = Work.find(params[:id])
  if validate_modification_permissions(work: @work, uneditable_message: "Can not update work: #{@work.id} is not editable by #{current_user.uid}",
                                       current_state_message: "Can not update work: #{@work.id} is not editable in current state by #{current_user.uid}")
    update_work
  end
end

#upload_filesObject

POST /works/1/upload-files (called via Uppy)



234
235
236
237
238
239
# File 'app/controllers/works_controller.rb', line 234

def upload_files
  @work = Work.find(params[:id])
  upload_service = WorkUploadsEditService.new(@work, current_user)
  upload_service.update_precurated_file_list(params["files"], [])
  render plain: params["files"].map(&:original_filename).join(",")
end

#validateObject

Validates that the work is ready to be approved GET /works/1/validate



243
244
245
246
247
# File 'app/controllers/works_controller.rb', line 243

def validate
  @work = Work.find(params[:id])
  @work.complete_submission!(current_user)
  redirect_to user_path(current_user)
end

#withdrawObject



145
146
147
148
149
# File 'app/controllers/works_controller.rb', line 145

def withdraw
  @work = Work.find(params[:id])
  @work.withdraw!(current_user)
  redirect_to work_path(@work)
end