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

pulibrary / pdc_describe / 9cd1579d-9684-4b66-ae83-9619a7d64644

pending completion
9cd1579d-9684-4b66-ae83-9619a7d64644

Pull #1094

circleci

GitHub
Merge branch 'main' into sidekiq-prod
Pull Request #1094: Adding redis and sidekiq

1628 of 2126 relevant lines covered (76.58%)

97.58 hits per line

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

69.74
/app/models/collection.rb
1
# frozen_string_literal: true
2

3
class Collection < ApplicationRecord
1✔
4
  resourcify
1✔
5

6
  # CollectionOptions model extensible options set for Collections and Users
7
  has_many :collection_options, dependent: :destroy
1✔
8
  has_many :collection_messaging_options, -> { where(option_type: CollectionOption::EMAIL_MESSAGES) }, class_name: "CollectionOption", dependent: :destroy
64✔
9

10
  has_many :users_with_options, through: :collection_options, source: :user
1✔
11
  has_many :users_with_messaging, through: :collection_messaging_options, source: :user
1✔
12

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

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

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

30
  def administrators
1✔
31
    User.with_role(:collection_admin, self)
78✔
32
  end
33

34
  def super_administrators
1✔
35
    User.with_role(:super_admin)
3✔
36
  end
37

38
  def datasets
1✔
39
    Work.where(collection_id: id)
1✔
40
  end
41

42
  ##
43
  # The current user adds a new admin user to a collection.
44
  # For use in the UI - we need to check whether the current_user
45
  # has the right permissions to add someone as an admin_user.
46
  # @param [User] current_user - the currently logged in user
47
  # @param [User] admin_user - the user who will be granted admin rights on this collection
48
  def add_administrator(current_user, admin_user)
1✔
49
    if current_user.has_role?(:super_admin) || current_user.has_role?(:collection_admin, self)
1✔
50
      if admin_user.has_role? :collection_admin, self
1✔
51
        errors.add(:admin, "User has already been added")
×
52
      else
53
        errors.delete(:admin)
1✔
54
        admin_user.add_role :collection_admin, self
1✔
55
      end
56
    else
57
      errors.add(:admin, "Unauthorized")
×
58
    end
59
  end
60

61
  def add_submitter(current_user, additional_user)
1✔
62
    if current_user.has_role?(:super_admin) || current_user.has_role?(:collection_admin, self)
1✔
63
      return if (self == additional_user.default_collection) && additional_user.just_created
1✔
64

65
      if additional_user.has_role? :submitter, self
1✔
66
        errors.add(:submitter, "User has already been added")
×
67
      else
68
        errors.delete(:submitter)
1✔
69
        additional_user.add_role :submitter, self
1✔
70
      end
71
    else
72
      errors.add(:submitter, "Unauthorized")
×
73
    end
74
  end
75

76
  def delete_permission(current_user, removed_user)
1✔
77
    if current_user.has_role?(:super_admin) || current_user.has_role?(:collection_admin, self)
×
78
      if removed_user.nil?
×
79
        errors.add(:delete_permission, "User was not found")
×
80
      elsif removed_user == current_user
×
81
        errors.add(:delete_permission, "Cannot remove yourself from a collection. Contact a super-admin for help.")
×
82
      else
83
        errors.delete(:delete_permission)
×
84
        removed_user.remove_role :collection_admin, self
×
85
        removed_user.remove_role :submitter, self
×
86
      end
87
    else
88
      errors.add(:delete_permission, "Unauthorized")
×
89
    end
90
  end
91

92
  def submitters
1✔
93
    User.with_role(:submitter, self)
3✔
94
  end
95

96
  # Permit a User to receive notification messages for members of this Collection
97
  # @param user [User]
98
  def enable_messages_for(user:)
1✔
99
    raise(ArgumentError, "User #{user.uid} is not an administrator for this collection #{title}") unless user.can_admin?(self)
×
100
    collection_messaging_options << CollectionOption.new(option_type: CollectionOption::EMAIL_MESSAGES, collection: self, user: user)
×
101
  end
102

103
  # Disable a User from receiving notification messages for members of this Collection
104
  # @param user [User]
105
  def disable_messages_for(user:)
1✔
106
    raise(ArgumentError, "User #{user.uid} is not an administrator for this collection #{title}") unless user.can_admin?(self)
×
107
    users_with_messaging.destroy(user)
×
108
  end
109

110
  # Returns true if a given user has notification e-mails enabled for this collection
111
  # @param user [User]
112
  # @return [Boolean]
113
  def messages_enabled_for?(user:)
1✔
114
    found = users_with_messaging.find_by(id: user.id)
63✔
115

116
    found.present?
63✔
117
  end
118

119
  def self.create_defaults
1✔
120
    return if Collection.count > 0
1,678✔
121
    Rails.logger.info "Creating default Collections"
217✔
122
    Collection.create(title: "Research Data", code: "RD")
217✔
123
    Collection.create(title: "Princeton Plasma Physics Laboratory", code: "PPPL")
217✔
124
  end
125

126
  # Returns the default collection.
127
  # Used when we don't have anything else to determine a more specific collection for a user.
128
  def self.default
1✔
129
    create_defaults
660✔
130
    research_data
660✔
131
  end
132

133
  # Returns the default collection for a given department number.
134
  # Reference: https://docs.google.com/spreadsheets/d/1_Elxs3Ex-2wCbbKUzD4ii3k16zx36sYf/edit#gid=1484576831
135
  def self.default_for_department(department_number)
1✔
136
    if department_number.present? && department_number >= "31000" && department_number <= "31026"
114✔
137
      plasma_laboratory
16✔
138
    else
139
      default
98✔
140
    end
141
  end
142

143
  def self.research_data
1✔
144
    create_defaults
891✔
145
    Collection.where(code: "RD").first
891✔
146
  end
147

148
  def self.plasma_laboratory
1✔
149
    create_defaults
35✔
150
    Collection.where(code: "PPPL").first
35✔
151
  end
152
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