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

pulibrary / tigerdata-app / ada84852-d060-49eb-9a73-c1f44990c9d4

05 Nov 2025 06:01PM UTC coverage: 91.044% (-0.5%) from 91.5%
ada84852-d060-49eb-9a73-c1f44990c9d4

Pull #2128

circleci

web-flow
Merge branch 'main' into 2039-showpage-mf
Pull Request #2128: Project Show page now displays metadata straight from Mediaflux

46 of 69 new or added lines in 8 files covered. (66.67%)

275 existing lines in 16 files now uncovered.

2826 of 3104 relevant lines covered (91.04%)

530.1 hits per line

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

97.85
/app/presenters/project_show_presenter.rb
1
# frozen_string_literal: true
2
class ProjectShowPresenter
5✔
3
  delegate "id", "in_mediaflux?", "mediaflux_id", "status", to: :project
5✔
4
  delegate "project_id", "storage_performance_expectations", to: :project_metadata
5✔
5

6
  attr_reader :project, :project_metadata
5✔
7

8
  # @return [Class] The presenter class for building XML Documents from Projects
9
  def self.xml_presenter_class
5✔
10
    ProjectXmlPresenter
8✔
11
  end
12

13
  # While we are transitioning to fetching the data straight from Mediaflux `project` can be
14
  # an ActiveRecord Project model (when used from the Project show page) or a Hash with the
15
  # data from Mediaflux (when used from the Dashboard).
16
  # This branching can be refactored (elimitated?) once we implement ticket
17
  # https://github.com/pulibrary/tigerdata-app/issues/2039 and the project data will always
18
  # come from Mediaflux.
19
  def initialize(project, current_user)
5✔
20
    if project.is_a?(Hash)
1,252✔
21
      @project_mf = project
1,160✔
22
      @project = rails_project(@project_mf)
1,160✔
23
    else
24
      @project = project
92✔
25
      @project_mf = project.mediaflux_metadata(session_id: current_user.mediaflux_session) if current_user.present?
92✔
26
    end
27
    @project_metadata = @project&.metadata_model
1,248✔
28
  end
29

30
  def title
5✔
31
    @project_mf[:title]
245✔
32
  end
33

34
  def description
5✔
35
    @project_mf[:description]
45✔
36
  end
37

38
  # @return [String] the XML for the project Document
39
  def to_xml
5✔
40
    xml_document.to_xml
7✔
41
  end
42

43
  # @return [Nokogiri::XML::Document] the XML Document for the Project
44
  def xml_document
5✔
45
    @xml_document ||= xml_presenter.document
8✔
46
  end
47

48
  def created
5✔
UNCOV
49
    @project.created_at.strftime("%b %e, %Y %l:%M %p")
32✔
50
  end
51

52
  def updated
5✔
UNCOV
53
    @project.updated_at.strftime("%b %e, %Y %l:%M %p")
32✔
54
  end
55

56
  def data_sponsor
5✔
57
    User.find_by(uid: @project_mf[:data_sponsor])
260✔
58
  end
59

60
  def data_manager
5✔
61
    User.find_by(uid: @project_mf[:data_manager])
145✔
62
  end
63

64
  def data_read_only_users
5✔
NEW
65
    (@project_mf[:ro_users] || []).map { |uid| ReadOnlyUser.find_by(uid:) }.compact
19✔
66
  end
67

68
  def data_read_write_users
5✔
NEW
69
    (@project_mf[:rw_users] || []).map { |uid| User.find_by(uid:) }.compact
21✔
70
  end
71

72
  def data_users
5✔
NEW
73
    unsorted_data_users = data_read_only_users + data_read_write_users
19✔
NEW
74
    sorted_data_users = unsorted_data_users.sort_by { |u| u.family_name || u.uid }
21✔
NEW
75
    sorted_data_users.uniq { |u| u.uid }
19✔
76
  end
77

78
  def data_user_names
5✔
NEW
79
    user_model_names = data_users.map(&:display_name_safe)
