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

pulibrary / tigerdata-app / 4140f8fb-f31e-43be-93b7-9c92bca91b73

11 Dec 2024 09:36PM UTC coverage: 84.171% (+0.01%) from 84.159%
4140f8fb-f31e-43be-93b7-9c92bca91b73

Pull #1122

circleci

JaymeeH
Merge branch '1100-project-tab-nav' of https://github.com/pulibrary/tiger-data-app into 1100-project-tab-nav
Pull Request #1122: Adding tabbed navigation to the project page

4 of 4 branches covered (100.0%)

3 of 3 new or added lines in 1 file covered. (100.0%)

7 existing lines in 1 file now uncovered.

2244 of 2666 relevant lines covered (84.17%)

333.34 hits per line

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

82.04
/app/controllers/projects_controller.rb
1
# frozen_string_literal: true
2
class ProjectsController < ApplicationController
1✔
3

4
  before_action :set_breadcrumbs
1✔
5

6
  def new
1✔
7
    add_breadcrumb("New Project Request")
15✔
8
    return build_new_project if current_user.eligible_sponsor?
15✔
9

10
    redirect_to root_path
2✔
11
  end
12

13
  def project_params
1✔
14
    params.dup
×
15
  end
16

17
  def create
1✔
18
    metadata_params = params.dup
11✔
19
    metadata_params[:status] = Project::PENDING_STATUS
11✔
20
    metadata_params[:created_by] = current_user.uid
11✔
21
    metadata_params[:created_on] = Time.current.in_time_zone("America/New_York").iso8601
11✔
22
    project_metadata = ProjectMetadata.new_from_params(metadata_params)
11✔
23

24
    build_new_project # calling private method to build a new project and set a class variable @project
11✔
25
    project.create!(initial_metadata: project_metadata, user: current_user)
11✔
26
    if project.metadata_model.project_id != nil
11✔
27
      begin
28
        mailer = TigerdataMailer.with(project_id: project.id)
11✔
29
        message_delivery = mailer.project_creation
11✔
30
        message_delivery.deliver_later
11✔
31

32
        redirect_to project_confirmation_path(project)
9✔
33
      rescue StandardError => mailer_error
34
        raise(TigerData::MailerError, mailer_error)
3✔
35
      end
36
    else
37
      render :new
×
38
    end
39
  rescue TigerData::MailerError => mailer_error
40
    logger_message = "Error encountered creating the project #{project.id} as user #{current_user.email}"
3✔
41
    Rails.logger.error(logger_message)
3✔
42
    honeybadger_context = {
43
      current_user_email: current_user.email,
3✔
44
      project_id: project.id,
45
      project_metadata: project.metadata
46
    }
47
    Honeybadger.notify(mailer_error, context: honeybadger_context)
3✔
48

49
    error_message = "We are sorry, while the project was successfully created, an error was encountered which prevents the delivery of an e-mail message confirming this. Please know that this error has been logged, and shall be reviewed by members of RDSS."
3✔
50
    flash[:notice] = error_message
3✔
51

52
    render :new
3✔
53
  rescue StandardError => error
54
    logger_message = if project.persisted?
×
55
                      "Error encountered creating the project #{project.id} as user #{current_user.email}"
×
56
                     else
57
                      "Error encountered creating the project #{metadata_params[:title]} as user #{current_user.email}"
×
58
                     end
59
    Rails.logger.error(logger_message)
×
60
    honeybadger_context = {
61
      current_user_email: current_user.email,
×
62
      project_id: project.id,
63
      project_metadata: project.metadata
64
    }
65
    Honeybadger.notify(error, context: honeybadger_context)
×
66

67
    error_message = "We are sorry, the project was not successfully created, and an error was encountered which prevents the delivery of an e-mail message confirming this. Please know that this error has been logged, and shall be reviewed by members of RDSS promptly."
×
68

69
    flash[:notice] = error_message
×
70
    render :new
×
71
  end
72

73
  def show
1✔
74
    add_breadcrumb(project.title, project_path)
34✔
75
    add_breadcrumb("Details")
34✔
76
    project
34✔
77
    @departments = project.departments.join(", ")
34✔
78
    @project_metadata = project.metadata_model
34✔
79

80
    @data_sponsor = User.find_by(uid: @project_metadata.data_sponsor)
