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

pulibrary / tigerdata-app / a25a9344-105b-44fa-8cbb-8294c0216121

30 Oct 2025 08:44PM UTC coverage: 64.982% (-22.7%) from 87.65%
a25a9344-105b-44fa-8cbb-8294c0216121

Pull #2128

circleci

hectorcorrea
Started updating the project show page to display metadata from Mediaflux
Pull Request #2128: Project Show page now displays metadata straight from Mediaflux

0 of 37 new or added lines in 3 files covered. (0.0%)

757 existing lines in 36 files now uncovered.

2134 of 3284 relevant lines covered (64.98%)

168.86 hits per line

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

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

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

7
  def details
2✔
8
    return if project.blank?
5✔
9

NEW
10
    @presenter = ProjectShowPresenter.new(project, current_user)
4✔
11

NEW
12
    add_breadcrumb(@presenter.title, project_path)
4✔
UNCOV
13
    add_breadcrumb("Details")
4✔
14

15
    @project_metadata = project.metadata_model
4✔
16

17
    read_only_uids = @project_metadata.ro_users
4✔
18
    data_read_only_users = read_only_uids.map { |uid| ReadOnlyUser.find_by(uid:) }.reject(&:blank?)
4✔
19

20
    read_write_uids = @project_metadata.rw_users
4✔
21
    data_read_write_users = read_write_uids.map { |uid| User.find_by(uid:) }.reject(&:blank?)
4✔
22

23
    unsorted_data_users = data_read_only_users + data_read_write_users
4✔
24
    sorted_data_users = unsorted_data_users.sort_by { |u| u.family_name || u.uid }
4✔
25
    @data_users = sorted_data_users.uniq { |u| u.uid }
4✔
26
    user_model_names = @data_users.map(&:display_name_safe)
4✔
27
    @data_user_names = user_model_names.join(", ")
4✔
28

29
    @provenance_events = project.provenance_events.where.not(event_type: ProvenanceEvent::STATUS_UPDATE_EVENT_TYPE)
4✔
30

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

33
    @project_metadata = @project.metadata
4✔
34
    @storage_capacity = @project_metadata[:storage_capacity]
4✔
35
    @size = @storage_capacity[:size]
4✔
36
    @unit = @storage_capacity[:unit]
4✔
37

38
    @requested_size = @size[:requested]
4✔
39
    @requested_unit = @unit[:requested]
4✔
40

41
    @approved_size = @size[:approved]
4✔
42
    @approved_unit = @unit[:approved]
4✔
43

44
    @storage_expectations = @project_metadata[:storage_performance_expectations]
4✔
45
    @requested_storage_expectations = @storage_expectations[:requested]
4✔
46
    @approved_storage_expectations = @storage_expectations[:approved]
4✔
47

48
    @project_session = "details"
4✔
49

50
    respond_to do |format|
4✔
51
      format.html do
4✔
NEW
52
        render
1✔
53
      end
54
      format.json do
4✔
55
        render json: project.to_json
2✔
56
      end
57
      format.xml do
4✔
58
        render xml: project.to_xml
1✔
59
      end
60
    end
61
  end
62

63
  def index
2✔
64
    if current_user.eligible_sysadmin?
4✔
65
      search_projects
3✔
66
    else
67
      flash[:alert] = I18n.t(:access_denied)
1✔
68
      redirect_to dashboard_path
1✔
69
    end
70
  end
71

72
  def show
2✔
UNCOV
73
    return if project.blank?
8✔
74

NEW
75
    @presenter = ProjectShowPresenter.new(project, current_user)
7✔
76

NEW
77
    add_breadcrumb(@presenter.title, project_path)
3✔
UNCOV
78
    add_breadcrumb("Contents")
3✔
79

80
    @latest_completed_download = current_user.user_requests.where(project_id: @project.id, state: "completed").order(:completion_time).last
3✔
81
    @storage_usage = project.storage_usage(session_id: current_user.mediaflux_session)
