NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

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()