Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2019-11-11 15:06:23 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2019-11-11 15:06:23 +0300
commit16bd8409bcb61d2331227d1df539c40683b6bda3 (patch)
tree6d9ede1b4d8f4c9e743758a6f4d7b78a684a6da9 /app/models/concerns/analytics
parent4a45f0eff2a25c64bdd83926e35a8894a4f0469f (diff)
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app/models/concerns/analytics')
-rw-r--r--app/models/concerns/analytics/cycle_analytics/stage.rb60
1 files changed, 55 insertions, 5 deletions
diff --git a/app/models/concerns/analytics/cycle_analytics/stage.rb b/app/models/concerns/analytics/cycle_analytics/stage.rb
index 1376dd97a49..0e07806dd6f 100644
--- a/app/models/concerns/analytics/cycle_analytics/stage.rb
+++ b/app/models/concerns/analytics/cycle_analytics/stage.rb
@@ -5,13 +5,20 @@ module Analytics
module Stage
extend ActiveSupport::Concern
include RelativePositioning
+ include Gitlab::Utils::StrongMemoize
included do
+ belongs_to :start_event_label, class_name: 'GroupLabel', optional: true
+ belongs_to :end_event_label, class_name: 'GroupLabel', optional: true
+
validates :name, presence: true
validates :name, exclusion: { in: Gitlab::Analytics::CycleAnalytics::DefaultStages.names }, if: :custom?
validates :start_event_identifier, presence: true
validates :end_event_identifier, presence: true
+ validates :start_event_label, presence: true, if: :start_event_label_based?
+ validates :end_event_label, presence: true, if: :end_event_label_based?
validate :validate_stage_event_pairs
+ validate :validate_labels
enum start_event_identifier: Gitlab::Analytics::CycleAnalytics::StageEvents.to_enum, _prefix: :start_event_identifier
enum end_event_identifier: Gitlab::Analytics::CycleAnalytics::StageEvents.to_enum, _prefix: :end_event_identifier
@@ -30,19 +37,41 @@ module Analytics
end
def start_event
- Gitlab::Analytics::CycleAnalytics::StageEvents[start_event_identifier].new(params_for_start_event)
+ strong_memoize(:start_event) do
+ Gitlab::Analytics::CycleAnalytics::StageEvents[start_event_identifier].new(params_for_start_event)
+ end
end
def end_event
- Gitlab::Analytics::CycleAnalytics::StageEvents[end_event_identifier].new(params_for_end_event)
+ strong_memoize(:end_event) do
+ Gitlab::Analytics::CycleAnalytics::StageEvents[end_event_identifier].new(params_for_end_event)
+ end
+ end
+
+ def start_event_label_based?
+ start_event_identifier && start_event.label_based?
+ end
+
+ def end_event_label_based?
+ end_event_identifier && end_event.label_based?
+ end
+
+ def start_event_identifier=(identifier)
+ clear_memoization(:start_event)
+ super
+ end
+
+ def end_event_identifier=(identifier)
+ clear_memoization(:end_event)
+ super
end
def params_for_start_event
- {}
+ start_event_label.present? ? { label: start_event_label } : {}
end
def params_for_end_event
- {}
+ end_event_label.present? ? { label: end_event_label } : {}
end
def default_stage?
@@ -70,13 +99,34 @@ module Analytics
return if start_event_identifier.nil? || end_event_identifier.nil?
unless pairing_rules.fetch(start_event.class, []).include?(end_event.class)
- errors.add(:end_event, :not_allowed_for_the_given_start_event)
+ errors.add(:end_event, s_('CycleAnalytics|not allowed for the given start event'))
end
end
def pairing_rules
Gitlab::Analytics::CycleAnalytics::StageEvents.pairing_rules
end
+
+ def validate_labels
+ validate_label_within_group(:start_event_label, start_event_label_id) if start_event_label_id_changed?
+ validate_label_within_group(:end_event_label, end_event_label_id) if end_event_label_id_changed?
+ end
+
+ def validate_label_within_group(association_name, label_id)
+ return unless label_id
+ return unless group
+
+ unless label_available_for_group?(label_id)
+ errors.add(association_name, s_('CycleAnalyticsStage|is not available for the selected group'))
+ end
+ end
+
+ def label_available_for_group?(label_id)
+ LabelsFinder.new(nil, { group_id: group.id, include_ancestor_groups: true, only_group_labels: true })
+ .execute(skip_authorization: true)
+ .by_ids(label_id)
+ .exists?
+ end
end
end
end