panel_controller.py (6573B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\shared\theatersOfWar\campaigns\panel_controller.py 2 import logging 3 from campaigns.client.api import get_campaigns_repository_v1 4 from campaigns.client.v1.data_model.campaign import CampaignID 5 from campaigns.client.errors import CampaignRequestError 6 from campaigns.client.v1.signals import on_objective_contributed_notice 7 from carbon.common.script.util.mathCommon import FloatCloseEnough 8 from clientsettings.setting import CharSettingNumeric, CharSettingUUID 9 from campaigns.client.ui_controllers.campaign_controller import CampaignController 10 from eve.client.script.ui.shared.theatersOfWar.campaigns.campaign_sets import camapaign_sets, CURRENT_CAMPAIGN_SET 11 from eveexceptions import ExceptionEater 12 from jobboard.client import get_job_board_service, ProviderType 13 from localization.formatters.timeIntervalFormatters import GetByLabel 14 from locks import TempLock 15 from signals import Signal 16 selected_campaign_id_setting = CharSettingUUID('selected_campaign_id', None) 17 logger = logging.getLogger(__name__) 18 19 class CampaignPanelController(object): 20 21 def __init__(self): 22 self._repository = get_campaigns_repository_v1() 23 self._campaigns_by_id = None 24 selected_campaign_uuid = selected_campaign_id_setting.get() 25 self._selected_campaign_id = CampaignID(selected_campaign_uuid) if selected_campaign_uuid else None 26 self._set_page_id_from_setting() 27 self.on_campaign_selected = Signal(signalName='on_campaign_selected') 28 self.on_contribution_completed_objective = Signal(signalName='on_contribution_completed_objective') 29 self.connect_signals() 30 31 def connect_signals(self): 32 on_objective_contributed_notice.connect(self.on_objective_contributed) 33 34 def disconnect_signals(self): 35 on_objective_contributed_notice.disconnect(self.on_objective_contributed) 36 37 def _set_page_id_from_setting(self): 38 self._selected_campaign_page_id = self._get_page_setting_for_selected_campaign().get() 39 40 def _get_page_setting_for_selected_campaign(self): 41 selected_campaign_id = self._selected_campaign_id.uuid if self._selected_campaign_id else None 42 settings_key = 'selected_campaign_id_%s' % selected_campaign_id 43 return CharSettingNumeric(settings_key, 0) 44 45 @property 46 def campaigns_by_id(self): 47 if self._campaigns_by_id is not None: 48 return self._campaigns_by_id 49 with TempLock('FetchingCampaignInfo'): 50 if self._campaigns_by_id is not None: 51 return self._campaigns_by_id 52 campaigns_by_id = {} 53 current_campaigns_by_id = self._repository.get_data_for_all_current_campaigns() 54 for c_id, campaign in current_campaigns_by_id.iteritems(): 55 controller = CampaignController(campaign, self._repository) 56 campaigns_by_id[c_id] = controller 57 58 self._campaigns_by_id = campaigns_by_id 59 return campaigns_by_id 60 61 def get_controller_for_campaign_id(self, campaign_id): 62 if campaign_id in self._campaigns_by_id: 63 return self._campaigns_by_id[campaign_id] 64 campaign = self._repository.get_campaign(campaign_id) 65 controller = CampaignController(campaign, self._repository) 66 return controller 67 68 @property 69 def campaigns_by_id_safe(self): 70 try: 71 return self.campaigns_by_id 72 except CampaignRequestError: 73 logger.exception('Failed to fetch campaigns') 74 return {} 75 76 @property 77 def selected_campaign_id(self): 78 return self._selected_campaign_id 79 80 @selected_campaign_id.setter 81 def selected_campaign_id(self, campaign_id): 82 self._selected_campaign_id = campaign_id 83 self._set_page_id_from_setting() 84 selected_campaign_id_setting.set(campaign_id.uuid if campaign_id else None) 85 self.on_campaign_selected(campaign_id) 86 87 def get_campaigns(self): 88 current_set = CURRENT_CAMPAIGN_SET 89 ret = [] 90 for campaign in self.campaigns_by_id.itervalues(): 91 if campaign.campaign_set_name != current_set: 92 continue 93 if campaign.is_cancelled: 94 continue 95 ret.append(campaign) 96 97 ret.sort(key=lambda x: x.ui_idx) 98 return ret 99 100 @property 101 def selected_campaign_controller(self): 102 return self.campaigns_by_id.get(self._selected_campaign_id, None) 103 104 def get_num_days_left(self): 105 if not self.campaigns_by_id: 106 return None 107 first_controller = self.campaigns_by_id.values()[0] 108 return first_controller.num_days_left 109 110 @property 111 def selected_campaign_page_id(self): 112 return self._selected_campaign_page_id 113 114 @selected_campaign_page_id.setter 115 def selected_campaign_page_id(self, value): 116 self._selected_campaign_page_id = value 117 page_setting = self._get_page_setting_for_selected_campaign() 118 page_setting.set(value) 119 120 def get_campaign_set_info(self): 121 campaign_set_info = camapaign_sets[CURRENT_CAMPAIGN_SET] 122 return campaign_set_info 123 124 @property 125 def campaign_landing_page_title(self): 126 campaign_set_info = self.get_campaign_set_info() 127 return GetByLabel(campaign_set_info.landing_page_title) 128 129 @property 130 def campaign_landing_page_bg_path(self): 131 campaign_set_info = self.get_campaign_set_info() 132 return campaign_set_info.landing_page_bg_path 133 134 def on_objective_contributed(self, objective_id, total_participant_progress): 135 job = self._get_job(objective_id) 136 is_completed = job.is_completed or FloatCloseEnough(job.total_progress_percentage, 1) 137 if not is_completed: 138 return 139 campaign_controller = self.get_controller_for_campaign_id(job.campaign_id) 140 campaign_controller.clear_campaign_stats_cache() 141 self.on_contribution_completed_objective(objective_id, job.campaign_id) 142 143 def _get_job(self, objective_id): 144 provider = get_job_board_service().get_provider(ProviderType.CAMPAIGNS) 145 job = provider.get_job(provider.get_job_id(objective_id.uuid)) 146 return job 147 148 def handle_destruction(self): 149 self._perform_cleanup() 150 151 def __del__(self): 152 self._perform_cleanup() 153 154 def _perform_cleanup(self): 155 with ExceptionEater('cleaning up campaign panel controller'): 156 self.disconnect_signals() 157 self.on_campaign_selected.clear() 158 self.on_contribution_completed_objective.clear()