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

pulibrary / tigerdata-app / a7a7c677-70ce-4fb7-93a9-85b7a17ef43a

10 Dec 2024 07:51PM UTC coverage: 83.95% (-0.3%) from 84.203%
a7a7c677-70ce-4fb7-93a9-85b7a17ef43a

Pull #1097

circleci

carolyncole
Adding a tble to display the contents of a project
Pull Request #1097: Adding a table to display the contents of a project

4 of 4 branches covered (100.0%)

2 of 9 new or added lines in 2 files covered. (22.22%)

12 existing lines in 4 files now uncovered.

2223 of 2648 relevant lines covered (83.95%)

332.31 hits per line

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

81.71
/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)
32✔
75
    add_breadcrumb("Details")
32✔
76
    project
32✔
77
    @departments = project.departments.join(", ")
32✔
78
    @project_metadata = project.metadata_model
32✔
79

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

167
  def index
1✔
168
    @projects = Project.all
2✔
169
  end
170

171
  def confirmation; end
1✔
172
  def revision_confirmation; end
1✔
173

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

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

182
    @num_files = project.asset_count(session_id: current_user.mediaflux_session)
7✔
183

184
    @file_list = project.file_list(session_id: current_user.mediaflux_session, size: 100)
7✔
185
    @files = @file_list[:files]
7✔
186
    @files.sort_by!(&:path)
7✔
187
  end
188

189
  def project_job_service
1✔
190
    @project_job_service ||= ProjectJobService.new(project:)
1✔
191
  end
192

193
  def list_contents
1✔
194
    project_job_service.list_contents_job(user: current_user)
1✔
195

196
    json_response = {
197
      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✔
198
    }
199
    render json: json_response
1✔
200
  rescue => ex
UNCOV
201
    message = "Error producing document list (project id: #{project&.id}): #{ex.message}"
×
UNCOV
202
    Rails.logger.error(message)
×
203
    Honeybadger.notify(message)
×
204
    render json: { message: "Document list could not be generated." }
×
205
  end
206

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

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

231
      @title = @project_metadata["title"]
4✔
232
    else redirect_to root_path
3✔
233
    end
234
  end
235

236
  def create_script
1✔
UNCOV
237
    project_id = params[:id]
×
UNCOV
238
    project = Project.find(project_id)
×
239
    service = MediafluxScriptFactory.new(project: project)
×
240
    respond_to do |format|
×
241
      format.json { render json: {script: service.aterm_script} }
×
242
    end
243
  end
244

245
  private
1✔
246

247
    def build_new_project
1✔
248
      @project ||= Project.new
24✔
249
    end
250

251
    def project
1✔
252
      @project ||= Project.find(params[:id])
409✔
253
    end
254

255
    def eligible_editor?
1✔
256
      return true if current_user.eligible_sponsor? or current_user.eligible_manager?
22✔
257
    end
258

259
    def shared_file_location(filename)
1✔
UNCOV
260
      raise "Shared location is not configured" if Rails.configuration.mediaflux["shared_files_location"].blank?
×
UNCOV
261
      location = Pathname.new(Rails.configuration.mediaflux["shared_files_location"])
×
262
      location.join(filename).to_s
×
263
    end
264

265
    def set_breadcrumbs
1✔
266
      add_breadcrumb("Dashboard","/")
108✔
267
    end
268
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