provider.py (5584B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\jobboard\client\features\campaigns\provider.py 2 import uthread2 3 from campaigns.client.v1 import signals as campaign_signals 4 from campaigns.client.api import get_campaigns_repository_v1 5 from campaigns.client.v1.data_model.objective import FutureObjective 6 from campaigns.client.feature_flags import campaigns_enabled 7 from campaigns.client.v1.signals import on_job_provider_finished_refreshing_campaign 8 from jobboard.client import job_board_signals 9 from jobboard.client.features.campaigns.feature_page import CampaignsFeaturePage 10 from jobboard.client.features.campaigns.job import CampaignJob, FutureCampaignJob 11 from jobboard.client.job_provider import JobProvider 12 from jobboard.client.provider_type import ProviderType 13 from metadata import ContentTags 14 import logging 15 logger = logging.getLogger('campaigns') 16 17 class CampaignJobProvider(JobProvider): 18 PROVIDER_ID = ProviderType.CAMPAIGNS 19 PROVIDER_CONTENT_TAGS = [ContentTags.feature_campaigns] 20 FEATURE_PAGE_CLASS = CampaignsFeaturePage 21 __notifyevents__ = ['OnSessionChanged'] 22 23 def __init__(self, *args, **kwargs): 24 super(CampaignJobProvider, self).__init__(*args, **kwargs) 25 self._repository = get_campaigns_repository_v1() 26 27 def _get_all_content(self): 28 ret = self._repository.get_all_campaigns_objectives() 29 self._repository.prime_all_stats() 30 return ret 31 32 def _get_campaign_content(self, campaign_id): 33 logger.info('_get_campaign_content %s', campaign_id) 34 ret = self._repository.get_campaign_objectives(campaign_id) 35 self._repository.prime_all_stats() 36 return ret 37 38 def _construct_job(self, job_id, content): 39 if isinstance(content, FutureObjective): 40 cJob = FutureCampaignJob(job_id, self, content) 41 else: 42 cJob = CampaignJob(job_id, self, content) 43 return cJob 44 45 def _get_instance_id(self, objective): 46 if isinstance(objective, FutureObjective): 47 return (objective.campaign_id, 48 objective.start_datetime, 49 objective.career_path, 50 objective.contribution_method_name) 51 return objective.id.uuid 52 53 def _register_availability(self): 54 campaign_signals.on_campaigns_enabled_changed.connect(self._on_availability_changed) 55 campaign_signals.on_campaigns_cache_invalidated.connect(self._on_campaigns_cache_invalidated) 56 57 def _unregister_availability(self): 58 campaign_signals.on_campaigns_enabled_changed.disconnect(self._on_availability_changed) 59 campaign_signals.on_campaigns_cache_invalidated.disconnect(self._on_campaigns_cache_invalidated) 60 61 def _should_enable(self): 62 return campaigns_enabled() 63 64 def _on_campaigns_cache_invalidated(self): 65 logger.info('_on_campaigns_cache_invalidated') 66 self.set_dirty() 67 68 def _on_campaign_updated(self, campaign_id): 69 logger.info('_on_campaign_updated %s', campaign_id) 70 self._refresh_jobs_for_campaign(campaign_id) 71 72 def _register_slots(self): 73 super(CampaignJobProvider, self)._register_slots() 74 campaign_signals.on_campaign_updated.connect(self._on_campaign_updated) 75 76 def _unregister_slots(self): 77 super(CampaignJobProvider, self)._unregister_slots() 78 campaign_signals.on_campaign_updated.disconnect(self._on_campaign_updated) 79 80 def _refresh_jobs_for_campaign(self, campaign_id): 81 if not self._enabled or self._fetching: 82 return 83 if not session.charid: 84 logger.warning('No character logged in when refreshing provider %s', self.PROVIDER_ID) 85 return 86 self._fetching = True 87 uthread2.start_tasklet(self.__refresh_jobs_for_campaign, campaign_id) 88 89 def __refresh_jobs_for_campaign(self, campaign_id): 90 logger.info('Refreshing campaign for provider %s %s', self.PROVIDER_ID, campaign_id) 91 job_board_signals.on_job_provider_started_refreshing(self.PROVIDER_ID) 92 self._fetching = True 93 valid_job_ids = set() 94 try: 95 all_content = self._get_campaign_content(campaign_id) 96 except Exception as e: 97 logger.exception('Failed to fetch jobs for provider %s - e=%s', self.PROVIDER_ID, e) 98 self._fetching = False 99 return 100 101 try: 102 for content in all_content or []: 103 job = self._create_job(content) 104 if job: 105 valid_job_ids.add(job.job_id) 106 107 jobs_to_remove = set() 108 for job_id, job in self._jobs.iteritems(): 109 if job_id not in valid_job_ids and job.campaign_id == campaign_id: 110 jobs_to_remove.add(job_id) 111 112 for job_id in jobs_to_remove: 113 self._remove_job(job_id) 114 115 finally: 116 self._fetching = False 117 self._on_jobs_refreshed() 118 job_board_signals.on_job_provider_finished_refreshing(self.PROVIDER_ID) 119 on_job_provider_finished_refreshing_campaign(campaign_id) 120 121 def _should_refresh_on_window_initializing(self): 122 return not self.is_hidden 123 124 def _on_availability_changed(self, *args, **kwargs): 125 should_enable = self._should_enable() 126 self._update_provider_state(should_enable) 127 logger.info('Updated Job Board provider availability to: %s', should_enable) 128 129 def OnSessionChanged(self, _is_remote, _session, change): 130 if 'solarsystemid2' in change: 131 for job in self._jobs.values(): 132 job.on_system_change()