51 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			51 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| """Stage Markers"""
 | |
| from dataclasses import dataclass
 | |
| from typing import TYPE_CHECKING, Optional
 | |
| 
 | |
| from structlog import get_logger
 | |
| 
 | |
| from passbook.core.models import User
 | |
| from passbook.flows.models import Stage
 | |
| from passbook.policies.engine import PolicyEngine
 | |
| from passbook.policies.models import PolicyBinding
 | |
| 
 | |
| if TYPE_CHECKING:
 | |
|     from passbook.flows.planner import FlowPlan
 | |
| 
 | |
| LOGGER = get_logger()
 | |
| 
 | |
| 
 | |
| @dataclass
 | |
| class StageMarker:
 | |
|     """Base stage marker class, no extra attributes, and has no special handler."""
 | |
| 
 | |
|     # pylint: disable=unused-argument
 | |
|     def process(self, plan: "FlowPlan", stage: Stage) -> Optional[Stage]:
 | |
|         """Process callback for this marker. This should be overridden by sub-classes.
 | |
|         If a stage should be removed, return None."""
 | |
|         return stage
 | |
| 
 | |
| 
 | |
| @dataclass
 | |
| class ReevaluateMarker(StageMarker):
 | |
|     """Reevaluate Marker, forces stage's policies to be evaluated again."""
 | |
| 
 | |
|     binding: PolicyBinding
 | |
|     user: User
 | |
| 
 | |
|     def process(self, plan: "FlowPlan", stage: Stage) -> Optional[Stage]:
 | |
|         """Re-evaluate policies bound to stage, and if they fail, remove from plan"""
 | |
|         engine = PolicyEngine(self.binding, self.user)
 | |
|         engine.use_cache = False
 | |
|         engine.request.context = plan.context
 | |
|         engine.build()
 | |
|         result = engine.result
 | |
|         if result.passing:
 | |
|             return stage
 | |
|         LOGGER.warning(
 | |
|             "f(plan_inst)[re-eval marker]: stage failed re-evaluation",
 | |
|             stage=stage,
 | |
|             messages=result.messages,
 | |
|         )
 | |
|         return None
 | 
