flows/planner: optimise db queries during plan building
This commit is contained in:
parent
28893b9695
commit
87b14e8761
|
@ -11,7 +11,7 @@ from rest_framework.serializers import BaseSerializer
|
||||||
from structlog import get_logger
|
from structlog import get_logger
|
||||||
|
|
||||||
from passbook.core.types import UIUserSettings
|
from passbook.core.types import UIUserSettings
|
||||||
from passbook.lib.models import SerializerModel
|
from passbook.lib.models import InheritanceForeignKey, SerializerModel
|
||||||
from passbook.policies.models import PolicyBindingModel
|
from passbook.policies.models import PolicyBindingModel
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
|
@ -150,7 +150,7 @@ class FlowStageBinding(SerializerModel, PolicyBindingModel):
|
||||||
fsb_uuid = models.UUIDField(primary_key=True, editable=False, default=uuid4)
|
fsb_uuid = models.UUIDField(primary_key=True, editable=False, default=uuid4)
|
||||||
|
|
||||||
target = models.ForeignKey("Flow", on_delete=models.CASCADE)
|
target = models.ForeignKey("Flow", on_delete=models.CASCADE)
|
||||||
stage = models.ForeignKey(Stage, on_delete=models.CASCADE)
|
stage = InheritanceForeignKey(Stage, on_delete=models.CASCADE)
|
||||||
|
|
||||||
re_evaluate_policies = models.BooleanField(
|
re_evaluate_policies = models.BooleanField(
|
||||||
default=False,
|
default=False,
|
||||||
|
|
|
@ -156,25 +156,22 @@ class FlowPlanner:
|
||||||
if default_context:
|
if default_context:
|
||||||
plan.context = default_context
|
plan.context = default_context
|
||||||
# Check Flow policies
|
# Check Flow policies
|
||||||
for stage in (
|
for binding in FlowStageBinding.objects.filter(
|
||||||
self.flow.stages.order_by("flowstagebinding__order")
|
|
||||||
.select_subclasses()
|
|
||||||
.select_related()
|
|
||||||
):
|
|
||||||
binding: FlowStageBinding = stage.flowstagebinding_set.get(
|
|
||||||
target__pk=self.flow.pk
|
target__pk=self.flow.pk
|
||||||
)
|
).order_by("order"):
|
||||||
engine = PolicyEngine(binding, user, request)
|
engine = PolicyEngine(binding, user, request)
|
||||||
engine.request.context = plan.context
|
engine.request.context = plan.context
|
||||||
engine.build()
|
engine.build()
|
||||||
if engine.passing:
|
if engine.passing:
|
||||||
LOGGER.debug("f(plan): Stage passing", stage=stage, flow=self.flow)
|
LOGGER.debug(
|
||||||
plan.stages.append(stage)
|
"f(plan): Stage passing", stage=binding.stage, flow=self.flow
|
||||||
|
)
|
||||||
|
plan.stages.append(binding.stage)
|
||||||
marker = StageMarker()
|
marker = StageMarker()
|
||||||
if binding.re_evaluate_policies:
|
if binding.re_evaluate_policies:
|
||||||
LOGGER.debug(
|
LOGGER.debug(
|
||||||
"f(plan): Stage has re-evaluate marker",
|
"f(plan): Stage has re-evaluate marker",
|
||||||
stage=stage,
|
stage=binding.stage,
|
||||||
flow=self.flow,
|
flow=self.flow,
|
||||||
)
|
)
|
||||||
marker = ReevaluateMarker(binding=binding, user=user)
|
marker = ReevaluateMarker(binding=binding, user=user)
|
||||||
|
|
Reference in a new issue