Class: NewProjectRequest

Inherits:
ApplicationRecord show all
Defined in:
app/models/new_project_request.rb

Overview

rubocop:disable Metrics/ClassLength

Constant Summary collapse

DRAFT =

default state set by database

"draft"
SUBMITTED =

Ready to be approved

"submitted"

Instance Method Summary collapse

Instance Method Details

#approve(approver) ⇒ Object



88
89
90
91
92
93
94
95
96
97
98
99
# File 'app/models/new_project_request.rb', line 88

def approve(approver)
  create_project_operation = ProjectCreate.new
  result = create_project_operation.call(request: self, approver: approver)
  if result.success?
    result.value!
  else
    self.error_message = { message: result.failure }
    save!
    cleanup_incomplete_project
    raise ProjectCreate::ProjectCreateError, result.failure
  end
end

#approved_quota_sizeObject



101
102
103
104
105
106
107
108
109
110
111
# File 'app/models/new_project_request.rb', line 101

def approved_quota_size
  if approved_quota.present?
    if approved_quota == "custom"
      approved_storage_size.to_f
    else
      approved_quota.split.first.to_f
    end
  else
    requested_quota_size
  end
end

#approved_quota_unitObject



121
122
123
124
125
126
127
128
129
130
131
# File 'app/models/new_project_request.rb', line 121

def approved_quota_unit
  if approved_quota.present?
    if approved_quota == "custom"
      approved_storage_unit
    else
      approved_quota.split.last
    end
  else
    requested_quota_unit
  end
end

#custom_quota?Boolean

Returns:

  • (Boolean)


80
81
82
# File 'app/models/new_project_request.rb', line 80

def custom_quota?
  quota == "custom"
end

#data_manager_nameObject



156
157
158
# File 'app/models/new_project_request.rb', line 156

def data_manager_name
  user_name(data_manager)
end

#data_sponsor_nameObject



160
161
162
# File 'app/models/new_project_request.rb', line 160

def data_sponsor_name
  user_name(data_sponsor)
end

#project_pathObject



145
146
147
148
149
# File 'app/models/new_project_request.rb', line 145

def project_path
  return project_folder if parent_folder.blank?

  [parent_folder, project_folder].join("/")
end

#requested_quota_sizeObject



113
114
115
116
117
118
119
# File 'app/models/new_project_request.rb', line 113

def requested_quota_size
  if custom_quota?
    storage_size.to_f
  else
    quota.split.first.to_f
  end
end

#requested_quota_unitObject



133
134
135
136
137
138
139
# File 'app/models/new_project_request.rb', line 133

def requested_quota_unit
  if custom_quota?
    storage_unit
  else
    quota.split.last
  end
end

#requestorObject



151
152
153
154
# File 'app/models/new_project_request.rb', line 151

def requestor
  return "Missing requestor." if requested_by.blank?
  User.find_by(uid: requested_by).display_name_safe
end

#submitted?Boolean

Returns:

  • (Boolean)


141
142
143
# File 'app/models/new_project_request.rb', line 141

def 
  state == NewProjectRequest::SUBMITTED
end

#valid_data_manager?Boolean

Returns:

  • (Boolean)


35
36
37
# File 'app/models/new_project_request.rb', line 35

def valid_data_manager?
  check_errors? { validate_uid(data_manager, :data_manager) }
end

#valid_data_sponsor?Boolean

Returns:

  • (Boolean)


31
32
33
# File 'app/models/new_project_request.rb', line 31

def valid_data_sponsor?
  check_errors? { validate_uid(data_sponsor, :data_sponsor) }
end

#valid_departments?Boolean

Returns:

  • (Boolean)


39
40
41
# File 'app/models/new_project_request.rb', line 39

def valid_departments?
  check_errors? { field_present?(departments, :departments) }
end

#valid_description?Boolean

Returns:

  • (Boolean)


47
48
49
50
51
52
# File 'app/models/new_project_request.rb', line 47

def valid_description?
  check_errors? do
    field_present?(description, :description)
    valid_length(description, 1000, :description)
  end
end

#valid_parent_folder?(allow_empty_parent_folder: false) ⇒ Boolean

Returns:

  • (Boolean)


54
55
56
57
58
59
60
# File 'app/models/new_project_request.rb', line 54

def valid_parent_folder?(allow_empty_parent_folder: false)
  check_errors? do
    field_present?(parent_folder, :parent_folder) unless allow_empty_parent_folder
    # Check the parent_folder for invalid characters.
    alphanumeric_dash_underscore_only(parent_folder, :parent_folder)
  end
end

#valid_project_folder?Boolean

Returns:

  • (Boolean)


62
63
64
65
66
67
68
# File 'app/models/new_project_request.rb', line 62

def valid_project_folder?
  check_errors? do
    field_present?(project_folder, :project_folder)
    # Check the project folder for invalid characters (notice that we display the error under the parent folder)
    alphanumeric_dash_underscore_only(project_folder, :parent_folder)
  end
end

#valid_project_purpose?Boolean

Returns:

  • (Boolean)


43
44
45
# File 'app/models/new_project_request.rb', line 43

def valid_project_purpose?
  check_errors? { project_purpose_present?(project_purpose, :project_purpose) }
end

#valid_quota?Boolean

Returns:

  • (Boolean)


70
71
72
73
74
75
76
77
78
# File 'app/models/new_project_request.rb', line 70

def valid_quota?
  if ((quota == "500 GB") || (quota == "2 TB") || (quota == "10 TB") || (quota == "25 TB")) ||
     (custom_quota? && (storage_size.present? && (storage_size > 0)) && ((storage_unit == "GB") || (storage_unit == "TB")))
    true
  else
    errors.add(:quota, :invalid, message: "must be one of '500 GB', '2 TB', '10 TB', '25 TB', or 'custom'")
    false
  end
end

#valid_requested_by?Boolean

Returns:

  • (Boolean)


84
85
86
# File 'app/models/new_project_request.rb', line 84

def valid_requested_by?
  check_errors? { field_present?(requested_by, :requested_by) }
end

#valid_title?Boolean

Returns:

  • (Boolean)


24
25
26
27
28
29
# File 'app/models/new_project_request.rb', line 24

def valid_title?
  check_errors? do
    field_present?(project_title, :project_title)
    valid_length(project_title, 200, :project_title)
  end
end

#valid_to_submit?(allow_empty_parent_folder: false) ⇒ Boolean

Returns:

  • (Boolean)


7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# File 'app/models/new_project_request.rb', line 7

def valid_to_submit?(allow_empty_parent_folder: false)
  errors.clear
  # run all validations and then check for errors otherwise ruby stops at the first error
  valid_title?
  valid_data_sponsor?
  valid_data_manager?
  valid_departments?
  valid_quota?
  valid_project_purpose?
  valid_description?
  valid_parent_folder?(allow_empty_parent_folder:)
  valid_project_folder?
  # For Skeletor we are setting the requestor to the data sponsor
  # valid_requested_by?
  errors.count == 0
end