diff --git a/alliance_auth/settings.py.example b/alliance_auth/settings.py.example index 0e82dadb..981a3200 100644 --- a/alliance_auth/settings.py.example +++ b/alliance_auth/settings.py.example @@ -353,11 +353,15 @@ ALLIANCE_IDS = [] # CORP_API_VCODE - Set this to the api vcode for the corp API key # BLUE_STANDING - The lowest standings value to consider blue # STANDING_LEVEL - The level of standings to query. Accepted values are 'corp' and 'alliance'. +# BLUE_CORP_IDS - A list of corps to remain blue regardless of in-game standings +# BLUE_ALLIANCE_IDS - A list of alliances to remain blue regardless of in-game standings ######################## CORP_API_ID = os.environ.get('AA_CORP_API_ID', '') CORP_API_VCODE = os.environ.get('AA_CORP_API_VCODE', '') BLUE_STANDING = float(os.environ.get('AA_BLUE_STANDING', '5.0')) STANDING_LEVEL = os.environ.get('AA_STANDING_LEVEL', 'corp') +BLUE_CORP_IDS = [] +BLUE_ALLIANCE_IDS = [] ######################## # API Configuration @@ -710,7 +714,10 @@ if ENABLE_AUTH_IPS4 or ENABLE_BLUE_IPS4: # Ensure corp/alliance IDs are expected types STR_CORP_IDS = [str(id) for id in CORP_IDS] STR_ALLIANCE_IDS = [str(id) for id in ALLIANCE_IDS] +STR_BLUE_CORP_IDS = [str(id) for id in BLUE_CORP_IDS] +STR_BLUE_ALLIANCE_IDS = [str(id) for id in BLUE_ALLIANCE_IDS] +# Conditionally add periodic tasks for services if installed if 'services.modules.teamspeak3' in INSTALLED_APPS: CELERYBEAT_SCHEDULE['run_ts3_group_update'] = { 'task': 'services.modules.teamspeak3.tasks.Teamspeak3Tasks.run_ts3_group_update', diff --git a/eveonline/managers.py b/eveonline/managers.py index 4d7464a7..ca828c1d 100644 --- a/eveonline/managers.py +++ b/eveonline/managers.py @@ -30,16 +30,16 @@ class EveManager(object): @staticmethod def create_character_obj(character, user, api_id): - EveCharacter.objects.create( - character_id = character.id, - character_name = character.name, - corporation_id = character.corp.id, - corporation_name = character.corp.name, - corporation_ticker = character.corp.ticker, - alliance_id = character.alliance.id, - alliance_name = character.alliance.name, - user = user, - api_id = api_id, + return EveCharacter.objects.create( + character_id=character.id, + character_name=character.name, + corporation_id=character.corp.id, + corporation_name=character.corp.name, + corporation_ticker=character.corp.ticker, + alliance_id=character.alliance.id, + alliance_name=character.alliance.name, + user=user, + api_id=api_id, ) @staticmethod @@ -56,6 +56,7 @@ class EveManager(object): model.alliance_id = char.alliance.id model.alliance_name = char.alliance.name model.save() + return model @staticmethod def create_api_keypair(api_id, api_key, user_id): @@ -80,12 +81,12 @@ class EveManager(object): @staticmethod def create_alliance_obj(alliance, is_blue=False): - EveAllianceInfo.objects.create( - alliance_id = alliance.id, - alliance_name = alliance.name, - alliance_ticker = alliance.ticker, - executor_corp_id = alliance.executor_corp_id, - is_blue = is_blue, + return EveAllianceInfo.objects.create( + alliance_id=alliance.id, + alliance_name=alliance.name, + alliance_ticker=alliance.ticker, + executor_corp_id=alliance.executor_corp_id, + is_blue=is_blue, ) @staticmethod @@ -96,8 +97,9 @@ class EveManager(object): def update_alliance_obj(alliance, is_blue=None): model = EveAllianceInfo.objects.get(alliance_id=alliance.id) model.executor_corp_id = alliance.executor_corp_id - model.is_blue = model.is_blue if is_blue == None else is_blue + model.is_blue = model.is_blue if is_blue is None else is_blue model.save() + return model @staticmethod def populate_alliance(id): @@ -105,9 +107,12 @@ class EveManager(object): alliance = EveManager.get_alliance(id) for corp_id in alliance.corp_ids: if not EveCorporationInfo.objects.filter(corporation_id=corp_id).exists(): - EveManager.create_corporation(corp_id, is_blue=alliance_model.is_blue) + EveManager.create_corporation(corp_id, is_blue=alliance_model.is_blue) EveCorporationInfo.objects.filter(corporation_id__in=alliance.corp_ids).update(alliance=alliance_model) - EveCorporationInfo.objects.filter(alliance=alliance_model).exclude(corporation_id__in=alliance.corp_ids).update(alliance=None) + EveCorporationInfo.objects.filter(alliance=alliance_model).exclude(corporation_id__in=alliance.corp_ids).update( + alliance=None) + if alliance_model.is_blue: + EveCorporationInfo.objects.filter(alliance=alliance_model).update(is_blue=True) @classmethod def get_corporation(cls, corp_id): @@ -123,13 +128,13 @@ class EveManager(object): alliance = EveAllianceInfo.objects.get(alliance_id=corp.alliance_id) except EveAllianceInfo.DoesNotExist: alliance = None - EveCorporationInfo.objects.create( - corporation_id = corp.id, - corporation_name = corp.name, - corporation_ticker = corp.ticker, - member_count = corp.members, - alliance = alliance, - is_blue = is_blue, + return EveCorporationInfo.objects.create( + corporation_id=corp.id, + corporation_name=corp.name, + corporation_ticker=corp.ticker, + member_count=corp.members, + alliance=alliance, + is_blue=is_blue, ) @staticmethod @@ -144,8 +149,9 @@ class EveManager(object): model.alliance = EveAllianceInfo.objects.get(alliance_id=corp.alliance_id) except EveAllianceInfo.DoesNotExist: model.alliance = None - model.is_blue = model.is_blue if is_blue == None else is_blue + model.is_blue = model.is_blue if is_blue is None else is_blue model.save() + return model @classmethod def get_itemtype(cls, type_id): diff --git a/eveonline/tasks.py b/eveonline/tasks.py index d050cc8c..d15ab692 100644 --- a/eveonline/tasks.py +++ b/eveonline/tasks.py @@ -12,6 +12,7 @@ from services.managers.eve_api_manager import EveApiManager from eveonline.models import EveCharacter from eveonline.models import EveCorporationInfo from eveonline.models import EveAllianceInfo +from eveonline.providers import eve_adapter_factory, ObjectNotFound from authentication.tasks import set_state import logging import evelink @@ -101,12 +102,13 @@ def run_api_refresh(): @task -def update_corp(id): - EveManager.update_corporation(id) +def update_corp(id, is_blue=None): + EveManager.update_corporation(id, is_blue=is_blue) + @task -def update_alliance(id): - EveManager.update_alliance(id) +def update_alliance(id, is_blue=None): + EveManager.update_alliance(id, is_blue=is_blue) EveManager.populate_alliance(id) @@ -117,27 +119,37 @@ def run_corp_update(): return # generate member corps - for corp_id in settings.STR_CORP_IDS: - if EveCorporationInfo.objects.filter(corporation_id=corp_id).exists(): - update_corp(corp_id) - else: - EveManager.create_corporation(corp_id) + for corp_id in settings.STR_CORP_IDS + settings.STR_BLUE_CORP_IDS: + is_blue = True if corp_id in settings.STR_BLUE_CORP_IDS else False + try: + if EveCorporationInfo.objects.filter(corporation_id=corp_id).exists(): + update_corp(corp_id, is_blue=is_blue) + else: + EveManager.create_corporation(corp_id, is_blue=is_blue) + except ObjectNotFound: + logger.warn('Bad corp ID in settings: %s' % corp_id) # generate member alliances - for alliance_id in settings.STR_ALLIANCE_IDS: - if EveAllianceInfo.objects.filter(alliance_id=alliance_id).exists(): - logger.debug("Updating existing owner alliance model with id %s" % alliance_id) - update_alliance(alliance_id) - else: - EveManager.create_alliance(alliance_id) - EveManager.populate_alliance(alliance_id) + for alliance_id in settings.STR_ALLIANCE_IDS + settings.STR_BLUE_ALLIANCE_IDS: + is_blue = True if alliance_id in settings.STR_BLUE_ALLIANCE_IDS else False + try: + if EveAllianceInfo.objects.filter(alliance_id=alliance_id).exists(): + logger.debug("Updating existing owner alliance model with id %s" % alliance_id) + update_alliance(alliance_id, is_blue=is_blue) + else: + EveManager.create_alliance(alliance_id, is_blue=is_blue) + EveManager.populate_alliance(alliance_id) + except ObjectNotFound: + logger.warn('Bad alliance ID in settings: %s' % alliance_id) # update existing corp models - for corp in EveCorporationInfo.objects.all(): + for corp in EveCorporationInfo.objects.exclude( + corporation_id__in=settings.STR_CORP_IDS + settings.STR_BLUE_CORP_IDS): update_corp.delay(corp.corporation_id) # update existing alliance models - for alliance in EveAllianceInfo.objects.all(): + for alliance in EveAllianceInfo.objects.exclude( + alliance_id__in=settings.STR_ALLIANCE_IDS + settings.STR_BLUE_ALLIANCE_IDS): update_alliance.delay(alliance.alliance_id) try: @@ -177,7 +189,7 @@ def run_corp_update(): logger.info("Alliance %s no longer meets minimum blue standing threshold" % alliance) alliance.is_blue = False alliance.save() - else: + elif alliance.alliance_id not in settings.STR_BLUE_ALLIANCE_IDS: logger.info("Alliance %s no longer in standings" % alliance) alliance.is_blue = False alliance.save() @@ -189,7 +201,7 @@ def run_corp_update(): logger.info("Corp %s no longer meets minimum blue standing threshold" % corp) corp.is_blue = False corp.save() - else: + elif corp.corporation_id not in settings.STR_BLUE_CORP_IDS: if corp.alliance: if not corp.alliance.is_blue: logger.info("Corp %s and its alliance %s are no longer blue" % (corp, corp.alliance)) @@ -203,22 +215,8 @@ def run_corp_update(): logger.error("Model update failed with error code %s" % e.code) # delete unnecessary alliance models - for alliance in EveAllianceInfo.objects.filter(is_blue=False): - logger.debug("Checking to delete alliance %s" % alliance) - if not alliance.alliance_id in settings.STR_ALLIANCE_IDS: - logger.info("Deleting unnecessary alliance model %s" % alliance) - alliance.delete() + EveAllianceInfo.objects.filter(is_blue=False).exclude(alliance_id__in=settings.STR_ALLIANCE_IDS).delete() # delete unnecessary corp models - for corp in EveCorporationInfo.objects.filter(is_blue=False): - logger.debug("Checking to delete corp %s" % corp) - if not corp.corporation_id in settings.STR_CORP_IDS: - logger.debug("Corp %s is not member corp" % corp) - if corp.alliance: - logger.debug("Corp %s has alliance %s" % (corp, corp.alliance)) - if not corp.alliance.alliance_id in settings.STR_ALLIANCE_IDS: - logger.info("Deleting unnecessary corp model %s" % corp) - corp.delete() - else: - logger.info("Deleting unnecessary corp model %s" % corp) - corp.delete() + EveCorporationInfo.objects.filter(is_blue=False).exclude(corporation_id__in=settings.STR_CORP_IDS).exclude( + alliance__alliance_id__in=settings.STR_ALLIANCE_IDS).delete() diff --git a/services/managers/eve_api_manager.py b/services/managers/eve_api_manager.py index d39136c2..98f4272f 100644 --- a/services/managers/eve_api_manager.py +++ b/services/managers/eve_api_manager.py @@ -190,7 +190,7 @@ class EveApiManager: logger.debug("Got corp standings from settings: %s" % results) return results else: - logger.warn("No corp API key supplied in settings. Unable to get standings.") + logger.debug("No corp API key supplied in settings. Unable to get standings.") return {} @staticmethod