Merge branch '38245-private-avatars-are-not-cdn-compatible' into 'master'
Resolve "Private Avatars are not CDN compatible" Closes #38245 and gitlab-com/support-forum#2476 See merge request gitlab-org/gitlab-ce!14443
This commit is contained in:
commit
36ae3bf1ca
15 changed files with 67 additions and 18 deletions
|
@ -7,7 +7,12 @@ module GroupsHelper
|
||||||
can?(current_user, :change_share_with_group_lock, group)
|
can?(current_user, :change_share_with_group_lock, group)
|
||||||
end
|
end
|
||||||
|
|
||||||
def group_icon(group)
|
def group_icon(group, options = {})
|
||||||
|
img_path = group_icon_url(group, options)
|
||||||
|
image_tag img_path, options
|
||||||
|
end
|
||||||
|
|
||||||
|
def group_icon_url(group, options = {})
|
||||||
if group.is_a?(String)
|
if group.is_a?(String)
|
||||||
group = Group.find_by_full_path(group)
|
group = Group.find_by_full_path(group)
|
||||||
end
|
end
|
||||||
|
@ -89,7 +94,7 @@ module GroupsHelper
|
||||||
link_to(group_path(group), class: "group-path #{'breadcrumb-item-text' unless for_dropdown} js-breadcrumb-item-text #{'hidable' if hidable}") do
|
link_to(group_path(group), class: "group-path #{'breadcrumb-item-text' unless for_dropdown} js-breadcrumb-item-text #{'hidable' if hidable}") do
|
||||||
output =
|
output =
|
||||||
if (group.try(:avatar_url) || show_avatar) && !Rails.env.test?
|
if (group.try(:avatar_url) || show_avatar) && !Rails.env.test?
|
||||||
image_tag(group_icon(group), class: "avatar-tile", width: 15, height: 15)
|
group_icon(group, class: "avatar-tile", width: 15, height: 15)
|
||||||
else
|
else
|
||||||
""
|
""
|
||||||
end
|
end
|
||||||
|
|
|
@ -10,6 +10,7 @@ module LazyImageTagHelper
|
||||||
unless options.delete(:lazy) == false
|
unless options.delete(:lazy) == false
|
||||||
options[:data] ||= {}
|
options[:data] ||= {}
|
||||||
options[:data][:src] = path_to_image(source)
|
options[:data][:src] = path_to_image(source)
|
||||||
|
|
||||||
options[:class] ||= ""
|
options[:class] ||= ""
|
||||||
options[:class] << " lazy"
|
options[:class] << " lazy"
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,7 @@ module Avatarable
|
||||||
|
|
||||||
# If asset_host is set then it is expected that assets are handled by a standalone host.
|
# If asset_host is set then it is expected that assets are handled by a standalone host.
|
||||||
# That means we do not want to get GitLab's relative_url_root option anymore.
|
# That means we do not want to get GitLab's relative_url_root option anymore.
|
||||||
host = asset_host.present? ? asset_host : gitlab_host
|
host = (asset_host.present? && (!respond_to?(:public?) || public?)) ? asset_host : gitlab_host
|
||||||
|
|
||||||
[host, avatar.url].join
|
[host, avatar.url].join
|
||||||
end
|
end
|
||||||
|
|
|
@ -45,6 +45,6 @@ class GroupEntity < Grape::Entity
|
||||||
end
|
end
|
||||||
|
|
||||||
expose :avatar_url do |group|
|
expose :avatar_url do |group|
|
||||||
group_icon(group)
|
group_icon_url(group)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
= visibility_level_icon(group.visibility_level, fw: false)
|
= visibility_level_icon(group.visibility_level, fw: false)
|
||||||
|
|
||||||
.avatar-container.s40
|
.avatar-container.s40
|
||||||
= image_tag group_icon(group), class: "avatar s40 hidden-xs"
|
= group_icon(group, class: "avatar s40 hidden-xs")
|
||||||
.title
|
.title
|
||||||
= link_to [:admin, group], class: 'group-name' do
|
= link_to [:admin, group], class: 'group-name' do
|
||||||
= group.full_name
|
= group.full_name
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
%ul.well-list
|
%ul.well-list
|
||||||
%li
|
%li
|
||||||
.avatar-container.s60
|
.avatar-container.s60
|
||||||
= image_tag group_icon(@group), class: "avatar s60"
|
= group_icon(@group, class: "avatar s60")
|
||||||
%li
|
%li
|
||||||
%span.light Name:
|
%span.light Name:
|
||||||
%strong= @group.name
|
%strong= @group.name
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
.group-home-panel.text-center
|
.group-home-panel.text-center
|
||||||
%div{ class: container_class }
|
%div{ class: container_class }
|
||||||
.avatar-container.s70.group-avatar
|
.avatar-container.s70.group-avatar
|
||||||
= image_tag group_icon(@group), class: "avatar s70 avatar-tile"
|
= group_icon(@group, class: "avatar s70 avatar-tile")
|
||||||
%h1.group-title
|
%h1.group-title
|
||||||
= @group.name
|
= @group.name
|
||||||
%span.visibility-icon.has-tooltip{ data: { container: 'body' }, title: visibility_icon_description(@group) }
|
%span.visibility-icon.has-tooltip{ data: { container: 'body' }, title: visibility_icon_description(@group) }
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
.form-group
|
.form-group
|
||||||
.col-sm-offset-2.col-sm-10
|
.col-sm-offset-2.col-sm-10
|
||||||
.avatar-container.s160
|
.avatar-container.s160
|
||||||
= image_tag group_icon(@group), alt: '', class: 'avatar group-avatar s160'
|
= group_icon(@group, alt: '', class: 'avatar group-avatar s160')
|
||||||
%p.light
|
%p.light
|
||||||
- if @group.avatar?
|
- if @group.avatar?
|
||||||
You can change your group avatar here
|
You can change your group avatar here
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
.context-header
|
.context-header
|
||||||
= link_to group_path(@group), title: @group.name do
|
= link_to group_path(@group), title: @group.name do
|
||||||
.avatar-container.s40.group-avatar
|
.avatar-container.s40.group-avatar
|
||||||
= image_tag group_icon(@group), class: "avatar s40 avatar-tile"
|
= group_icon(@group, class: "avatar s40 avatar-tile")
|
||||||
.sidebar-context-title
|
.sidebar-context-title
|
||||||
= @group.name
|
= @group.name
|
||||||
%ul.sidebar-top-level-items
|
%ul.sidebar-top-level-items
|
||||||
|
|
|
@ -28,7 +28,7 @@
|
||||||
|
|
||||||
.avatar-container.s40
|
.avatar-container.s40
|
||||||
= link_to group do
|
= link_to group do
|
||||||
= image_tag group_icon(group), class: "avatar s40 hidden-xs"
|
= group_icon(group, class: "avatar s40 hidden-xs")
|
||||||
.title
|
.title
|
||||||
= link_to group_name, group, class: 'group-name'
|
= link_to group_name, group, class: 'group-name'
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
- dom_id = "group_member_#{group_link.id}"
|
- dom_id = "group_member_#{group_link.id}"
|
||||||
%li.member.group_member{ id: dom_id }
|
%li.member.group_member{ id: dom_id }
|
||||||
%span.list-item-name
|
%span.list-item-name
|
||||||
= image_tag group_icon(group), class: "avatar s40", alt: ''
|
= group_icon(group, class: "avatar s40", alt: '')
|
||||||
%strong
|
%strong
|
||||||
= link_to group.full_name, group_path(group)
|
= link_to group.full_name, group_path(group)
|
||||||
.cgray
|
.cgray
|
||||||
|
|
|
@ -2,4 +2,4 @@
|
||||||
- groups.each do |group|
|
- groups.each do |group|
|
||||||
= link_to group, class: 'profile-groups-avatars inline', title: group.name do
|
= link_to group, class: 'profile-groups-avatars inline', title: group.name do
|
||||||
.avatar-container.s40
|
.avatar-container.s40
|
||||||
= image_tag group_icon(group), class: 'avatar group-avatar s40'
|
= group_icon(group, class: 'avatar group-avatar s40')
|
||||||
|
|
|
@ -57,15 +57,17 @@ describe ApplicationHelper do
|
||||||
end
|
end
|
||||||
|
|
||||||
describe 'project_icon' do
|
describe 'project_icon' do
|
||||||
|
let(:asset_host) { 'http://assets' }
|
||||||
|
|
||||||
it 'returns an url for the avatar' do
|
it 'returns an url for the avatar' do
|
||||||
project = create(:project, avatar: File.open(uploaded_image_temp_path))
|
project = create(:project, :public, avatar: File.open(uploaded_image_temp_path))
|
||||||
avatar_url = "/uploads/-/system/project/avatar/#{project.id}/banana_sample.gif"
|
avatar_url = "/uploads/-/system/project/avatar/#{project.id}/banana_sample.gif"
|
||||||
|
|
||||||
expect(helper.project_icon(project.full_path).to_s)
|
expect(helper.project_icon(project.full_path).to_s)
|
||||||
.to eq "<img data-src=\"#{avatar_url}\" class=\" lazy\" src=\"#{LazyImageTagHelper.placeholder_image}\" />"
|
.to eq "<img data-src=\"#{avatar_url}\" class=\" lazy\" src=\"#{LazyImageTagHelper.placeholder_image}\" />"
|
||||||
|
|
||||||
allow(ActionController::Base).to receive(:asset_host).and_return(gitlab_host)
|
allow(ActionController::Base).to receive(:asset_host).and_return(asset_host)
|
||||||
avatar_url = "#{gitlab_host}/uploads/-/system/project/avatar/#{project.id}/banana_sample.gif"
|
avatar_url = "#{asset_host}/uploads/-/system/project/avatar/#{project.id}/banana_sample.gif"
|
||||||
|
|
||||||
expect(helper.project_icon(project.full_path).to_s)
|
expect(helper.project_icon(project.full_path).to_s)
|
||||||
.to eq "<img data-src=\"#{avatar_url}\" class=\" lazy\" src=\"#{LazyImageTagHelper.placeholder_image}\" />"
|
.to eq "<img data-src=\"#{avatar_url}\" class=\" lazy\" src=\"#{LazyImageTagHelper.placeholder_image}\" />"
|
||||||
|
|
|
@ -3,6 +3,8 @@ require 'spec_helper'
|
||||||
describe GroupsHelper do
|
describe GroupsHelper do
|
||||||
include ApplicationHelper
|
include ApplicationHelper
|
||||||
|
|
||||||
|
let(:asset_host) { 'http://assets' }
|
||||||
|
|
||||||
describe 'group_icon' do
|
describe 'group_icon' do
|
||||||
avatar_file_path = File.join(Rails.root, 'spec', 'fixtures', 'banana_sample.gif')
|
avatar_file_path = File.join(Rails.root, 'spec', 'fixtures', 'banana_sample.gif')
|
||||||
|
|
||||||
|
@ -10,14 +12,53 @@ describe GroupsHelper do
|
||||||
group = create(:group)
|
group = create(:group)
|
||||||
group.avatar = fixture_file_upload(avatar_file_path)
|
group.avatar = fixture_file_upload(avatar_file_path)
|
||||||
group.save!
|
group.save!
|
||||||
expect(group_icon(group.path).to_s)
|
|
||||||
|
avatar_url = "/uploads/-/system/group/avatar/#{group.id}/banana_sample.gif"
|
||||||
|
|
||||||
|
expect(helper.group_icon(group).to_s)
|
||||||
|
.to eq "<img data-src=\"#{avatar_url}\" class=\" lazy\" src=\"#{LazyImageTagHelper.placeholder_image}\" />"
|
||||||
|
|
||||||
|
allow(ActionController::Base).to receive(:asset_host).and_return(asset_host)
|
||||||
|
avatar_url = "#{asset_host}/uploads/-/system/group/avatar/#{group.id}/banana_sample.gif"
|
||||||
|
|
||||||
|
expect(helper.group_icon(group).to_s)
|
||||||
|
.to eq "<img data-src=\"#{avatar_url}\" class=\" lazy\" src=\"#{LazyImageTagHelper.placeholder_image}\" />"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe 'group_icon_url' do
|
||||||
|
avatar_file_path = File.join(Rails.root, 'spec', 'fixtures', 'banana_sample.gif')
|
||||||
|
|
||||||
|
it 'returns an url for the avatar' do
|
||||||
|
group = create(:group)
|
||||||
|
group.avatar = fixture_file_upload(avatar_file_path)
|
||||||
|
group.save!
|
||||||
|
expect(group_icon_url(group.path).to_s)
|
||||||
|
.to match("/uploads/-/system/group/avatar/#{group.id}/banana_sample.gif")
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns an CDN url for the avatar' do
|
||||||
|
allow(ActionController::Base).to receive(:asset_host).and_return(asset_host)
|
||||||
|
group = create(:group)
|
||||||
|
group.avatar = fixture_file_upload(avatar_file_path)
|
||||||
|
group.save!
|
||||||
|
expect(group_icon_url(group.path).to_s)
|
||||||
|
.to match("#{asset_host}/uploads/-/system/group/avatar/#{group.id}/banana_sample.gif")
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns an based url for the avatar if private' do
|
||||||
|
allow(ActionController::Base).to receive(:asset_host).and_return(asset_host)
|
||||||
|
group = create(:group, :private)
|
||||||
|
group.avatar = fixture_file_upload(avatar_file_path)
|
||||||
|
group.save!
|
||||||
|
expect(group_icon_url(group.path).to_s)
|
||||||
.to match("/uploads/-/system/group/avatar/#{group.id}/banana_sample.gif")
|
.to match("/uploads/-/system/group/avatar/#{group.id}/banana_sample.gif")
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'gives default avatar_icon when no avatar is present' do
|
it 'gives default avatar_icon when no avatar is present' do
|
||||||
group = create(:group)
|
group = create(:group)
|
||||||
group.save!
|
group.save!
|
||||||
expect(group_icon(group.path)).to match_asset_path('group_avatar.png')
|
expect(group_icon_url(group.path)).to match_asset_path('group_avatar.png')
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -874,7 +874,7 @@ describe Project do
|
||||||
let(:project) { create(:project) }
|
let(:project) { create(:project) }
|
||||||
|
|
||||||
context 'when avatar file is uploaded' do
|
context 'when avatar file is uploaded' do
|
||||||
let(:project) { create(:project, :with_avatar) }
|
let(:project) { create(:project, :public, :with_avatar) }
|
||||||
let(:avatar_path) { "/uploads/-/system/project/avatar/#{project.id}/dk.png" }
|
let(:avatar_path) { "/uploads/-/system/project/avatar/#{project.id}/dk.png" }
|
||||||
let(:gitlab_host) { "http://#{Gitlab.config.gitlab.host}" }
|
let(:gitlab_host) { "http://#{Gitlab.config.gitlab.host}" }
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue