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

pulibrary / tigerdata-app / 24425d25-0a53-410b-b63c-86dcbe0f9cbe

14 Aug 2025 07:35PM UTC coverage: 75.917% (-0.6%) from 76.482%
24425d25-0a53-410b-b63c-86dcbe0f9cbe

Pull #1754

circleci

hectorcorrea
Mark a couple of tests as integration
Pull Request #1754: Better handling for Mediaflux XML error responses

0 of 5 new or added lines in 2 files covered. (0.0%)

13 existing lines in 3 files now uncovered.

2257 of 2973 relevant lines covered (75.92%)

176.18 hits per line

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

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

4
  before_action :set_breadcrumbs
1✔
5
  before_action :authenticate_user!
1✔
6

7
  def project_params
1✔
8
    params.dup
×
9
  end
10

11
  def details
1✔
12
    return if project.blank?
19✔
13

14
    add_breadcrumb(project.title, project_path)
18✔
15
    add_breadcrumb("Details")
18✔
16

17
    @departments = project.departments.join(", ")
18✔
18
    @project_metadata = project.metadata_model
18✔
19

20
    @data_sponsor = User.find_by(uid: @project_metadata.data_sponsor)
18✔
21
    @data_manager = User.find_by(uid: @project_metadata.data_manager)
18✔
22

23
    read_only_uids = @project_metadata.ro_users
18✔
24
    data_read_only_users = read_only_uids.map { |uid| ReadOnlyUser.find_by(uid:) }.reject(&:blank?)
28✔
25

26
    read_write_uids = @project_metadata.rw_users
18✔
27
    data_read_write_users = read_write_uids.map { |uid| User.find_by(uid:) }.reject(&:blank?)
26✔
28

29
    unsorted_data_users = data_read_only_users + data_read_write_users
18✔
30
    sorted_data_users = unsorted_data_users.sort_by { |u| u.family_name || u.uid }
36✔
31
    @data_users = sorted_data_users.uniq { |u| u.uid }
34✔
32
    user_model_names = @data_users.map(&:display_name_safe)
18✔
33
    @data_user_names = user_model_names.join(", ")
18✔
34

35
    @provenance_events = project.provenance_events.where.not(event_type: ProvenanceEvent::STATUS_UPDATE_EVENT_TYPE)
18✔
36

37
    @project_eligible_to_edit = true if project.status == Project::APPROVED_STATUS && eligible_editor?
18✔
38

39
    @project_metadata = @project.metadata
18✔
40
    @project_id = @project_metadata[:project_id] || {}
18✔
41
    @storage_capacity = @project_metadata[:storage_capacity]
18✔
42
    @size = @storage_capacity[:size]
18✔
43
    @unit = @storage_capacity[:unit]
18✔
44

45
    @requested_size = @size[:requested]
18✔
46
    @requested_unit = @unit[:requested]
18✔
47

48
    @approved_size = @size[:approved]
18✔
49
    @approved_unit = @unit[:approved]
18✔
50

51
    @storage_expectations = @project_metadata[:storage_performance_expectations]
18✔
52
    @requested_storage_expectations = @storage_expectations[:requested]
18✔
53
    @approved_storage_expectations = @storage_expectations[:approved]
18✔
54

55
    @project_purpose = @project_metadata[:project_purpose]
18✔
56

57

58
    @project_session = "details"
18✔
59

60
    respond_to do |format|
18✔
61
      format.html do
18✔
62
        @project = ProjectShowPresenter.new(project)
16✔
63
      end
64
      format.json do
18✔
65
        render json: project.to_json
2✔
66
      end
67
      format.xml do
18✔
68
        render xml: project.to_xml
×
69
      end
70
    end
71
  end
72

73
  def edit
1✔
74
    add_breadcrumb(project.title, project_path)
14✔
75
    add_breadcrumb("Edit")
14✔
76
    project
14✔
77
    if project.metadata_model.status != Project::APPROVED_STATUS
14✔
78
      flash[:notice] = "Pending projects can not be edited."
1✔
79
      redirect_to project
1✔
80
    elsif project.metadata_model.status == Project::APPROVED_STATUS && !eligible_editor? #check if the current user is a sponsor or a manager
13✔
81
      flash[:notice] = "Only data sponsors and data managers can revise this project."
2✔
82
      redirect_to project
2✔
83
    end
84
  end
85

86
  def update
1✔
87
    @project = Project.find(params[:id])
4✔
88

89
    #Edit action
90
    if params.key?("title")
4✔
91
      @project.metadata_model.status = @project.metadata_model.status || Project::PENDING_STATUS
4✔
92
      @project.metadata_model.update_with_params(params, current_user)
4✔
93
    end
94

95
    # @todo ProjectMetadata should be refactored to implement ProjectMetadata.valid?(updated_metadata)
96
    if project.save and params.key?("title")
