• 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

78.67
/app/models/user.rb
1
# frozen_string_literal: true
2

3
require "csv"
2✔
4
class User < ApplicationRecord
2✔
5
  # Include default devise modules. Others available are:
6
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
7
  devise :rememberable, :omniauthable
2✔
8

9
  has_many :user_requests, dependent: :destroy
2✔
10

11
  paginates_per 100
2✔
12

13
  USER_REGISTRATION_LIST = Rails.root.join("data", "user_registration_list_#{Rails.env}.csv")
2✔
14

15
  attr_accessor :mediaflux_session
2✔
16

17
  def self.from_cas(access_token)
2✔
UNCOV
18
    user = User.find_by(provider: access_token.provider, uid: access_token.uid)
9✔
UNCOV
19
    if user.present? && user.given_name.nil? # fix any users that do not have the name information loaded
9✔
UNCOV
20
      user.initialize_name_values(access_token.extra)
7✔
UNCOV
21
      user.save
7✔
22
    end
UNCOV
23
    user
9✔
24
  end
25

26
  # Users that can be project sponsors
27
  def self.sponsor_users
2✔
UNCOV
28
    if Rails.env.development? || Rails.env.staging?
2✔
UNCOV
29
      User.where(eligible_sponsor: true).or(User.where(superuser: true))
1✔
30
    else
UNCOV
31
      User.where(eligible_sponsor: true)
1✔
32
    end
33
  end
34

35
  # Users that can be data managers
36
  def self.manager_users
2✔
37
    if Rails.env.development? || Rails.env.staging?
×
38
      User.where(eligible_manager: true).or(User.where(superuser: true))
×
39
    else
40
      User.where(eligible_manager: true)
×
41
    end
42
  end
43

44
  def clear_mediaflux_session(session)
2✔
UNCOV
45
    Rails.logger.debug("!!!!!!! Clearing Mediaflux session !!!!!!!!")
3✔
UNCOV
46
    @mediaflux_session = nil
3✔
UNCOV
47
    session[:mediaflux_session] = nil
3✔
48
  end
49

50
  def mediaflux_from_session(session)
2✔
51
    logger.debug "Session Get #{session[:mediaflux_session]} cas: #{session[:active_web_user]}  user: #{uid}"
391✔
52
    if session[:mediaflux_session].blank?
391✔
53
      logger.debug("!!!! Creating a new session !!! #{uid}")
178✔
54
      session[:mediaflux_session] = SystemUser.mediaflux_session
178✔
55
      session[:active_web_user] = false
176✔
56
    end
57
    @active_web_user = session[:active_web_user]
389✔
58
    @mediaflux_session = session[:mediaflux_session]
389✔
59
  end
60

61
  def mediaflux_login(token, session)
2✔
62
    logger.debug("mediaflux session created for #{uid}")
×
63
    logon_request = Mediaflux::LogonRequest.new(identity_token: token, token_type: "cas")
×
64
    if logon_request.error?
×
65
      raise "Invalid Logon #{logon_request.response_error}"
×
66
    end
67
    @mediaflux_session = logon_request.session_token
×
68
    @active_web_user = true
×
69
    session[:mediaflux_session] = @mediaflux_session
×
70
    session[:active_web_user] = @active_web_user
×
71
    logger.debug "Login Session #{session[:mediaflux_session]} cas: #{session[:active_web_user]}  user: #{uid}"
×
72
  end
73

74
  def terminate_mediaflux_session
2✔
75
    return if @mediaflux_session.nil? # nothing to terminate
×
76
    logger.debug "!!!! Terminating mediaflux session"
×
77

78
    Mediaflux::LogoutRequest.new(session_token: @mediaflux_session).response_body
×
79
    @mediaflux_session = nil
×
80
  end
81

82
  # Initialize the name values from the CAS information.
83
  # Our name fields do not match their name fields, so we need to translate.
84
  def initialize_name_values(extra_cas_info)
2✔
UNCOV
85
    self.given_name = extra_cas_info.givenname
7✔
UNCOV
86
    self.family_name =  extra_cas_info.sn
7✔
UNCOV
87
    self.display_name = extra_cas_info.pudisplayname
7✔
88
  end
89

90
  # Return the display name if it exists, otherwise return the uid
91
  # @return [String]
92
  def display_name_safe
2✔
93
    return uid if display_name.blank?
118✔
94

95
    display_name
116✔
96
  end
97

98
  # Is this user eligible to be a data sponsor in this environment?
99
  # @return [Boolean]
100
  def eligible_sponsor?
2✔
101
    return true if superuser
126✔
102
    super
121✔
103
  end
104

105
  # Is this user eligible to be a data manger in this environment?
106
  # @return [Boolean]
107
  def eligible_manager?
2✔
108
    return true if superuser
86✔
109
    super
81✔
110
  end
111

112
  # Is this user eligible to be a data user in this environment?
113
  # @return [Boolean]
114
  def eligible_data_user?
2✔
115
    return true if superuser
25✔
116
    return true if !eligible_sponsor? && !eligible_manager
25✔
117
  end
118

119
  # Is this user eligible to be a sysadmin in this environment?
120
  # @return [Boolean]
121
  def eligible_sysadmin?
2✔
122
    return true if superuser || sysadmin
455✔
123
  end
124

125
  def eligible_to_create_new?
2✔
UNCOV
126
    return true if eligible_sysadmin?
6✔
127

UNCOV
128
    !Rails.env.production? && (eligible_sponsor? && trainer?)
4✔
129
  end
130

131
  # Methods serialize_into_session() and serialize_from_session() are called by Warden/Devise
132
  # to calculate what information will be stored in the session and to serialize an object
133
  # back from the session.
134
  #
135
  # By default Warden/Devise store the database ID of the record (e.g. User.id) but this causes
136
  # problems if we repopulate our User table and the IDs change. The implementation provided below
137
  # uses the User.uid field (which is unique, does not change, and it's required) as the value to
138
  # store in the session to prevent this issue.
139
  #
140
  # References:
141
  #   https://stackoverflow.com/questions/23597718/what-is-the-warden-data-in-a-rails-devise-session-composed-of/23683925#23683925
142
  #   https://web.archive.org/web/20211028103224/https://tadas-s.github.io/ruby-on-rails/2020/08/02/devise-serialize-into-session-trick/
143
  #   https://github.com/wardencommunity/warden/wiki/Setup
144
  def self.serialize_into_session(record)
2✔
145
    # The return value _must_ have at least two elements since the serialize_from_session() requires
146
    # two arguments (see below)
147
    [record.uid, ""]
189✔
148
  end
149

150
  def self.serialize_from_session(key, _salt, _opts = {})
2✔
151
    User.where(uid: key)&.first
222✔
152
  end
153

154
  # Fetches the most recent download jobs for the user
155
  def latest_downloads(limit: 10)
2✔
156
    @latest_downloads ||= UserRequest.where(user_id: id).where(["completion_time > ?", 7.days.ago]).order(created_at: "DESC").limit(limit)
61✔
157
  end
158
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