Multitenant

Closes #604
This commit is contained in:
Adarnof 2016-12-29 18:10:43 -05:00
commit 04f2731517
6 changed files with 55 additions and 92 deletions

View File

@ -192,15 +192,6 @@ MESSAGE_TAGS = {
## ##
##################################################### #####################################################
###########################
# ALLIANCE / CORP TOGGLE
###########################
# Specifies to run membership checks against corp or alliance
# Set to FALSE for alliance
# Set to TRUE for corp
###########################
IS_CORP = 'True' == os.environ.get('AA_IS_CORP', 'True')
################# #################
# EMAIL SETTINGS # EMAIL SETTINGS
################# #################
@ -224,11 +215,12 @@ EMAIL_USE_TLS = 'True' == os.environ.get('AA_EMAIL_USE_TLS', 'True')
# KILLBOARD_URL - URL for your killboard. Blank to hide link # KILLBOARD_URL - URL for your killboard. Blank to hide link
# MEDIA_URL - URL for your media page (youtube etc). Blank to hide link # MEDIA_URL - URL for your media page (youtube etc). Blank to hide link
# FORUM_URL - URL for your forums. Blank to hide link # FORUM_URL - URL for your forums. Blank to hide link
# SMF_URL - URL for your SMF forums. # SITE_NAME - Name of the auth site.
#################### ####################
KILLBOARD_URL = os.environ.get('AA_KILLBOARD_URL', '') KILLBOARD_URL = os.environ.get('AA_KILLBOARD_URL', '')
EXTERNAL_MEDIA_URL = os.environ.get('AA_EXTERNAL_MEDIA_URL', '') EXTERNAL_MEDIA_URL = os.environ.get('AA_EXTERNAL_MEDIA_URL', '')
FORUM_URL = os.environ.get('AA_FORUM_URL', '') FORUM_URL = os.environ.get('AA_FORUM_URL', '')
SITE_NAME = os.environ.get('AA_SITE_NAME', 'Alliance Auth')
################### ###################
# SSO Settings # SSO Settings
@ -288,7 +280,6 @@ ENABLE_AUTH_XENFORO = 'True' == os.environ.get('AA_ENABLE_AUTH_XENFORO', 'False'
##################### #####################
# Blue service Setup # Blue service Setup
##################### #####################
# BLUE_STANDING - The default lowest standings setting to consider blue
# ENABLE_BLUE_FORUM - Enable forum support in the auth for blues # ENABLE_BLUE_FORUM - Enable forum support in the auth for blues
# ENABLE_BLUE_JABBER - Enable jabber support in the auth for blues # ENABLE_BLUE_JABBER - Enable jabber support in the auth for blues
# ENABLE_BLUE_MUMBLE - Enable mumble support in the auth for blues # ENABLE_BLUE_MUMBLE - Enable mumble support in the auth for blues
@ -301,7 +292,6 @@ ENABLE_AUTH_XENFORO = 'True' == os.environ.get('AA_ENABLE_AUTH_XENFORO', 'False'
# ENABLE_BLUE_PATHFINDER = Enable Pathfinder support in the auth for blues # ENABLE_BLUE_PATHFINDER = Enable Pathfinder support in the auth for blues
# ENABLE_BLUE_XENFORO = Enable XenForo forum support in the auth for blue # ENABLE_BLUE_XENFORO = Enable XenForo forum support in the auth for blue
##################### #####################
BLUE_STANDING = float(os.environ.get('AA_BLUE_STANDING', '5.0'))
ENABLE_BLUE_FORUM = 'True' == os.environ.get('AA_ENABLE_BLUE_FORUM', 'False') ENABLE_BLUE_FORUM = 'True' == os.environ.get('AA_ENABLE_BLUE_FORUM', 'False')
ENABLE_BLUE_JABBER = 'True' == os.environ.get('AA_ENABLE_BLUE_JABBER', 'False') ENABLE_BLUE_JABBER = 'True' == os.environ.get('AA_ENABLE_BLUE_JABBER', 'False')
ENABLE_BLUE_MUMBLE = 'True' == os.environ.get('AA_ENABLE_BLUE_MUMBLE', 'False') ENABLE_BLUE_MUMBLE = 'True' == os.environ.get('AA_ENABLE_BLUE_MUMBLE', 'False')
@ -315,27 +305,28 @@ ENABLE_BLUE_MARKET = 'True' == os.environ.get('AA_ENABLE_BLUE_MARKET', 'False')
ENABLE_BLUE_XENFORO = 'True' == os.environ.get('AA_ENABLE_BLUE_XENFORO', 'False') ENABLE_BLUE_XENFORO = 'True' == os.environ.get('AA_ENABLE_BLUE_XENFORO', 'False')
######################### #########################
# Corp Configuration # Tenant Configuration
######################### #########################
# If running in alliance mode, the following should be for the executor corp# # CORP_IDS - A list of corporation IDs to treat as members.
# CORP_ID - Set this to your corp ID (get this from https://zkillboard.com/corporation/#######) # ALLIANCE_IDS - A list of alliance IDs to treat as members.
# CORP_NAME - Set this to your Corporation Name # Any corps in a specified alliance will be treated as members, so do not include them in CORP_IDS
# CORP_API_ID - Set this to the api id for the corp API key #########################
# CORP_API_VCODE - Set this to the api vcode for the corp API key CORP_IDS = []
######################## ALLIANCE_IDS = []
CORP_ID = os.environ.get('AA_CORP_ID', '')
CORP_NAME = os.environ.get('AA_CORP_NAME', '')
CORP_API_ID = os.environ.get('AA_CORP_API_ID', '')
CORP_API_VCODE = os.environ.get('AA_CORP_API_VCODE', '')
######################### #########################
# Alliance Configuration # Standings Configuration
######################### #########################
# ALLIANCE_ID - Set this to your Alliance ID (get this from https://zkillboard.com/alliance/#######) # Add a corp API key to add blue standings to grant access.
# ALLIANCE_NAME - Set this to your Alliance Name # CORP_API_ID - Set this to the api id for the corp API key
# 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'.
######################## ########################
ALLIANCE_ID = os.environ.get('AA_ALLIANCE_ID', '') CORP_API_ID = os.environ.get('AA_CORP_API_ID', '')
ALLIANCE_NAME = os.environ.get('AA_ALLIANCE_NAME', '') 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')
######################## ########################
# API Configuration # API Configuration
@ -668,3 +659,7 @@ if ENABLE_AUTH_MARKET or ENABLE_BLUE_MARKET:
DATABASES['market'] = MARKET_DB DATABASES['market'] = MARKET_DB
if ENABLE_AUTH_IPS4 or ENABLE_BLUE_IPS4: if ENABLE_AUTH_IPS4 or ENABLE_BLUE_IPS4:
DATABASES['ips4'] = IPS4_DB DATABASES['ips4'] = IPS4_DB
# 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]

View File

@ -63,15 +63,13 @@ def make_blue(auth):
def determine_membership_by_character(char): def determine_membership_by_character(char):
if settings.IS_CORP: if char.corporation_id in settings.STR_CORP_IDS:
if int(char.corporation_id) == int(settings.CORP_ID): logger.debug("Character %s in member corp id %s" % (char, char.corporation_id))
logger.debug("Character %s in owning corp id %s" % (char, char.corporation_id)) return MEMBER_STATE
return MEMBER_STATE elif char.alliance_id in settings.STR_ALLIANCE_IDS:
else: logger.debug("Character %s in member alliance id %s" % (char, char.alliance_id))
if int(char.alliance_id) == int(settings.ALLIANCE_ID): return MEMBER_STATE
logger.debug("Character %s in owning alliance id %s" % (char, char.alliance_id)) elif not EveCorporationInfo.objects.filter(corporation_id=char.corporation_id).exists():
return MEMBER_STATE
if EveCorporationInfo.objects.filter(corporation_id=char.corporation_id).exists() is False:
logger.debug("No corp model for character %s corp id %s. Unable to check standings. Non-member." % ( logger.debug("No corp model for character %s corp id %s. Unable to check standings. Non-member." % (
char, char.corporation_id)) char, char.corporation_id))
return NONE_STATE return NONE_STATE

View File

@ -113,30 +113,25 @@ def update_alliance(id):
@periodic_task(run_every=crontab(minute=0, hour="*/2")) @periodic_task(run_every=crontab(minute=0, hour="*/2"))
def run_corp_update(): def run_corp_update():
if EveApiManager.check_if_api_server_online() is False: if not EveApiManager.check_if_api_server_online():
logger.warn("Aborted updating corp and alliance models: API server unreachable") logger.warn("Aborted updating corp and alliance models: API server unreachable")
return return
standing_level = 'alliance'
alliance_id = settings.ALLIANCE_ID
# get corp info for owning corp if required # generate member corps
if settings.IS_CORP: for corp_id in settings.STR_CORP_IDS:
standing_level = 'corp' if EveCorporationInfo.objects.filter(corporation_id=corp_id).exists():
if EveCorporationInfo.objects.filter(corporation_id=settings.CORP_ID).exists(): update_corp(corp_id)
update_corp(settings.CORP_ID)
else: else:
EveManager.create_corporation(settings.CORP_ID) EveManager.create_corporation(corp_id)
alliance_id = eve_adapter_factory().get_corp(settings.CORP_ID).alliance_id
# get and create alliance info for owning alliance if required # generate member alliances
if alliance_id: for alliance_id in settings.STR_ALLIANCE_IDS:
if EveAllianceInfo.objects.filter(alliance_id=alliance_id).exists(): if EveAllianceInfo.objects.filter(alliance_id=alliance_id).exists():
logger.debug("Updating existing owner alliance model with id %s" % alliance_id) logger.debug("Updating existing owner alliance model with id %s" % alliance_id)
update_alliance(alliance_id) update_alliance(alliance_id)
else: else:
EveManager.create_alliance(id) EveManager.create_alliance(alliance_id)
EveManager.populate_alliance(id) EveManager.populate_alliance(alliance_id)
# update existing corp models # update existing corp models
for corp in EveCorporationInfo.objects.all(): for corp in EveCorporationInfo.objects.all():
@ -150,9 +145,9 @@ def run_corp_update():
# create standings # create standings
standings = EveApiManager.get_corp_standings() standings = EveApiManager.get_corp_standings()
if standings: if standings:
standings = standings[standing_level] standings = standings[settings.STANDING_LEVEL]
for standing in standings: for standing in standings:
if int(standings[standing]['standing']) >= settings.BLUE_STANDING: if float(standings[standing]['standing']) >= settings.BLUE_STANDING:
logger.debug("Standing %s meets threshold" % standing) logger.debug("Standing %s meets threshold" % standing)
if EveApiManager.check_if_id_is_alliance(standing): if EveApiManager.check_if_id_is_alliance(standing):
logger.debug("Standing %s is an alliance" % standing) logger.debug("Standing %s is an alliance" % standing)
@ -211,37 +206,20 @@ def run_corp_update():
# delete unnecessary alliance models # delete unnecessary alliance models
for alliance in EveAllianceInfo.objects.filter(is_blue=False): for alliance in EveAllianceInfo.objects.filter(is_blue=False):
logger.debug("Checking to delete alliance %s" % alliance) logger.debug("Checking to delete alliance %s" % alliance)
if not settings.IS_CORP: if not alliance.alliance_id in settings.STR_ALLIANCE_IDS:
if not alliance.alliance_id == settings.ALLIANCE_ID: logger.info("Deleting unnecessary alliance model %s" % alliance)
logger.info("Deleting unnecessary alliance model %s" % alliance) alliance.delete()
alliance.delete()
else:
if not alliance.evecorporationinfo_set.filter(corporation_id=settings.CORP_ID).exists():
logger.info("Deleting unnecessary alliance model %s" % alliance)
alliance.delete()
# delete unnecessary corp models # delete unnecessary corp models
for corp in EveCorporationInfo.objects.filter(is_blue=False): for corp in EveCorporationInfo.objects.filter(is_blue=False):
logger.debug("Checking to delete corp %s" % corp) logger.debug("Checking to delete corp %s" % corp)
if not settings.IS_CORP: if not corp.corporation_id in settings.STR_CORP_IDS:
logger.debug("Corp %s is not member corp" % corp)
if corp.alliance: if corp.alliance:
logger.debug("Corp %s has alliance %s" % (corp, corp.alliance)) logger.debug("Corp %s has alliance %s" % (corp, corp.alliance))
if not corp.alliance.alliance_id == settings.ALLIANCE_ID: if not corp.alliance.alliance_id in settings.STR_ALLIANCE_IDS:
logger.info("Deleting unnecessary corp model %s" % corp) logger.info("Deleting unnecessary corp model %s" % corp)
corp.delete() corp.delete()
else: else:
logger.info("Deleting unnecessary corp model %s" % corp) logger.info("Deleting unnecessary corp model %s" % corp)
corp.delete() corp.delete()
else:
if corp.corporation_id != settings.CORP_ID:
logger.debug("Corp %s is not owning corp" % corp)
if corp.alliance:
logger.debug("Corp %s has alliance %s" % (corp, corp.alliance))
if not corp.alliance.evecorporationinfo_set.filter(corporation_id=settings.CORP_ID).exists():
logger.info("Deleting unnecessary corp model %s" % corp)
corp.delete()
else:
logger.info("Deleting unnecessary corp model %s" % corp)
corp.delete()
else:
logger.debug("Corp %s is owning corp" % corp)

View File

@ -98,10 +98,10 @@ def fatlink_statistics_view(request, year=datetime.date.today().year, month=date
# get FAT stats for member corps # get FAT stats for member corps
if settings.IS_CORP: for corp_id in settings.STR_CORP_IDS:
fat_stats[settings.CORP_ID] = CorpStat(settings.CORP_ID, start_of_month, start_of_next_month) fat_stats[corp_id] = CorpStat(corp_id, start_of_month, start_of_next_month)
else: for alliance_id in settings.STR_ALLIANCE_IDS:
alliance_corps = EveCorporationInfo.objects.filter(alliance__alliance_id=settings.ALLIANCE_ID) alliance_corps = EveCorporationInfo.objects.filter(alliance__alliance_id=alliance_id)
for corp in alliance_corps: for corp in alliance_corps:
fat_stats[corp.corporation_id] = CorpStat(corp.corporation_id, start_of_month, start_of_next_month) fat_stats[corp.corporation_id] = CorpStat(corp.corporation_id, start_of_month, start_of_next_month)

View File

@ -23,9 +23,5 @@ def auth_settings(request):
'MEMBER_API_MASK': settings.MEMBER_API_MASK, 'MEMBER_API_MASK': settings.MEMBER_API_MASK,
'MEMBER_API_ACCOUNT': settings.MEMBER_API_ACCOUNT, 'MEMBER_API_ACCOUNT': settings.MEMBER_API_ACCOUNT,
'JABBER_URL': settings.JABBER_URL, 'JABBER_URL': settings.JABBER_URL,
'ALLIANCE_NAME': settings.ALLIANCE_NAME, 'SITE_NAME': settings.SITE_NAME,
'ALLIANCE_ID': settings.ALLIANCE_ID, }
'CORP_NAME': settings.CORP_NAME,
'CORP_ID': settings.CORP_ID,
'IS_CORP': settings.IS_CORP,
}

View File

@ -46,11 +46,7 @@
<nav class="navbar navbar-inverse navbar-static-top" role="navigation"> <nav class="navbar navbar-inverse navbar-static-top" role="navigation">
<div class="container-fluid"> <div class="container-fluid">
<a class="navbar-brand"> <a class="navbar-brand">
{% if IS_CORP %} {{ SITE_NAME }}
{{ CORP_NAME }}
{% else %}
{{ ALLIANCE_NAME }}
{% endif %}
</a> </a>
<!-- /.navbar-header --> <!-- /.navbar-header -->