Module: Avatarable

Extended by:
ActiveSupport::Concern
Included in:
Achievements::Achievement, Group, Organizations::OrganizationDetail, Project, Projects::Topic, User
Defined in:
app/models/concerns/avatarable.rb

Defined Under Namespace

Modules: ShadowMethods

Constant Summary collapse

USER_AVATAR_SIZES =
[16, 20, 23, 24, 26, 32, 36, 38, 40, 48, 60, 64, 90, 96, 120, 160].freeze
PROJECT_AVATAR_SIZES =
[15, 40, 48, 64, 88].freeze
GROUP_AVATAR_SIZES =
[15, 37, 38, 39, 40, 64, 96].freeze
COMBINED_AVATAR_SIZES =
(USER_AVATAR_SIZES | PROJECT_AVATAR_SIZES | GROUP_AVATAR_SIZES).freeze
COMBINED_AVATAR_SIZES_RETINA =
COMBINED_AVATAR_SIZES.map { |size| size * 2 }
ALLOWED_IMAGE_SCALER_WIDTHS =
(COMBINED_AVATAR_SIZES | COMBINED_AVATAR_SIZES_RETINA).uniq.freeze
MAXIMUM_FILE_SIZE =
200.kilobytes.to_i

Instance Method Summary collapse

Instance Method Details

#avatar_path(only_path: true, size: nil) ⇒ Object



61
62
63
64
65
66
67
68
69
70
# File 'app/models/concerns/avatarable.rb', line 61

def avatar_path(only_path: true, size: nil)
  return uncached_avatar_path(only_path: only_path, size: size) unless self.try(:id)

  return self.security_policy_bot_static_avatar_path(size) if self.try(:should_use_security_policy_bot_avatar?)

  # Cache this avatar path only within the request because avatars in
  # object storage may be generated with time-limited, signed URLs.
  key = "#{self.class.name}:#{self.id}:#{only_path}:#{size}"
  Gitlab::SafeRequestStore[key] ||= uncached_avatar_path(only_path: only_path, size: size)
end

#avatar_typeObject



53
54
55
56
57
58
59
# File 'app/models/concerns/avatarable.rb', line 53

def avatar_type
  unless self.avatar.image?
    errors.add :avatar,
      "file format is not supported. " \
        "Please try one of the following supported formats: #{AvatarUploader::SAFE_IMAGE_EXT.join(', ')}"
  end
end

#uncached_avatar_path(only_path: true, size: nil) ⇒ Object



72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# File 'app/models/concerns/avatarable.rb', line 72

def uncached_avatar_path(only_path: true, size: nil)
  return unless self.try(:avatar).present?

  asset_host = ActionController::Base.asset_host
  use_asset_host = asset_host.present?
  use_authentication = respond_to?(:public?) && !public?
  query_params = size&.nonzero? ? "?width=#{size}" : ""

  # Avatars for private and internal groups and projects require authentication to be viewed,
  # which means they can only be served by Rails, on the regular GitLab host.
  # If an asset host is configured, we need to return the fully qualified URL
  # instead of only the avatar path, so that Rails doesn't prefix it with the asset host.
  if use_asset_host && use_authentication
    use_asset_host = false
    only_path = false
  end

  url_base = []

  if use_asset_host
    url_base << asset_host unless only_path
  else
    url_base << gitlab_config.base_url unless only_path
    url_base << gitlab_config.relative_url_root
  end

  url_base.join + avatar.local_url + query_params
end

#upload_paths(identifier) ⇒ Object

Path that is persisted in the tracking Upload model. Used to fetch the upload from the model.



103
104
105
# File 'app/models/concerns/avatarable.rb', line 103

def upload_paths(identifier)
  avatar_mounter.blank_uploader.store_dirs.map { |store, path| File.join(path, identifier) }
end