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

pulibrary / tigerdata-app / 8d70f2ab-acc5-4aab-b64b-743d66ddd2eb

29 Aug 2025 06:22PM UTC coverage: 87.983% (-0.1%) from 88.118%
8d70f2ab-acc5-4aab-b64b-743d66ddd2eb

Pull #1801

circleci

JaymeeH
Merge branch '1586-request-mailer' of https://github.com/pulibrary/tiger-data-app into 1586-request-mailer
Pull Request #1801: 1586 request mailer

10 of 10 new or added lines in 2 files covered. (100.0%)

1173 existing lines in 56 files now uncovered.

2482 of 2821 relevant lines covered (87.98%)

317.98 hits per line

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

98.21
/app/presenters/project_xml_presenter.rb
1
# frozen_string_literal: true
2

3
# rubocop:disable Metrics/ClassLength
4
class ProjectXmlPresenter
2✔
5
  attr_reader :project, :project_metadata
2✔
6

7
  # Delegate methods to the project and project_metadata objects
8
  delegate(
2✔
9
    "id",
10
    "in_mediaflux?",
11
    "mediaflux_id",
12
    "title",
13
    to: :project
14
  )
15

16
  delegate(
2✔
17
    "approval_note",
18
    "description",
19
    "data_manager",
20
    "data_sponsor",
21
    "data_user_read_only",
22
    "data_user_read_write",
23
    "departments",
24
    "project_id",
25
    "project_purpose",
26
    "storage_capacity",
27
    "storage_performance_expectations",
28
    "created_by",
29
    "created_on",
30
    "updated_by",
31
    "updated_on",
32
    "schema_version",
33
    to: :project_metadata
34
  )
35

36
  # @param project [Project] The project for the presenter
37
  def initialize(project)
2✔
38
    @project = project
61✔
39
    @project_metadata = @project.metadata_model
61✔
40
  end
41

42
  # @return [Nokogiri::XML::Document] The XML document
43
  delegate :document, to: :build
2✔
44

45
  # @return [Boolean] Whether the request for a Globus mount is approved
46
  def globus_enable_approved?
2✔
47
    globus_request = project_metadata.globus_request
151✔
48
    globus_request[:approved] || false
151✔
49
  end
50

51
  # @return [String] Whether the request for a Globus mount is approved
52
  def globus_enable_approved
2✔
53
    if globus_enable_approved?
148✔
UNCOV
54
      "true"
1✔
55
    else
56
      "false"
147✔
57
    end
58
  end
59

60
  # @return [Boolean] Whether there is a request for a Globus mount
61
  def globus_enable_requested?
2✔
62
    globus_request = project_metadata.globus_request
53✔
63
    globus_request.present?
53✔
64
  end
65

66
  # @return [String] Whether the request for a Globus mount is requested
67
  def globus_enable_requested
2✔
68
    if globus_enable_requested?
51✔
69
      "true"
13✔
70
    else
UNCOV
71
      "false"
38✔
72
    end
73
  end
74

75
  # @return [Boolean] Whether the request for the SMB mount is approved
76
  def smb_enable_approved?
2✔
77
    smb_request = project_metadata.smb_request
151✔
78
    smb_request[:approved] || false
151✔
79
  end
80

81
  # @return [String] Whether the request for the SMB mount is approved
82
  def smb_enable_approved
2✔
83
    if smb_enable_approved?
98✔
UNCOV
84
      "true"
1✔
85
    else
86
      "false"
97✔
87
    end
88
  end
89

90
  # @return [Boolean] Whether there is a request for SMB mount
91
  def smb_enable_requested?
2✔
92
    smb_request = project_metadata.smb_request
49✔
93
    smb_request.present?
49✔
94
  end
95

96
  # @return [String] Whether the request for the SMB mount is requested
97
  def smb_enable_requested
2✔
98
    if smb_enable_requested?
48✔
99
      "true"
12✔
100
    else
UNCOV
101
      "false"
36✔
102
    end
103
  end
104

105
  # @return [String] The project status (mapped to values specified by the TigerData XML schema)
106
  # NOTE: Valid values are one of: 'AdminReview', 'Approved', 'Active', 'Retired', 'Published'
107
  def status
2✔
108
    project_status = project.status
48✔
109
    return if project_status.nil?
48✔
110

111
    project_status.capitalize
48✔
112
  end
113

114
  # @return [ProvenanceEvent] The first project submission event
115
  def submission
2✔
116
    @submission ||= project.provenance_events.find_by(event_type: ProvenanceEvent::SUBMISSION_EVENT_TYPE)
220✔
117
  end
118

119
  # @return [Array<ProvenanceEvent>] The project submission events
120
  def submissions
2✔
121
    [submission]
48✔
122
  end
123

