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

pulibrary / pdc_describe / 9091a1ae-29be-458c-984a-339d213919c4

12 Dec 2024 07:41PM UTC coverage: 26.434% (-69.7%) from 96.113%
9091a1ae-29be-458c-984a-339d213919c4

Pull #2000

circleci

jrgriffiniii
Removing integration with ActiveStorage
Pull Request #2000: Bump actionpack from 7.2.1.1 to 7.2.2.1

945 of 3575 relevant lines covered (26.43%)

0.35 hits per line

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

35.48
/app/models/group.rb
1
# frozen_string_literal: true
2

3
# rubocop:disable Metrics/ClassLength
4
class Group < ApplicationRecord
1✔
5
  resourcify
1✔
6

7
  # GroupOptions model extensible options set for Groups and Users
8
  has_many :group_options, dependent: :destroy, class_name: "GroupOption"
1✔
9
  has_many :group_messaging_options, -> { where(option_type: GroupOption::EMAIL_MESSAGES) }, class_name: "GroupOption", dependent: :destroy
1✔
10

11
  has_many :users_with_options, through: :group_options, source: :user
1✔
12
  has_many :users_with_messaging, through: :group_messaging_options, source: :user
1✔
13

14
  validate do |group|
1✔
15
    if group.title.blank?
2✔
16
      group.errors.add :base, "Title cannot be empty"
×
17
    end
18
  end
19

20
  def default_admins_list
1✔
21
    return [] if code.blank?
×
22
    key = code.downcase.to_sym
×
23
    Rails.configuration.group_defaults.dig(key, :admin) || []
×
24
  end
25

26
  def default_submitters_list
1✔
27
    key = code.downcase.to_sym
×
28
    Rails.configuration.group_defaults.dig(key, :submit) || []
×
29
  end
30

31
  def super_administrators
1✔
32
    User.with_role(:super_admin)
×
33
  end
34

35
  def datasets
1✔
36
    Work.where(group_id: id)
×
37
  end
38

39
  def submitters
1✔
40
    User.with_role(:submitter, self)
×
41
  end
42

43
  # Permit a User to receive notification messages for members of this Group
44
  # @param user [User]
45
  def enable_messages_for(user:, subcommunity: nil)
1✔
46
    raise(ArgumentError, "User #{user.uid} is not an administrator or submitter for this group #{title}") unless user.can_admin?(self) || user.can_submit?(self)
1✔
47
    group = GroupOption.find_or_initialize_by(option_type: GroupOption::EMAIL_MESSAGES, user:, group: self, subcommunity:)
1✔
48
    group.enabled = true
1✔
49
    group.save
1✔
50
  end
51

52
  # Disable a User from receiving notification messages for members of this Group
53
  # @param user [User]
54
  def disable_messages_for(user:, subcommunity: nil)
1✔
55
    raise(ArgumentError, "User #{user.uid} is not an administrator or submitter for this group #{title}") unless user.can_admin?(self) || user.can_submit?(self)
×
56
    group = GroupOption.find_or_initialize_by(option_type: GroupOption::EMAIL_MESSAGES, user:, group: self, subcommunity:)
×
57
    group.enabled = false
×
58
    group.save
×
59
  end
60

61
  # Returns true if a given user has notification e-mails enabled for this Group
62
  # @param user [User]
63
  # @return [Boolean]
64
  def messages_enabled_for?(user:, subcommunity: nil)
1✔
65
    group_option = group_messaging_options.find_by(user:, group: self, subcommunity:)
×
66
    group_option ||= GroupOption.new(enabled: true)
×
67
    group_option.enabled
×
68
  end
69

70
  def self.create_defaults
1✔
71
    return if where(code: "RD").count > 0
3✔
72
    Rails.logger.info "Creating default Groups"
1✔
73
    create(title: "Princeton Research Data Service (PRDS)", code: "RD")
1✔
74
    create(title: "Princeton Plasma Physics Lab (PPPL)", code: "PPPL")
1✔
75
  end
76

77
  # Returns the default group.
78
  # Used when we don't have anything else to determine a more specific Group for a user.
79
  def self.default
1✔
80
    create_defaults
1✔
81
    research_data
1✔
82
  end
83

84
  # Returns the default group for a given department number.
85
  # Reference: https://docs.google.com/spreadsheets/d/1_Elxs3Ex-2wCbbKUzD4ii3k16zx36sYf/edit#gid=1484576831
86
  def self.default_for_department(department_number)
1✔
87
    if department_number.present? && department_number >= "31000" && department_number <= "31027"
1✔
88
      plasma_laboratory
×
89
    else
90
      default
1✔
91
    end
92
  end
93

94
  def self.research_data
1✔
95
    create_defaults
2✔
96
    where(code: "RD").first
2✔
97
  end
98

99
  def self.plasma_laboratory
