Backport CE changes for Ops Dashboard in EE
This commit is contained in:
parent
0047869c27
commit
4d9ede0be7
|
@ -42,17 +42,7 @@ class ProjectsFinder < UnionFinder
|
||||||
init_collection
|
init_collection
|
||||||
end
|
end
|
||||||
|
|
||||||
collection = by_ids(collection)
|
collection = filter_projects(collection)
|
||||||
collection = by_personal(collection)
|
|
||||||
collection = by_starred(collection)
|
|
||||||
collection = by_trending(collection)
|
|
||||||
collection = by_visibilty_level(collection)
|
|
||||||
collection = by_tags(collection)
|
|
||||||
collection = by_search(collection)
|
|
||||||
collection = by_archived(collection)
|
|
||||||
collection = by_custom_attributes(collection)
|
|
||||||
collection = by_deleted_status(collection)
|
|
||||||
|
|
||||||
sort(collection)
|
sort(collection)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -66,6 +56,21 @@ class ProjectsFinder < UnionFinder
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# EE would override this to add more filters
|
||||||
|
def filter_projects(collection)
|
||||||
|
collection = by_ids(collection)
|
||||||
|
collection = by_personal(collection)
|
||||||
|
collection = by_starred(collection)
|
||||||
|
collection = by_trending(collection)
|
||||||
|
collection = by_visibilty_level(collection)
|
||||||
|
collection = by_tags(collection)
|
||||||
|
collection = by_search(collection)
|
||||||
|
collection = by_archived(collection)
|
||||||
|
collection = by_custom_attributes(collection)
|
||||||
|
collection = by_deleted_status(collection)
|
||||||
|
collection
|
||||||
|
end
|
||||||
|
|
||||||
# rubocop: disable CodeReuse/ActiveRecord
|
# rubocop: disable CodeReuse/ActiveRecord
|
||||||
def collection_with_user
|
def collection_with_user
|
||||||
if owned_projects?
|
if owned_projects?
|
||||||
|
|
|
@ -18,22 +18,20 @@ module PreferencesHelper
|
||||||
groups: _("Your Groups"),
|
groups: _("Your Groups"),
|
||||||
todos: _("Your Todos"),
|
todos: _("Your Todos"),
|
||||||
issues: _("Assigned Issues"),
|
issues: _("Assigned Issues"),
|
||||||
merge_requests: _("Assigned Merge Requests")
|
merge_requests: _("Assigned Merge Requests"),
|
||||||
|
operations: _("Operations Dashboard")
|
||||||
}.with_indifferent_access.freeze
|
}.with_indifferent_access.freeze
|
||||||
|
|
||||||
# Returns an Array usable by a select field for more user-friendly option text
|
# Returns an Array usable by a select field for more user-friendly option text
|
||||||
def dashboard_choices
|
def dashboard_choices
|
||||||
defined = User.dashboards
|
dashboards = User.dashboards.keys
|
||||||
|
|
||||||
if defined.size != DASHBOARD_CHOICES.size
|
validate_dashboard_choices!(dashboards)
|
||||||
# Ensure that anyone adding new options updates this method too
|
dashboards -= excluded_dashboard_choices
|
||||||
raise "`User` defines #{defined.size} dashboard choices," \
|
|
||||||
" but `DASHBOARD_CHOICES` defined #{DASHBOARD_CHOICES.size}."
|
dashboards.map do |key|
|
||||||
else
|
# Use `fetch` so `KeyError` gets raised when a key is missing
|
||||||
defined.map do |key, _|
|
[DASHBOARD_CHOICES.fetch(key), key]
|
||||||
# Use `fetch` so `KeyError` gets raised when a key is missing
|
|
||||||
[DASHBOARD_CHOICES.fetch(key), key]
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -52,4 +50,20 @@ module PreferencesHelper
|
||||||
def user_color_scheme
|
def user_color_scheme
|
||||||
Gitlab::ColorSchemes.for_user(current_user).css_class
|
Gitlab::ColorSchemes.for_user(current_user).css_class
|
||||||
end
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
# Ensure that anyone adding new options updates `DASHBOARD_CHOICES` too
|
||||||
|
def validate_dashboard_choices!(user_dashboards)
|
||||||
|
if user_dashboards.size != DASHBOARD_CHOICES.size
|
||||||
|
raise "`User` defines #{user_dashboards.size} dashboard choices," \
|
||||||
|
" but `DASHBOARD_CHOICES` defined #{DASHBOARD_CHOICES.size}."
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# List of dashboard choice to be excluded from CE.
|
||||||
|
# EE would override this.
|
||||||
|
def excluded_dashboard_choices
|
||||||
|
['operations']
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -19,6 +19,17 @@ class Deployment < ActiveRecord::Base
|
||||||
after_create :create_ref
|
after_create :create_ref
|
||||||
after_create :invalidate_cache
|
after_create :invalidate_cache
|
||||||
|
|
||||||
|
scope :for_environment, -> (environment) { where(environment_id: environment) }
|
||||||
|
|
||||||
|
def self.last_for_environment(environment)
|
||||||
|
ids = self
|
||||||
|
.for_environment(environment)
|
||||||
|
.select('MAX(id) AS id')
|
||||||
|
.group(:environment_id)
|
||||||
|
.map(&:id)
|
||||||
|
find(ids)
|
||||||
|
end
|
||||||
|
|
||||||
def commit
|
def commit
|
||||||
project.commit(sha)
|
project.commit(sha)
|
||||||
end
|
end
|
||||||
|
|
|
@ -48,6 +48,8 @@ class Environment < ActiveRecord::Base
|
||||||
order(Gitlab::Database.nulls_first_order("(#{max_deployment_id_sql})", 'ASC'))
|
order(Gitlab::Database.nulls_first_order("(#{max_deployment_id_sql})", 'ASC'))
|
||||||
end
|
end
|
||||||
scope :in_review_folder, -> { where(environment_type: "review") }
|
scope :in_review_folder, -> { where(environment_type: "review") }
|
||||||
|
scope :for_name, -> (name) { where(name: name) }
|
||||||
|
scope :for_project, -> (project) { where(project_id: project) }
|
||||||
|
|
||||||
state_machine :state, initial: :available do
|
state_machine :state, initial: :available do
|
||||||
event :start do
|
event :start do
|
||||||
|
|
|
@ -217,7 +217,7 @@ class User < ActiveRecord::Base
|
||||||
|
|
||||||
# User's Dashboard preference
|
# User's Dashboard preference
|
||||||
# Note: When adding an option, it MUST go on the end of the array.
|
# Note: When adding an option, it MUST go on the end of the array.
|
||||||
enum dashboard: [:projects, :stars, :project_activity, :starred_project_activity, :groups, :todos, :issues, :merge_requests]
|
enum dashboard: [:projects, :stars, :project_activity, :starred_project_activity, :groups, :todos, :issues, :merge_requests, :operations]
|
||||||
|
|
||||||
# User's Project preference
|
# User's Project preference
|
||||||
# Note: When adding an option, it MUST go on the end of the array.
|
# Note: When adding an option, it MUST go on the end of the array.
|
||||||
|
|
|
@ -66,6 +66,7 @@
|
||||||
|
|
||||||
- if Gitlab::Sherlock.enabled? || can?(current_user, :read_instance_statistics)
|
- if Gitlab::Sherlock.enabled? || can?(current_user, :read_instance_statistics)
|
||||||
%li.line-separator.d-none.d-sm-block
|
%li.line-separator.d-none.d-sm-block
|
||||||
|
= render_if_exists 'dashboard/operations/nav_link'
|
||||||
- if can?(current_user, :read_instance_statistics)
|
- if can?(current_user, :read_instance_statistics)
|
||||||
= nav_link(controller: [:conversational_development_index, :cohorts]) do
|
= nav_link(controller: [:conversational_development_index, :cohorts]) do
|
||||||
= link_to instance_statistics_root_path, title: _('Instance Statistics'), aria: { label: _('Instance Statistics') }, data: {toggle: 'tooltip', placement: 'bottom', container: 'body'} do
|
= link_to instance_statistics_root_path, title: _('Instance Statistics'), aria: { label: _('Instance Statistics') }, data: {toggle: 'tooltip', placement: 'bottom', container: 'body'} do
|
||||||
|
|
|
@ -4236,6 +4236,9 @@ msgstr ""
|
||||||
msgid "Operations"
|
msgid "Operations"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Operations Dashboard"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
|
msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,13 @@ require 'spec_helper'
|
||||||
|
|
||||||
describe PreferencesHelper do
|
describe PreferencesHelper do
|
||||||
describe '#dashboard_choices' do
|
describe '#dashboard_choices' do
|
||||||
|
let(:user) { build(:user) }
|
||||||
|
|
||||||
|
before do
|
||||||
|
allow(helper).to receive(:current_user).and_return(user)
|
||||||
|
allow(helper).to receive(:can?).and_return(false)
|
||||||
|
end
|
||||||
|
|
||||||
it 'raises an exception when defined choices may be missing' do
|
it 'raises an exception when defined choices may be missing' do
|
||||||
expect(User).to receive(:dashboards).and_return(foo: 'foo')
|
expect(User).to receive(:dashboards).and_return(foo: 'foo')
|
||||||
expect { helper.dashboard_choices }.to raise_error(RuntimeError)
|
expect { helper.dashboard_choices }.to raise_error(RuntimeError)
|
||||||
|
|
|
@ -39,6 +39,29 @@ describe Deployment do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe 'scopes' do
|
||||||
|
describe 'last_for_environment' do
|
||||||
|
let(:production) { create(:environment) }
|
||||||
|
let(:staging) { create(:environment) }
|
||||||
|
let(:testing) { create(:environment) }
|
||||||
|
|
||||||
|
let!(:deployments) do
|
||||||
|
[
|
||||||
|
create(:deployment, environment: production),
|
||||||
|
create(:deployment, environment: staging),
|
||||||
|
create(:deployment, environment: production)
|
||||||
|
]
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'retrieves last deployments for environments' do
|
||||||
|
last_deployments = described_class.last_for_environment([staging, production, testing])
|
||||||
|
|
||||||
|
expect(last_deployments.size).to eq(2)
|
||||||
|
expect(last_deployments).to eq(deployments.last(2))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
describe '#includes_commit?' do
|
describe '#includes_commit?' do
|
||||||
let(:project) { create(:project, :repository) }
|
let(:project) { create(:project, :repository) }
|
||||||
let(:environment) { create(:environment, project: project) }
|
let(:environment) { create(:environment, project: project) }
|
||||||
|
|
Loading…
Reference in New Issue