Commit 88cb5599 authored by GitLab Bot's avatar GitLab Bot

Automatic merge of gitlab-org/gitlab master

parents b01bbc35 07a4c90a
......@@ -11,14 +11,14 @@ class Service < ApplicationRecord
include EachBatch
SERVICE_NAMES = %w[
asana assembla bamboo bugzilla buildkite campfire confluence custom_issue_tracker datadog discord
asana assembla bamboo bugzilla buildkite campfire confluence custom_issue_tracker discord
drone_ci emails_on_push ewm external_wiki flowdock hangouts_chat irker jira
mattermost mattermost_slash_commands microsoft_teams packagist pipelines_email
pivotaltracker prometheus pushover redmine slack slack_slash_commands teamcity unify_circuit webex_teams youtrack
].freeze
PROJECT_SPECIFIC_SERVICE_NAMES = %w[
jenkins
datadog jenkins
].freeze
# Fake services to help with local development.
......
......@@ -114,6 +114,36 @@ class MergeRequestPollCachedWidgetEntity < IssuableEntity
presenter(merge_request).api_unapprove_path
end
expose :test_reports_path do |merge_request|
if merge_request.has_test_reports?
test_reports_project_merge_request_path(merge_request.project, merge_request, format: :json)
end
end
expose :accessibility_report_path do |merge_request|
if merge_request.has_accessibility_reports?
accessibility_reports_project_merge_request_path(merge_request.project, merge_request, format: :json)
end
end
expose :codequality_reports_path do |merge_request|
if merge_request.has_codequality_reports?
codequality_reports_project_merge_request_path(merge_request.project, merge_request, format: :json)
end
end
expose :terraform_reports_path do |merge_request|
if merge_request.has_terraform_reports?
terraform_reports_project_merge_request_path(merge_request.project, merge_request, format: :json)
end
end
expose :exposed_artifacts_path do |merge_request|
if merge_request.has_exposed_artifacts?
exposed_artifacts_project_merge_request_path(merge_request.project, merge_request, format: :json)
end
end
expose :blob_path do
expose :head_path, if: -> (mr, _) { mr.source_branch_sha } do |merge_request|
project_blob_path(merge_request.project, merge_request.source_branch_sha)
......
......@@ -76,36 +76,6 @@ class MergeRequestPollWidgetEntity < Grape::Entity
presenter(merge_request).cancel_auto_merge_path
end
expose :test_reports_path do |merge_request|
if merge_request.has_test_reports?
test_reports_project_merge_request_path(merge_request.project, merge_request, format: :json)
end
end
expose :accessibility_report_path do |merge_request|
if merge_request.has_accessibility_reports?
accessibility_reports_project_merge_request_path(merge_request.project, merge_request, format: :json)
end
end
expose :codequality_reports_path do |merge_request|
if merge_request.has_codequality_reports?
codequality_reports_project_merge_request_path(merge_request.project, merge_request, format: :json)
end
end
expose :terraform_reports_path do |merge_request|
if merge_request.has_terraform_reports?
terraform_reports_project_merge_request_path(merge_request.project, merge_request, format: :json)
end
end
expose :exposed_artifacts_path do |merge_request|
if merge_request.has_exposed_artifacts?
exposed_artifacts_project_merge_request_path(merge_request.project, merge_request, format: :json)
end
end
expose :create_issue_to_resolve_discussions_path do |merge_request|
presenter(merge_request).create_issue_to_resolve_discussions_path
end
......
---
title: Move CI related paths to cached MR widget
merge_request: 58711
author:
type: performance
......@@ -9956,6 +9956,30 @@ Status: `implemented`
Tiers: `premium`, `ultimate`
### `redis_hll_counters.epics_usage.g_project_management_epic_users_changing_labels_monthly`
Count of MAU chaging the epic lables
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210312195730_g_project_management_epic_labels_monthly.yml)
Group: `group::product planning`
Status: `implemented`
Tiers: `premium`, `ultimate`
### `redis_hll_counters.epics_usage.g_project_management_epic_users_changing_labels_weekly`
Count of WAU chaging the epic lables
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210312195849_g_project_management_epic_labels_weekly.yml)
Group: `group::product planning`
Status: `implemented`
Tiers: `premium`, `ultimate`
### `redis_hll_counters.epics_usage.g_project_management_issue_promoted_to_epic_monthly`
Count of MAU promoting issues to epics
......
......@@ -11,6 +11,9 @@ GitLab provides a simple tool to administrators for emailing all users, or users
a chosen group or project, right from the Admin Area. Users receive the email
at their primary email address.
For information about email notifications originating from GitLab, read
[GitLab notification emails](../user/profile/notifications.md).
## Use-cases
- Notify your users about a new project, a new feature, or a new product launch.
......
......@@ -11,6 +11,9 @@ GitLab Notifications allow you to stay informed about what's happening in GitLab
enabled, you can receive updates about activity in issues, merge requests, epics, and designs.
Notifications are sent via email.
For the tool that enables GitLab administrators to send messages to users, read
[Email from GitLab](../../tools/email.md).
## Receiving notifications
You receive notifications for one of the following reasons:
......
......@@ -6,6 +6,13 @@ module EE
extend ActiveSupport::Concern
extend ::Gitlab::Utils::Override
override :execute
def execute(added_labels: [], removed_labels: [])
super
::Gitlab::UsageDataCounters::EpicActivityUniqueCounter.track_epic_labels_changed_action(author: user) if resource.is_a?(Epic)
end
override :resource_column
def resource_column(resource)
resource.is_a?(Epic) ? :epic_id : super
......
---
title: Track epic labels change action on usage ping
merge_request: 56571
author:
type: other
---
# Name of this metric contains g_project_management prefix
# because we are using the same slot from issue_tracking to
# allow data aggregation.
key_path: redis_hll_counters.epics_usage.g_project_management_epic_users_changing_labels_monthly
description: Count of MAU chaging the epic lables
product_section: dev
product_stage: plan
product_group: group::product planning
product_category: epics_usage
value_type: number
status: implemented
milestone: "13.11"
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/56571
time_frame: 28d
data_source: redis_hll
distribution:
- ee
tier:
- premium
- ultimate
---
# Name of this metric contains g_project_management prefix
# because we are using the same slot from issue_tracking to
# allow data aggregation.
key_path: redis_hll_counters.epics_usage.g_project_management_epic_users_changing_labels_weekly
description: Count of WAU chaging the epic lables
product_section: dev
product_stage: plan
product_group: group::product planning
product_category: epics_usage
value_type: number
status: implemented
milestone: "13.11"
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/56571
time_frame: 7d
data_source: redis_hll
distribution:
- ee
tier:
- premium
- ultimate
......@@ -26,6 +26,7 @@ module Gitlab
ISSUE_PROMOTED_TO_EPIC = 'g_project_management_issue_promoted_to_epic'
EPIC_CONFIDENTIAL = 'g_project_management_users_setting_epic_confidential'
EPIC_VISIBLE = 'g_project_management_users_setting_epic_visible'
EPIC_LABELS = 'g_project_management_epic_users_changing_labels'
class << self
def track_epic_created_action(author:)
......@@ -104,6 +105,10 @@ module Gitlab
track_unique_action(EPIC_VISIBLE, author)
end
def track_epic_labels_changed_action(author:)
track_unique_action(EPIC_LABELS, author)
end
private
def track_unique_action(action, author)
......
......@@ -208,6 +208,16 @@ RSpec.describe Gitlab::UsageDataCounters::EpicActivityUniqueCounter, :clean_gitl
it_behaves_like 'a daily tracked issuable event' do
let(:action) { described_class::EPIC_ISSUE_ADDED }
end
end
context 'for changing labels epic event' do
def track_action(params)
described_class.track_epic_labels_changed_action(**params)
end
it_behaves_like 'a daily tracked issuable event' do
let(:action) { described_class::EPIC_LABELS }
end
it_behaves_like 'does not track when feature flag is disabled', :track_epics_activity
end
......
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe ResourceEvents::ChangeLabelsService do
let_it_be(:group) { create(:group) }
let_it_be(:user) { create(:user) }
let_it_be(:labels) { create_list(:group_label, 2, group: group) }
let(:resource) { create(:epic, group: group) }
describe '.execute' do
subject { described_class.new(resource, user).execute(added_labels: added, removed_labels: removed) }
context 'when adding a label' do
let(:added) { [labels[0]] }
let(:removed) { [] }
it 'tracks the label change' do
expect(::Gitlab::UsageDataCounters::EpicActivityUniqueCounter)
.to receive(:track_epic_labels_changed_action).with(author: user)
subject
end
end
context 'when removing a label' do
let(:added) { [] }
let(:removed) { [labels[1]] }
it 'tracks the label change' do
expect(::Gitlab::UsageDataCounters::EpicActivityUniqueCounter)
.to receive(:track_epic_labels_changed_action).with(author: user)
subject
end
end
context 'when both adding and removing labels' do
let(:added) { [labels[0]] }
let(:removed) { [labels[1]] }
it 'tracks the label change' do
expect(::Gitlab::UsageDataCounters::EpicActivityUniqueCounter)
.to receive(:track_epic_labels_changed_action).with(author: user)
subject
end
end
end
end
......@@ -220,19 +220,30 @@ RSpec.describe Epics::UpdateService do
user: user2)
end
subject { update_epic(label_ids: [label.id]) }
before do
group.add_developer(user)
update_epic(label_ids: [label.id])
end
it 'marks todo as done for a user who added a label' do
subject
expect(todo1.reload.state).to eq('done')
end
it 'does not mark todos as done for other users' do
subject
expect(todo2.reload.state).to eq('pending')
end
it 'tracks the label change' do
expect(::Gitlab::UsageDataCounters::EpicActivityUniqueCounter)
.to receive(:track_epic_labels_changed_action).with(author: user)
subject
end
end
context 'mentioning a group in epic description' do
......
......@@ -122,3 +122,9 @@
redis_slot: project_management
aggregation: daily
feature_flag: track_epics_activity
- name: g_project_management_epic_users_changing_labels
category: epics_usage
redis_slot: project_management
aggregation: daily
feature_flag: track_epics_activity
......@@ -313,4 +313,38 @@ RSpec.describe MergeRequestPollCachedWidgetEntity do
end
end
end
describe 'ci related paths' do
using RSpec::Parameterized::TableSyntax
where(:path_field, :method_for_existence_check) do
:terraform_reports_path | :has_terraform_reports?
:accessibility_report_path | :has_accessibility_reports?
:exposed_artifacts_path | :has_exposed_artifacts?
:test_reports_path | :has_test_reports?
:codequality_reports_path | :has_codequality_reports?
end
with_them do
context 'when merge request has reports' do
before do
allow(resource).to receive(method_for_existence_check).and_return(true)
end
it 'set the path to poll data' do
expect(subject[path_field]).to be_present
end
end
context 'when merge request has no reports' do
before do
allow(resource).to receive(method_for_existence_check).and_return(false)
end
it 'does not set reports path' do
expect(subject[path_field]).to be_nil
end
end
end
end
end
......@@ -87,72 +87,6 @@ RSpec.describe MergeRequestPollWidgetEntity do
end
end
describe 'terraform_reports_path' do
context 'when merge request has terraform reports' do
before do
allow(resource).to receive(:has_terraform_reports?).and_return(true)
end
it 'set the path to poll data' do
expect(subject[:terraform_reports_path]).to be_present
end
end
context 'when merge request has no terraform reports' do
before do
allow(resource).to receive(:has_terraform_reports?).and_return(false)
end
it 'set the path to poll data' do
expect(subject[:terraform_reports_path]).to be_nil
end
end
end
describe 'accessibility_report_path' do
context 'when merge request has accessibility reports' do
before do
allow(resource).to receive(:has_accessibility_reports?).and_return(true)
end
it 'set the path to poll data' do
expect(subject[:accessibility_report_path]).to be_present
end
end
context 'when merge request has no accessibility reports' do
before do
allow(resource).to receive(:has_accessibility_reports?).and_return(false)
end
it 'set the path to poll data' do
expect(subject[:accessibility_report_path]).to be_nil
end
end
end
describe 'exposed_artifacts_path' do
context 'when merge request has exposed artifacts' do
before do
expect(resource).to receive(:has_exposed_artifacts?).and_return(true)
end
it 'set the path to poll data' do
expect(subject[:exposed_artifacts_path]).to be_present
end
end
context 'when merge request has no exposed artifacts' do
before do
expect(resource).to receive(:has_exposed_artifacts?).and_return(false)
end
it 'set the path to poll data' do
expect(subject[:exposed_artifacts_path]).to be_nil
end
end
end
describe 'auto merge' do
before do
project.add_maintainer(user)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment