diff --git a/celerytask/tasks.py b/celerytask/tasks.py index 75fe51e9..559cd4ad 100755 --- a/celerytask/tasks.py +++ b/celerytask/tasks.py @@ -1,6 +1,7 @@ from django.conf import settings from celery.task import periodic_task from django.contrib.auth.models import User +from django.contrib.auth.models import Group from models import SyncGroupCache from celery.task.schedules import crontab @@ -31,7 +32,7 @@ import logging logger = logging.getLogger(__name__) -def disable_member(user, char_id): +def disable_member(user): logger.debug("Disabling member %s" % user) if user.user_permissions.all().exists(): logger.info("Clearning user %s permission to deactivate user." % user) @@ -276,7 +277,7 @@ def make_member(user): 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(g.name, "Corp_"): + 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) @@ -305,29 +306,29 @@ def make_blue(user): auth.is_blue = True auth.save() for g in user.groups.all(): - if str.startswith(g.name, 'Corp_'): + if str.startswith(str(g.name), 'Corp_'): logger.info("Removing blue user %s from corp group %s" % (user, g)) user.groups.remove(g) def determine_membership_by_character(char): if settings.IS_CORP: if char.corporation_id == settings.CORP_ID: - logger.debug("User %s main character %s in owning corp id %s" % (user, char, char.corporation_id)) + logger.debug("Character %s in owning corp id %s" % (char, char.corporation_id)) return "MEMBER" else: if char.alliance_id == settings.ALLIANCE_ID: - logger.debug("User %s main character %s in owning alliance id %s" % (user, char, char.alliance_id)) + logger.debug("Character %s in owning alliance id %s" % (char, char.alliance_id)) return "MEMBER" - if EveCorporation.objects.filter(corporation_id=char.corporation_id).exists() is False: - logger.debug("No corp model for user %s main character %s corp id %s. Unable to check standings. Non-member." % (user, char, char.corporation_id)) + 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." % (char, char.corporation_id)) return False else: - corp = EveCorporation.objects.get(corporation_id=char.corporation_id) + corp = EveCorporationInfo.objects.get(corporation_id=char.corporation_id) if corp.is_blue: - logger.debug("User %s main character %s member of blue corp %s" % (user, char, corp)) + logger.debug("Character %s member of blue corp %s" % (char, corp)) return "BLUE" else: - logger.debug("User %s main character %s member of non-blue corp %s. Non-member." % (user, char, corp)) + logger.debug("Character %s member of non-blue corp %s. Non-member." % (char, corp)) return False def determine_membership_by_user(user): @@ -338,12 +339,21 @@ def determine_membership_by_user(user): char = EveCharacter.objects.get(character_id=auth.main_char_id) return determine_membership_by_character(char) else: - logger.debug("Character model matching user %s main character id %s does not exist. Non-member." % (user, auth.main_character_id)) + logger.debug("Character model matching user %s main character id %s does not exist. Non-member." % (user, auth.main_char_id)) return False else: logger.debug("User %s has no main character set. Non-member." % user) return False +def set_state(user): + state = determine_membership_by_user(user) + if state == "MEMBER": + make_member(user) + elif state == "BLUE": + make_blue(user) + else: + disable_member(user) + # Run every minute @periodic_task(run_every=crontab(minute="*/1")) def run_databaseUpdate(): @@ -460,6 +470,10 @@ def run_api_refresh(): 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) # 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/forms.py b/eveonline/forms.py index 8b4d0590..a4fb4c17 100644 --- a/eveonline/forms.py +++ b/eveonline/forms.py @@ -12,34 +12,36 @@ import logging logger = logging.getLogger(__name__) class UpdateKeyForm(forms.Form): - def __init__(self, user_state=None, *args, **kwargs): - super(UpdateKeyForm, self).__init__(args, kwargs) - self.user_state=user_state + user_state = None api_id = forms.CharField(max_length=254, required=True, label="Key ID") api_key = forms.CharField(max_length=254, required=True, label="Verification Code") def clean(self): - if EveManager.check_if_api_key_pair_exist(self.cleaned_data['api_id']): - logger.debug("UpdateKeyForm failed cleaning as API id %s already exists." % self.cleaned_data['api_id']) - raise forms.ValidationError(u'API key already exist') + super(UpdateKeyForm, self).clean() - chars = EveApiManager.get_characters_from_api(self.cleaned_data['api_id'], self.cleaned_data['api_key']).result - states = [] - states.append(self.user_state) - for char in chars: - evechar = EveCharacter() - evechar.character_name = chars[char]['name'] - evechar.corporation_id = chars[char]['corp']['id'] - evechar.alliance_id = chars[char]['alliance']['id'] - state = determine_membership_by_character(evechar) - logger.debug("API ID %s character %s has state %s" % (self.cleaned_data['api_id'], evechar, state)) - states.append(state) + if 'api_id' in self.cleaned_data and 'api_key' in self.cleaned_data: + logger.debug("Form has id and key") + if EveManager.check_if_api_key_pair_exist(self.cleaned_data['api_id']): + logger.debug("UpdateKeyForm failed cleaning as API id %s already exists." % self.cleaned_data['api_id']) + raise forms.ValidationError(u'API key already exist') - if 'MEMBER' in states: - if EveApiManager.validate_member_api(self.cleaned_data['api_id'], self.cleaned_data['api_key']) is False: - raise forms.ValidationError(u'API does not meet requirements: account: %s mask: %s' % (settings.MEMBER_API_ACCOUNT, settings.MEMBER_API_MASK)) - if 'BLUE' in states: - if EveApiManager.validate_blue_api(self.cleaned_data['api_id'], self.cleaned_data['api_key']) is False: - raise forms.ValidationError(u'API does not meet requirements: account: %s mask: %s' % (settings.BLUE_API_ACCOUNT, settings.BLUE_API_MASK)) + chars = EveApiManager.get_characters_from_api(self.cleaned_data['api_id'], self.cleaned_data['api_key']).result + states = [] + states.append(self.user_state) + for char in chars: + evechar = EveCharacter() + evechar.character_name = chars[char]['name'] + evechar.corporation_id = chars[char]['corp']['id'] + evechar.alliance_id = chars[char]['alliance']['id'] + state = determine_membership_by_character(evechar) + logger.debug("API ID %s character %s has state %s" % (self.cleaned_data['api_id'], evechar, state)) + states.append(state) + + if 'MEMBER' in states: + if EveApiManager.validate_member_api(self.cleaned_data['api_id'], self.cleaned_data['api_key']) is False: + raise forms.ValidationError(u'API does not meet requirements: account: %s mask: %s' % (settings.MEMBER_API_ACCOUNT, settings.MEMBER_API_MASK)) + if 'BLUE' in states: + if EveApiManager.validate_blue_api(self.cleaned_data['api_id'], self.cleaned_data['api_key']) is False: + raise forms.ValidationError(u'API does not meet requirements: account: %s mask: %s' % (settings.BLUE_API_ACCOUNT, settings.BLUE_API_MASK)) return self.cleaned_data diff --git a/eveonline/views.py b/eveonline/views.py index 1d3db1a9..c4b35463 100755 --- a/eveonline/views.py +++ b/eveonline/views.py @@ -21,6 +21,7 @@ from eveonline.models import EveCharacter from eveonline.models import EveApiKeyPair from authentication.models import AuthServicesInfo from celerytask.tasks import determine_membership_by_user +from celerytask.tasks import set_state import logging @@ -49,7 +50,8 @@ def add_api_key(request): logger.debug("add_api_key called by user %s" % request.user) user_state = determine_membership_by_user(request.user) if request.method == 'POST': - form = UpdateKeyForm(request.POST, user_state=user_state) + form = UpdateKeyForm(request.POST) + form.user_state=user_state logger.debug("Request type POST with form valid: %s" % form.is_valid()) if form.is_valid(): EveManager.create_api_keypair(form.cleaned_data['api_id'], @@ -66,7 +68,8 @@ def add_api_key(request): logger.debug("Form invalid: returning to form.") else: logger.debug("Providing empty update key form for user %s" % request.user) - form = UpdateKeyForm(user_state=user_state) + form = UpdateKeyForm() + form.user_state = user_state context = {'form': form, 'apikeypairs': EveManager.get_api_key_pairs(request.user.id)} return render_to_response('registered/addapikey.html', context, context_instance=RequestContext(request)) @@ -117,41 +120,8 @@ def characters_view(request): def main_character_change(request, char_id): logger.debug("main_character_change called by user %s for character id %s" % (request.user, char_id)) if EveManager.check_if_character_owned_by_user(char_id, request.user): - previousmainid = AuthServicesInfoManager.get_auth_service_info(request.user).main_char_id AuthServicesInfoManager.update_main_char_Id(char_id, request.user) - # Check if character is in the alliance - character_info = EveManager.get_character_by_id(char_id) - corporation_info = EveManager.get_corporation_info_by_id(character_info.corporation_id) - logger.debug("User %s changing main character to %s in corp %s" % (request.user, character_info, corporation_info)) - if (settings.IS_CORP and EveManager.get_charater_corporation_id_by_id(char_id) == settings.CORP_ID) or (not settings.IS_CORP and EveManager.get_charater_alliance_id_by_id(char_id) == settings.ALLIANCE_ID): - add_member_permission(request.user, 'member') - add_user_to_group(request.user, settings.DEFAULT_AUTH_GROUP) - add_user_to_group(request.user, - generate_corp_group_name(EveManager.get_character_by_id(char_id).corporation_name)) - logger.info("User %s transitioned to full member by chaning main character to %s" % (request.user, character_info)) - - elif corporation_info != None: - if corporation_info.is_blue: - add_member_permission(request.user, 'blue_member') - add_user_to_group(request.user, settings.DEFAULT_BLUE_GROUP) - AuthServicesInfoManager.update_is_blue(True, request.user) - logger.info("User %s transitioned to blue by changing main character to %s" % (request.user, character_info)) - else: - if check_if_user_has_permission(request.user, 'member'): - disable_member(request.user, previousmainid) - - if check_if_user_has_permission(request.user, 'blue_member'): - disable_blue_member(request.user) - logger.info("User %s disabled as new main character %s not member nor blue." % (request.user, character_info)) - else: - # TODO: disable serivces - if check_if_user_has_permission(request.user, 'member'): - disable_member(request.user, previousmainid) - - if check_if_user_has_permission(request.user, 'blue_member'): - disable_blue_member(request.user) - logger.info("User %s disabled as new main character %s does not have corp model to check." % (request.user, character_info)) - + set_state(request.user) return HttpResponseRedirect("/characters") return HttpResponseRedirect("/characters")