From 4d0aa928090d3cbd3cecde5a242cacebd75dcefa Mon Sep 17 00:00:00 2001 From: Adarnof Date: Fri, 12 Feb 2016 17:30:52 +0000 Subject: [PATCH 1/8] Initial rework of corp/alliance model update Corrected exception when determining id type --- celerytask/tasks.py | 426 ++++++++++++++------------- services/managers/eve_api_manager.py | 4 +- 2 files changed, 219 insertions(+), 211 deletions(-) diff --git a/celerytask/tasks.py b/celerytask/tasks.py index e75eee2b..96545aa6 100755 --- a/celerytask/tasks.py +++ b/celerytask/tasks.py @@ -25,6 +25,7 @@ from util.common_task import remove_user_from_group from util.common_task import generate_corp_group_name from eveonline.models import EveCharacter from eveonline.models import EveCorporationInfo +from eveonline.models import EveAllianceInfo from authentication.managers import AuthServicesInfoManager from services.models import DiscordAuthToken @@ -496,222 +497,227 @@ def run_api_refresh(): authserviceinfo.save() set_state(user) +def populate_alliance(id, blue=False): + logger.info("Populating alliance model with id %s blue %s" % (id, blue)) + alliance_info = EveApiManager.get_alliance_information(id) + + if not alliance_info: + raise ValueError("Supplied alliance id %s is invalid" % id) + + if EveAllianceInfo.objects.filter(alliance_id=id).exists(): + alliance = EveAllianceInfo.objects.get(alliance_id=id) + else: + EveManager.create_alliance_info(alliance_info['id'], alliance_info['name'], alliance_info['ticker'], + alliance_info['executor_id'], alliance_info['member_count'], blue) + alliance = EveAllianceInfo.objects.get(alliance_id=id) + for member_corp in alliance_info['member_corps']: + if EveCorporationInfo.objects.filter(corporation_id=member_corp).exists(): + corp = EveCorporationInfo.objects.get(corporation_id=member_corp) + if corp.alliance == alliance is not True: + corp.alliance = alliance + corp.save() + else: + logger.info("Creating new alliance member corp id %s" % member_corp) + corpinfo = EveApiManager.get_corporation_information(member_corp) + EveManager.create_corporation_info(corpinfo['id'], corpinfo['name'], corpinfo['ticker'], + corpinfo['members']['current'], corp.is_blue, alliance) # Run Every 2 hours @periodic_task(run_every=crontab(minute=0, hour="*/2")) def run_corp_update(): - # I am not proud of this block of code - if EveApiManager.check_if_api_server_online(): - logger.debug("API server online and reachable. Proceeding with corp update.") - if settings.IS_CORP: - # Create the corp - logger.debug("Ensuring corp model exists for owning corp id %s due to settings.IS_CORP %s" % (settings.CORP_ID, settings.IS_CORP)) - ownercorpinfo = EveApiManager.get_corporation_information(settings.CORP_ID) - logger.debug("Determined ownercorp info: %s" % ownercorpinfo) - if not EveManager.check_if_corporation_exists_by_id(ownercorpinfo['id']): - logger.debug("Owning corp id %s does not have a model. Creating." % ownercorpinfo['id']) - if ownercorpinfo['alliance']['id'] is None: - logger.debug("Owning corp does not have an alliance. Creating model with alliance=None") - EveManager.create_corporation_info(ownercorpinfo['id'], ownercorpinfo['name'], ownercorpinfo['ticker'], - ownercorpinfo['members']['current'], False, None) - else: - alliance_info = EveApiManager.get_alliance_information(ownercorpinfo['alliance']['id']) - logger.debug("Owning corp has an alliance, got info: %s" % alliance_info) - if not EveManager.check_if_alliance_exists_by_id(ownercorpinfo['alliance']['id']): - logger.debug("Owning corp missing alliance model. Creating for id %s" % ownercorpinfo['alliance']['id']) - EveManager.create_alliance_info(ownercorpinfo['alliance']['id'], alliance_info['name'], alliance_info['ticker'], - alliance_info['executor_id'], alliance_info['member_count'], False) - alliance = EveManager.get_alliance_info_by_id(ownercorpinfo['alliance']['id']) - logger.debug("Got alliance model %s for owning corp. Creating corp model." % alliance) - EveManager.create_corporation_info(ownercorpinfo['id'], ownercorpinfo['name'], ownercorpinfo['ticker'], + if EveApiManager.check_if_api_server_online() is not True: + logger.warn("Aborted updating corp and alliance models: API server unreachable") + return + standing_level = 'alliance' + + # get corp info for owning corp if required + ownercorpinfo = {} + if settings.IS_CORP: + standing_level = 'corp' + logger.debug("Getting information for owning corp with id %s" % settings.CORP_ID) + ownercorpinfo = EveApiManager.get_corporation_information(settings.CORP_ID) + if not ownercorpinfo: + logger.error("Failed to retrieve corp info for owning corp id %s - bad corp id?" % settings.CORP_ID) + return + + # check if we need to update an alliance model + alliance_id = '' + if ownercorpinfo and ownercorpinfo['alliance']['id']: + alliance_id = ownercorpinfo['alliance']['id'] + elif settings.IS_CORP is False: + alliance_id = settings.ALLIANCE_ID + + # get and create alliance info for owning alliance if required + alliance = None + if alliance_id: + logger.debug("Getting information for owning alliance with id %s" % alliance_id) + ownerallianceinfo = EveApiManager.get_alliance_information(alliance_id) + if not ownerallianceinfo: + logger.error("Failed to retrieve corp info for owning alliance id %s - bad alliance id?" % alliance_id) + return + if EveAllianceInfo.objects.filter(alliance_id=ownerallianceinfo['id']).exists(): + logger.debug("Updating existing owner alliance model with id %s" % alliance_id) + EveManager.update_alliance_info(ownerallianceinfo['id'], ownerallianceinfo['executor_id'], ownerallianceinfo['member_count'], False) + else: + populate_alliance(alliance_id) + alliance = EveAllianceInfo.objects.get(alliance_id=alliance_id) + + # create corp info for owning corp if required + if ownercorpinfo: + if EveCorporationInfo.objects.filter(corporation_id=ownercorpinfo['id']).exists(): + logger.debug("Updating existing owner corp model with id %s" % ownercorpinfo['id']) + EveManager.update_corporation_info(ownercorpinfo['id'], ownercorpinfo['members']['current'], alliance, False) + else: + logger.info("Creating model for owning corp with id %s" % ownercorpinfo['id']) + EveManager.create_corporation_info(ownercorpinfo['id'], ownercorpinfo['name'], ownercorpinfo['ticker'], ownercorpinfo['members']['current'], False, alliance) - else: - # Updated alliance info - logger.debug("Getting info for owning alliance %s" % settings.ALLIANCE_ID) - alliance_info = EveApiManager.get_alliance_information(settings.ALLIANCE_ID) - logger.debug("Owning alliance info: %s" % alliance_info) - # Populate alliance info - if not EveManager.check_if_alliance_exists_by_id(settings.ALLIANCE_ID): - logger.debug("Missing alliance model for owning alliance. Creating with id %s" % settings.ALLIANCE_ID) - EveManager.create_alliance_info(settings.ALLIANCE_ID, alliance_info['name'], alliance_info['ticker'], - alliance_info['executor_id'], alliance_info['member_count'], False) - alliance = EveManager.get_alliance_info_by_id(settings.ALLIANCE_ID) - logger.debug("Got owning alliance model %s" % alliance) - # Create the corps in the alliance - for alliance_corp in alliance_info['member_corps']: - corpinfo = EveApiManager.get_corporation_information(alliance_corp) - logger.debug("Got corpinfo for alliance member corp: %s" % corpinfo) - if not EveManager.check_if_corporation_exists_by_id(corpinfo['id']): - logger.debug("Alliance member corp id %s missing model - creating." % corpinfo['id']) - EveManager.create_corporation_info(corpinfo['id'], corpinfo['name'], corpinfo['ticker'], - corpinfo['members']['current'], False, alliance) - - #determine what level of standings to check - #refer to https://github.com/eve-val/evelink/blob/master/evelink/parsing/contact_list.py#L43 - standing_level = 'alliance' - if settings.IS_CORP: - logger.debug("Switching standings check to corp level.") - standing_level = 'corp' - - # Create the corps in the standings - corp_standings = EveApiManager.get_corp_standings() - logger.debug("Got %s corp standings." % len(corp_standings)) - if corp_standings: - for standing_id in EveApiManager.get_corp_standings()[standing_level]: - logger.debug("Processing standing id %s" % standing_id) - if int(corp_standings[standing_level][standing_id]['standing']) >= settings.BLUE_STANDING: - logger.debug("Standing %s meets or exceeds blue threshold." % standing_id) - if EveApiManager.check_if_id_is_character(standing_id): - logger.debug("Standing id %s is a character. Not creating model.") - pass - elif EveApiManager.check_if_id_is_corp(standing_id): - corpinfo = EveApiManager.get_corporation_information(standing_id) - logger.debug("Standing id %s is a corp. Got corpinfo: %s" % (standing_id, corpinfo)) - if not EveManager.check_if_corporation_exists_by_id(standing_id): - logger.debug("Corp model for standing id %s does not exist. Creating" % standing_id) - EveManager.create_corporation_info(corpinfo['id'], corpinfo['name'], corpinfo['ticker'], - corpinfo['members']['current'], True, None) - else: - # Alliance id create corps - blue_alliance_info = EveApiManager.get_alliance_information(standing_id) - logger.debug("Standing id %s is alliance. Got alliance info: %s" % (standing_id, blue_alliance_info)) - if not EveManager.check_if_alliance_exists_by_id(standing_id): - logger.debug("Alliance model for standing id %s does not exist. Creating" % standing_id) - EveManager.create_alliance_info(standing_id, blue_alliance_info['name'], - blue_alliance_info['ticker'], - blue_alliance_info['executor_id'], - blue_alliance_info['member_count'], True) - - blue_alliance = EveManager.get_alliance_info_by_id(standing_id) - logger.debug("Got alliance model %s for standing id %s" % (blue_alliance, standing_id)) - for blue_alliance_corp in blue_alliance_info['member_corps']: - blue_info = EveApiManager.get_corporation_information(blue_alliance_corp) - logger.debug("Got corpinfo for member corp id %s of blue alliance %s: %s" % (blue_info['id'], blue_alliance, blue_info)) - if not EveManager.check_if_corporation_exists_by_id(blue_info['id']): - logger.debug("Blue alliance %s member corp id %s missing model. Creating." % (blue_alliance, blue_info['id'])) - EveManager.create_corporation_info(blue_info['id'], blue_info['name'], - blue_info['ticker'], - blue_info['members']['current'], True, blue_alliance) - - # Update all allinace info's - for all_alliance_info in EveManager.get_all_alliance_info(): - logger.debug("Validating alliance model %s" % all_alliance_info) - if EveApiManager.check_if_alliance_exists(all_alliance_info.alliance_id): - all_alliance_api_info = EveApiManager.get_alliance_information(all_alliance_info.alliance_id) - logger.debug("Got alliance %s alliance info: %s" % (all_alliance_info, all_alliance_api_info)) - if (not settings.IS_CORP and all_alliance_info.alliance_id == settings.ALLIANCE_ID): - logger.debug("Alliance %s is owning alliance. Updating info." % all_alliance_info) - EveManager.update_alliance_info(all_alliance_api_info['id'], all_alliance_api_info['executor_id'], - all_alliance_api_info['member_count'], False) - elif standing_level in corp_standings: - if int(all_alliance_info.alliance_id) in corp_standings[standing_level]: - if int(corp_standings[standing_level][int(all_alliance_info.alliance_id)][ - 'standing']) >= settings.BLUE_STANDING: - logger.debug("Alliance %s is blue. Updating." % all_alliance_info) - EveManager.update_alliance_info(all_alliance_api_info['id'], - all_alliance_api_info['executor_id'], - all_alliance_api_info['member_count'], True) - else: - logger.debug("Alliance %s does not meet blue standing threshold. Updating as non-blue." % all_alliance_info) - EveManager.update_alliance_info(all_alliance_api_info['id'], - all_alliance_api_info['executor_id'], - all_alliance_api_info['member_count'], False) - else: - logger.debug("Alliance %s not in standings. Updating as non-blue." % all_alliance_info) - EveManager.update_alliance_info(all_alliance_api_info['id'], - all_alliance_api_info['executor_id'], - all_alliance_api_info['member_count'], False) - else: - logger.debug("No standings found. Updating alliance %s as non-blue." % all_alliance_info) - EveManager.update_alliance_info(all_alliance_api_info['id'], - all_alliance_api_info['executor_id'], - all_alliance_api_info['member_count'], False) - else: - logger.info("Alliance %s has closed. Deleting model." % all_alliance_info) - #alliance no longer exists - all_alliance_info.delete() - - # Update corp infos - for all_corp_info in EveManager.get_all_corporation_info(): - logger.debug("Validating corp model %s" % all_corp_info) - if EveApiManager.check_if_corp_exists(all_corp_info.corporation_id): - alliance = None - corpinfo = EveApiManager.get_corporation_information(all_corp_info.corporation_id) - if corpinfo['alliance']['id'] is not None: - alliance = EveManager.get_alliance_info_by_id(corpinfo['alliance']['id']) - logger.debug("Got corpinfo %s and allianceinfo %s" % (corpinfo, alliance)) - - if (settings.IS_CORP and all_corp_info.corporation_id == settings.CORP_ID): - logger.debug("Corp %s is owning corp. Updating." % all_corp_info) - EveManager.update_corporation_info(corpinfo['id'], corpinfo['members']['current'], None, False) - elif int(all_corp_info.corporation_id) in corp_standings[standing_level]: - if int(corp_standings[standing_level][int(all_corp_info.corporation_id)][ - 'standing']) >= settings.BLUE_STANDING: - logger.debug("Corp %s is blue. Updating." % all_corp_info) - EveManager.update_corporation_info(corpinfo['id'], corpinfo['members']['current'], None, True) - else: - logger.debug("Corp %s does not meet blue standing threshold. Updating as non-blue." % all_corp_info) - EveManager.update_corporation_info(corpinfo['id'], corpinfo['members']['current'], None, False) - elif alliance is not None and all_corp_info.alliance is not None: - logger.debug("Corp %s not in standings - checking alliance with model %s" % (all_corp_info, alliance)) - if (not settings.IS_CORP) and (all_corp_info.alliance.alliance_id == settings.ALLIANCE_ID): - logger.debug("Corp %s is member of owning alliance. Updating." % all_corp_info) - EveManager.update_corporation_info(corpinfo['id'], corpinfo['members']['current'], alliance, False) - elif int(alliance.alliance_id) in corp_standings[standing_level]: - if int(corp_standings[standing_level][int(alliance.alliance_id)][ - 'standing']) >= settings.BLUE_STANDING: - logger.debug("Corp %s alliance %s is blue. Updating." % (all_corp_info, alliance)) - EveManager.update_corporation_info(corpinfo['id'], corpinfo['members']['current'], alliance, - True) - else: - logger.debug("Corp %s alliance %s does not meet blue standing threshold. Updating as non-blue." % (all_corp_info, alliance)) - EveManager.update_corporation_info(corpinfo['id'], corpinfo['members']['current'], alliance, - False) - else: - logger.debug("Corp %s alliance %s not found in standings. Updating as non-blue." % (all_corp_info, alliance)) - EveManager.update_corporation_info(corpinfo['id'], corpinfo['members']['current'], alliance, - False) - else: - logger.info("Corp model %s is not owning, member of owning alliance, or in standings. Updating as non-blue." % all_corp_info) - EveManager.update_corporation_info(corpinfo['id'], corpinfo['members']['current'], None, False) - else: - #corp has closed - logger.info("Corp %s has closed. Deleting model." % all_corp_info) - all_corp_info.delete() - - # Remove irrelevent corp and alliance models - # Check the corps - for all_corp_info in EveManager.get_all_corporation_info(): - logger.debug("Checking to delete corp model %s" % all_corp_info) - if settings.IS_CORP: - if all_corp_info.corporation_id != settings.CORP_ID: - if not all_corp_info.is_blue: - logger.info("Corp model %s is not owning corp nor blue. Deleting." % all_corp_info) - all_corp_info.delete() + # validate and create corp models for member corps of owning alliance + if alliance: + current_corps = EveCorporationInfo.objects.filter(alliance=alliance) + for corp in current_corps: + if corp.corporation_id in ownerallianceinfo['member_corps'] is False: + logger.info("Corp %s is no longer in owning alliance %s - updating model." % (corp, alliance)) + corp.alliance = None + corp.save() + for member_corp in ownerallianceinfo['member_corps']: + if EveCorporationInfo.objects.filter(corporation_id=member_corp).exists(): + corp = EveCorporationInfo.objects.get(corporation_id=member_corp) + if corp.alliance == alliance is not True: + logger.info("Associating corp %s with owning alliance %s" % (corp, alliance)) + corp.alliance = alliance + corp.save() else: - if all_corp_info.alliance is not None: - if all_corp_info.alliance.alliance_id != settings.ALLIANCE_ID: - if not all_corp_info.is_blue: - logger.info("Corp model %s not in owning alliance nor blue. Deleting." % all_corp_info) - all_corp_info.delete() - elif not all_corp_info.is_blue: - logger.info("Corp model %s has no alliance and is not blue. Deleting." % all_corp_info) - all_corp_info.delete() + corpinfo = EveApiManager.get_corporation_information(member_corp) + logger.info("Creating model for owning alliance member corp with id %s" % corpinfo['id']) + EveManager.create_corporation_info(corpinfo['id'], corpinfo['name'], corpinfo['ticker'], + corpinfo['members']['current'], False, alliance) - # Check the alliances - for all_alliance_info in EveManager.get_all_alliance_info(): - logger.debug("Checking to delete alliance model %s" % all_alliance_info) - if settings.IS_CORP: - if all_alliance_info.is_blue is not True: - if ownercorpinfo['alliance']['id'] is not None: - if int(all_alliance_info.alliance_id) != ownercorpinfo['alliance']['id']: - logger.info("Alliance model %s not owning corp alliance nor blue. Deleting." % all_alliance_info) - all_alliance_info.delete() + # update existing corp models + for corp in EveCorporationInfo.objects.all(): + logger.debug("Updating corp %s" % corp) + corpinfo = EveApiManager.get_corporation_information(corp.corporation_id) + if corpinfo: + alliance = None + if EveAllianceInfo.objects.filter(alliance_id=corpinfo['alliance']['id']).exists(): + alliance = EveAllianceInfo.objects.get(alliance_id=corpinfo['alliance']['id']) + EveManager.update_corporation_info(corpinfo['id'], corpinfo['members']['current'], alliance, corp.is_blue) + elif EveApiManager.check_if_corp_exists(corp.corporation_id) is False: + logger.info("Corp %s has closed. Deleting model" % corp) + corp.delete() + + # update existing alliance models + for alliance in EveAllianceInfo.objects.all(): + logger.debug("Updating alliance %s" % alliance) + allianceinfo = EveApiManager.get_alliance_information(alliance.alliance_id) + if allianceinfo: + EveManager.update_alliance_info(allianceinfo['id'], allianceinfo['executor_id'], + allianceinfo['member_count'], alliance.is_blue) + for corp in EveCorporationInfo.objects.filter(alliance=alliance): + if corp.corporation_id in allianceinfo['member_corps'] is False: + logger.info("Corp %s no longer in alliance %s" % (corp, alliance)) + corp.alliance = None + corp.save() + populate_alliance(alliance.alliance_id, blue=alliance.is_blue) + elif EveApiManager.check_if_alliance_exists(alliance.alliance_id) is False: + logger.info("Alliance %s has closed. Deleting model" % alliance) + alliance.delete() + + # create standings + standings = EveApiManager.get_corp_standings() + if standings: + standings = standings[standing_level] + for standing in standings: + if int(standings[standing]['standing']) >= settings.BLUE_STANDING: + logger.debug("Standing %s meets threshold" % standing) + if EveApiManager.check_if_id_is_alliance(standing): + logger.debug("Standing %s is an alliance" % standing) + if EveAllianceInfo.objects.filter(alliance_id=standing).exists(): + alliance = EveAllianceInfo.objects.get(alliance_id=standing) + if alliance.is_blue is not True: + logger.info("Updating alliance %s as blue" % alliance) + alliance.is_blue = True + alliance.save() else: - logger.info("Alliance model %s not blue to alliance-less owning corp. Deleting." % all_alliance_info) - all_alliance_info.delete() - elif all_alliance_info.alliance_id != settings.ALLIANCE_ID: - if all_alliance_info.is_blue is not True: - logger.info("Alliance model %s not owning alliance nor blue. Deleting." % all_alliance_info) - all_alliance_info.delete() + populate_alliance(standing, blue=True) + if EveApiManager.check_if_id_is_corp(standing): + logger.debug("Standing %s is a corp" % standing) + if EveCorporationInfo.objects.filter(corporation_id=standing).exists(): + corp = EveCorporationInfo.objects.get(corporation_id=standing) + if corp.is_blue is not True: + logger.info("Updating corp %s as blue" % corp) + corp.is_blue = True + corp.save() + else: + logger.info("Creating model for blue corp with id %s" % standing) + corpinfo = EveApiManager.get_corporation_information(standing) + corp_alliance = None + if EveAllianceInfo.objects.filter(alliance_id=corpinfo['alliance']['id']).exists(): + logger.debug("New corp model for standing %s has existing alliance model" % standing) + corp_alliance = EveAllianceInfo.objects.get(alliance_id=corpinfo['alliance']['id']) + EveManager.create_corporation_info(corpinfo['id'], corpinfo['name'], corpinfo['ticker'], + corpinfo['members']['current'], True, corp_alliance) + + + logger.debug(standings) + + # update alliance standings + for alliance in EveAllianceInfo.objects.filter(is_blue=True): + if int(alliance.alliance_id) in standings is not True: + logger.info("Alliance %s no longer in standings" % alliance) + alliance.is_blue = False + alliance.save() + elif float(standings[int(alliance.alliance_id)]['standing']) < float(settings.BLUE_STANDING): + logger.info("Alliance %s no longer meets minimum blue standing threshold" % alliance) + alliance.is_blue = False + alliance.save() + + # update corp standings + for corp in EveCorporationInfo.objects.filter(is_blue=True): + if int(corp.corporation_id) in standings is not True: + if corp.alliance: + if corp.alliance.is_blue is False: + logger.info("Corp %s and its alliance %s are no longer blue" % (corp, corp.alliance)) + corp.is_blue = False + corp.save() + else: + logger.info("Corp %s is no longer blue" % corp) + corp.is_blue = False + corp.save() + elif float(standings[int(corp.corporation_id)]['standing']) < float(settings.BLUE_STANDING): + logger.info("Corp %s no longer meets minimum blue standing threshold" % (corp, corp.alliance)) + corp.is_blue = False + corp.save() + + # delete unnecessary alliance models + for alliance in EveAllianceInfo.objects.all(): + if alliance.is_blue is not True: + if settings.IS_CORP is False: + if alliance.alliance_id == settings.ALLIANCE_ID is not True: + logger.info("Deleting unnecessary alliance model %s" % alliance) + alliance.delete() + else: + if alliance.evecorporationinfo_set.filter(corporation_id=settings.CORP_ID).exists() is not True: + logger.info("Deleting unnecessary alliance model %s" % alliance) + alliance.delete() + + # delete unnecessary corp models + for corp in EveCorporationInfo.objects.all(): + if corp.is_blue is not True: + if settings.IS_CORP is False: + if corp.alliance: + if corp.alliance.alliance_id == settings.ALLIANCE_ID is not True: + logger.info("Deleting unnecessary corp model %s" % corp) + corp.delete() + else: + logger.info("Deleting unnecessary corp model %s" % corp) + corp.delete() + else: + if corp.corporation_id == settings.CORP_ID is not True: + if corp.alliance: + if corp.alliance.evecorporationinfo_set.filter(corporation_id=settings.CORP_ID).exists() is not True: + logger.info("Deleting unnecessary corp model %s" % corp) + corp.delete() + else: + logger.info("Deleting unnecessary corp model %s" % corp) + corp.delete() diff --git a/services/managers/eve_api_manager.py b/services/managers/eve_api_manager.py index 1f17bd73..8385ffae 100644 --- a/services/managers/eve_api_manager.py +++ b/services/managers/eve_api_manager.py @@ -220,7 +220,9 @@ class EveApiManager(): return True except evelink.api.APIError as error: logger.exception("APIError occured while checking if id %s is an alliance. Possibly not alliance?" % alliance_id) - + except KeyError: + logger.debug("Alliance with id %s not found in active alliance list." % alliance_id) + return False logger.debug("Unable to verify id %s is an an alliance." % alliance_id) return False From 6d197d184d34e72412739dfc805b984b4443cdf2 Mon Sep 17 00:00:00 2001 From: Adarnof Date: Fri, 12 Feb 2016 20:09:46 +0000 Subject: [PATCH 2/8] Fixed bug in identifying standing models Fixes #254 #189 Addresses missing corp models for dropdown in corputils --- celerytask/tasks.py | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/celerytask/tasks.py b/celerytask/tasks.py index 96545aa6..015e3e9f 100755 --- a/celerytask/tasks.py +++ b/celerytask/tasks.py @@ -513,19 +513,19 @@ def populate_alliance(id, blue=False): for member_corp in alliance_info['member_corps']: if EveCorporationInfo.objects.filter(corporation_id=member_corp).exists(): corp = EveCorporationInfo.objects.get(corporation_id=member_corp) - if corp.alliance == alliance is not True: + if corp.alliance == alliance is False: corp.alliance = alliance corp.save() else: logger.info("Creating new alliance member corp id %s" % member_corp) corpinfo = EveApiManager.get_corporation_information(member_corp) EveManager.create_corporation_info(corpinfo['id'], corpinfo['name'], corpinfo['ticker'], - corpinfo['members']['current'], corp.is_blue, alliance) + corpinfo['members']['current'], blue, alliance) # Run Every 2 hours @periodic_task(run_every=crontab(minute=0, hour="*/2")) def run_corp_update(): - if EveApiManager.check_if_api_server_online() is not True: + if EveApiManager.check_if_api_server_online() is False: logger.warn("Aborted updating corp and alliance models: API server unreachable") return standing_level = 'alliance' @@ -640,7 +640,7 @@ def run_corp_update(): alliance.save() else: populate_alliance(standing, blue=True) - if EveApiManager.check_if_id_is_corp(standing): + elif EveApiManager.check_if_id_is_corp(standing): logger.debug("Standing %s is a corp" % standing) if EveCorporationInfo.objects.filter(corporation_id=standing).exists(): corp = EveCorporationInfo.objects.get(corporation_id=standing) @@ -659,22 +659,26 @@ def run_corp_update(): corpinfo['members']['current'], True, corp_alliance) - logger.debug(standings) - # update alliance standings for alliance in EveAllianceInfo.objects.filter(is_blue=True): - if int(alliance.alliance_id) in standings is not True: + if int(alliance.alliance_id) in standings: + if float(standings[int(alliance.alliance_id)]['standing']) < float(settings.BLUE_STANDING): + logger.info("Alliance %s no longer meets minimum blue standing threshold" % alliance) + alliance.is_blue = False + alliance.save() + else: logger.info("Alliance %s no longer in standings" % alliance) alliance.is_blue = False alliance.save() - elif float(standings[int(alliance.alliance_id)]['standing']) < float(settings.BLUE_STANDING): - logger.info("Alliance %s no longer meets minimum blue standing threshold" % alliance) - alliance.is_blue = False - alliance.save() # update corp standings for corp in EveCorporationInfo.objects.filter(is_blue=True): - if int(corp.corporation_id) in standings is not True: + if int(corp.corporation_id) in standings: + if float(standings[int(corp.corporation_id)]['standing']) < float(settings.BLUE_STANDING): + logger.info("Corp %s no longer meets minimum blue standing threshold" % (corp, corp.alliance)) + corp.is_blue = False + corp.save() + else: if corp.alliance: if corp.alliance.is_blue is False: logger.info("Corp %s and its alliance %s are no longer blue" % (corp, corp.alliance)) @@ -684,20 +688,16 @@ def run_corp_update(): logger.info("Corp %s is no longer blue" % corp) corp.is_blue = False corp.save() - elif float(standings[int(corp.corporation_id)]['standing']) < float(settings.BLUE_STANDING): - logger.info("Corp %s no longer meets minimum blue standing threshold" % (corp, corp.alliance)) - corp.is_blue = False - corp.save() # delete unnecessary alliance models for alliance in EveAllianceInfo.objects.all(): if alliance.is_blue is not True: if settings.IS_CORP is False: - if alliance.alliance_id == settings.ALLIANCE_ID is not True: + if alliance.alliance_id == settings.ALLIANCE_ID is False: logger.info("Deleting unnecessary alliance model %s" % alliance) alliance.delete() else: - if alliance.evecorporationinfo_set.filter(corporation_id=settings.CORP_ID).exists() is not True: + if alliance.evecorporationinfo_set.filter(corporation_id=settings.CORP_ID).exists() is False: logger.info("Deleting unnecessary alliance model %s" % alliance) alliance.delete() @@ -706,16 +706,16 @@ def run_corp_update(): if corp.is_blue is not True: if settings.IS_CORP is False: if corp.alliance: - if corp.alliance.alliance_id == settings.ALLIANCE_ID is not True: + if corp.alliance.alliance_id == settings.ALLIANCE_ID is False: logger.info("Deleting unnecessary corp model %s" % corp) corp.delete() else: logger.info("Deleting unnecessary corp model %s" % corp) corp.delete() else: - if corp.corporation_id == settings.CORP_ID is not True: + if corp.corporation_id == settings.CORP_ID is False: if corp.alliance: - if corp.alliance.evecorporationinfo_set.filter(corporation_id=settings.CORP_ID).exists() is not True: + if corp.alliance.evecorporationinfo_set.filter(corporation_id=settings.CORP_ID).exists() is False: logger.info("Deleting unnecessary corp model %s" % corp) corp.delete() else: From 6019b36842ed90aa35d14af20d9ce30bfedccf2c Mon Sep 17 00:00:00 2001 From: Adarnof Date: Fri, 12 Feb 2016 20:55:24 +0000 Subject: [PATCH 3/8] Corrected unnecessary alliance assignment Corrected inability to delete corp models --- celerytask/tasks.py | 51 +++++++++++++++++++++++++-------------------- 1 file changed, 28 insertions(+), 23 deletions(-) diff --git a/celerytask/tasks.py b/celerytask/tasks.py index 015e3e9f..5d87f0c2 100755 --- a/celerytask/tasks.py +++ b/celerytask/tasks.py @@ -513,7 +513,7 @@ def populate_alliance(id, blue=False): for member_corp in alliance_info['member_corps']: if EveCorporationInfo.objects.filter(corporation_id=member_corp).exists(): corp = EveCorporationInfo.objects.get(corporation_id=member_corp) - if corp.alliance == alliance is False: + if corp.alliance != alliance: corp.alliance = alliance corp.save() else: @@ -690,34 +690,39 @@ def run_corp_update(): corp.save() # delete unnecessary alliance models - for alliance in EveAllianceInfo.objects.all(): - if alliance.is_blue is not True: - if settings.IS_CORP is False: - if alliance.alliance_id == settings.ALLIANCE_ID is False: - logger.info("Deleting unnecessary alliance model %s" % alliance) - alliance.delete() - else: - if alliance.evecorporationinfo_set.filter(corporation_id=settings.CORP_ID).exists() is False: - logger.info("Deleting unnecessary alliance model %s" % alliance) - alliance.delete() + for alliance in EveAllianceInfo.objects.filter(is_blue=False): + logger.debug("Checking to delete alliance %s" % alliance) + if settings.IS_CORP is False: + if alliance.alliance_id == settings.ALLIANCE_ID is False: + logger.info("Deleting unnecessary alliance model %s" % alliance) + alliance.delete() + else: + if alliance.evecorporationinfo_set.filter(corporation_id=settings.CORP_ID).exists() is False: + logger.info("Deleting unnecessary alliance model %s" % alliance) + alliance.delete() # delete unnecessary corp models - for corp in EveCorporationInfo.objects.all(): - if corp.is_blue is not True: - if settings.IS_CORP is False: + for corp in EveCorporationInfo.objects.filter(is_blue=False): + logger.debug("Checking to delete corp %s" % corp) + if settings.IS_CORP is False: + if corp.alliance: + logger.debug("Corp %s has alliance %s" % (corp, corp.alliance)) + if corp.alliance.alliance_id == settings.ALLIANCE_ID is False: + logger.info("Deleting unnecessary corp model %s" % corp) + corp.delete() + else: + logger.info("Deleting unnecessary corp model %s" % corp) + corp.delete() + else: + if corp.corporation_id != settings.CORP_ID: + logger.debug("Corp %s is not owning corp" % corp) if corp.alliance: - if corp.alliance.alliance_id == settings.ALLIANCE_ID is False: + logger.debug("Corp %s has alliance %s" % (corp, corp.alliance)) + if corp.alliance.evecorporationinfo_set.filter(corporation_id=settings.CORP_ID).exists() is False: logger.info("Deleting unnecessary corp model %s" % corp) corp.delete() else: logger.info("Deleting unnecessary corp model %s" % corp) corp.delete() else: - if corp.corporation_id == settings.CORP_ID is False: - if corp.alliance: - if corp.alliance.evecorporationinfo_set.filter(corporation_id=settings.CORP_ID).exists() is False: - logger.info("Deleting unnecessary corp model %s" % corp) - corp.delete() - else: - logger.info("Deleting unnecessary corp model %s" % corp) - corp.delete() + logger.debug("Corp %s is owning corp" % corp) From a75391f27030fa306364b576c8314fd3d8a17d75 Mon Sep 17 00:00:00 2001 From: Adarnof Date: Fri, 12 Feb 2016 22:35:07 +0000 Subject: [PATCH 4/8] Modified logical operators to prevent #262 --- services/managers/eve_api_manager.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/services/managers/eve_api_manager.py b/services/managers/eve_api_manager.py index 1f17bd73..dd47db80 100644 --- a/services/managers/eve_api_manager.py +++ b/services/managers/eve_api_manager.py @@ -286,11 +286,11 @@ class EveApiManager(): @staticmethod def validate_member_api(api_id, api_key): if settings.MEMBER_API_ACCOUNT: - if EveApiManager.check_api_is_type_account(api_id, api_key) is not True: + if EveApiManager.check_api_is_type_account(api_id, api_key) is False: logger.info("Api id %s is not type account as required for members - failed validation." % api_id) return False - if EveApiManager.check_api_is_full(api_id, api_key) is not True: + if EveApiManager.check_api_is_full(api_id, api_key) is False: logger.info("Api id %s does not meet member access mask requirements - failed validation." % api_id) return False return True @@ -298,10 +298,10 @@ class EveApiManager(): @staticmethod def validate_blue_api(api_id, api_key): if settings.BLUE_API_ACCOUNT: - if EveApiManager.check_api_is_type_account(api_id, api_key) is not True: + if EveApiManager.check_api_is_type_account(api_id, api_key) is False: logger.info("Api id %s is not type account as required for blues - failed validation." % api_id) return False - if EveApiManager.check_blue_api_is_full(api_id, api_key) is not True: + if EveApiManager.check_blue_api_is_full(api_id, api_key) is False: logger.info("Api id %s does not meet minimum blue access mask requirements - failed validation." % api_id) return False return True From 1d99ef69d1cc8c9074e58c242d911b9e7dcc63d1 Mon Sep 17 00:00:00 2001 From: Adarnof Date: Sat, 13 Feb 2016 05:25:57 +0000 Subject: [PATCH 5/8] Front-end notification model Context processor to count notifications for display in base template Logging handler to generate notifications for users with permission --- README.md | 3 ++- alliance_auth/settings.py.example | 2 ++ notifications/__init__.py | 0 notifications/admin.py | 3 +++ notifications/context_processors.py | 4 ++++ notifications/handlers.py | 14 ++++++++++++++ notifications/models.py | 28 ++++++++++++++++++++++++++++ notifications/tests.py | 3 +++ notifications/views.py | 26 ++++++++++++++++++++++++++ util/__init__.py | 1 + 10 files changed, 83 insertions(+), 1 deletion(-) create mode 100644 notifications/__init__.py create mode 100644 notifications/admin.py create mode 100644 notifications/context_processors.py create mode 100644 notifications/handlers.py create mode 100644 notifications/models.py create mode 100644 notifications/tests.py create mode 100644 notifications/views.py diff --git a/README.md b/README.md index d38b8bd6..d23a57bf 100755 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ Join us in-game in the channel allianceauth for help and feature requests. Special Thanks: - Thanking [Nikdoof](https://github.com/nikdoof), without his old auth + Thanking Nikdoof, without his old auth implementation this project wouldn't be as far as it is now. Thanks to Raynaldo for his original work on this system and getting it as far as it is today. @@ -74,6 +74,7 @@ Special Permissions In Admin: auth | user | sigtracker_view ( Allows for an individual view signitures) auth | user | optimer_management ( Allows for an individual to create and remove fleet operations) auth | user | optimer_view ( Allows for an individual view fleet operations) + auth | user | logging_notifications ( Generate notifications from logging) Active Developers diff --git a/alliance_auth/settings.py.example b/alliance_auth/settings.py.example index 56ea232b..ed91e333 100755 --- a/alliance_auth/settings.py.example +++ b/alliance_auth/settings.py.example @@ -61,6 +61,7 @@ INSTALLED_APPS = ( 'sigtracker', 'optimer', 'corputils', + 'notifications', ) MIDDLEWARE_CLASSES = ( @@ -126,6 +127,7 @@ TEMPLATE_CONTEXT_PROCESSORS = ( 'util.context_processors.domain_url', 'util.context_processors.member_api_mask', 'util.context_processors.blue_api_mask', + 'notifications.context_processors.user_notification_count', ) TEMPLATE_DIRS = ( diff --git a/notifications/__init__.py b/notifications/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/notifications/admin.py b/notifications/admin.py new file mode 100644 index 00000000..8c38f3f3 --- /dev/null +++ b/notifications/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/notifications/context_processors.py b/notifications/context_processors.py new file mode 100644 index 00000000..d5985eff --- /dev/null +++ b/notifications/context_processors.py @@ -0,0 +1,4 @@ +from .models import Notification + +def user_notification_count(request): + return len(Notification.objects.filter(user=request.user).filter(viewed=False)) diff --git a/notifications/handlers.py b/notifications/handlers.py new file mode 100644 index 00000000..a047e279 --- /dev/null +++ b/notifications/handlers.py @@ -0,0 +1,14 @@ +import logging +from django.contrib.auth.models import User +from .models import Notification + +def NotificationHandler(logging.Handler): + def emit(self, record): + for user in User.objects.all(): + if user.has_perm('auth.logging_notifications'): + notif = Notification() + notif.user = user + notif.title = "%s [%s:%s]" % (record.levelname, record.funcName, record.lineno) + notif.level = str([item[0] for item in Notification.LEVEL_CHOICES if item[1] == record.levelname]) + notif.message = record.getMessage() + notif.save() diff --git a/notifications/models.py b/notifications/models.py new file mode 100644 index 00000000..f92c6852 --- /dev/null +++ b/notifications/models.py @@ -0,0 +1,28 @@ +from django.db import models +from django.contrib.auth.models import User + +class Notification(models.Model): + + LEVEL_CHOICES = ( + ('danger', 'CRITICAL'), + ('danger', 'ERROR'), + ('warning', 'WARN'), + ('info', 'INFO'), + ('success', 'DEBUG'), + ) + + user = models.ForeignKey(User, on_delete=models.CASCADE) + level = models.CharField(choices=LEVEL_CHOICES, max_length=10) + title = models.CharField(max_length=254) + message = models.TextField() + created = models.DateTimeField(auto_now_add=True) + viewed = models.BooleanField() + + def view(self): + logger.info("Marking notification as viewed: %s" % self) + self.viewed = True + self.save() + + def __unicode__(self): + output = "%s: %s" % (self.user, self.title) + return output.encode('utf-8') diff --git a/notifications/tests.py b/notifications/tests.py new file mode 100644 index 00000000..7ce503c2 --- /dev/null +++ b/notifications/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/notifications/views.py b/notifications/views.py new file mode 100644 index 00000000..63076dd6 --- /dev/null +++ b/notifications/views.py @@ -0,0 +1,26 @@ +from django.shortcuts import render, get_object_or_404 +from .models import Notification + +@login_required +def notification_list(request): + logger.debug("notification_list called by user %s" % request.user) + new_notifs = Notification.objects.filter(user=request.user).filter(read=False) + old_notifs = Notification.objects.filter(user=request.user).filter(read=True) + logger.debug("User %s has %s unread and %s read notifications" % (request.user, len(new_notifs), len(old_notifs))) + context = { + 'read': old_notifs, + 'unread': new_notifs, + } + return render(request, 'registered/notification_list.html', context) + +@login_required +def notification_view(request, notif_id): + logger.debug("notification_view called by user %s for notif_id %s" % (request.user, notif_id)) + notif = get_object_or_404(notification, pk=notif_id) + if notif.user == request.user: + logger.debug("Providing notification for user %s" % request.user) + context = {'notification': notif} + notif.view() + return render(request, 'registered/notification_view.html', context) + else: + logger.warn("User %s not authorized to view notif_id %s belonging to user %s" % (request.user, notif_id, notif.user)) diff --git a/util/__init__.py b/util/__init__.py index 6f90971a..339b36bb 100755 --- a/util/__init__.py +++ b/util/__init__.py @@ -27,6 +27,7 @@ def bootstrap_permissions(): Permission.objects.get_or_create(codename="signature_view", content_type=ct, name="signature_view") Permission.objects.get_or_create(codename="optimer_management", content_type=ct, name="optimer_management") Permission.objects.get_or_create(codename="optimer_view", content_type=ct, name="optimer_view") + Permission.objects.get_or_create(codename="logging_notifications", content_type=ct, name="logging_notifications") Group.objects.get_or_create(name=settings.DEFAULT_AUTH_GROUP) Group.objects.get_or_create(name=settings.DEFAULT_BLUE_GROUP) logger.info("Bootstrapped permissions for auth and created default groups.") From 5e2c828c3b744807b3ea337c5d4fd711ca6def41 Mon Sep 17 00:00:00 2001 From: Adarnof Date: Sat, 13 Feb 2016 21:53:43 +0000 Subject: [PATCH 6/8] Front-end notification system Currently only creates notifications for logging events Addresses #75 --- alliance_auth/settings.py.example | 37 ++++++---- alliance_auth/urls.py | 3 + notifications/admin.py | 3 +- notifications/context_processors.py | 2 +- notifications/handlers.py | 4 +- notifications/models.py | 10 ++- notifications/views.py | 15 ++-- stock/templates/public/base.html | 9 +++ .../registered/notification_list.html | 74 +++++++++++++++++++ .../registered/notification_view.html | 22 ++++++ 10 files changed, 152 insertions(+), 27 deletions(-) create mode 100644 stock/templates/registered/notification_list.html create mode 100644 stock/templates/registered/notification_view.html diff --git a/alliance_auth/settings.py.example b/alliance_auth/settings.py.example index ed91e333..830ed9ad 100755 --- a/alliance_auth/settings.py.example +++ b/alliance_auth/settings.py.example @@ -410,67 +410,72 @@ LOGGING = { 'level': 'DEBUG', # edit this line to change logging level to console 'class': 'logging.StreamHandler', 'formatter': 'verbose', - } + }, + 'notifications': { # creates notifications for users with logging_notifications permission + 'level': 'ERROR', # edit this line to change logging level to notifications + 'class': 'notifications.handlers.NotificationHandler', + 'formatter': 'verbose', + }, }, 'loggers': { 'authentication': { - 'handlers': ['log_file', 'console'], + 'handlers': ['log_file', 'console', 'notifications'], 'level': 'DEBUG', }, 'celerytask': { - 'handlers': ['log_file', 'console'], + 'handlers': ['log_file', 'console', 'notifications'], 'level': 'DEBUG', }, 'eveonline': { - 'handlers': ['log_file', 'console'], + 'handlers': ['log_file', 'console', 'notifications'], 'level': 'DEBUG', }, 'groupmanagement': { - 'handlers': ['log_file', 'console'], + 'handlers': ['log_file', 'console', 'notifications'], 'level': 'DEBUG', }, 'hrapplications': { - 'handlers': ['log_file', 'console'], + 'handlers': ['log_file', 'console', 'notifications'], 'level': 'DEBUG', }, 'portal': { - 'handlers': ['log_file', 'console'], + 'handlers': ['log_file', 'console', 'notifications'], 'level': 'DEBUG', }, 'registration': { - 'handlers': ['log_file', 'console'], + 'handlers': ['log_file', 'console', 'notifications'], 'level': 'DEBUG', }, 'services': { - 'handlers': ['log_file', 'console'], + 'handlers': ['log_file', 'console', 'notifications'], 'level': 'DEBUG', }, 'srp': { - 'handlers': ['log_file', 'console'], + 'handlers': ['log_file', 'console', 'notifications'], 'level': 'DEBUG', }, 'timerboard': { - 'handlers': ['log_file', 'console'], + 'handlers': ['log_file', 'console', 'notifications'], 'level': 'DEBUG', }, 'sigtracker': { - 'handlers': ['log_file', 'console'], + 'handlers': ['log_file', 'console', 'notifications'], 'level': 'DEBUG', }, 'optimer': { - 'handlers': ['log_file', 'console'], + 'handlers': ['log_file', 'console', 'notifications'], 'level': 'DEBUG', }, 'corputils': { - 'handlers': ['log_file', 'console'], + 'handlers': ['log_file', 'console', 'notifications'], 'level': 'DEBUG', }, 'util': { - 'handlers': ['log_file', 'console'], + 'handlers': ['log_file', 'console', 'notifications'], 'level': 'DEBUG', }, 'django': { - 'handlers': ['log_file', 'console'], + 'handlers': ['log_file', 'console', 'notifications'], 'level': 'ERROR', }, } diff --git a/alliance_auth/urls.py b/alliance_auth/urls.py index df632863..5325ea52 100755 --- a/alliance_auth/urls.py +++ b/alliance_auth/urls.py @@ -186,4 +186,7 @@ urlpatterns = patterns('', url(r'^remove_optimer/(\w+)', 'optimer.views.remove_optimer', name='auth_remove_optimer'), url(r'^edit_optimer/(\w+)$', 'optimer.views.edit_optimer', name='auth_edit_optimer'), + # Notifications + url(r'^notifications/$', 'notifications.views.notification_list', name='auth_notification_list'), + url(r'^notifications/(\w+)/$', 'notifications.views.notification_view', name='auth_notification_view'), ) diff --git a/notifications/admin.py b/notifications/admin.py index 8c38f3f3..56893293 100644 --- a/notifications/admin.py +++ b/notifications/admin.py @@ -1,3 +1,4 @@ from django.contrib import admin +from.models import Notification -# Register your models here. +admin.site.register(Notification) diff --git a/notifications/context_processors.py b/notifications/context_processors.py index d5985eff..1c9a5385 100644 --- a/notifications/context_processors.py +++ b/notifications/context_processors.py @@ -1,4 +1,4 @@ from .models import Notification def user_notification_count(request): - return len(Notification.objects.filter(user=request.user).filter(viewed=False)) + return {'notifications':len(Notification.objects.filter(user__id=request.user.id).filter(viewed=False))} diff --git a/notifications/handlers.py b/notifications/handlers.py index a047e279..bdffeb33 100644 --- a/notifications/handlers.py +++ b/notifications/handlers.py @@ -2,13 +2,13 @@ import logging from django.contrib.auth.models import User from .models import Notification -def NotificationHandler(logging.Handler): +class NotificationHandler(logging.Handler): def emit(self, record): for user in User.objects.all(): if user.has_perm('auth.logging_notifications'): notif = Notification() notif.user = user notif.title = "%s [%s:%s]" % (record.levelname, record.funcName, record.lineno) - notif.level = str([item[0] for item in Notification.LEVEL_CHOICES if item[1] == record.levelname]) + notif.level = str([item[0] for item in Notification.LEVEL_CHOICES if item[1] == record.levelname][0]) notif.message = record.getMessage() notif.save() diff --git a/notifications/models.py b/notifications/models.py index f92c6852..cf0d688d 100644 --- a/notifications/models.py +++ b/notifications/models.py @@ -1,5 +1,8 @@ from django.db import models from django.contrib.auth.models import User +import logging + +logger = logging.getLogger(__name__) class Notification(models.Model): @@ -15,8 +18,8 @@ class Notification(models.Model): level = models.CharField(choices=LEVEL_CHOICES, max_length=10) title = models.CharField(max_length=254) message = models.TextField() - created = models.DateTimeField(auto_now_add=True) - viewed = models.BooleanField() + timestamp = models.DateTimeField(auto_now_add=True) + viewed = models.BooleanField(default=False) def view(self): logger.info("Marking notification as viewed: %s" % self) @@ -26,3 +29,6 @@ class Notification(models.Model): def __unicode__(self): output = "%s: %s" % (self.user, self.title) return output.encode('utf-8') + + def set_level(self, level): + self.level = [item[0] for item in self.LEVEL_CHOICES if item[1] == level][0] diff --git a/notifications/views.py b/notifications/views.py index 63076dd6..7fa53a48 100644 --- a/notifications/views.py +++ b/notifications/views.py @@ -1,11 +1,15 @@ -from django.shortcuts import render, get_object_or_404 +from django.shortcuts import render, get_object_or_404, redirect from .models import Notification +from django.contrib.auth.decorators import login_required +import logging + +logger = logging.getLogger(__name__) @login_required def notification_list(request): logger.debug("notification_list called by user %s" % request.user) - new_notifs = Notification.objects.filter(user=request.user).filter(read=False) - old_notifs = Notification.objects.filter(user=request.user).filter(read=True) + new_notifs = Notification.objects.filter(user=request.user).filter(viewed=False) + old_notifs = Notification.objects.filter(user=request.user).filter(viewed=True) logger.debug("User %s has %s unread and %s read notifications" % (request.user, len(new_notifs), len(old_notifs))) context = { 'read': old_notifs, @@ -16,11 +20,12 @@ def notification_list(request): @login_required def notification_view(request, notif_id): logger.debug("notification_view called by user %s for notif_id %s" % (request.user, notif_id)) - notif = get_object_or_404(notification, pk=notif_id) + notif = get_object_or_404(Notification, pk=notif_id) if notif.user == request.user: logger.debug("Providing notification for user %s" % request.user) - context = {'notification': notif} + context = {'notif': notif} notif.view() return render(request, 'registered/notification_view.html', context) else: logger.warn("User %s not authorized to view notif_id %s belonging to user %s" % (request.user, notif_id, notif.user)) + return redirect('auth_notification_list') diff --git a/stock/templates/public/base.html b/stock/templates/public/base.html index a1c89870..b9f81154 100755 --- a/stock/templates/public/base.html +++ b/stock/templates/public/base.html @@ -47,6 +47,15 @@