1✔
100
    create_defaults
×
101
    where(code: "PPPL").first
×
102
  end
103

104
  def administrators
1✔
105
    User.with_role(:group_admin, self)
×
106
  end
107

108
  ##
109
  # The current user adds a new admin user to a group.
110
  # For use in the UI - we need to check whether the current_user
111
  # has the right permissions to add someone as an admin_user.
112
  # @param [User] current_user - the currently logged in user
113
  # @param [User] admin_user - the user who will be granted admin rights on this group
114
  def add_administrator(current_user, admin_user)
1✔
115
    if current_user.has_role?(:super_admin) || current_user.has_role?(:group_admin, self)
×
116
      if admin_user.has_role? :group_admin, self
×
117
        errors.add(:admin, "User has already been added")
×
118
      else
119
        errors.delete(:admin)
×
120
        admin_user.add_role :group_admin, self
×
121
      end
122
    else
123
      errors.add(:admin, "Unauthorized")
×
124
    end
125
  end
126

127
  def add_submitter(current_user, additional_user)
1✔
128
    if current_user.has_role?(:super_admin) || current_user.has_role?(:group_admin, self)
×
129
      return if (self == additional_user.default_group) && additional_user.just_created
×
130

131
      if additional_user.has_role? :submitter, self
×
132
        errors.add(:submitter, "User has already been added")
×
133
      else
134
        errors.delete(:submitter)
×
135
        additional_user.add_role :submitter, self
×
136
      end
137
    else
138
      errors.add(:submitter, "Unauthorized")
×
139
    end
140
  end
141

142
  def delete_permission(current_user, removed_user)
1✔
143
    if current_user.has_role?(:super_admin) || current_user.has_role?(:group_admin, self)
×
144
      if removed_user.nil?
×
145
        errors.add(:delete_permission, "User was not found")
×
146
      elsif removed_user == current_user
×
147
        errors.add(:delete_permission, "Cannot remove yourself from a group. Contact a super-admin for help.")
×
148
      else
149
        errors.delete(:delete_permission)
×
150
        removed_user.remove_role :group_admin, self
×
151
        removed_user.remove_role :submitter, self
×
152
      end
153
    else
154
      errors.add(:delete_permission, "Unauthorized")
×
155
    end
156
  end
157

158
  def communities
1✔
159
    if code == "PPPL"
×
160
      ["Princeton Plasma Physics Laboratory"]
×
161
    else
162
      ["Princeton Neuroscience Institute", "Geosciences", "Mechanical and Aerospace Engineering",
×
163
       "Astrophysical Sciences", "Civil and Environmental Engineering", "Chemical and Biological Engineering",
164
       "Digital Humanities", "Music and Arts", "Princeton School of Public and International Affairs",
165
       "Chemistry", "Lewis Seigler Genomics", "Architecture", "Ecology and Evolutionary Biology", "Economics"].sort
166
    end
167
  end
168

169
  # rubocop:disable Metrics/MethodLength
170
  def subcommunities
1✔
171
    values = []
×
172
    if code == "PPPL"
×
173
      values << "Spherical Torus"
×
174
      values << "Advanced Projects"
×
175
      values << "ITER and Tokamaks"
×
176
      values << "Theory"
×
177
      values << "NSTX-U"
×
178
      values << "NSTX"
×
179
      values << "Discovery Plasma Science"
×
180
      values << "Theory and Computation"
×
181
      values << "Stellarators"
×
182
      values << "PPPL Collaborations"
×
183
      values << "MAST-U"
×
184
      values << "Other Projects"
×
185
      values << "System Studies"
×
186
      values << "Applied Materials and Sustainability Sciences"
×
187
      values << "Computational Science"
×
188
      values << "DIII-D"
×
189
      values << "Tokamak Experimental Sciences"
×
190

191
    end
192
    values.sort
×
193
  end
194
  # rubocop:enable Metrics/MethodLength
195

196
  def publisher
1✔
197
    if code == "PPPL"
×
198
      "Princeton Plasma Physics Laboratory, Princeton University"
×
199
    else
200
      "Princeton University"
×
201
    end
202
  end
203

204
  def default_community
1✔
205
    return communities.first if code == "PPPL"
×
206
  end
207

208
  def default_user(uid)
1✔
209
    user = User.find_by(uid:)
×
210
    return user if user.present?
×
211

212
    begin
213
      user = User.new(uid:, default_group_id: id)
×
214
      user.save!
×
215
      user
×
216
    rescue ActiveRecord::RecordNotUnique => unique_error
×
217
      # If adding a submitter to an existing group
218
      Rails.logger.error("Failed to created a new user for #{self}: #{unique_error}")
×
219
      user = User.new(uid:)
×
220
      user.default_group_id = id
×
221
      user.save!
×
222
      user
×
223
    end
224
  end
225
end
226
# 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