milestoneService.py (4715B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\skills\skillplan\milestone\milestoneService.py 2 from __future__ import absolute_import 3 import logging 4 from collections import defaultdict 5 import uthread 6 from .milestoneController import BuildMilestonesFromRawData 7 from skills.skillplan import skillPlanSignals 8 import skills.skillplan.grpc.personalMilestoneRequest as personalMilestoneRequest 9 import skills.skillplan.grpc.corpMilestoneRequest as corpMilestoneRequest 10 from skills.skillplan.grpc.message_bus.corpMilestoneNoticeMessenger import CorpMilestoneNoticeMessenger 11 from skills.skillplan.milestone.milestoneController import GetMilestoneController 12 logger = logging.getLogger(__name__) 13 14 class BaseSkillPlanMilestoneService(object): 15 milestoneRequest = None 16 17 def __init__(self): 18 self.cache = defaultdict(dict) 19 skillPlanSignals.on_deleted.connect(self.OnSkillPlanDeleted) 20 21 def Get(self, skillPlanID, milestoneID): 22 if milestoneID in self.GetMilestonesForSkillPlan(skillPlanID): 23 return self.GetMilestonesForSkillPlan(skillPlanID)[milestoneID] 24 25 def GetMilestonesForSkillPlan(self, skillPlanID): 26 if skillPlanID not in self.cache: 27 self._PrimeCacheForSkillPlan(skillPlanID) 28 return self.cache[skillPlanID].copy() 29 30 def ClearMilestonesForSkillPlan(self, skillPlanID): 31 if skillPlanID in self.cache: 32 del self.cache[skillPlanID] 33 34 def _PrimeCacheForSkillPlan(self, skillPlanID): 35 try: 36 milestones = self.milestoneRequest.GetAll(skillPlanID) 37 self.cache[skillPlanID] = {} 38 for m in BuildMilestonesFromRawData(milestones): 39 if not m.IsValid(): 40 self.milestoneRequest.Delete(m.milestoneID) 41 else: 42 self.cache[skillPlanID][m.milestoneID] = m 43 44 except Exception as e: 45 logger.exception(e) 46 47 def _AddToCache(self, skillPlanID, milestoneController): 48 self.cache[skillPlanID][milestoneController.GetID()] = milestoneController 49 50 def _Create(self, skillPlanID, milestoneController): 51 try: 52 milestoneID = self.milestoneRequest.CreateMilestone(skillPlanID, milestoneController) 53 milestoneController.SetMilestoneID(milestoneID) 54 self._AddToCache(skillPlanID, milestoneController) 55 except Exception as e: 56 logger.exception(e) 57 58 def _Delete(self, skillPlanID, milestoneID): 59 try: 60 self.milestoneRequest.Delete(milestoneID) 61 if skillPlanID in self.cache and milestoneID in self.cache[skillPlanID]: 62 self._RemoveFromCache(skillPlanID, milestoneID) 63 except Exception as e: 64 logger.exception(e) 65 66 def _RemoveFromCache(self, skillPlanID, milestoneID): 67 self.cache[skillPlanID].pop(milestoneID, None) 68 69 def _GetSkillPlanID(self, milestoneID): 70 for skillPlanID, milestoneIDs in self.cache.iteritems(): 71 if milestoneID in milestoneIDs: 72 return skillPlanID 73 74 def SaveMilestones(self, skillPlanID, milestoneControllers): 75 addCalls = [] 76 for milestoneController in milestoneControllers: 77 addCalls.append((self._Create, (skillPlanID, milestoneController))) 78 79 uthread.parallel(addCalls) 80 81 def DeleteMilestones(self, skillPlanID, milestoneIDs): 82 deleteCalls = [ (self._Delete, (skillPlanID, milestoneID)) for milestoneID in milestoneIDs ] 83 uthread.parallel(deleteCalls) 84 85 def OnSkillPlanDeleted(self, skillPlanID): 86 if skillPlanID in self.cache: 87 self.ClearMilestonesForSkillPlan(skillPlanID) 88 89 90 class PersonalSkillPlanMilestoneService(BaseSkillPlanMilestoneService): 91 milestoneRequest = personalMilestoneRequest 92 93 94 class CorpSkillPlanMilestoneService(BaseSkillPlanMilestoneService): 95 milestoneRequest = corpMilestoneRequest 96 97 def __init__(self): 98 super(CorpSkillPlanMilestoneService, self).__init__() 99 self.corpMilestoneMessenger = CorpMilestoneNoticeMessenger(sm.GetService('publicGatewaySvc')) 100 self.corpMilestoneMessenger.on_created.connect(self.OnRemoteCorpMilestoneCreated) 101 self.corpMilestoneMessenger.on_deleted.connect(self.OnRemoteCorpMilestoneDeleted) 102 103 def OnRemoteCorpMilestoneCreated(self, skillPlanID, milestoneID, milestoneType, milestoneInfo): 104 controller = GetMilestoneController(milestoneID, milestoneType, milestoneInfo) 105 self._AddToCache(skillPlanID, controller) 106 107 def OnRemoteCorpMilestoneDeleted(self, milestoneID): 108 skillPlanID = self._GetSkillPlanID(milestoneID) 109 if skillPlanID: 110 self._RemoveFromCache(skillPlanID, milestoneID)