124
  # @return [String] The user ID of the user who requested the project
125
  def requested_by
2✔
126
    return if submission.nil?
49✔
127

UNCOV
128
    submission.event_person
37✔
129
  end
130

131
  # @return [String] The date and time of the request
132
  def request_date_time
2✔
133
    return if submission.nil?
49✔
134

UNCOV
135
    value = submission.created_at
37✔
UNCOV
136
    value.strftime("%Y-%m-%dT%H:%M:%S%:z")
37✔
137
  end
138

139
  # @return [String] The user ID of the user who approved the project
140
  def approved_by
2✔
141
    return if approval_note.nil?
49✔
142

UNCOV
143
    approval_note[:note_by]
3✔
144
  end
145

146
  # @return [String] The date and time of the approval
147
  def approval_date_time
2✔
148
    return nil if approval_note.nil?
49✔
149

UNCOV
150
    approval_note[:note_date_time]
3✔
151
  end
152

153
  # @return [String] Whether or not the project data use agreement
154
  def data_use_agreement?
2✔
155
    project_metadata.data_use_agreement.present?
49✔
156
  end
157

158
  # @return [String] The project resource type
159
  def project_resource_type
2✔
160
    project_metadata.resource_type
49✔
161
  end
162

163
  # @return [Boolean] Whether the project is provisional
164
  def provisional_project?
2✔
165
    project_metadata.provisional
49✔
166
  end
167

168
  # @return [String] Whether or not the project is associated with HPC
169
  delegate :hpc, to: :project_metadata
2✔
170

171
  # @return [String] The project visibility
172
  delegate :project_visibility, to: :project_metadata
2✔
173

174
  # @return [Boolean] Whether the project directory request is approved
175
  def project_directory_approved?
2✔
176
    expectations = storage_performance_expectations
48✔
177
    expectations[:approved] || false
48✔
178
  end
179

180
  # @return [Boolean] Whether the project storage capacity request is approved
181
  def storage_capacity_approved?
2✔
182
    storage_capacity_size = storage_capacity["size"] || {}
48✔
183
    return false unless storage_capacity_size.key?(:approved)
48✔
184

185
    approved_size = storage_capacity_size[:approved] || 0
12✔
186
    approved_size > 0
12✔
187
  end
188

189
  # @return [Boolean] Whether the project storage request is approved
190
  def storage_performance_requested?
2✔
191
    requested = storage_performance_expectations[:requested]
48✔
192
    requested.present?
48✔
193
  end
194

195
  # @return [Array<String>] The project directory paths
196
  def project_directory
2✔
197
    [project.project_directory]
147✔
198
  end
199

200
  # @param index [Integer] The index of the project directory
201
  # @return [String] The project directory path
202
  def project_directory_path(index)
2✔
203
    entry = project_directory[index]
48✔
204
    entry
48✔
205
  end
206

207
  # @param index [Integer] The index of the project directory
208
  # @return [String] The protocol for the project directory
209
  def project_directory_protocol(index)
2✔
210
    entry = project_directory[index]
49✔
211
    segments = entry.split("://")
49✔
212

213
    if segments.length > 1
49✔
214
      value = segments[0]
×
215
      value.upcase
×
216
    else
217
      ProjectMetadata.default_directory_protocol
49✔
218
    end
219
  end
220

221
  # @param index [Integer] The index of the department code to retrieve
222
  # @return [String] The department code for departments associated with the project
223
  def department(index)
2✔
224
    value = departments[index]
57✔
225
    if value.length < 6
57✔
226
      value = value.rjust(6, "0")
55✔
227
    end
228
    value
57✔
229
  end
230

231
  # @return [String] The department code for the project
232
  def department_code(index)
2✔
233
    departments[index]
57✔
234
  end
235

236
  # @return [String] The requested project storage capacity
237
  def requested_storage
2✔
238
    storage_performance_expectations[:requested] || nil
49✔
239
  end
240

241
  private
2✔
242

243
    def xml_builder_config
2✔
244
      Rails.configuration.xml_builder
96✔
245
    end
246

247
    def presenter_builder_config
2✔
248
      xml_builder_config[:project] || {}
96✔
249
    end
250

251
    def find_builder_args(key)
2✔
252
      raise "No builder config for #{key}" unless presenter_builder_config.key?(key)
48✔
253

254
      values = presenter_builder_config[key]
48✔
255
      values[:presenter] = self
48✔
256
      values
48✔
257
    end
258

259
    def builder
2✔
260
      @builder ||= begin
48✔
261
                     builder_args = find_builder_args(:resource)
48✔
262
                     XmlTreeBuilder.new(**builder_args)
48✔
263
                   end
264
    end
265

266
    delegate :build, to: :builder
2✔
267
end
268
# rubocop:enable Metrics/ClassLength
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