From b988f4ad6f2a366244b4566098f246cd3ba76265 Mon Sep 17 00:00:00 2001 From: Adarnof Date: Tue, 2 Feb 2016 06:28:06 +0000 Subject: [PATCH 1/3] Added ability to toggle assigning corp groups --- alliance_auth/settings.py.example | 4 +++ celerytask/tasks.py | 44 +++++++++++++++++++------------ 2 files changed, 31 insertions(+), 17 deletions(-) diff --git a/alliance_auth/settings.py.example b/alliance_auth/settings.py.example index 52804ca3..56ea232b 100755 --- a/alliance_auth/settings.py.example +++ b/alliance_auth/settings.py.example @@ -213,9 +213,13 @@ FORUM_URL = os.environ.get('AA_FORUM_URL', '') ######################### # DEFAULT_AUTH_GROUP - Default group members are put in # DEFAULT_BLUE_GROUP - Default group for blue members +# MEMBER_CORP_GROUPS - Assign members to a group representing their main corp +# BLUE_CORP_GROUPS - Assign blues to a group representing their main corp ######################### DEFAULT_AUTH_GROUP = os.environ.get('AA_DEFAULT_ALLIANCE_GROUP', 'Member') DEFAULT_BLUE_GROUP = os.environ.get('AA_DEFAULT_BLUE_GROUP', 'Blue') +MEMBER_CORP_GROUPS = 'True' == os.environ.get('AA_MEMBER_CORP_GROUPS', 'True') +BLUE_CORP_GROUPS = 'True' == os.environ.get('AA_BLUE_CORP_GROUPS', 'False') ######################### # Alliance Service Setup diff --git a/celerytask/tasks.py b/celerytask/tasks.py index e8a92e83..8a6c1c2e 100755 --- a/celerytask/tasks.py +++ b/celerytask/tasks.py @@ -245,6 +245,31 @@ def remove_from_databases(user, groups, syncgroups): logger.debug("User %s has discord uid %s - updating groups." % (user, authserviceinfo.discord_uid)) update_discord_groups(user) +def assign_corp_group(auth): + corp_group = None + if auth.main_character_id: + if EveCharacter.objects.filter(character_id=auth.main_char_id).exists(): + char = EveCharacter.objects.get(character_id=auth.main_char_id) + corpname = generate_corp_group_name(char.corporation_name) + state = determine_membership_by_character(char) + if state == "BLUE" and settings.BLUE_CORP_GROUPS: + logger.debug("Validating blue user %s has corp group assigned." % auth.user) + corp_group, c = Group.objects.get_or_create(name=corpname) + elif state == "MEMBER" and settings.MEMBER_CORP_GROUPS: + logger.debug("Validating member %s has corp group assigned." % auth.user) + corp_group, c = Group.objects.get_or_create(name=corpname) + else: + logger.debug("Ensuring non-member %s has no corp groups assigned." % auth.user) + if corp_group: + if not corp_group in auth.user.groups.all(): + logger.info("Adding user %s to corp group %s" % (auth.user, corp_group)) + auth.user.groups.add(corp_group) + for g in auth.user.groups.all(): + if str.startswith(str(g.name), "Corp_"): + if g != corp_group: + logger.info("Removing user %s from old corpgroup %s" % (auth.user, g)) + auth.user.groups.remove(g) + def make_member(user): logger.debug("Ensuring user %s has member permissions and groups." % user) # ensure member is not blue right now @@ -268,19 +293,7 @@ def make_member(user): logger.info("Marking user %s as non-blue" % user) auth.is_blue = False auth.save() - if auth.main_char_id: - if EveCharacter.objects.filter(character_id=auth.main_char_id).exists(): - char = EveCharacter.objects.get(character_id=auth.main_char_id) - corpname = generate_corp_group_name(char.corporation_name) - corp_group, c = Group.objects.get_or_create(name=corpname) - if not corp_group in user.groups.all(): - logger.info("Adding user %s to corp group %s" % (user, corp_group)) - user.groups.add(corp_group) - for g in user.groups.all(): - if str.startswith(str(g.name), "Corp_"): - if g != corp_group: - logger.info("Removing user %s from old corpgroup %s" % (user, g)) - user.groups.remove(g) + assign_corp_group(auth) def make_blue(user): logger.debug("Ensuring user %s has blue permissions and groups." % user) @@ -305,10 +318,7 @@ def make_blue(user): logger.info("Marking user %s as blue" % user) auth.is_blue = True auth.save() - for g in user.groups.all(): - if str.startswith(str(g.name), 'Corp_'): - logger.info("Removing blue user %s from corp group %s" % (user, g)) - user.groups.remove(g) + assign_corp_group(auth) def determine_membership_by_character(char): if settings.IS_CORP: From 2d2afa79eb2b2de47e4bf42ee94644983e35779f Mon Sep 17 00:00:00 2001 From: Adarnof Date: Sun, 7 Feb 2016 11:40:11 +0000 Subject: [PATCH 2/3] Added ability to manually trigger api refresh Ignored cache databases --- alliance_auth/urls.py | 1 + cache/.gitignore | 4 + celerytask/tasks.py | 158 +++++++++--------- eveonline/views.py | 15 ++ .../templates/registered/apikeymanagment.html | 4 + 5 files changed, 106 insertions(+), 76 deletions(-) create mode 100644 cache/.gitignore diff --git a/alliance_auth/urls.py b/alliance_auth/urls.py index 12120190..a71f7925 100755 --- a/alliance_auth/urls.py +++ b/alliance_auth/urls.py @@ -37,6 +37,7 @@ urlpatterns = patterns('', url(r'^add_api_key/', 'eveonline.views.add_api_key', name='auth_add_api_key'), url(r'^api_key_management/', 'eveonline.views.api_key_management_view', name='auth_api_key_management'), + url(r'^refresh_api_pair/([0-9]+)/$', 'eveonline.views.user_refresh_api', name='auth_user_refresh_api'), url(r'^delete_api_pair/(\w+)/$', 'eveonline.views.api_key_removal', name='auth_api_key_removal'), url(r'^characters/', 'eveonline.views.characters_view', name='auth_characters'), url(r'^main_character_change/(\w+)/$', 'eveonline.views.main_character_change', diff --git a/cache/.gitignore b/cache/.gitignore new file mode 100644 index 00000000..bbd659de --- /dev/null +++ b/cache/.gitignore @@ -0,0 +1,4 @@ +* + +!README.md +!.gitignore diff --git a/celerytask/tasks.py b/celerytask/tasks.py index 02c89dd2..dd23c544 100755 --- a/celerytask/tasks.py +++ b/celerytask/tasks.py @@ -1,5 +1,6 @@ from django.conf import settings from celery.task import periodic_task +from celery.task import shared_task from django.contrib.auth.models import User from django.contrib.auth.models import Group @@ -394,6 +395,86 @@ def run_discord_token_cleanup(): logger.debug("DiscordAuthToken failed validation. Deleting %s" % auth) auth.delete() +@shared_task +def refresh_api(api_key_pair): + logger.debug("Running update on api key %s" % api_key_pair.api_id) + user = api_key_pair.user + if EveApiManager.api_key_is_valid(api_key_pair.api_id, api_key_pair.api_key): + #check to ensure API key meets min spec + logger.info("Determined api key %s is still active." % api_key_pair.api_id) + still_valid = True + state = determine_membership_by_user(user) + if state == "BLUE": + if settings.BLUE_API_ACCOUNT: + type = EveApiManager.check_api_is_type_account(api_key_pair.api_id, api_key_pair.api_key) + if type == None: + api_key_pair.error_count += 1 + api_key_pair.save() + logger.info("API key %s incurred an error checking if type account. Error count is now %s" % (api_key_pair.api_id, api_key_pair.error_count)) + still_valid = None + elif type == False: + logger.info("Determined api key %s for blue user %s is no longer type account as requred." % (api_key_pair.api_id, user)) + still_valid = False + full = EveApiManager.check_blue_api_is_full(api_key_pair.api_id, api_key_pair.api_key) + if full == None: + api_key_pair.error_count += 1 + api_key_pair.save() + logger.info("API key %s incurred an error checking if meets mask requirements. Error count is now %s" % (api_key_pair.api_id, api_key_pair.error_count)) + still_valid = None + elif full == False: + logger.info("Determined api key %s for blue user %s no longer meets minimum access mask as required." % (api_key_pair.api_id, user)) + still_valid = False + elif state == "MEMBER": + if settings.MEMBER_API_ACCOUNT: + type = EveApiManager.check_api_is_type_account(api_key_pair.api_id, api_key_pair.api_key) + if type == None: + api_key_pair.error_count += 1 + api_key_pair.save() + logger.info("API key %s incurred an error checking if type account. Error count is now %s" % (api_key_pair.api_id, api_key_pair.error_count)) + still_valid = None + elif type == False: + logger.info("Determined api key %s for user %s is no longer type account as required." % (api_key_pair.api_id, user)) + still_valid = False + full = EveApiManager.check_api_is_full(api_key_pair.api_id, api_key_pair.api_key) + if full == None: + api_key_pair.error_count += 1 + api_key_pair.save() + logger.info("API key %s incurred an error checking if meets mask requirements. Error count is now %s" % (api_key_pair.api_id, api_key_pair.error_count)) + still_valid = None + elif full == False: + logger.info("Determined api key %s for user %s no longer meets minimum access mask as required." % (api_key_pair.api_id, user)) + still_valid = False + if still_valid == None: + if api_key_pair.error_count >= 3: + logger.info("API key %s has incurred 3 or more errors. Assuming invalid." % api_key_pair.api_id) + still_valid = False + if still_valid == False: + logger.debug("API key %s has failed validation; it and its characters will be deleted." % api_key_pair.api_id) + EveManager.delete_characters_by_api_id(api_key_pair.api_id, user.id) + EveManager.delete_api_key_pair(api_key_pair.api_id, user.id) + elif still_valid == True: + if api_key_pair.error_count != 0: + logger.info("Clearing error count for api %s as it passed validation" % api_key_pair.api_id) + api_key_pair.error_count = 0 + api_key_pair.save() + logger.info("Determined api key %s still meets requirements." % api_key_pair.api_id) + # Update characters + characters = EveApiManager.get_characters_from_api(api_key_pair.api_id, api_key_pair.api_key) + EveManager.update_characters_from_list(characters) + new_character = False + for char in characters.result: + # Ensure we have a model for all characters on key + if not EveManager.check_if_character_exist(characters.result[char]['name']): + new_character = True + logger.debug("API key %s has a new character on the account: %s" % (api_key_pair.api_id, characters.result[char]['name'])) + if new_character: + logger.debug("Creating new character %s from api key %s" % (characters.result[char]['name'], api_key_pair.api_id)) + EveManager.create_characters_from_list(characters, user, api_key_pair.api_key) + else: + logger.debug("API key %s is no longer valid; it and its characters will be deleted." % api_key_pair.api_id) + EveManager.delete_characters_by_api_id(api_key_pair.api_id, user.id) + EveManager.delete_api_key_pair(api_key_pair.api_id, user.id) + # Run every 3 hours @periodic_task(run_every=crontab(minute=0, hour="*/3")) def run_api_refresh(): @@ -409,82 +490,7 @@ def run_api_refresh(): authserviceinfo, c = AuthServicesInfo.objects.get_or_create(user=user) logger.debug("User %s has api keys. Proceeding to refresh." % user) for api_key_pair in api_key_pairs: - logger.debug("Running update on api key %s" % api_key_pair.api_id) - if EveApiManager.api_key_is_valid(api_key_pair.api_id, api_key_pair.api_key): - #check to ensure API key meets min spec - logger.info("Determined api key %s is still active." % api_key_pair.api_id) - still_valid = True - state = determine_membership_by_user(user) - if state == "BLUE": - if settings.BLUE_API_ACCOUNT: - type = EveApiManager.check_api_is_type_account(api_key_pair.api_id, api_key_pair.api_key) - if type == None: - api_key_pair.error_count += 1 - api_key_pair.save() - logger.info("API key %s incurred an error checking if type account. Error count is now %s" % (api_key_pair.api_id, api_key_pair.error_count)) - still_valid = None - elif type == False: - logger.info("Determined api key %s for blue user %s is no longer type account as requred." % (api_key_pair.api_id, user)) - still_valid = False - full = EveApiManager.check_blue_api_is_full(api_key_pair.api_id, api_key_pair.api_key) - if full == None: - api_key_pair.error_count += 1 - api_key_pair.save() - logger.info("API key %s incurred an error checking if meets mask requirements. Error count is now %s" % (api_key_pair.api_id, api_key_pair.error_count)) - still_valid = None - elif full == False: - logger.info("Determined api key %s for blue user %s no longer meets minimum access mask as required." % (api_key_pair.api_id, user)) - still_valid = False - elif state == "MEMBER": - if settings.MEMBER_API_ACCOUNT: - type = EveApiManager.check_api_is_type_account(api_key_pair.api_id, api_key_pair.api_key) - if type == None: - api_key_pair.error_count += 1 - api_key_pair.save() - logger.info("API key %s incurred an error checking if type account. Error count is now %s" % (api_key_pair.api_id, api_key_pair.error_count)) - still_valid = None - elif type == False: - logger.info("Determined api key %s for user %s is no longer type account as required." % (api_key_pair.api_id, user)) - still_valid = False - full = EveApiManager.check_api_is_full(api_key_pair.api_id, api_key_pair.api_key) - if full == None: - api_key_pair.error_count += 1 - api_key_pair.save() - logger.info("API key %s incurred an error checking if meets mask requirements. Error count is now %s" % (api_key_pair.api_id, api_key_pair.error_count)) - still_valid = None - elif full == False: - logger.info("Determined api key %s for user %s no longer meets minimum access mask as required." % (api_key_pair.api_id, user)) - still_valid = False - if still_valid == None: - if api_key_pair.error_count >= 3: - logger.info("API key %s has incurred 3 or more errors. Assuming invalid." % api_key_pair.api_id) - still_valid = False - if still_valid == False: - logger.debug("API key %s has failed validation; it and its characters will be deleted." % api_key_pair.api_id) - EveManager.delete_characters_by_api_id(api_key_pair.api_id, user.id) - EveManager.delete_api_key_pair(api_key_pair.api_id, user.id) - elif still_valid == True: - if api_key_pair.error_count != 0: - logger.info("Clearing error count for api %s as it passed validation" % api_key_pair.api_id) - api_key_pair.error_count = 0 - api_key_pair.save() - logger.info("Determined api key %s still meets requirements." % api_key_pair.api_id) - # Update characters - characters = EveApiManager.get_characters_from_api(api_key_pair.api_id, api_key_pair.api_key) - EveManager.update_characters_from_list(characters) - new_character = False - for char in characters.result: - # Ensure we have a model for all characters on key - if not EveManager.check_if_character_exist(characters.result[char]['name']): - new_character = True - logger.debug("API key %s has a new character on the account: %s" % (api_key_pair.api_id, characters.result[char]['name'])) - if new_character: - logger.debug("Creating new character %s from api key %s" % (characters.result[char]['name'], api_key_pair.api_id)) - EveManager.create_characters_from_list(characters, user, api_key_pair.api_key) - else: - logger.debug("API key %s is no longer valid; it and its characters will be deleted." % api_key_pair.api_id) - EveManager.delete_characters_by_api_id(api_key_pair.api_id, user.id) - EveManager.delete_api_key_pair(api_key_pair.api_id, user.id) + refresh_api(api_key_pair) # Check our main character if EveCharacter.objects.filter(character_id=authserviceinfo.main_char_id).exists() is False: logger.info("User %s main character id %s missing model. Clearning main character." % (user, authserviceinfo.main_char_id)) diff --git a/eveonline/views.py b/eveonline/views.py index 6a230fdb..0421ddb0 100755 --- a/eveonline/views.py +++ b/eveonline/views.py @@ -22,6 +22,7 @@ from eveonline.models import EveApiKeyPair from authentication.models import AuthServicesInfo from celerytask.tasks import determine_membership_by_user from celerytask.tasks import set_state +from celerytask.tasks import refresh_api import logging @@ -160,3 +161,17 @@ def corp_stats_view(request): else: logger.error("Unable to locate user %s main character model with id %s. Cannot provide corp stats." % (request.user, auth_info.main_char_id)) return render_to_response('registered/corpstats.html', None, context_instance=RequestContext(request)) + +@login_required +def user_refresh_api(request, api_id) + logger.debug("user_refresh_api called by user %s for api id %s" % (request.user, api_id)) + if EveApiKeyPair.objects.filter(api_id=api_id).exists(): + api_key_pair = EveApiKeyPair.objects.get(api_id=api_id) + if api_key_pair.user == request.user: + refresh_api(api_key_pair) + set_state(request.user) + else: + logger.warn("User %s not authorized to refresh api id %s" % (request.user, api_id)) + else: + logger.warn("User %s unable to refresh api id %s - api key not found" % (request.user, api_id)) + return HttpResponseRedirect("/api_key_management/") diff --git a/stock/templates/registered/apikeymanagment.html b/stock/templates/registered/apikeymanagment.html index d2a06a3a..6fbd4092 100644 --- a/stock/templates/registered/apikeymanagment.html +++ b/stock/templates/registered/apikeymanagment.html @@ -32,6 +32,10 @@ {{ pair.api_id }} {{ pair.api_key }} + + + From 2bf133ceee5af29cc08443a3ae76b27214ecf461 Mon Sep 17 00:00:00 2001 From: Adarnof Date: Sun, 7 Feb 2016 17:28:16 +0000 Subject: [PATCH 3/3] Corrections --- celerytask/tasks.py | 56 ++++++++++++++++++++++----------------------- eveonline/views.py | 2 +- 2 files changed, 28 insertions(+), 30 deletions(-) diff --git a/celerytask/tasks.py b/celerytask/tasks.py index dd23c544..e75eee2b 100755 --- a/celerytask/tasks.py +++ b/celerytask/tasks.py @@ -1,6 +1,5 @@ from django.conf import settings from celery.task import periodic_task -from celery.task import shared_task from django.contrib.auth.models import User from django.contrib.auth.models import Group @@ -248,7 +247,7 @@ def remove_from_databases(user, groups, syncgroups): def assign_corp_group(auth): corp_group = None - if auth.main_character_id: + if auth.main_char_id: if EveCharacter.objects.filter(character_id=auth.main_char_id).exists(): char = EveCharacter.objects.get(character_id=auth.main_char_id) corpname = generate_corp_group_name(char.corporation_name) @@ -395,7 +394,6 @@ def run_discord_token_cleanup(): logger.debug("DiscordAuthToken failed validation. Deleting %s" % auth) auth.delete() -@shared_task def refresh_api(api_key_pair): logger.debug("Running update on api key %s" % api_key_pair.api_id) user = api_key_pair.user @@ -444,32 +442,32 @@ def refresh_api(api_key_pair): elif full == False: logger.info("Determined api key %s for user %s no longer meets minimum access mask as required." % (api_key_pair.api_id, user)) still_valid = False - if still_valid == None: - if api_key_pair.error_count >= 3: - logger.info("API key %s has incurred 3 or more errors. Assuming invalid." % api_key_pair.api_id) - still_valid = False - if still_valid == False: - logger.debug("API key %s has failed validation; it and its characters will be deleted." % api_key_pair.api_id) - EveManager.delete_characters_by_api_id(api_key_pair.api_id, user.id) - EveManager.delete_api_key_pair(api_key_pair.api_id, user.id) - elif still_valid == True: - if api_key_pair.error_count != 0: - logger.info("Clearing error count for api %s as it passed validation" % api_key_pair.api_id) - api_key_pair.error_count = 0 - api_key_pair.save() - logger.info("Determined api key %s still meets requirements." % api_key_pair.api_id) - # Update characters - characters = EveApiManager.get_characters_from_api(api_key_pair.api_id, api_key_pair.api_key) - EveManager.update_characters_from_list(characters) - new_character = False - for char in characters.result: - # Ensure we have a model for all characters on key - if not EveManager.check_if_character_exist(characters.result[char]['name']): - new_character = True - logger.debug("API key %s has a new character on the account: %s" % (api_key_pair.api_id, characters.result[char]['name'])) - if new_character: - logger.debug("Creating new character %s from api key %s" % (characters.result[char]['name'], api_key_pair.api_id)) - EveManager.create_characters_from_list(characters, user, api_key_pair.api_key) + if still_valid == None: + if api_key_pair.error_count >= 3: + logger.info("API key %s has incurred 3 or more errors. Assuming invalid." % api_key_pair.api_id) + still_valid = False + if still_valid == False: + logger.debug("API key %s has failed validation; it and its characters will be deleted." % api_key_pair.api_id) + EveManager.delete_characters_by_api_id(api_key_pair.api_id, user.id) + EveManager.delete_api_key_pair(api_key_pair.api_id, user.id) + elif still_valid == True: + if api_key_pair.error_count != 0: + logger.info("Clearing error count for api %s as it passed validation" % api_key_pair.api_id) + api_key_pair.error_count = 0 + api_key_pair.save() + logger.info("Determined api key %s still meets requirements." % api_key_pair.api_id) + # Update characters + characters = EveApiManager.get_characters_from_api(api_key_pair.api_id, api_key_pair.api_key) + EveManager.update_characters_from_list(characters) + new_character = False + for char in characters.result: + # Ensure we have a model for all characters on key + if not EveManager.check_if_character_exist(characters.result[char]['name']): + new_character = True + logger.debug("API key %s has a new character on the account: %s" % (api_key_pair.api_id, characters.result[char]['name'])) + if new_character: + logger.debug("Creating new character %s from api key %s" % (characters.result[char]['name'], api_key_pair.api_id)) + EveManager.create_characters_from_list(characters, user, api_key_pair.api_key) else: logger.debug("API key %s is no longer valid; it and its characters will be deleted." % api_key_pair.api_id) EveManager.delete_characters_by_api_id(api_key_pair.api_id, user.id) diff --git a/eveonline/views.py b/eveonline/views.py index 0421ddb0..ff7bf6c1 100755 --- a/eveonline/views.py +++ b/eveonline/views.py @@ -163,7 +163,7 @@ def corp_stats_view(request): return render_to_response('registered/corpstats.html', None, context_instance=RequestContext(request)) @login_required -def user_refresh_api(request, api_id) +def user_refresh_api(request, api_id): logger.debug("user_refresh_api called by user %s for api id %s" % (request.user, api_id)) if EveApiKeyPair.objects.filter(api_id=api_id).exists(): api_key_pair = EveApiKeyPair.objects.get(api_id=api_id)