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



173
174
175
176
177
178
179
180
181
182
# File 'app/controllers/works_controller.rb', line 173

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



184
185
186
187
188
189
190
191
192
193
194
# File 'app/controllers/works_controller.rb', line 184

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



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

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

#assign_curatorObject



158
159
160
161
162
163
164
165
166
167
168
169
170
171
# File 'app/controllers/works_controller.rb', line 158

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



219
220
221
222
223
224
225
# File 'app/controllers/works_controller.rb', line 219

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



49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'app/controllers/works_controller.rb', line 49

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



197
198
199
200
# File 'app/controllers/works_controller.rb', line 197

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

#datacite_validateObject



202
203
204
205
206
207
208
209
# File 'app/controllers/works_controller.rb', line 202

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



111
112
113
114
115
116
117
118
119
120
# File 'app/controllers/works_controller.rb', line 111

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



88
89
90
91
92
93
94
95
96
97
# File 'app/controllers/works_controller.rb', line 88

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
# File 'app/controllers/works_controller.rb', line 32

def index
  @works = Work.all
  respond_to do |format|
    format.html
    format.rss { render layout: false }
  end
end

#migrating?Boolean

Returns:

  • (Boolean)


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

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

  params[:migrate]
end

#newObject

only non wizard mode



41
42
43
44
45
46
# File 'app/controllers/works_controller.rb', line 41

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



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

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

#resolve_doiObject



99
100
101
102
# File 'app/controllers/works_controller.rb', line 99

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

#resubmitObject



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

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

#revert_to_draftObject



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

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



69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'app/controllers/works_controller.rb', line 69

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



124
125
126
127
128
129
130
# File 'app/controllers/works_controller.rb', line 124

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)



228
229
230
231
232
# File 'app/controllers/works_controller.rb', line 228

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

#validateObject

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



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

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

#withdrawObject



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

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