3✔
82
    @storage_capacity = project.storage_capacity(session_id: current_user.mediaflux_session)
3✔
83

84
    @num_files = project.asset_count(session_id: current_user.mediaflux_session)
3✔
85

86
    @file_list = project.file_list(session_id: current_user.mediaflux_session, size: 100)
3✔
87
    @files = @file_list[:files]
3✔
88
    @files.sort_by!(&:path)
3✔
89

UNCOV
90
    @project_session = "content"
3✔
91
    respond_to do |format|
3✔
92
      format.html { render }
5✔
93
      format.xml { render xml: @project.to_xml }
4✔
94
    end
95
  end
96

97
  # GET "projects/:id/:id-mf"
98
  #
99
  # This action is used to render the mediaflux metadata for a project.
100
  def show_mediaflux
2✔
101
    project_id = params[:id]
2✔
102
    project = Project.find(project_id)
2✔
103
    respond_to do |format|
2✔
104
      format.xml do
2✔
105
        render xml: project.mediaflux_meta_xml(user: current_user)
2✔
106
      end
107
    end
108
  rescue => ex
109
    Rails.logger.error "Error getting MediaFlux XML for project #{project_id}, user #{current_user.uid}: #{ex.message}"
×
110
    flash[:alert] = "Error fetching Mediaflux XML for this project"
×
111
    redirect_to project_path(project_id)
×
112
  end
113

114
  def list_contents
2✔
115
    return if project.blank?
2✔
116

117
    project_job_service.list_contents_job(user: current_user)
1✔
118

119
    json_response = {
120
      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✔
121
    }
122
    render json: json_response
1✔
123
  rescue => ex
124
    message = "Error producing document list (project id: #{project&.id}): #{ex.message}"
×
125
    Rails.logger.error(message)
×
126
    Honeybadger.notify(message)
×
127
    render json: { message: "Document list could not be generated." }
×
128
  end
129

130
  def file_list_download
2✔
131
    job_id = params[:job_id]
×
132
    user_request = FileInventoryRequest.where(job_id:job_id).first
×
133
    if user_request.nil?
×
134
      # TODO: handle error
135
      redirect_to "/"
×
136
    else
137
      filename = user_request.output_file
×
138
      send_data File.read(filename), type: "text/plain", filename: "filelist.csv", disposition: "attachment"
×
139
    end
140
  end
141

142
  private
2✔
143

144
    def project_job_service
2✔
145
      @project_job_service ||= ProjectJobService.new(project:)
1✔
146
    end
147

148

149
    def build_new_project
2✔
150
      @project ||= Project.new
×
151
    end
152

153
    def project
2✔
154
      @project ||= begin
55✔
155
        project = Project.find(params[:id])
13✔
156
        if project.user_has_access?(user: current_user)
13✔
157
          project
10✔
158
        else
159
          flash[:alert] = I18n.t(:access_denied)
3✔
160
          redirect_to dashboard_path
3✔
161
          nil
3✔
162
        end
163
      end
164
    end
165

166
    def eligible_editor?
2✔
167
      return true if current_user.eligible_sponsor? or current_user.eligible_manager?
3✔
168
    end
169

170
    def set_breadcrumbs
2✔
171
      add_breadcrumb("Dashboard",dashboard_path)
25✔
172
    end
173

174
    def search_projects
2✔
175
      @title_query = params[:title_query]
3✔
176
      if @title_query.blank?
3✔
177
        @projects = Project.all
1✔
178
        flash[:notice] = nil
1✔
179
      else
180
        result =  ProjectSearch.new.call(search_string: @title_query, requestor: current_user)
2✔
181
        if result.success?
2✔
182
          flash[:notice] = "Successful search in Mediaflux for #{@title_query}"
2✔
183
          @projects = result.value!
2✔
184
        else
185
          @projects = []
×
186
          flash[:notice] = "Error searching projects for #{@title_query}.  Error: #{result.failure}"
×
187
        end
188
      end
189
    end
190
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