itemLocking.py (3131B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\services\corporation\itemLocking.py 2 from carbon.common.script.sys.service import Service 3 from eve.common.lib import appConst as const 4 from eve.common.script.sys.idCheckers import IsCorporation 5 from locks import TempLock 6 7 class ItemLocking(Service): 8 __servicename__ = 'ItemLocking' 9 __displayname__ = 'Client side Item Locking Service' 10 __guid__ = 'svc.lockedItems' 11 __notifyevents__ = ['OnLockedItemChange'] 12 13 def __init__(self): 14 Service.__init__(self) 15 self.lockedItemsByLocationID = {} 16 self.locationsWithLockedItems = None 17 self.remoteSvc = None 18 19 def Run(self, *args): 20 Service.Run(self, args) 21 self.remoteSvc = sm.RemoteSvc('itemLocking') 22 23 def GetLockedItemsByLocation(self, locationID): 24 with TempLock('GetLockedItemsByLocation_%s' % locationID): 25 if locationID not in self.lockedItemsByLocationID: 26 self.lockedItemsByLocationID[locationID] = self.remoteSvc.GetItemsByLocation(locationID) 27 return self.lockedItemsByLocationID[locationID] 28 29 def GetLockedItemLocations(self): 30 with TempLock('GetLockedItemLocations'): 31 if self.locationsWithLockedItems is None: 32 self.locationsWithLockedItems = self.remoteSvc.GetLockedItemLocations() 33 return self.locationsWithLockedItems 34 35 def IsItemLocked(self, item): 36 if not IsCorporation(item.ownerID): 37 return False 38 if item.flagID == const.flagCorpDeliveries and item.locationID in (session.structureid, session.stationid) and not self._CanTakeFromDeliveries(): 39 return True 40 if item.flagID == const.flagCapsuleerDeliveries and item.locationID in (session.structureid, session.stationid) and not session.corprole & (const.corpRoleProjectManager | const.corpRoleDirector): 41 return True 42 for office in sm.GetService('officeManager').GetMyCorporationsOffices(): 43 if office.officeID == item.locationID: 44 if item.itemID in self.GetLockedItemsByLocation(office.stationID): 45 return True 46 47 return self.IsItemIDLocked(item.itemID) 48 49 def IsItemIDLocked(self, itemID): 50 stationID = session.stationid or session.structureid 51 if stationID is not None: 52 return itemID in self.GetLockedItemsByLocation(stationID) 53 return False 54 55 @staticmethod 56 def _CanTakeFromDeliveries(): 57 return session.corprole & (const.corpRoleAccountant | const.corpRoleTrader) 58 59 def OnLockedItemChange(self, itemID, ownerID, locationID, isLocked): 60 try: 61 del self.lockedItemsByLocationID[locationID] 62 except KeyError: 63 pass 64 65 if self.locationsWithLockedItems is not None: 66 if isLocked: 67 self.locationsWithLockedItems.add(locationID) 68 elif len(self.GetLockedItemsByLocation(locationID)) == 0: 69 self.locationsWithLockedItems.discard(locationID) 70 sm.ScatterEvent('OnLockedItemChangeUI', itemID, ownerID, locationID)