lifecycle.py (8764B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\campaigns\client\v2\data_model\lifecycle.py 2 from campaigns.client.v2.data_model.side_effect import SideEffectGroup 3 from campaigns.client.v2.data_model.trigger import lifecycle_trigger_from_proto 4 from campaigns.client.v2.data_model.ui_definition import UIDefinition 5 from eveProto.generated.eve_public.campaign import campaign_pb2 6 from eveProto.generated.eve_public.campaign.objective import objective_pb2 7 from eveProto.generated.eve_public.campaign.track import track_pb2 8 9 class LifecycleStateType(object): 10 UNSPECIFIED = 'unspecified' 11 STARTED = 'started' 12 ACTIVE = 'active' 13 COMPLETED = 'completed' 14 FAILED = 'failed' 15 EXPIRED = 'expired' 16 CANCELLED = 'cancelled' 17 TARGET_REACHED = 'target_reached' 18 STOPPED = 'stopped' 19 20 21 CAMPAIGN_STATE_BY_PROTO = {campaign_pb2.STATE_UNSPECIFIED: LifecycleStateType.UNSPECIFIED, 22 campaign_pb2.STATE_STARTED: LifecycleStateType.STARTED, 23 campaign_pb2.STATE_ACTIVE: LifecycleStateType.ACTIVE, 24 campaign_pb2.STATE_COMPLETED: LifecycleStateType.COMPLETED, 25 campaign_pb2.STATE_FAILED: LifecycleStateType.FAILED, 26 campaign_pb2.STATE_EXPIRED: LifecycleStateType.EXPIRED, 27 campaign_pb2.STATE_CANCELLED: LifecycleStateType.CANCELLED} 28 OBJECTIVE_STATE_BY_PROTO = {objective_pb2.STATE_UNSPECIFIED: LifecycleStateType.UNSPECIFIED, 29 objective_pb2.STATE_STARTED: LifecycleStateType.STARTED, 30 objective_pb2.STATE_ACTIVE: LifecycleStateType.ACTIVE, 31 objective_pb2.STATE_COMPLETED: LifecycleStateType.COMPLETED, 32 objective_pb2.STATE_FAILED: LifecycleStateType.FAILED, 33 objective_pb2.STATE_EXPIRED: LifecycleStateType.EXPIRED, 34 objective_pb2.STATE_CANCELLED: LifecycleStateType.CANCELLED} 35 TRACK_STATE_BY_PROTO = {track_pb2.STATE_UNSPECIFIED: LifecycleStateType.UNSPECIFIED, 36 track_pb2.STATE_STARTED: LifecycleStateType.STARTED, 37 track_pb2.STATE_TARGET_REACHED: LifecycleStateType.TARGET_REACHED, 38 track_pb2.STATE_STOPPED: LifecycleStateType.STOPPED} 39 40 class TriggeredByCause(object): 41 UNSPECIFIED = 'unspecified' 42 SCHEDULED = 'scheduled' 43 LIFECYCLE_TRIGGER = 'lifecycle_trigger' 44 ADMINISTRATIVE_ACTION = 'administrative_action' 45 PARENT_STATE = 'parent_state' 46 TARGET_PROGRESS_REACHED = 'target_progress_reached' 47 48 49 _CAUSE_BY_ONEOF = {'unspecified': TriggeredByCause.UNSPECIFIED, 50 'scheduled': TriggeredByCause.SCHEDULED, 51 'lifecycle_trigger': TriggeredByCause.LIFECYCLE_TRIGGER, 52 'administrative_action': TriggeredByCause.ADMINISTRATIVE_ACTION, 53 'parent_state': TriggeredByCause.PARENT_STATE, 54 'target_progress_reached': TriggeredByCause.TARGET_PROGRESS_REACHED} 55 TRIGGER_PHASE_START = 'start' 56 TRIGGER_PHASE_COMPLETE = 'complete' 57 TRIGGER_PHASE_FAIL = 'fail' 58 TRIGGER_PHASE_STOP = 'stop' 59 SIDE_EFFECT_PHASE_ON_STARTED = 'on_started' 60 SIDE_EFFECT_PHASE_ON_COMPLETED = 'on_completed' 61 SIDE_EFFECT_PHASE_ON_FAILED = 'on_failed' 62 SIDE_EFFECT_PHASE_ON_CANCELLED = 'on_cancelled' 63 SIDE_EFFECT_PHASE_ON_STOPPED = 'on_stopped' 64 65 class TriggeredBy(object): 66 67 def __init__(self, cause, lifecycle_trigger_key): 68 self._cause = cause 69 self._lifecycle_trigger_key = lifecycle_trigger_key 70 71 @property 72 def cause(self): 73 return self._cause 74 75 @property 76 def lifecycle_trigger_key(self): 77 return self._lifecycle_trigger_key 78 79 @classmethod 80 def from_proto(cls, triggered_by): 81 cause_class = triggered_by.WhichOneof('cause') 82 if cause_class is not None and cause_class not in _CAUSE_BY_ONEOF: 83 raise NotImplementedError('Unknown lifecycle state cause: %s' % cause_class) 84 key = triggered_by.lifecycle_trigger.key if cause_class == 'lifecycle_trigger' else None 85 return TriggeredBy(_CAUSE_BY_ONEOF.get(cause_class, TriggeredByCause.UNSPECIFIED), key) 86 87 def __eq__(self, other): 88 if not isinstance(other, TriggeredBy): 89 raise NotImplementedError 90 return self.cause == other.cause and self.lifecycle_trigger_key == other.lifecycle_trigger_key 91 92 def __ne__(self, other): 93 return not self.__eq__(other) 94 95 def __repr__(self): 96 return '<%s %r>' % (self.__class__.__name__, self.__dict__) 97 98 99 class LifecycleState(object): 100 101 def __init__(self, state, transition_datetime, triggered_by): 102 self._state = state 103 self._transition_datetime = transition_datetime 104 self._triggered_by = triggered_by 105 106 @property 107 def state(self): 108 return self._state 109 110 @property 111 def transition_datetime(self): 112 return self._transition_datetime 113 114 @property 115 def triggered_by(self): 116 return self._triggered_by 117 118 @classmethod 119 def from_proto(cls, lifecycle_state, state_by_proto): 120 if lifecycle_state.state not in state_by_proto: 121 raise NotImplementedError('Unknown lifecycle state: %s' % lifecycle_state.state) 122 transition_datetime = None 123 if lifecycle_state.HasField('transition_time'): 124 transition_datetime = lifecycle_state.transition_time.ToDatetime() 125 return LifecycleState(state_by_proto[lifecycle_state.state], transition_datetime, TriggeredBy.from_proto(lifecycle_state.triggered_by)) 126 127 @classmethod 128 def from_campaign_proto(cls, lifecycle_state): 129 return cls.from_proto(lifecycle_state, CAMPAIGN_STATE_BY_PROTO) 130 131 @classmethod 132 def from_objective_proto(cls, lifecycle_state): 133 return cls.from_proto(lifecycle_state, OBJECTIVE_STATE_BY_PROTO) 134 135 @classmethod 136 def from_track_proto(cls, lifecycle_state): 137 return cls.from_proto(lifecycle_state, TRACK_STATE_BY_PROTO) 138 139 def __eq__(self, other): 140 if not isinstance(other, LifecycleState): 141 raise NotImplementedError 142 return self.state == other.state and self.transition_datetime == other.transition_datetime and self.triggered_by == other.triggered_by 143 144 def __ne__(self, other): 145 return not self.__eq__(other) 146 147 def __repr__(self): 148 return '<%s %r>' % (self.__class__.__name__, self.__dict__) 149 150 151 class LifecycleTriggerEntry(object): 152 153 def __init__(self, key, trigger, ui_definition): 154 self._key = key 155 self._trigger = trigger 156 self._ui_definition = ui_definition 157 158 @property 159 def key(self): 160 return self._key 161 162 @property 163 def trigger(self): 164 return self._trigger 165 166 @property 167 def ui_definition(self): 168 return self._ui_definition 169 170 @classmethod 171 def from_proto(cls, entry): 172 return LifecycleTriggerEntry(entry.key, lifecycle_trigger_from_proto(entry.trigger), UIDefinition.from_proto(entry.ui)) 173 174 def __eq__(self, other): 175 if not isinstance(other, LifecycleTriggerEntry): 176 raise NotImplementedError 177 return self.key == other.key and self.trigger == other.trigger and self.ui_definition == other.ui_definition 178 179 def __ne__(self, other): 180 return not self.__eq__(other) 181 182 def __repr__(self): 183 return '<%s %r>' % (self.__class__.__name__, self.__dict__) 184 185 186 class LifecycleTriggers(object): 187 188 def __init__(self, entries_by_phase): 189 self._entries_by_phase = entries_by_phase 190 191 @property 192 def entries_by_phase(self): 193 return self._entries_by_phase 194 195 def get(self, phase): 196 return self._entries_by_phase.get(phase, []) 197 198 @classmethod 199 def from_proto(cls, lifecycle_triggers): 200 return LifecycleTriggers({field.name:[ LifecycleTriggerEntry.from_proto(entry) for entry in getattr(lifecycle_triggers, field.name) ] for field in lifecycle_triggers.DESCRIPTOR.fields}) 201 202 def __eq__(self, other): 203 if not isinstance(other, LifecycleTriggers): 204 raise NotImplementedError 205 return self.entries_by_phase == other.entries_by_phase 206 207 def __ne__(self, other): 208 return not self.__eq__(other) 209 210 def __repr__(self): 211 return '<%s %r>' % (self.__class__.__name__, self.__dict__) 212 213 214 class LifecycleSideEffects(object): 215 216 def __init__(self, groups_by_phase): 217 self._groups_by_phase = groups_by_phase 218 219 @property 220 def groups_by_phase(self): 221 return self._groups_by_phase 222 223 def get(self, phase): 224 return self._groups_by_phase.get(phase) 225 226 @classmethod 227 def from_proto(cls, lifecycle_side_effects): 228 return LifecycleSideEffects({field.name:SideEffectGroup.from_proto(getattr(lifecycle_side_effects, field.name)) for field in lifecycle_side_effects.DESCRIPTOR.fields if lifecycle_side_effects.HasField(field.name)}) 229 230 def __eq__(self, other): 231 if not isinstance(other, LifecycleSideEffects): 232 raise NotImplementedError 233 return self.groups_by_phase == other.groups_by_phase 234 235 def __ne__(self, other): 236 return not self.__eq__(other) 237 238 def __repr__(self): 239 return '<%s %r>' % (self.__class__.__name__, self.__dict__)