feat(conflicts): added conflicts business and presentation logic
This commit is contained in:
@@ -8,6 +8,7 @@ from django.core.cache import cache
|
||||
from django.utils import timezone
|
||||
from prometheus_client import Counter
|
||||
|
||||
from apps.conflicts.services import resolve_domain_conflict
|
||||
from apps.events.models import Decision
|
||||
from apps.events.services import decision_create
|
||||
from apps.experiments.models import Experiment, ExperimentStatus, Variant
|
||||
@@ -143,6 +144,23 @@ def _check_participation_limits(
|
||||
return not recent_completed
|
||||
|
||||
|
||||
def _check_domain_conflicts(experiment: Experiment) -> bool:
|
||||
from apps.conflicts.models import ExperimentConflictDomain
|
||||
|
||||
memberships = ExperimentConflictDomain.objects.filter(
|
||||
experiment=experiment,
|
||||
).select_related("conflict_domain")
|
||||
|
||||
for membership in memberships:
|
||||
if not resolve_domain_conflict(
|
||||
experiment_id=experiment.pk,
|
||||
domain_id=membership.conflict_domain_id,
|
||||
subject_id="",
|
||||
):
|
||||
return False
|
||||
return True
|
||||
|
||||
|
||||
def decide_for_flag(
|
||||
flag_key: str,
|
||||
subject_id: str,
|
||||
@@ -202,6 +220,19 @@ def decide_for_flag(
|
||||
_persist_decision(result, subject_id)
|
||||
return result
|
||||
|
||||
if not _check_domain_conflicts(experiment):
|
||||
DECIDE_REQUESTS.labels(reason="domain_conflict").inc()
|
||||
result = {
|
||||
"flag": flag_key,
|
||||
"value": flag.default_value,
|
||||
"decision_id": str(uuid.uuid4()),
|
||||
"experiment_id": str(experiment.pk),
|
||||
"variant_id": None,
|
||||
"reason": "domain_conflict",
|
||||
}
|
||||
_persist_decision(result, subject_id)
|
||||
return result
|
||||
|
||||
allocation_hash = _hash_subject(
|
||||
subject_id,
|
||||
str(experiment.pk),
|
||||
|
||||
Reference in New Issue
Block a user