34✔
81
    @data_manager = User.find_by(uid: @project_metadata.data_manager)
34✔
82

83
    read_only_uids = @project_metadata.ro_users
34✔
84
    data_read_only_users = read_only_uids.map { |uid| ReadOnlyUser.find_by(uid:) }.reject(&:blank?)
53✔
85

86
    read_write_uids = @project_metadata.rw_users
34✔
87
    data_read_write_users = read_write_uids.map { |uid| User.find_by(uid:) }.reject(&:blank?)
53✔
88

89
    unsorted_data_users = data_read_only_users + data_read_write_users
34✔
90
    sorted_data_users = unsorted_data_users.sort_by { |u| u.family_name || u.uid }
72✔
91
    @data_users = sorted_data_users.uniq { |u| u.uid }
72✔
92
    user_model_names = @data_users.map(&:display_name_safe)
34✔
93
    @data_user_names = user_model_names.join(", ")
34✔
94

95
    @provenance_events = project.provenance_events.where.not(event_type: ProvenanceEvent::STATUS_UPDATE_EVENT_TYPE)
34✔
96

97
    @project_eligible_to_edit = true if project.status == Project::APPROVED_STATUS && eligible_editor?
34✔
98

99
    @project_metadata = @project.metadata
34✔
100
    @project_id = @project_metadata[:project_id] || {}
34✔
101
    @storage_capacity = @project_metadata[:storage_capacity]
34✔
102
    @size = @storage_capacity[:size]
34✔
103
    @unit = @storage_capacity[:unit]
34✔
104

105
    @requested_size = @size[:requested]
34✔
106
    @requested_unit = @unit[:requested]
34✔
107

108
    @approved_size = @size[:approved]
34✔
109
    @approved_unit = @unit[:approved]
34✔
110

111
    @storage_expectations = @project_metadata[:storage_performance_expectations]
34✔
112
    @requested_storage_expectations = @storage_expectations[:requested]
34✔
113
    @approved_storage_expectations = @storage_expectations[:approved]
34✔
114

115
    @project_purpose = @project_metadata[:project_purpose]
34✔
116

117
    @project_session = "details"
34✔
118

119
    respond_to do |format|
34✔
120
      format.html do
34✔
121
        @project = ProjectShowPresenter.new(project)
31✔
122
      end
123
      format.json do
34✔
124
        render json: project.to_json
2✔
125
      end
126
      format.xml do
34✔
127
        render xml: project.to_xml
1✔
128
      end
129
    end
130
  end
131

132
  def edit
1✔
133
    add_breadcrumb(project.title, project_path)
15✔
134
    add_breadcrumb("Edit")
15✔
135
    project
15✔
136
    if project.metadata_model.status != Project::APPROVED_STATUS
15✔
137
      flash[:notice] = "Pending projects can not be edited."
1✔
138
      redirect_to project
1✔
139
    elsif project.metadata_model.status == Project::APPROVED_STATUS && !eligible_editor? #check if the current user is a sponsor or a manager
14✔
140
      flash[:notice] = "Only data sponsors and data managers can revise this project."
1✔
141
      redirect_to project
1✔
142
    end
143
  end
144

145
  def update
1✔
146
    @project = Project.find(params[:id])
10✔
147
    #Approve action
148
    if params.key?("mediaflux_id")
10✔
149
      @project.metadata_model.update_with_params(params, current_user)
2✔
150
      @project.approve!(mediaflux_id: params["mediaflux_id"],current_user:)
2✔
151
    end
152

153
    #Edit action
154
    if params.key?("title")
10✔
155
      @project.metadata_model.status = @project.metadata_model.status || Project::PENDING_STATUS
8✔
156
      @project.metadata_model.update_with_params(params, current_user)
8✔
157
    end
158

159
    # @todo ProjectMetadata should be refactored to implement ProjectMetadata.valid?(updated_metadata)
160
    if project.save and params.key?("mediaflux_id")
10✔
161
      redirect_to project_approval_received_path(@project)
2✔
162
    elsif project.save and params.key?("title")
8✔
163
      redirect_to project_revision_confirmation_path(@project)
8✔
164
    else
UNCOV
165
      render :edit
×
166
    end
167
  end
168

169
  def index
1✔
170
    @projects = Project.all
