debian-mirror-gitlab/app/helpers/storage_helper.rb

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

142 lines
7 KiB
Ruby
Raw Normal View History

2018-12-05 23:21:45 +05:30
# frozen_string_literal: true
2017-08-17 22:00:37 +05:30
module StorageHelper
def storage_counter(size_in_bytes)
2019-09-04 21:01:54 +05:30
return s_('StorageSize|Unknown') unless size_in_bytes
2017-08-17 22:00:37 +05:30
precision = size_in_bytes < 1.megabyte ? 0 : 1
number_to_human_size(size_in_bytes, delimiter: ',', precision: precision, significant: false)
end
2019-07-31 22:56:46 +05:30
def storage_counters_details(statistics)
counters = {
counter_repositories: storage_counter(statistics.repository_size),
2019-09-04 21:01:54 +05:30
counter_wikis: storage_counter(statistics.wiki_size),
2019-07-31 22:56:46 +05:30
counter_build_artifacts: storage_counter(statistics.build_artifacts_size),
2021-12-11 22:18:48 +05:30
counter_pipeline_artifacts: storage_counter(statistics.pipeline_artifacts_size),
2020-07-28 23:09:34 +05:30
counter_lfs_objects: storage_counter(statistics.lfs_objects_size),
2021-02-22 17:27:13 +05:30
counter_snippets: storage_counter(statistics.snippets_size),
counter_packages: storage_counter(statistics.packages_size),
counter_uploads: storage_counter(statistics.uploads_size)
2019-07-31 22:56:46 +05:30
}
2021-12-11 22:18:48 +05:30
_("Repository: %{counter_repositories} / Wikis: %{counter_wikis} / Build Artifacts: %{counter_build_artifacts} / Pipeline Artifacts: %{counter_pipeline_artifacts} / LFS: %{counter_lfs_objects} / Snippets: %{counter_snippets} / Packages: %{counter_packages} / Uploads: %{counter_uploads}") % counters
2019-07-31 22:56:46 +05:30
end
2022-04-04 11:22:00 +05:30
2022-08-27 11:52:29 +05:30
def storage_enforcement_banner_info(context)
root_ancestor = context.root_ancestor
2022-07-23 23:45:48 +05:30
2022-08-27 11:52:29 +05:30
return unless should_show_storage_enforcement_banner?(context, current_user, root_ancestor)
text_args = storage_enforcement_banner_text_args(root_ancestor, context)
text_paragraph_2 = if root_ancestor.user_namespace?
html_escape_once(s_("UsageQuota|The namespace is currently using %{strong_start}%{used_storage}%{strong_end} of namespace storage. " \
"View and manage your usage from %{strong_start}User settings &gt; Usage quotas%{strong_end}. %{docs_link_start}Learn more%{link_end} " \
"about how to reduce your storage.")).html_safe % text_args[:p2]
else
html_escape_once(s_("UsageQuota|The namespace is currently using %{strong_start}%{used_storage}%{strong_end} of namespace storage. " \
"Group owners can view namespace storage usage and purchase more from %{strong_start}Group settings &gt; Usage quotas%{strong_end}. %{docs_link_start}Learn more.%{link_end}" \
)).html_safe % text_args[:p2]
end
2022-04-04 11:22:00 +05:30
{
2022-08-27 11:52:29 +05:30
text_paragraph_1: html_escape_once(s_("UsageQuota|Effective %{storage_enforcement_date}, namespace storage limits will apply " \
"to the %{strong_start}%{namespace_name}%{strong_end} namespace. %{extra_message}" \
"View the %{rollout_link_start}rollout schedule for this change%{link_end}.")).html_safe % text_args[:p1],
text_paragraph_2: text_paragraph_2,
text_paragraph_3: html_escape_once(s_("UsageQuota|See our %{faq_link_start}FAQ%{link_end} for more information.")).html_safe % text_args[:p3],
2022-04-04 11:22:00 +05:30
variant: 'warning',
2022-08-27 11:52:29 +05:30
namespace_id: root_ancestor.id,
2022-07-23 23:45:48 +05:30
callouts_path: root_ancestor.user_namespace? ? callouts_path : group_callouts_path,
2022-08-27 11:52:29 +05:30
callouts_feature_name: storage_enforcement_banner_user_callouts_feature_name(root_ancestor)
2022-04-04 11:22:00 +05:30
}
end
private
2022-08-27 11:52:29 +05:30
def should_show_storage_enforcement_banner?(context, current_user, root_ancestor)
return false unless user_allowed_storage_enforcement_banner?(context, current_user, root_ancestor)
return false if root_ancestor.paid?
return false unless future_enforcement_date?(root_ancestor)
return false if user_dismissed_storage_enforcement_banner?(root_ancestor)
::Feature.enabled?(:namespace_storage_limit_show_preenforcement_banner, root_ancestor)
end
def user_allowed_storage_enforcement_banner?(context, current_user, root_ancestor)
return can?(current_user, :maintainer_access, context) unless context.respond_to?(:user_namespace?) && context.user_namespace?
can?(current_user, :owner_access, context)
end
def storage_enforcement_banner_text_args(root_ancestor, context)
strong_tags = {
strong_start: "<strong>".html_safe,
strong_end: "</strong>".html_safe
}
extra_message = if context.is_a?(Project)
html_escape_once(s_("UsageQuota|The %{strong_start}%{context_name}%{strong_end} project will be affected by this. "))
.html_safe % strong_tags.merge(context_name: context.name)
elsif !context.root?
html_escape_once(s_("UsageQuota|The %{strong_start}%{context_name}%{strong_end} group will be affected by this. "))
.html_safe % strong_tags.merge(context_name: context.name)
else
''
end
{
p1: {
storage_enforcement_date: root_ancestor.storage_enforcement_date,
namespace_name: root_ancestor.name,
extra_message: extra_message,
rollout_link_start: '<a href="%{url}" >'.html_safe % { url: help_page_path('user/usage_quotas', anchor: 'namespace-storage-limit-enforcement-schedule') },
link_end: "</a>".html_safe
}.merge(strong_tags),
p2: {
used_storage: storage_counter(root_ancestor.root_storage_statistics&.storage_size || 0),
docs_link_start: '<a href="%{url}" >'.html_safe % { url: help_page_path('user/usage_quotas', anchor: 'manage-your-storage-usage') },
link_end: "</a>".html_safe
}.merge(strong_tags),
p3: {
faq_link_start: '<a href="%{url}" >'.html_safe % { url: "#{Gitlab::Saas.about_pricing_url}faq-efficient-free-tier/#storage-limits-on-gitlab-saas-free-tier" },
link_end: "</a>".html_safe
}
}
end
2022-04-04 11:22:00 +05:30
def storage_enforcement_banner_user_callouts_feature_name(namespace)
"storage_enforcement_banner_#{storage_enforcement_banner_threshold(namespace)}_enforcement_threshold"
end
def storage_enforcement_banner_threshold(namespace)
days_to_enforcement_date = (namespace.storage_enforcement_date - Date.today)
return :first if days_to_enforcement_date > 30
return :second if days_to_enforcement_date > 15 && days_to_enforcement_date <= 30
return :third if days_to_enforcement_date > 7 && days_to_enforcement_date <= 15
2022-05-07 20:08:51 +05:30
return :fourth if days_to_enforcement_date >= 0 && days_to_enforcement_date <= 7
2022-04-04 11:22:00 +05:30
end
def user_dismissed_storage_enforcement_banner?(namespace)
return false unless current_user
2022-05-07 20:08:51 +05:30
if namespace.user_namespace?
current_user.dismissed_callout?(feature_name: storage_enforcement_banner_user_callouts_feature_name(namespace))
else
2022-07-23 23:45:48 +05:30
current_user.dismissed_callout_for_group?(
feature_name: storage_enforcement_banner_user_callouts_feature_name(namespace),
group: namespace
)
2022-05-07 20:08:51 +05:30
end
2022-04-04 11:22:00 +05:30
end
2022-07-23 23:45:48 +05:30
def future_enforcement_date?(namespace)
return true if ::Feature.enabled?(:namespace_storage_limit_bypass_date_check, namespace)
namespace.storage_enforcement_date.present? && namespace.storage_enforcement_date >= Date.today
end
2017-08-17 22:00:37 +05:30
end