4✔
97
      redirect_to project_revision_confirmation_path(@project)
4✔
98
    else
99
      render :edit
×
100
    end
101
  end
102

103
  def index
1✔
104
    if current_user.eligible_sysadmin?
5✔
105
      @projects = Project.all
1✔
106
    else
107
      flash[:alert] = I18n.t(:access_denied)
4✔
108
      redirect_to dashboard_path
4✔
109
    end
110
  end
111

112
  def confirmation; end
1✔
113
  def revision_confirmation; end
1✔
114

115
  def show
1✔
116

117
    return if project.blank?
12✔
118
    add_breadcrumb(project.title, project_path)
11✔
119
    add_breadcrumb("Contents")
11✔
120

121
    @latest_completed_download = current_user.user_requests.where(project_id: @project.id, state: "completed").order(:completion_time).last
11✔
122
    @storage_usage = project.storage_usage(session_id: current_user.mediaflux_session)
11✔
123
    @storage_capacity = project.storage_capacity(session_id: current_user.mediaflux_session)
11✔
124

125
    @num_files = project.asset_count(session_id: current_user.mediaflux_session)
11✔
126

127
    @file_list = project.file_list(session_id: current_user.mediaflux_session, size: 100)
11✔
128
    @files = @file_list[:files]
11✔
129
    @files.sort_by!(&:path)
11✔
130
    @project = ProjectShowPresenter.new(project)
11✔
131

132
    @project_session = "content"
11✔
133
    respond_to do |format|
11✔
134
      format.html { render }
21✔
135
      format.xml { render xml: @project.to_xml }
12✔
136
    end
137
  end
138

139
  # GET "projects/:id/:id-mf"
140
  #
141
  # This action is used to render the mediaflux metadata for a project.
142
  def show_mediaflux
1✔
UNCOV
143
    project_id = params[:id]
×
UNCOV
144
    project = Project.find(project_id)
×
UNCOV
145
    if project.mediaflux_id == 0
×
146
      flash[:alert] = "Project has not been created in Mediaflux"
×
147
      redirect_to project_path(project_id)
×
148
    else
UNCOV
149
      respond_to do |format|
×
UNCOV
150
        format.xml do
×
UNCOV
151
          render xml: project.mediaflux_meta_xml(user: current_user)
×
152
        end
153
      end
154
    end
155
  rescue => ex
NEW
156
    Rails.logger.error "Error getting MediaFlux XML for project #{project_id}, user #{current_user.uid}: #{ex.message}"
×
NEW
157
    flash[:alert] = "Error fetching Mediaflux XML for this project"
×
NEW
158
    redirect_to project_path(project_id)
×
159
  end
160

161
  def project_job_service
1✔
162
    @project_job_service ||= ProjectJobService.new(project:)
×
163
  end
164

165
  def list_contents
1✔
166
    return if project.blank?
1✔
167

168
    project_job_service.list_contents_job(user: current_user)
×
169

170
    json_response = {
171
      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."
×
172
    }
173
    render json: json_response
×
174
  rescue => ex
175
    message = "Error producing document list (project id: #{project&.id}): #{ex.message}"
×
176
    Rails.logger.error(message)
×
177
    Honeybadger.notify(message)
×
178
    render json: { message: "Document list could not be generated." }
×
179
  end
180

181
  def file_list_download
1✔
182
    job_id = params[:job_id]
×
183
    user_request = FileInventoryRequest.where(job_id:job_id).first
×
184
    if user_request.nil?
×
185
      # TODO: handle error
186
      redirect_to "/"
×
187
    else
188
      filename = user_request.output_file
×
189
      send_data File.read(filename), type: "text/plain", filename: "filelist.csv", disposition: "attachment"
×
190
    end
191
  end
192

193
  private
1✔
194

195
    def build_new_project
1✔
196
      @project ||= Project.new
×
197
    end
198

199
    def project
1✔
200
      @project ||= begin
268✔
201
        project = Project.find(params[:id])
46✔
202
        if project.user_has_access?(user: current_user)
46✔
203
          project
43✔
204
        else
205
          flash[:alert] = I18n.t(:access_denied)
3✔
206
          redirect_to dashboard_path
3✔
207
          nil
3✔
208
        end
209
      end
210
    end
211

212
    def eligible_editor?
1✔
213
      return true if current_user.eligible_sponsor? or current_user.eligible_manager?
20✔
214
    end
215

216
    def shared_file_location(filename)
1✔
217
      raise "Shared location is not configured" if Rails.configuration.mediaflux["shared_files_location"].blank?
×
218
      location = Pathname.new(Rails.configuration.mediaflux["shared_files_location"])
×
219
      location.join(filename).to_s
×
220
    end
221

222
    def set_breadcrumbs
1✔
223
      add_breadcrumb("Dashboard",dashboard_path)
64✔
224
    end
225
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