2✔
171
  end
172

173
  def confirmation; end
1✔
174
  def revision_confirmation; end
1✔
175

176
  def contents
1✔
177
    add_breadcrumb(project.title, project_path)
8✔
178
    add_breadcrumb("Contents", project_contents_path)
8✔
179
    project
8✔
180

181
    @storage_usage = project.storage_usage(session_id: current_user.mediaflux_session)
8✔
182
    @storage_capacity = project.storage_capacity(session_id: current_user.mediaflux_session)
7✔
183

184
    @num_files = project.asset_count(session_id: current_user.mediaflux_session)
7✔
185

186
    @file_list = project.file_list(session_id: current_user.mediaflux_session, size: 100)
7✔
187
    @files = @file_list[:files]
7✔
188
    @files.sort_by!(&:path)
7✔
189
    @project = ProjectShowPresenter.new(project)
7✔
190

191
    @project_session = "content"
7✔
192
  end
193

194
  def project_job_service
1✔
195
    @project_job_service ||= ProjectJobService.new(project:)
1✔
196
  end
197

198
  def list_contents
1✔
199
    project_job_service.list_contents_job(user: current_user)
1✔
200

201
    json_response = {
202
      message: "File list for \"#{project.title}\" is being generated in the background. A link to the downloadable file list will be available in the \"Recent Activity\" section of your dashboard when it is available. You may safely navigate away from this page or close this tab."
1✔
203
    }
204
    render json: json_response
1✔
205
  rescue => ex
UNCOV
206
    message = "Error producing document list (project id: #{project&.id}): #{ex.message}"
×
207
    Rails.logger.error(message)
×
208
    Honeybadger.notify(message)
×
209
    render json: { message: "Document list could not be generated." }
×
210
  end
211

212
  def file_list_download
1✔
UNCOV
213
    job_id = params[:job_id]
×
214
    user_request = FileInventoryRequest.where(job_id:job_id).first
×
215
    if user_request.nil?
×
216
      # TODO: handle error
UNCOV
217
      redirect_to "/"
×
218
    else
UNCOV
219
      filename = user_request.output_file
×
220
      send_data File.read(filename), type: "text/plain", filename: "filelist.csv", disposition: "attachment"
×
221
    end
222
  end
223

224
  def approve
1✔
225
    if current_user.eligible_sysadmin?
7✔
226
      add_breadcrumb(project.title, project_path)
4✔
227
      add_breadcrumb("Approval Settings", project_approve_path)
4✔
228
      add_breadcrumb("Edit")
4✔
229
      project
4✔
230
      @departments = project.departments.join(", ")
4✔
231
      @project_metadata = project.metadata
4✔
232
      sponsor_uid = @project_metadata[:data_sponsor]
4✔
233
      @data_sponsor = User.find_by(uid: sponsor_uid)
4✔
234
      @provenance_events = project.provenance_events.where.not(event_type: ProvenanceEvent::STATUS_UPDATE_EVENT_TYPE)
4✔
235

236
      @title = @project_metadata["title"]
4✔
237
    else redirect_to root_path
3✔
238
    end
239
  end
240

241
  def create_script
1✔
UNCOV
242
    project_id = params[:id]
×
243
    project = Project.find(project_id)
×
244
    service = MediafluxScriptFactory.new(project: project)
×
245
    respond_to do |format|
×
246
      format.json { render json: {script: service.aterm_script} }
×
247
    end
248
  end
249

250
  private
1✔
251

252
    def build_new_project
1✔
253
      @project ||= Project.new
24✔
254
    end
255

256
    def project
1✔
257
      @project ||= Project.find(params[:id])
442✔
258
    end
259

260
    def eligible_editor?
1✔
261
      return true if current_user.eligible_sponsor? or current_user.eligible_manager?
26✔
262
    end
263

264
    def shared_file_location(filename)
1✔
UNCOV
265
      raise "Shared location is not configured" if Rails.configuration.mediaflux["shared_files_location"].blank?
×
266
      location = Pathname.new(Rails.configuration.mediaflux["shared_files_location"])
×
267
      location.join(filename).to_s
×
268
    end
269

270
    def set_breadcrumbs
1✔
271
      add_breadcrumb("Dashboard","/")
116✔
272
    end
273
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

© 2025 Coveralls, Inc