×
NEW
80
    user_model_names.join(", ")
×
81
  end
82

83
  def project_purpose
5✔
84
    @project_mf[:project_purpose]
13✔
85
  end
86

87
  # used to hide the project root that is not visible to the end user
88
  def project_directory
5✔
89
    # This value comes from Mediaflux without the extra hidden root
90
    directory = @project_mf[:project_directory] || ""
92✔
91
    directory.start_with?("/") ? directory : "/" + directory
92✔
92
  end
93

94
  def hpc
5✔
NEW
95
    @project_mf[:hpc] == true ? "Yes" : "No"
11✔
96
  end
97

98
  def globus
5✔
NEW
99
    @project_mf[:globus] == true ? "Yes" : "No"
11✔
100
  end
101

102
  def smb
5✔
NEW
103
    @project_mf[:smb] == true ? "Yes" : "No"
11✔
104
  end
105

106
  def number_of_files
5✔
NEW
107
    @project_mf[:number_of_files]
11✔
108
  end
109

110
  def departments
5✔
NEW
111
    @project_mf[:departments] || []
22✔
112
  end
113

114
  def project_id
5✔
115
    @project_mf[:project_id]
13✔
116
  end
117

118
  def storage_capacity(session_id: nil)
5✔
119
    return project_metadata.storage_capacity if session_id.nil?
34✔
120

UNCOV
121
    persisted = project.storage_capacity_raw(session_id: session_id)
32✔
UNCOV
122
    value = persisted.to_f
32✔
123

UNCOV
124
    value*default_capacity_divisor
32✔
125
  end
126

127
  def formatted_storage_capacity(session_id:)
5✔
UNCOV
128
    value = storage_capacity(session_id: session_id)
32✔
UNCOV
129
    format("%.3f", value)
32✔
130
  end
131

132
  def formatted_quota_percentage(session_id:)
5✔
UNCOV
133
    value = quota_percentage(session_id:)
32✔
UNCOV
134
    format("%.3f", value)
32✔
135
  end
136

137
  def quota_usage(session_id:)
5✔
UNCOV
138
    "#{project.storage_usage(session_id:)} out of #{project.storage_capacity(session_id:)} used"
190✔
139
  end
140

141
  def quota_percentage(session_id:)
5✔
UNCOV
142
    storage_capacity = project.storage_capacity_raw(session_id:)
143✔
UNCOV
143
    return 0 if storage_capacity.zero?
143✔
144

145
    storage_usage = project.storage_usage_raw(session_id:)
143✔
146
    (storage_usage.to_f / storage_capacity.to_f) * 100
143✔
147
  end
148

149
  def user_has_access?(user:)
5✔
NEW
150
    return true if user.eligible_sysadmin?
53✔
NEW
151
    data_sponsor.uid == user.uid || data_manager.uid == user.uid || data_users.include?(user.uid)
45✔
152
  end
153

154
  def project_in_rails?
5✔
155
    project != nil
1,160✔
156
  end
157

158
  private
5✔
159

160
    # Capacity is in bytes
161
    def default_capacity_divisor
5✔
UNCOV
162
      1.0/(1000.0**3)
32✔
163
    end
164

165
    def xml_presenter_args
5✔
166
      project
8✔
167
    end
168

169
    def xml_presenter
5✔
170
      @xml_presenter ||= self.class.xml_presenter_class.new(xml_presenter_args)
8✔
171
    end
172

173
    def rails_project(project_mf)
5✔
174
      database_record = Project.where(mediaflux_id:project_mf[:mediaflux_id]).first
1,160✔
175
      if database_record.nil?
1,160✔
176
        Rails.logger.warn("Mediaflux project with ID #{project_mf[:mediaflux_id]} is not in the Rails database (title: #{project_mf[:title]})")
1,068✔
177
        Honeybadger.notify("Mediaflux project with ID #{project_mf[:mediaflux_id]} is not in the Rails database (title: #{project_mf[:title]})")
1,068✔
178
      end
179
      database_record
1,160✔
180
    end
181
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