Merge pull request #3 from R4stl1n/master

added corp utils
This commit is contained in:
Mr McClain 2016-01-31 20:13:12 -06:00
commit 22b84588de
31 changed files with 982 additions and 509 deletions

View File

@ -6,21 +6,16 @@
<option name="rootFolder" value="$MODULE_DIR$" /> <option name="rootFolder" value="$MODULE_DIR$" />
<option name="settingsModule" value="settings.py" /> <option name="settingsModule" value="settings.py" />
<option name="manageScript" value="manage.py" /> <option name="manageScript" value="manage.py" />
<option name="environment" value="&lt;map/&gt;" />
</configuration> </configuration>
</facet> </facet>
</component> </component>
<component name="NewModuleRootManager"> <component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" /> <content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" /> <orderEntry type="jdk" jdkName="Python 2.7.6 (/usr/bin/python2.7)" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" /> <orderEntry type="sourceFolder" forTests="false" />
</component> </component>
<component name="TemplatesService"> <component name="TemplatesService">
<option name="TEMPLATE_CONFIGURATION" value="Django" /> <option name="TEMPLATE_CONFIGURATION" value="Django" />
<option name="TEMPLATE_FOLDERS">
<list>
<option value="$MODULE_DIR$/templates" />
</list>
</option>
</component> </component>
</module> </module>

View File

@ -66,6 +66,7 @@ Special Permissions In Admin:
auth | user | jabber_broadcast_all ( Can choose from all groups and the 'all' option when broadcasting) auth | user | jabber_broadcast_all ( Can choose from all groups and the 'all' option when broadcasting)
auth | user | blue_member ( Auto Added to people who register has a blue when adding api key) auth | user | blue_member ( Auto Added to people who register has a blue when adding api key)
auth | user | corp_stats ( View basic corp auth stats *who is authed etc*) auth | user | corp_stats ( View basic corp auth stats *who is authed etc*)
auth | user | corputils ( View who has registered APIs, which alts belong to which main, and more. )
auth | user | timer_management ( Access to create and remove timers) auth | user | timer_management ( Access to create and remove timers)
auth | user | timer_view ( Access to timerboard to view timers) auth | user | timer_view ( Access to timerboard to view timers)
auth | user | srp_management ( Allows for an individual to create and remove srp fleets and fleet data) auth | user | srp_management ( Allows for an individual to create and remove srp fleets and fleet data)

View File

@ -60,6 +60,7 @@ INSTALLED_APPS = (
'srp', 'srp',
'sigtracker', 'sigtracker',
'optimer', 'optimer',
'corputils',
) )
MIDDLEWARE_CLASSES = ( MIDDLEWARE_CLASSES = (
@ -157,6 +158,12 @@ USE_TZ = True
STATIC_URL = '/static/' STATIC_URL = '/static/'
STATIC_ROOT = '/home/allianceserver/allianceauth/static/' STATIC_ROOT = '/home/allianceserver/allianceauth/static/'
# Cache directory for EveWho, no ending /
# by default this becomes ~/<installdir>/alliance_auth/cache
# This directory needs to be writable by the webserver
EVEWHO_CACHE_DIR = '{}/cache'.format(BASE_DIR)
##################################################### #####################################################
## ##
## Auth configuration starts here ## Auth configuration starts here
@ -448,6 +455,10 @@ LOGGING = {
'handlers': ['log_file', 'console'], 'handlers': ['log_file', 'console'],
'level': 'DEBUG', 'level': 'DEBUG',
}, },
'corputils': {
'handlers': ['log_file', 'console'],
'level': 'DEBUG',
},
'util': { 'util': {
'handlers': ['log_file', 'console'], 'handlers': ['log_file', 'console'],
'level': 'DEBUG', 'level': 'DEBUG',

View File

@ -163,13 +163,19 @@ urlpatterns = patterns('',
url(r'srp_request_amount_update/(\w+)', 'srp.views.srp_request_update_amount_view', url(r'srp_request_amount_update/(\w+)', 'srp.views.srp_request_update_amount_view',
name="auth_srp_request_update_amount_view"), name="auth_srp_request_update_amount_view"),
# FLEET FITTINGS #corputils
url(r'^fits/$', 'services.views.fleet_fits', name='auth_fleet_fits'), url(r'^corputils/$', 'corputils.views.corp_member_view', name='auth_corp_member_view'),
url(r'^corputils/(?P<corpid>[0-9]+)/$', 'corputils.views.corp_member_view'),
url(r'^corputils/search/$', 'corputils.views.corputils_search', name="auth_corputils_search"),
url(r'^corputils/search/(?P<corpid>[0-9]+)/$', 'corputils.views.corputils_search'),
# Sig Tracker # FLEET FITTINGS
url(r'^sigtracker/$', 'sigtracker.views.sigtracker_view', name='auth_signature_view'), url(r'^fits/$', 'services.views.fleet_fits', name='auth_fleet_fits'),
url(r'^add_signature/$', 'sigtracker.views.add_signature_view', name='auth_add_signature_view'),
url(r'^remove_signature/(\w+)', 'sigtracker.views.remove_signature', name='auth_remove_signature'), # Sig Tracker
url(r'^sigtracker/$', 'sigtracker.views.sigtracker_view', name='auth_signature_view'),
url(r'^add_signature/$', 'sigtracker.views.add_signature_view', name='auth_add_signature_view'),
url(r'^remove_signature/(\w+)', 'sigtracker.views.remove_signature', name='auth_remove_signature'),
# Fleet Operations Timers # Fleet Operations Timers
url(r'^optimer/$', 'optimer.views.optimer_view', name='auth_optimer_view'), url(r'^optimer/$', 'optimer.views.optimer_view', name='auth_optimer_view'),

View File

@ -1,6 +1,7 @@
from django.conf import settings from django.conf import settings
from celery.task import periodic_task from celery.task import periodic_task
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.contrib.auth.models import Group
from models import SyncGroupCache from models import SyncGroupCache
from celery.task.schedules import crontab from celery.task.schedules import crontab
@ -31,31 +32,15 @@ import logging
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
def disable_alliance_member(user, char_id): def disable_member(user):
logger.debug("Disabling alliance member %s" % user) logger.debug("Disabling member %s" % user)
remove_member_permission(user, 'member') if user.user_permissions.all().exists():
remove_user_from_group(user, settings.DEFAULT_AUTH_GROUP) logger.info("Clearning user %s permission to deactivate user." % user)
remove_user_from_group(user, user.user_permissions.clear()
generate_corp_group_name( if user.groups.all().exists():
EveManager.get_character_by_id(char_id).corporation_name)) logger.info("Clearing user %s groups to deactivate user." % user)
user.groups.clear()
deactivate_services(user) deactivate_services(user)
logger.info("Disabled alliance member %s" % user)
def disable_expired_member(user):
logger.debug("Disabling expired member %s" % user)
deactivate_services(user)
user.user_permissions.clear()
user.groups.clear()
user.save()
logger.info("Disabled expired member %s" % user)
def disable_blue_member(user):
logger.debug("Disabling blue member %s" % user)
remove_member_permission(user, 'blue_member')
remove_user_from_group(user, settings.DEFAULT_BLUE_GROUP)
deactivate_services(user)
AuthServicesInfoManager.update_is_blue(False, user)
logger.info("Disabled blue member %s" % user)
def is_teamspeak3_active(): def is_teamspeak3_active():
return settings.ENABLE_AUTH_TEAMSPEAK3 or settings.ENABLE_BLUE_TEAMSPEAK3 return settings.ENABLE_AUTH_TEAMSPEAK3 or settings.ENABLE_BLUE_TEAMSPEAK3
@ -260,6 +245,115 @@ def remove_from_databases(user, groups, syncgroups):
logger.debug("User %s has discord uid %s - updating groups." % (user, authserviceinfo.discord_uid)) logger.debug("User %s has discord uid %s - updating groups." % (user, authserviceinfo.discord_uid))
update_discord_groups(user) update_discord_groups(user)
def make_member(user):
logger.debug("Ensuring user %s has member permissions and groups." % user)
# ensure member is not blue right now
if check_if_user_has_permission(user, 'blue_member'):
logger.info("Removing user %s blue permission to transition to member" % user)
remove_member_permission(user, 'blue_member')
blue_group, c = Group.objects.get_or_create(name=settings.DEFAULT_BLUE_GROUP)
if blue_group in user.groups.all():
logger.info("Removing user %s blue group" % user)
user.groups.remove(blue_group)
# make member
if check_if_user_has_permission(user, 'member') is False:
logger.info("Adding user %s member permission" % user)
add_member_permission(user, 'member')
member_group, c = Group.objects.get_or_create(name=settings.DEFAULT_AUTH_GROUP)
if member_group in user.groups.all() is False:
logger.info("Adding user %s to member group" % user)
user.groups.add(member_group)
auth, c = AuthServicesInfo.objects.get_or_create(user=user)
if auth.is_blue:
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)
def make_blue(user):
logger.debug("Ensuring user %s has blue permissions and groups." % user)
# ensure user is not a member
if check_if_user_has_permission(user, 'member'):
logger.info("Removing user %s member permission to transition to blue" % user)
remove_member_permission(user, 'blue_member')
member_group, c = Group.objects.get_or_create(name=settings.DEFAULT_AUTH_GROUP)
if member_group in user.groups.all():
logger.info("Removing user %s member group" % user)
user.groups.remove(member_group)
# make blue
if check_if_user_has_permission(user, 'blue_member') is False:
logger.info("Adding user %s blue permission" % user)
add_member_permission(user, 'blue_member')
blue_group, c = Group.objects.get_or_create(name=settings.DEFAULT_BLUE_GROUP)
if blue_group in user.groups.all() is False:
logger.info("Adding user %s to blue group" % user)
user.groups.add(blue_group)
auth, c = AuthServicesInfo.objects.get_or_create(user=user)
if auth.is_blue is False:
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)
def determine_membership_by_character(char):
if settings.IS_CORP:
if char.corporation_id == settings.CORP_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("Character %s in owning alliance id %s" % (char, char.alliance_id))
return "MEMBER"
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 = EveCorporationInfo.objects.get(corporation_id=char.corporation_id)
if corp.is_blue:
logger.debug("Character %s member of blue corp %s" % (char, corp))
return "BLUE"
else:
logger.debug("Character %s member of non-blue corp %s. Non-member." % (char, corp))
return False
def determine_membership_by_user(user):
logger.debug("Determining membership of user %s" % user)
auth, c = AuthServicesInfo.objects.get_or_create(user=user)
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)
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_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)
logger.debug("Assigning user %s to state %s" % (user, state))
if state == "MEMBER":
make_member(user)
elif state == "BLUE":
make_blue(user)
else:
disable_member(user)
# Run every minute # Run every minute
@periodic_task(run_every=crontab(minute="*/1")) @periodic_task(run_every=crontab(minute="*/1"))
@ -302,179 +396,93 @@ def run_api_refresh():
api_key_pairs = EveManager.get_api_key_pairs(user.id) api_key_pairs = EveManager.get_api_key_pairs(user.id)
logger.debug("User %s has api key pairs %s" % (user, api_key_pairs)) logger.debug("User %s has api key pairs %s" % (user, api_key_pairs))
if api_key_pairs: if api_key_pairs:
valid_key = False authserviceinfo, c = AuthServicesInfo.objects.get_or_create(user=user)
authserviceinfo = AuthServicesInfo.objects.get(user=user)
logger.debug("User %s has api keys. Proceeding to refresh." % user) logger.debug("User %s has api keys. Proceeding to refresh." % user)
if authserviceinfo.main_char_id: for api_key_pair in api_key_pairs:
if authserviceinfo.main_char_id != "": logger.debug("Running update on api key %s" % api_key_pair.api_id)
#preserve old corp ID for corp change test on members if EveApiManager.api_key_is_valid(api_key_pair.api_id, api_key_pair.api_key):
oldcorp_id = 0 #check to ensure API key meets min spec
if EveManager.get_character_by_id(authserviceinfo.main_char_id): logger.info("Determined api key %s is still active." % api_key_pair.api_id)
oldcorp_id = EveCharacter.objects.get(character_id=authserviceinfo.main_char_id).corporation_id still_valid = True
logger.debug("Determined user %s current main corp id %s" % (user, oldcorp_id)) state = determine_membership_by_user(user)
for api_key_pair in api_key_pairs: if state == "BLUE":
logger.debug("Running update on api key %s" % api_key_pair.api_id) if settings.BLUE_API_ACCOUNT:
if EveApiManager.api_key_is_valid(api_key_pair.api_id, api_key_pair.api_key): type = EveApiManager.check_api_is_type_account(api_key_pair.api_id, api_key_pair.api_key)
#check to ensure API key meets min spec if type == None:
logger.info("Determined api key %s is still active." % api_key_pair.api_id) api_key_pair.error_count += 1
still_valid = True api_key_pair.save()
if authserviceinfo.is_blue: 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))
if settings.BLUE_API_ACCOUNT: still_valid = None
type = EveApiManager.check_api_is_type_account(api_key_pair.api_id, api_key_pair.api_key) elif type == False:
if type == None: logger.info("Determined api key %s for blue user %s is no longer type account as requred." % (api_key_pair.api_id, user))
api_key_pair.error_count += 1 still_valid = False
api_key_pair.save() full = EveApiManager.check_blue_api_is_full(api_key_pair.api_id, api_key_pair.api_key)
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)) if full == None:
still_valid = None api_key_pair.error_count += 1
elif type == False: api_key_pair.save()
logger.info("Determined api key %s for blue user %s is no longer type account as requred." % (api_key_pair.api_id, user)) 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 = False still_valid = None
full = EveApiManager.check_blue_api_is_full(api_key_pair.api_id, api_key_pair.api_key) elif full == False:
if full == None: logger.info("Determined api key %s for blue user %s no longer meets minimum access mask as required." % (api_key_pair.api_id, user))
api_key_pair.error_count += 1 still_valid = False
api_key_pair.save() elif state == "MEMBER":
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)) if settings.MEMBER_API_ACCOUNT:
still_valid = None type = EveApiManager.check_api_is_type_account(api_key_pair.api_id, api_key_pair.api_key)
elif full == False: if type == None:
logger.info("Determined api key %s for blue user %s no longer meets minimum access mask as required." % (api_key_pair.api_id, user)) api_key_pair.error_count += 1
still_valid = False api_key_pair.save()
else: 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))
if settings.MEMBER_API_ACCOUNT: still_valid = None
type = EveApiManager.check_api_is_type_account(api_key_pair.api_id, api_key_pair.api_key) elif type == False:
if type == None: logger.info("Determined api key %s for user %s is no longer type account as required." % (api_key_pair.api_id, user))
api_key_pair.error_count += 1 still_valid = False
api_key_pair.save() full = EveApiManager.check_api_is_full(api_key_pair.api_id, api_key_pair.api_key)
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)) if full == None:
still_valid = None api_key_pair.error_count += 1
elif type == False: api_key_pair.save()
logger.info("Determined api key %s for user %s is no longer type account as required." % (api_key_pair.api_id, user)) 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 = False still_valid = None
full = EveApiManager.check_api_is_full(api_key_pair.api_id, api_key_pair.api_key) elif full == False:
if full == None: logger.info("Determined api key %s for user %s no longer meets minimum access mask as required." % (api_key_pair.api_id, user))
api_key_pair.error_count += 1 still_valid = False
api_key_pair.save() if still_valid == None:
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)) if api_key_pair.error_count >= 3:
still_valid = None logger.info("API key %s has incurred 3 or more errors. Assuming invalid." % api_key_pair.api_id)
elif full == False: still_valid = False
logger.info("Determined api key %s for user %s no longer meets minimum access mask as required." % (api_key_pair.api_id, user)) if still_valid == False:
still_valid = False logger.debug("API key %s has failed validation; it and its characters will be deleted." % api_key_pair.api_id)
if still_valid == None: EveManager.delete_characters_by_api_id(api_key_pair.api_id, user.id)
if api_key_pair.error_count >= 3: EveManager.delete_api_key_pair(api_key_pair.api_id, user.id)
logger.info("API key %s has incurred 3 or more errors. Assuming invalid." % api_key_pair.api_id) elif still_valid == True:
still_valid = False if api_key_pair.error_count != 0:
if still_valid == False: logger.info("Clearing error count for api %s as it passed validation" % api_key_pair.api_id)
logger.debug("API key %s has failed validation; it and its characters will be deleted." % api_key_pair.api_id) api_key_pair.error_count = 0
EveManager.delete_characters_by_api_id(api_key_pair.api_id, user.id) api_key_pair.save()
EveManager.delete_api_key_pair(api_key_pair.api_id, user.id) logger.info("Determined api key %s still meets requirements." % api_key_pair.api_id)
else: # Update characters
if api_key_pair.error_count != 0: characters = EveApiManager.get_characters_from_api(api_key_pair.api_id, api_key_pair.api_key)
logger.info("Clearing error count for api %s as it passed validation" % api_key_pair.api_id) EveManager.update_characters_from_list(characters)
api_key_pair.error_count = 0 new_character = False
api_key_pair.save() for char in characters.result:
logger.info("Determined api key %s still meets requirements." % api_key_pair.api_id) # Ensure we have a model for all characters on key
# Update characters if not EveManager.check_if_character_exist(characters.result[char]['name']):
characters = EveApiManager.get_characters_from_api(api_key_pair.api_id, new_character = True
api_key_pair.api_key) logger.debug("API key %s has a new character on the account: %s" % (api_key_pair.api_id, characters.result[char]['name']))
EveManager.update_characters_from_list(characters) if new_character:
new_character = False logger.debug("Creating new character %s from api key %s" % (characters.result[char]['name'], api_key_pair.api_id))
for char in characters.result: EveManager.create_characters_from_list(characters, user, api_key_pair.api_key)
# Ensure we have a model for all characters on key else:
if not EveManager.check_if_character_exist(characters.result[char]['name']): logger.debug("API key %s is no longer valid; it and its characters will be deleted." % api_key_pair.api_id)
new_character = True EveManager.delete_characters_by_api_id(api_key_pair.api_id, user.id)
logger.debug("API key %s has a new character on the account: %s" % (api_key_pair.api_id, characters.result[char]['name'])) EveManager.delete_api_key_pair(api_key_pair.api_id, user.id)
if new_character: # Check our main character
logger.debug("Creating new character %s from api key %s" % (characters.result[char]['name'], api_key_pair.api_id)) if EveCharacter.objects.filter(character_id=authserviceinfo.main_char_id).exists() is False:
EveManager.create_characters_from_list(characters, user, api_key_pair.api_key) logger.info("User %s main character id %s missing model. Clearning main character." % (user, authserviceinfo.main_char_id))
valid_key = True authserviceinfo.main_char_id = ''
else: authserviceinfo.save()
logger.debug("API key %s is no longer active; 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)
if valid_key:
# Check our main character
character = EveManager.get_character_by_id(authserviceinfo.main_char_id)
logger.debug("User %s has valid api key, checking main character %s" % (user, character))
if character is not None and EveManager.check_if_corporation_exists_by_id(character.corporation_id):
corp = EveManager.get_corporation_info_by_id(character.corporation_id)
main_corp_id = EveManager.get_charater_corporation_id_by_id(authserviceinfo.main_char_id)
main_alliance_id = EveManager.get_charater_alliance_id_by_id(authserviceinfo.main_char_id)
logger.debug("User %s main character %s has corp %s with alliance id %s" % (user, character, corp, main_alliance_id))
if (settings.IS_CORP and main_corp_id == settings.CORP_ID) or (not settings.IS_CORP and main_alliance_id == settings.ALLIANCE_ID):
logger.debug("User %s corp or alliance meets membership requirements. Ensuring has required permissions and groups." % user)
if not check_if_user_has_permission(user, "member"):
#transition from none or blue to member
if check_if_user_has_permission(user, "blue_member"):
#strip blue status
logger.debug("Removing user %s blue permission and group to prepare for member transition." % user)
remove_member_permission(user, "blue_member")
remove_user_from_group(user, settings.DEFAULT_BLUE_GROUP)
AuthServicesInfoManager.update_is_blue(False, user)
#add to auth group
add_member_permission(user, "member")
add_user_to_group(user, settings.DEFAULT_AUTH_GROUP)
#add to required corp group
add_user_to_group(user, generate_corp_group_name(character.corporation_name))
logger.info("User %s transitioned to full member during api refresh." % user)
elif corp.corporation_id != oldcorp_id:
#changed corps, both corps auth'd, need to change group assignment
logger.debug("User %s main character changed corp from id %s to %s, both meet membership requirements. Updating corp group." % (user, oldcorp_id, corp.corporation_id))
oldcorp = EveCorporationInfo.objects.get(corporation_id=oldcorp_id)
remove_user_from_group(user, generate_corp_group_name(oldcorp.corporation_name))
add_user_to_group(user, generate_corp_group_name(character.corporation_name))
#reset services to force new mumble names and group assignments
deactivate_services(user)
logger.info("User %s transferred corps from member to member. Reassigned groups." % user)
elif corp is not None:
logger.debug("User %s main corp %s does not meet membership requirements." % (user, corp))
if corp.is_blue is not True:
if check_if_user_has_permission(user, "member"):
#transition from member to nobody
disable_alliance_member(user, authserviceinfo.main_char_id)
logger.info("User %s no longer member: main has left member corp/alliance." % user)
elif check_if_user_has_permission(user, "blue_member"):
#transition from blue to nobody
disable_blue_member(user)
logger.info("User %s no longer blue: main has left blue entities." % user)
else:
#stay nobody, make sure no services
deactivate_services(user)
logger.debug("Ensured non-member %s has no services." % user)
else:
if check_if_user_has_permission(user, "member"):
#remove auth member to prepare for member to blue transition
disable_alliance_member(user, authserviceinfo.main_char_id)
logger.debug("Removed user %s member group/permissions to transition to blue." % user)
if not check_if_user_has_permission(user, "blue_member"):
#perform nobody to blue transition
add_member_permission(user, "blue_member")
add_user_to_group(user, settings.DEFAULT_BLUE_GROUP)
AuthServicesInfoManager.update_is_blue(True, user)
logger.info("User %s transitioned to blue member during api refresh." % user)
else:
# disable accounts with missing corp model (not blue or member)
if check_if_user_has_permission(user, "member"):
disable_alliance_member(user, authserviceinfo.main_char_id)
logger.info("User %s disabled (previously member) as unable to check missing corp model." % user)
elif check_if_user_has_permission(user, "blue_member"):
disable_blue_member(user)
logger.info("User %s disabled (previously blue) as unable to check missing corp model." % user)
else:
deactivate_services(user)
logger.debug("Ensured non-member %s has no services." % user)
else:
# nuke it, the hard way
disable_expired_member(user)
logger.info("User %s disabled due to missing main character or corp model." % user)
else:
# disable accounts with invalid keys
disable_expired_member(user)
logger.info("User %s has no valid api keys and has been disabled." % user)
else: else:
logger.warn("User %s has no main character id, unable to validate membership.") logger.warn("User %s has no main character id, unable to validate membership.")
set_state(user)
# Run Every 2 hours # Run Every 2 hours

0
corputils/__init__.py Normal file
View File

0
corputils/admin.py Normal file
View File

8
corputils/forms.py Normal file
View File

@ -0,0 +1,8 @@
from django import forms
from django.conf import settings
from eveonline.models import EveCorporationInfo
from eveonline.models import EveAllianceInfo
class CorputilsSearchForm(forms.Form):
search_string = forms.CharField(max_length=254, required=True, label="", widget=forms.TextInput(attrs={'placeholder': 'Search characters...'}))

0
corputils/models.py Normal file
View File

0
corputils/tests.py Normal file
View File

158
corputils/views.py Normal file
View File

@ -0,0 +1,158 @@
from django.conf import settings
from django.shortcuts import render_to_response
from django.template import RequestContext
from django.contrib.auth.decorators import login_required
from django.contrib.auth.decorators import permission_required
from django.shortcuts import HttpResponseRedirect
from collections import namedtuple
from authentication.managers import AuthServicesInfoManager
from services.managers.eve_api_manager import EveApiManager
from services.managers.evewho_manager import EveWhoManager
from eveonline.models import EveCorporationInfo
from eveonline.models import EveAllianceInfo
from eveonline.models import EveCharacter
from authentication.models import AuthServicesInfo
from forms import CorputilsSearchForm
from evelink.api import APIError
import logging
logger = logging.getLogger(__name__)
# Because corp-api only exist for the executor corp, this function will only be available in corporation mode.
@login_required
@permission_required('auth.corputils')
def corp_member_view(request, corpid = None):
logger.debug("corp_member_view called by user %s" % request.user)
if not settings.IS_CORP:
alliance = EveAllianceInfo.objects.get(alliance_id=settings.ALLIANCE_ID)
alliancecorps = EveCorporationInfo.objects.filter(alliance=alliance)
membercorp_list = [(int(membercorp.corporation_id), str(membercorp.corporation_name)) for membercorp in alliancecorps]
membercorp_list.sort(key=lambda tup: tup[1])
if not corpid:
if(settings.CORP_ID):
corpid = settings.CORP_ID
else:
corpid = membercorp_list[0][0]
corp = EveCorporationInfo.objects.get(corporation_id=corpid)
Player = namedtuple("Player", ["main", "maincorp", "maincorpid", "altlist"])
if settings.IS_CORP:
try:
member_list = EveApiManager.get_corp_membertracking(settings.CORP_API_ID, settings.CORP_API_VCODE)
except APIError:
logger.debug("Corp API does not have membertracking scope, using EveWho data instead.")
member_list = EveWhoManager.get_corporation_members(corpid)
else:
member_list = EveWhoManager.get_corporation_members(corpid)
characters_with_api = {}
characters_without_api = {}
for char_id, member_data in member_list.items():
try:
char = EveCharacter.objects.get(character_id=char_id)
user = char.user
try:
mainid = int(AuthServicesInfoManager.get_auth_service_info(user=user).main_char_id)
mainchar = EveCharacter.objects.get(character_id=mainid)
mainname = mainchar.character_name
maincorp = mainchar.corporation_name
maincorpid = mainchar.corporation_id
except (ValueError, EveCharacter.DoesNotExist):
mainname = "User: " + user.username
mainchar = char
maincorp = "Not set."
maincorpid = None
characters_with_api.setdefault(mainname, Player(main=mainchar,
maincorp=maincorp,
maincorpid=maincorpid,
altlist=[])
).altlist.append(char)
except EveCharacter.DoesNotExist:
characters_without_api.update({member_data["name"]: member_data["id"]})
if not settings.IS_CORP:
context = {"membercorp_list": membercorp_list,
"corp": corp,
"characters_with_api": sorted(characters_with_api.items()),
"characters_without_api": sorted(characters_without_api.items()),
"search_form": CorputilsSearchForm()}
else:
logger.debug("corp_member_view running in corportation mode")
context = {"corp": corp,
"characters_with_api": sorted(characters_with_api.items()),
"characters_without_api": sorted(characters_without_api.items()),
"search_form": CorputilsSearchForm()}
return render_to_response('registered/corputils.html',context, context_instance=RequestContext(request) )
@login_required
@permission_required('auth.corputils')
def corputils_search(request, corpid=settings.CORP_ID):
logger.debug("corputils_search called by user %s" % request.user)
corp = EveCorporationInfo.objects.get(corporation_id=corpid)
if request.method == 'POST':
form = CorputilsSearchForm(request.POST)
logger.debug("Request type POST contains form valid: %s" % form.is_valid())
if form.is_valid():
# Really dumb search and only checks character name
# This can be improved but it does the job for now
searchstring = form.cleaned_data['search_string']
logger.debug("Searching for player with character name %s for user %s" % (searchstring, request.user))
if settings.IS_CORP:
try:
member_list = EveApiManager.get_corp_membertracking(settings.CORP_API_ID, settings.CORP_API_VCODE)
except APIError:
logger.debug("Corp API does not have membertracking scope, using EveWho data instead.")
member_list = EveWhoManager.get_corporation_members(corpid)
else:
member_list = EveWhoManager.get_corporation_members(corpid)
Member = namedtuple('Member', ['name', 'main', 'api_registered'])
members = []
for memberid, member_data in member_list.items():
if searchstring.lower() in member_data["name"].lower():
try:
char = EveCharacter.objects.get(character_name=member_data["name"])
user = char.user
mainid = int(AuthServicesInfoManager.get_auth_service_info(user=user).main_char_id)
mainname = EveCharacter.objects.get(character_id=mainid).character_name
api_registered = True
except EveCharacter.DoesNotExist:
api_registered = False
mainname = ""
members.append(Member(name=member_data["name"], main=mainname, api_registered=api_registered))
logger.info("Found %s members for user %s matching search string %s" % (len(members), request.user, searchstring))
context = {'corp': corp, 'members': members, 'search_form': CorputilsSearchForm()}
return render_to_response('registered/corputilssearchview.html',
context, context_instance=RequestContext(request))
else:
logger.debug("Form invalid - returning for user %s to retry." % request.user)
context = {'corp': corp, 'members': None, 'search_form': CorputilsSearchForm()}
return render_to_response('registered/corputilssearchview.html',
context, context_instance=RequestContext(request))
else:
logger.debug("Returning empty search form for user %s" % request.user)
return HttpResponseRedirect("/corputils/")

View File

@ -3,49 +3,44 @@ from django.conf import settings
from services.managers.eve_api_manager import EveApiManager from services.managers.eve_api_manager import EveApiManager
from eveonline.managers import EveManager from eveonline.managers import EveManager
from eveonline.models import EveCharacter
from celerytask.tasks import determine_membership_by_character
import logging import logging
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
class UpdateKeyForm(forms.Form): class UpdateKeyForm(forms.Form):
user_state = None
api_id = forms.CharField(max_length=254, required=True, label="Key ID") api_id = forms.CharField(max_length=254, required=True, label="Key ID")
api_key = forms.CharField(max_length=254, required=True, label="Verification Code") api_key = forms.CharField(max_length=254, required=True, label="Verification Code")
is_blue = forms.BooleanField(label="Blue to corp/alliance", required=False)
def clean(self): def clean(self):
if EveManager.check_if_api_key_pair_exist(self.cleaned_data['api_id']): super(UpdateKeyForm, self).clean()
logger.debug("UpdateKeyForm failed cleaning as API id %s already exists." % self.cleaned_data['api_id'])
raise forms.ValidationError(u'API key already exist')
check_blue = False if 'api_id' in self.cleaned_data and 'api_key' in self.cleaned_data:
try: if EveManager.check_if_api_key_pair_exist(self.cleaned_data['api_id']):
check_blue = self.cleaned_data['is_blue'] logger.debug("UpdateKeyForm failed cleaning as API id %s already exists." % self.cleaned_data['api_id'])
except: raise forms.ValidationError(u'API key already exist')
pass
if check_blue: chars = EveApiManager.get_characters_from_api(self.cleaned_data['api_id'], self.cleaned_data['api_key']).result
if settings.BLUE_API_ACCOUNT: states = []
if not EveApiManager.check_api_is_type_account(self.cleaned_data['api_id'], states.append(self.user_state)
self.cleaned_data['api_key']): for char in chars:
logger.debug("UpdateKeyForm failed cleaning as API id %s does not meet blue api key account requirement." % self.cleaned_data['api_id']) evechar = EveCharacter()
raise forms.ValidationError(u'API not of type account') evechar.character_name = chars[char]['name']
evechar.corporation_id = chars[char]['corp']['id']
if not EveApiManager.check_blue_api_is_full(self.cleaned_data['api_id'], evechar.alliance_id = chars[char]['alliance']['id']
self.cleaned_data['api_key']): state = determine_membership_by_character(evechar)
logger.debug("UpdateKeyForm failed cleaning as API id %s does not meet minimum blue api access mask requirement." % self.cleaned_data['api_id']) logger.debug("API ID %s character %s has state %s" % (self.cleaned_data['api_id'], evechar, state))
raise forms.ValidationError(u'API supplied is too restricted. Minimum access mask is ' + str(settings.BLUE_API_MASK)) states.append(state)
else:
if settings.MEMBER_API_ACCOUNT:
if not EveApiManager.check_api_is_type_account(self.cleaned_data['api_id'],
self.cleaned_data['api_key']):
logger.debug("UpdateKeyForm failed cleaning as API id %s does not meet member api key account requirement." % self.cleaned_data['api_id'])
raise forms.ValidationError(u'API not of type account')
if not EveApiManager.check_api_is_full(self.cleaned_data['api_id'],
self.cleaned_data['api_key']):
logger.debug("UpdateKeyForm failed cleaning as API id %s does not meet minimum member api access mask requirement." % self.cleaned_data['api_id'])
raise forms.ValidationError(u'API supplied is too restricted. Minimum access mask is ' + str(settings.MEMBER_API_MASK))
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 must meet member requirements')
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 must meet blue requirements')
return self.cleaned_data return self.cleaned_data

View File

@ -20,11 +20,14 @@ from eveonline.models import EveCorporationInfo
from eveonline.models import EveCharacter from eveonline.models import EveCharacter
from eveonline.models import EveApiKeyPair from eveonline.models import EveApiKeyPair
from authentication.models import AuthServicesInfo from authentication.models import AuthServicesInfo
from celerytask.tasks import determine_membership_by_user
from celerytask.tasks import set_state
import logging import logging
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
def disable_member(user, char_id): def disable_member(user, char_id):
logger.debug("Disabling user %s with character id %s" % (user, char_id)) logger.debug("Disabling user %s with character id %s" % (user, char_id))
remove_member_permission(user, 'member') remove_member_permission(user, 'member')
@ -46,8 +49,10 @@ def disable_blue_member(user):
@login_required @login_required
def add_api_key(request): def add_api_key(request):
logger.debug("add_api_key called by user %s" % request.user) logger.debug("add_api_key called by user %s" % request.user)
user_state = determine_membership_by_user(request.user)
if request.method == 'POST': if request.method == 'POST':
form = UpdateKeyForm(request.POST) form = UpdateKeyForm(request.POST)
form.user_state=user_state
logger.debug("Request type POST with form valid: %s" % form.is_valid()) logger.debug("Request type POST with form valid: %s" % form.is_valid())
if form.is_valid(): if form.is_valid():
EveManager.create_api_keypair(form.cleaned_data['api_id'], EveManager.create_api_keypair(form.cleaned_data['api_id'],
@ -65,6 +70,7 @@ def add_api_key(request):
else: else:
logger.debug("Providing empty update key form for user %s" % request.user) logger.debug("Providing empty update key form for user %s" % request.user)
form = UpdateKeyForm() form = UpdateKeyForm()
form.user_state = user_state
context = {'form': form, 'apikeypairs': EveManager.get_api_key_pairs(request.user.id)} context = {'form': form, 'apikeypairs': EveManager.get_api_key_pairs(request.user.id)}
return render_to_response('registered/addapikey.html', context, return render_to_response('registered/addapikey.html', context,
context_instance=RequestContext(request)) context_instance=RequestContext(request))
@ -115,41 +121,8 @@ def characters_view(request):
def main_character_change(request, char_id): def main_character_change(request, char_id):
logger.debug("main_character_change called by user %s for character id %s" % (request.user, 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): 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) AuthServicesInfoManager.update_main_char_Id(char_id, request.user)
# Check if character is in the alliance set_state(request.user)
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))
return HttpResponseRedirect("/characters") return HttpResponseRedirect("/characters")
return HttpResponseRedirect("/characters") return HttpResponseRedirect("/characters")

View File

@ -49,7 +49,7 @@ def group_accept_request(request, group_request_id):
group_request.delete() group_request.delete()
logger.info("User %s accepted group request from user %s to group %s" % (request.user, group_request.user, group_request.group.name)) logger.info("User %s accepted group request from user %s to group %s" % (request.user, group_request.user, group_request.group.name))
except: except:
logger.exception("Unhandled exception occured while user %s attempting to accept grouprequest id %s." % (request.user, group_request_id), exc_info=True) logger.exception("Unhandled exception occured while user %s attempting to accept grouprequest id %s." % (request.user, group_request_id))
pass pass
return HttpResponseRedirect("/group/management/") return HttpResponseRedirect("/group/management/")
@ -66,7 +66,7 @@ def group_reject_request(request, group_request_id):
logger.info("User %s rejected group request from user %s to group %s" % (request.user, group_request.user, group_request.group.name)) logger.info("User %s rejected group request from user %s to group %s" % (request.user, group_request.user, group_request.group.name))
group_request.delete() group_request.delete()
except: except:
logger.exception("Unhandled exception occured while user %s attempting to reject group request id %s" % (request.user, group_request_id), exc_info=True) logger.exception("Unhandled exception occured while user %s attempting to reject group request id %s" % (request.user, group_request_id))
pass pass
return HttpResponseRedirect("/group/management/") return HttpResponseRedirect("/group/management/")
@ -84,7 +84,7 @@ def group_leave_accept_request(request, group_request_id):
group_request.delete() group_request.delete()
logger.info("User %s accepted group leave request from user %s to group %s" % (request.user, group_request.user, group_request.group.name)) logger.info("User %s accepted group leave request from user %s to group %s" % (request.user, group_request.user, group_request.group.name))
except: except:
logger.exception("Unhandled exception occured while user %s attempting to accept group leave request id %s" % (request.user, group_request_id), exc_info=True) logger.exception("Unhandled exception occured while user %s attempting to accept group leave request id %s" % (request.user, group_request_id))
pass pass
return HttpResponseRedirect("/group/management/") return HttpResponseRedirect("/group/management/")
@ -101,7 +101,7 @@ def group_leave_reject_request(request, group_request_id):
group_request.delete() group_request.delete()
logger.info("User %s rejected group leave request from user %s for group %s" % (request.user, group_request.user, group_request.group.name)) logger.info("User %s rejected group leave request from user %s for group %s" % (request.user, group_request.user, group_request.group.name))
except: except:
logger.exception("Unhandled exception occured while user %s attempting to reject group leave request id %s" % (request.user, group_request_id), exc_info=True) logger.exception("Unhandled exception occured while user %s attempting to reject group leave request id %s" % (request.user, group_request_id))
pass pass
return HttpResponseRedirect("/group/management/") return HttpResponseRedirect("/group/management/")

View File

@ -22,236 +22,236 @@ logger = logging.getLogger(__name__)
@login_required @login_required
def hr_application_management_view(request): def hr_application_management_view(request):
logger.debug("hr_application_management_view called by user %s" % request.user) logger.debug("hr_application_management_view called by user %s" % request.user)
personal_app = None personal_app = None
corp_applications = None corp_applications = None
if request.user.is_superuser: if request.user.is_superuser:
logger.debug("User %s is superuser: returning all applications." % request.user) logger.debug("User %s is superuser: returning all applications." % request.user)
corp_applications = HRApplication.objects.all() corp_applications = HRApplication.objects.all()
else: else:
# Get the corp the member is in # Get the corp the member is in
auth_info = AuthServicesInfo.objects.get(user=request.user) auth_info = AuthServicesInfo.objects.get(user=request.user)
if auth_info.main_char_id != "": if auth_info.main_char_id != "":
try: try:
main_corp_id = EveManager.get_charater_corporation_id_by_id(auth_info.main_char_id) main_corp_id = EveManager.get_charater_corporation_id_by_id(auth_info.main_char_id)
main_alliance_id = EveManager.get_charater_alliance_id_by_id(auth_info.main_char_id) main_alliance_id = EveManager.get_charater_alliance_id_by_id(auth_info.main_char_id)
if (settings.IS_CORP and main_corp_id == settings.CORP_ID) or (not settings.IS_CORP and main_alliance_id == settings.ALLIANCE_ID): if (settings.IS_CORP and main_corp_id == settings.CORP_ID) or (not settings.IS_CORP and main_alliance_id == settings.ALLIANCE_ID):
main_char = EveCharacter.objects.get(character_id=auth_info.main_char_id) main_char = EveCharacter.objects.get(character_id=auth_info.main_char_id)
if EveCorporationInfo.objects.filter(corporation_id=main_char.corporation_id).exists(): if EveCorporationInfo.objects.filter(corporation_id=main_char.corporation_id).exists():
corp = EveCorporationInfo.objects.get(corporation_id=main_char.corporation_id) corp = EveCorporationInfo.objects.get(corporation_id=main_char.corporation_id)
corp_applications = HRApplication.objects.filter(corp=corp).filter(approved_denied=None) corp_applications = HRApplication.objects.filter(corp=corp).filter(approved_denied=None)
else: else:
corp_applications = None corp_applications = None
else: else:
corp_applications = None corp_applications = None
except: except:
logger.error("Unable to determine user %s main character id %s corp. Returning no corp hrapplications." % (request.user, auth_info.main_char_id)) logger.error("Unable to determine user %s main character id %s corp. Returning no corp hrapplications." % (request.user, auth_info.main_char_id))
corp_applications = None corp_applications = None
context = {'personal_apps': HRApplication.objects.all().filter(user=request.user), context = {'personal_apps': HRApplication.objects.all().filter(user=request.user),
'applications': corp_applications, 'applications': corp_applications,
'search_form': HRApplicationSearchForm()} 'search_form': HRApplicationSearchForm()}
return render_to_response('registered/hrapplicationmanagement.html', return render_to_response('registered/hrapplicationmanagement.html',
context, context_instance=RequestContext(request)) context, context_instance=RequestContext(request))
@login_required @login_required
def hr_application_create_view(request): def hr_application_create_view(request):
logger.debug("hr_application_create_view called by user %s" % request.user) logger.debug("hr_application_create_view called by user %s" % request.user)
success = False success = False
if request.method == 'POST': if request.method == 'POST':
form = HRApplicationForm(request.POST) form = HRApplicationForm(request.POST)
logger.debug("Request type POST with form valid: %s" % form.is_valid()) logger.debug("Request type POST with form valid: %s" % form.is_valid())
if form.is_valid(): if form.is_valid():
application = HRApplication() application = HRApplication()
application.user = request.user application.user = request.user
application.character_name = form.cleaned_data['character_name'] application.character_name = form.cleaned_data['character_name']
application.full_api_id = form.cleaned_data['full_api_id'] application.full_api_id = form.cleaned_data['full_api_id']
application.full_api_key = form.cleaned_data['full_api_key'] application.full_api_key = form.cleaned_data['full_api_key']
application.corp = EveCorporationInfo.objects.get(corporation_id=form.cleaned_data['corp']) application.corp = EveCorporationInfo.objects.get(corporation_id=form.cleaned_data['corp'])
application.is_a_spi = form.cleaned_data['is_a_spi'] application.is_a_spi = form.cleaned_data['is_a_spi']
application.about = form.cleaned_data['about'] application.about = form.cleaned_data['about']
application.extra = form.cleaned_data['extra'] application.extra = form.cleaned_data['extra']
application.save() application.save()
success = True success = True
logger.info("Created HRApplication for user %s to corp %s" % (request.user, application.corp)) logger.info("Created HRApplication for user %s to corp %s" % (request.user, application.corp))
else: else:
logger.debug("Providing empty form.") logger.debug("Providing empty form.")
form = HRApplicationForm() form = HRApplicationForm()
context = {'form': form, 'success': success} context = {'form': form, 'success': success}
return render_to_response('registered/hrcreateapplication.html', return render_to_response('registered/hrcreateapplication.html',
context, context_instance=RequestContext(request)) context, context_instance=RequestContext(request))
@login_required @login_required
def hr_application_personal_view(request, app_id): def hr_application_personal_view(request, app_id):
logger.debug("hr_application_personal_view called by user %s for app id %s" % (request.user, app_id)) logger.debug("hr_application_personal_view called by user %s for app id %s" % (request.user, app_id))
if HRApplication.objects.filter(id=app_id).exists(): if HRApplication.objects.filter(id=app_id).exists():
application = HRApplication.objects.get(id=app_id) application = HRApplication.objects.get(id=app_id)
logger.debug("Got application id %s: %s" % (app_id, application)) logger.debug("Got application id %s: %s" % (app_id, application))
if application.user != request.user: if application.user != request.user:
logger.warn("HRApplication id %s user %s does not match request user %s - returning blank application." % (app_id, application.user, request.user)) logger.warn("HRApplication id %s user %s does not match request user %s - returning blank application." % (app_id, application.user, request.user))
application = HRApplication() application = HRApplication()
else: else:
logger.error("Unable to locate HRApplication matching id %s - returning blank application to user %s" % (app_id, request.user)) logger.error("Unable to locate HRApplication matching id %s - returning blank application to user %s" % (app_id, request.user))
application = HRApplication() application = HRApplication()
context = {'application': application} context = {'application': application}
return render_to_response('registered/hrapplicationview.html', return render_to_response('registered/hrapplicationview.html',
context, context_instance=RequestContext(request)) context, context_instance=RequestContext(request))
@login_required @login_required
def hr_application_personal_removal(request, app_id): def hr_application_personal_removal(request, app_id):
logger.debug("hr_application_personal_removal called by user %s for app id %s" % (request.user, app_id)) logger.debug("hr_application_personal_removal called by user %s for app id %s" % (request.user, app_id))
if HRApplication.objects.filter(id=app_id).exists(): if HRApplication.objects.filter(id=app_id).exists():
application = HRApplication.objects.get(id=app_id) application = HRApplication.objects.get(id=app_id)
if application.user == request.user: if application.user == request.user:
application.delete() application.delete()
logger.info("Deleted HRApplication with id %s for user %s to corp %s" % (app_id, request.user, application.corp)) logger.info("Deleted HRApplication with id %s for user %s to corp %s" % (app_id, request.user, application.corp))
else: else:
logger.error("HRapplication id %s user %s does not match request user %s - refusing to delete." % (app_id, application.user, request.user)) logger.error("HRapplication id %s user %s does not match request user %s - refusing to delete." % (app_id, application.user, request.user))
return HttpResponseRedirect("/hr_application_management/") return HttpResponseRedirect("/hr_application_management/")
@login_required @login_required
@permission_required('auth.human_resources') @permission_required('auth.human_resources')
def hr_application_view(request, app_id): def hr_application_view(request, app_id):
logger.debug("hr_application_view called by user %s for app id %s" % (request.user, app_id)) logger.debug("hr_application_view called by user %s for app id %s" % (request.user, app_id))
if request.method == 'POST': if request.method == 'POST':
form = HRApplicationCommentForm(request.POST) form = HRApplicationCommentForm(request.POST)
logger.debug("Request type POST contains form valid: %s" % form.is_valid()) logger.debug("Request type POST contains form valid: %s" % form.is_valid())
if form.is_valid(): if form.is_valid():
auth_info = AuthServicesInfo.objects.get(user=request.user) auth_info = AuthServicesInfo.objects.get(user=request.user)
comment = HRApplicationComment() comment = HRApplicationComment()
comment.application = HRApplication.objects.get(id=int(form.cleaned_data['app_id'])) comment.application = HRApplication.objects.get(id=int(form.cleaned_data['app_id']))
comment.commenter_user = request.user comment.commenter_user = request.user
comment.commenter_character = EveCharacter.objects.get(character_id=auth_info.main_char_id) comment.commenter_character = EveCharacter.objects.get(character_id=auth_info.main_char_id)
comment.comment = form.cleaned_data['comment'] comment.comment = form.cleaned_data['comment']
comment.save() comment.save()
logger.info("Saved comment by user %s to hrapplication %s" % (request.user, comment.application)) logger.info("Saved comment by user %s to hrapplication %s" % (request.user, comment.application))
else: else:
logger.debug("Returning blank HRApplication comment form.") logger.debug("Returning blank HRApplication comment form.")
form = HRApplicationCommentForm() form = HRApplicationCommentForm()
if HRApplication.objects.filter(id=app_id).exists(): if HRApplication.objects.filter(id=app_id).exists():
application = HRApplication.objects.get(id=app_id) application = HRApplication.objects.get(id=app_id)
comments = HRApplicationComment.objects.all().filter(application=application) comments = HRApplicationComment.objects.all().filter(application=application)
logger.debug("Retrieved hrpplication id %s on behalf of user %s with comments %s" % (app_id, request.user, len(comments))) logger.debug("Retrieved hrpplication id %s on behalf of user %s with comments %s" % (app_id, request.user, len(comments)))
else: else:
application = HRApplication() application = HRApplication()
comments = [] comments = []
logger.error("HRAppllication with id %s not found - returning blank applicatin to user %s" % request.user) logger.error("HRAppllication with id %s not found - returning blank applicatin to user %s" % request.user)
context = {'application': application, 'comments': comments, 'comment_form': form} context = {'application': application, 'comments': comments, 'comment_form': form}
return render_to_response('registered/hrapplicationview.html', return render_to_response('registered/hrapplicationview.html',
context, context_instance=RequestContext(request)) context, context_instance=RequestContext(request))
@login_required @login_required
@permission_required('auth.human_resources') @permission_required('auth.human_resources')
def hr_application_remove(request, app_id): def hr_application_remove(request, app_id):
logger.debug("hr_application_remove called by user %s for app id %s" % (request.user, app_id)) logger.debug("hr_application_remove called by user %s for app id %s" % (request.user, app_id))
if HRApplication.objects.filter(id=app_id).exists(): if HRApplication.objects.filter(id=app_id).exists():
application = HRApplication.objects.get(id=app_id) application = HRApplication.objects.get(id=app_id)
if application: if application:
logger.info("Deleted HRApplication id %s on behalf of user %s" % (app_id, request.user)) logger.info("Deleted HRApplication id %s on behalf of user %s" % (app_id, request.user))
application.delete() application.delete()
else: else:
logger.error("Unable to delete HRApplication with id %s on behalf of user %s: application is NoneType" % (app_id, request.user)) logger.error("Unable to delete HRApplication with id %s on behalf of user %s: application is NoneType" % (app_id, request.user))
else: else:
logger.error("Unable to delete HRApplication with id %s on behalf of user %s: application not found." % (app_id, request.user)) logger.error("Unable to delete HRApplication with id %s on behalf of user %s: application not found." % (app_id, request.user))
return HttpResponseRedirect("/hr_application_management/") return HttpResponseRedirect("/hr_application_management/")
@login_required @login_required
@permission_required('auth.human_resources') @permission_required('auth.human_resources')
def hr_application_approve(request, app_id): def hr_application_approve(request, app_id):
logger.debug("hr_application_approve called by user %s for app id %s" % (request.user, app_id)) logger.debug("hr_application_approve called by user %s for app id %s" % (request.user, app_id))
if HRApplication.objects.filter(id=app_id).exists(): if HRApplication.objects.filter(id=app_id).exists():
auth_info = AuthServicesInfo.objects.get(user=request.user) auth_info = AuthServicesInfo.objects.get(user=request.user)
application = HRApplication.objects.get(id=app_id) application = HRApplication.objects.get(id=app_id)
application.approved_denied = True application.approved_denied = True
application.reviewer_user = request.user application.reviewer_user = request.user
application.reviewer_character = EveCharacter.objects.get(character_id=auth_info.main_char_id) application.reviewer_character = EveCharacter.objects.get(character_id=auth_info.main_char_id)
application.save() application.save()
logger.info("HRApplication for user %s to corp %s approved by %s" % (application.user, application.corp, request.user)) logger.info("HRApplication for user %s to corp %s approved by %s" % (application.user, application.corp, request.user))
else: else:
logger.error("User %s unable to approve HRApplication id %s - hrapplication with that id not found." % (request.user, app_id)) logger.error("User %s unable to approve HRApplication id %s - hrapplication with that id not found." % (request.user, app_id))
return HttpResponseRedirect("/hr_application_management/") return HttpResponseRedirect("/hr_application_management/")
@login_required @login_required
@permission_required('auth.human_resources') @permission_required('auth.human_resources')
def hr_application_reject(request, app_id): def hr_application_reject(request, app_id):
logger.debug("hr_application_reject called by user %s for app id %s" % (request.user, app_id)) logger.debug("hr_application_reject called by user %s for app id %s" % (request.user, app_id))
if HRApplication.objects.filter(id=app_id).exists(): if HRApplication.objects.filter(id=app_id).exists():
auth_info = AuthServicesInfo.objects.get(user=request.user) auth_info = AuthServicesInfo.objects.get(user=request.user)
application = HRApplication.objects.get(id=app_id) application = HRApplication.objects.get(id=app_id)
application.approved_denied = False application.approved_denied = False
application.reviewer_user = request.user application.reviewer_user = request.user
application.reviewer_character = EveCharacter.objects.get(character_id=auth_info.main_char_id) application.reviewer_character = EveCharacter.objects.get(character_id=auth_info.main_char_id)
application.save() application.save()
logger.info("HRApplication for user %s to corp %s rejected by %s" % (application.user, application.corp, request.user)) logger.info("HRApplication for user %s to corp %s rejected by %s" % (application.user, application.corp, request.user))
else: else:
logger.error("User %s unable to reject HRApplication id %s - hrapplication with that id not found." % (request.user, app_id)) logger.error("User %s unable to reject HRApplication id %s - hrapplication with that id not found." % (request.user, app_id))
return HttpResponseRedirect("/hr_application_management/") return HttpResponseRedirect("/hr_application_management/")
@login_required @login_required
@permission_required('auth.human_resources') @permission_required('auth.human_resources')
def hr_application_search(request): def hr_application_search(request):
logger.debug("hr_application_search called by user %s" % request.user) logger.debug("hr_application_search called by user %s" % request.user)
if request.method == 'POST': if request.method == 'POST':
form = HRApplicationSearchForm(request.POST) form = HRApplicationSearchForm(request.POST)
logger.debug("Request type POST contains form valid: %s" % form.is_valid()) logger.debug("Request type POST contains form valid: %s" % form.is_valid())
if form.is_valid(): if form.is_valid():
# Really dumb search and only checks character name # Really dumb search and only checks character name
# This can be improved but it does the job for now # This can be improved but it does the job for now
searchstring = form.cleaned_data['search_string'] searchstring = form.cleaned_data['search_string']
applications = [] applications = []
logger.debug("Searching for application with character name %s for user %s" % (searchstring, request.user)) logger.debug("Searching for application with character name %s for user %s" % (searchstring, request.user))
for application in HRApplication.objects.all(): for application in HRApplication.objects.all():
if searchstring in application.character_name: if searchstring in application.character_name:
applications.append(application) applications.append(application)
logger.info("Found %s HRApplications for user %s matching search string %s" % (len(applications), request.user, searchstring)) logger.info("Found %s HRApplications for user %s matching search string %s" % (len(applications), request.user, searchstring))
context = {'applications': applications, 'search_form': HRApplicationSearchForm()} context = {'applications': applications, 'search_form': HRApplicationSearchForm()}
return render_to_response('registered/hrapplicationsearchview.html', return render_to_response('registered/hrapplicationsearchview.html',
context, context_instance=RequestContext(request)) context, context_instance=RequestContext(request))
else: else:
logger.debug("Form invalid - returning for user %s to retry." % request.user) logger.debug("Form invalid - returning for user %s to retry." % request.user)
context = {'applications': None, 'search_form': form} context = {'applications': None, 'search_form': form}
return render_to_response('registered/hrapplicationsearchview.html', return render_to_response('registered/hrapplicationsearchview.html',
context, context_instance=RequestContext(request)) context, context_instance=RequestContext(request))
else: else:
logger.debug("Returning empty search form for user %s" % request.user) logger.debug("Returning empty search form for user %s" % request.user)
return HttpResponseRedirect("/hr_application_management/") return HttpResponseRedirect("/hr_application_management/")
@login_required @login_required
@permission_required('auth.human_resources') @permission_required('auth.human_resources')
def hr_application_mark_in_progress(request, app_id): def hr_application_mark_in_progress(request, app_id):
logger.debug("hr_application_mark_in_progress called by user %s for app id %s" % (request.user, app_id)) logger.debug("hr_application_mark_in_progress called by user %s for app id %s" % (request.user, app_id))
if HRApplication.objects.filter(id=app_id).exists(): if HRApplication.objects.filter(id=app_id).exists():
auth_info = AuthServicesInfo.objects.get(user=request.user) auth_info = AuthServicesInfo.objects.get(user=request.user)
application = HRApplication.objects.get(id=app_id) application = HRApplication.objects.get(id=app_id)
application.reviewer_inprogress_character = EveCharacter.objects.get(character_id=auth_info.main_char_id) application.reviewer_inprogress_character = EveCharacter.objects.get(character_id=auth_info.main_char_id)
application.save() application.save()
logger.info("Marked HRApplication for user %s to corp %s in progress by user %s" % (application.user, application.corp, request.user)) logger.info("Marked HRApplication for user %s to corp %s in progress by user %s" % (application.user, application.corp, request.user))
else: else:
logger.error("Unable to mark HRApplication id %s in progress by user %s - hrapplication matching id not found." % (app_id, request.user)) logger.error("Unable to mark HRApplication id %s in progress by user %s - hrapplication matching id not found." % (app_id, request.user))
return HttpResponseRedirect("/hr_application_view/" + str(app_id)) return HttpResponseRedirect("/hr_application_view/" + str(app_id))

View File

@ -5,6 +5,7 @@ evelink
dnspython dnspython
passlib passlib
requests>=2.9.1 requests>=2.9.1
requests_cache
# Django Stuff # # Django Stuff #
django==1.6.5 django==1.6.5

View File

@ -399,7 +399,7 @@ class DiscordManager:
logger.info("Added user to discord server %s with id %s" % (settings.DISCORD_SERVER_ID, user_id)) logger.info("Added user to discord server %s with id %s" % (settings.DISCORD_SERVER_ID, user_id))
return user_id return user_id
except: except:
logger.exception("An unhandled exception has occured.", exc_info=True) logger.exception("An unhandled exception has occured.")
return "" return ""
@staticmethod @staticmethod
@ -412,5 +412,5 @@ class DiscordManager:
logger.info("Deleted user with id %s from discord server id %s" % (user_id, settings.DISCORD_SERVER_ID)) logger.info("Deleted user with id %s from discord server id %s" % (user_id, settings.DISCORD_SERVER_ID))
return True return True
except: except:
logger.exception("An unhandled exception has occured.", exc_info=True) logger.exception("An unhandled exception has occured.")
return False return False

View File

@ -22,7 +22,7 @@ class EveApiManager():
account = evelink.account.Account(api=api) account = evelink.account.Account(api=api)
chars = account.characters() chars = account.characters()
except evelink.api.APIError as error: except evelink.api.APIError as error:
logger.exception("Unhandled APIError occured.", exc_info=True) logger.exception("Unhandled APIError occured.")
logger.debug("Retrieved characters %s from api id %s" % (chars, api_id)) logger.debug("Retrieved characters %s from api id %s" % (chars, api_id))
return chars return chars
@ -38,7 +38,7 @@ class EveApiManager():
logger.debug("Retrieved corp sheet for id %s: %s" % (corp_id, response)) logger.debug("Retrieved corp sheet for id %s: %s" % (corp_id, response))
ticker = response[0]['ticker'] ticker = response[0]['ticker']
except evelink.api.APIError as error: except evelink.api.APIError as error:
logger.exception("Unhandled APIError occured.", exc_info=True) logger.exception("Unhandled APIError occured.")
logger.debug("Determined corp id %s ticker: %s" % (corp_id, ticker)) logger.debug("Determined corp id %s ticker: %s" % (corp_id, ticker))
return ticker return ticker
@ -53,7 +53,7 @@ class EveApiManager():
alliance = eve.alliances() alliance = eve.alliances()
results = alliance[0][int(alliance_id)] results = alliance[0][int(alliance_id)]
except evelink.api.APIError as error: except evelink.api.APIError as error:
logger.exception("Unhandled APIError occured.", exc_info=True) logger.exception("Unhandled APIError occured.")
logger.debug("Got alliance info %s" % results) logger.debug("Got alliance info %s" % results)
return results return results
@ -67,7 +67,7 @@ class EveApiManager():
corpinfo = corp.corporation_sheet(corp_id=int(corp_id)) corpinfo = corp.corporation_sheet(corp_id=int(corp_id))
results = corpinfo[0] results = corpinfo[0]
except evelink.api.APIError as error: except evelink.api.APIError as error:
logger.exception("Unhandled APIError occured.", exc_info=True) logger.exception("Unhandled APIError occured.")
logger.debug("Got corp info %s" % results) logger.debug("Got corp info %s" % results)
return results return results
@ -82,7 +82,7 @@ class EveApiManager():
return info[0]['type'] == "account" return info[0]['type'] == "account"
except evelink.api.APIError as error: except evelink.api.APIError as error:
logger.exception("Unhandled APIError occured.", exc_info=True) logger.exception("Unhandled APIError occured.")
return None return None
@ -97,7 +97,7 @@ class EveApiManager():
return info[0]['access_mask'] & int(settings.MEMBER_API_MASK) == int(settings.MEMBER_API_MASK) return info[0]['access_mask'] & int(settings.MEMBER_API_MASK) == int(settings.MEMBER_API_MASK)
except evelink.api.APIError as error: except evelink.api.APIError as error:
logger.exception("Unhandled APIError occured.", exc_info=True) logger.exception("Unhandled APIError occured.")
return None return None
@staticmethod @staticmethod
@ -111,7 +111,7 @@ class EveApiManager():
return info[0]['access_mask'] & int(settings.BLUE_API_MASK) == int(settings.BLUE_API_MASK) return info[0]['access_mask'] & int(settings.BLUE_API_MASK) == int(settings.BLUE_API_MASK)
except evelink.api.APIError as error: except evelink.api.APIError as error:
logger.exception("Unhandled APIError occured.", exc_info=True) logger.exception("Unhandled APIError occured.")
return None return None
@ -126,7 +126,7 @@ class EveApiManager():
return info return info
except evelink.api.APIError as error: except evelink.api.APIError as error:
logger.exception("Unhandled APIError occured.", exc_info=True) logger.exception("Unhandled APIError occured.")
return None return None
@staticmethod @staticmethod
@ -139,7 +139,7 @@ class EveApiManager():
logger.info("Verified api id %s is still valid." % api_id) logger.info("Verified api id %s is still valid." % api_id)
return True return True
except evelink.api.APIError as error: except evelink.api.APIError as error:
logger.exception("APIError occured while validating api id %s" % api_id, exc_info=True) logger.exception("APIError occured while validating api id %s" % api_id)
logger.info("API id %s is invalid." % api_id) logger.info("API id %s is invalid." % api_id)
return False return False
@ -154,7 +154,7 @@ class EveApiManager():
logger.info("Verified API server is online and reachable.") logger.info("Verified API server is online and reachable.")
return True return True
except evelink.api.APIError as error: except evelink.api.APIError as error:
logger.exception("APIError occured while trying to query api server. Possibly offline?", exc_info=True) logger.exception("APIError occured while trying to query api server. Possibly offline?")
logger.warn("Unable to reach API server.") logger.warn("Unable to reach API server.")
return False return False
@ -170,7 +170,7 @@ class EveApiManager():
logger.debug("Confirmed id %s is a corp." % corp_id) logger.debug("Confirmed id %s is a corp." % corp_id)
return True return True
except evelink.api.APIError as error: except evelink.api.APIError as error:
logger.exception("APIError occured while checking if id %s is corp. Possibly not corp?" % corp_id, exc_info=True) logger.exception("APIError occured while checking if id %s is corp. Possibly not corp?" % corp_id)
logger.debug("Unable to verify id %s is corp." % corp_id) logger.debug("Unable to verify id %s is corp." % corp_id)
return False return False
@ -183,7 +183,7 @@ class EveApiManager():
api = evelink.api.API(api_key=(settings.CORP_API_ID, settings.CORP_API_VCODE)) api = evelink.api.API(api_key=(settings.CORP_API_ID, settings.CORP_API_VCODE))
corp = evelink.corp.Corp(api=api) corp = evelink.corp.Corp(api=api)
corpinfo = corp.contacts() corpinfo = corp.contacts()
results = corpinfo[0] results = corpinfo.result
logger.debug("Got corp standings from settings: %s" % results) logger.debug("Got corp standings from settings: %s" % results)
return results return results
except evelink.api.APIError as error: except evelink.api.APIError as error:
@ -192,6 +192,21 @@ class EveApiManager():
logger.error("No corp API key supplied in settings. Unable to get standings.") logger.error("No corp API key supplied in settings. Unable to get standings.")
return {} return {}
@staticmethod
def get_corp_membertracking(api, vcode):
try:
logger.debug("Getting corp membertracking with api id %s" % settings.CORP_API_ID)
api = evelink.api.API(api_key=(api, vcode))
corp = evelink.corp.Corp(api=api)
membertracking = corp.members()
results = membertracking.result
logger.debug("Got corp membertracking from settings: %s" % results)
return results
except evelink.api.APIError as error:
logger.exception("Unhandled APIError occured.")
return {}
@staticmethod @staticmethod
def check_if_id_is_alliance(alliance_id): def check_if_id_is_alliance(alliance_id):
logger.debug("Checking if id %s is an alliance." % alliance_id) logger.debug("Checking if id %s is an alliance." % alliance_id)
@ -199,12 +214,12 @@ class EveApiManager():
api = evelink.api.API() api = evelink.api.API()
eve = evelink.eve.EVE(api=api) eve = evelink.eve.EVE(api=api)
alliance = eve.alliances() alliance = eve.alliances()
results = alliance[0][int(alliance_id)] results = alliance.result[int(alliance_id)]
if results: if results:
logger.debug("Confirmed id %s is an alliance." % alliance_id) logger.debug("Confirmed id %s is an alliance." % alliance_id)
return True return True
except evelink.api.APIError as error: except evelink.api.APIError as error:
logger.exception("APIError occured while checking if id %s is an alliance. Possibly not alliance?" % alliance_id, exc_info=True) logger.exception("APIError occured while checking if id %s is an alliance. Possibly not alliance?" % alliance_id)
logger.debug("Unable to verify id %s is an an alliance." % alliance_id) logger.debug("Unable to verify id %s is an an alliance." % alliance_id)
return False return False
@ -220,7 +235,7 @@ class EveApiManager():
logger.debug("Confirmed id %s is a character." % character_id) logger.debug("Confirmed id %s is a character." % character_id)
return True return True
except evelink.api.APIError as error: except evelink.api.APIError as error:
logger.exception("APIError occured while checking if id %s is a character. Possibly not character?" % character_id, exc_info=True) logger.exception("APIError occured while checking if id %s is a character. Possibly not character?" % character_id)
logger.debug("Unable to verify id %s is a character." % character_id) logger.debug("Unable to verify id %s is a character." % character_id)
return False return False
@ -239,11 +254,11 @@ class EveApiManager():
logger.debug("Verified alliance id %s does not exist." % alliance_id) logger.debug("Verified alliance id %s does not exist." % alliance_id)
return False return False
except evelink.api.APIError as error: except evelink.api.APIError as error:
logger.exception("Unhandled APIError occured.", exc_info=True) logger.exception("Unhandled APIError occured.")
return False return False
except ValueError as error: except ValueError as error:
#attempts to catch error resulting from checking alliance_of nonetype models #attempts to catch error resulting from checking alliance_of nonetype models
logger.exception("Unhandled ValueError occured. Possible nonetype alliance model.", exc_info=True) logger.exception("Unhandled ValueError occured. Possible nonetype alliance model.")
return False return False
logger.warn("Exception prevented verification of alliance id %s existance. Assuming false." % alliance_id) logger.warn("Exception prevented verification of alliance id %s existance. Assuming false." % alliance_id)
return False return False
@ -263,7 +278,30 @@ class EveApiManager():
return False return False
except evelink.api.APIError as error: except evelink.api.APIError as error:
#could be smart and check for error code523 to verify error due to no corp instead of catch-all #could be smart and check for error code523 to verify error due to no corp instead of catch-all
logger.exception("Unhandled APIError occured.", exc_info=True) logger.exception("Unhandled APIError occured.")
return False return False
logger.warn("Exception prevented verification of corp id %s existance. Assuming false." % corp_id) logger.warn("Exception prevented verification of corp id %s existance. Assuming false." % corp_id)
return False return False
@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:
logger.debug("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:
logger.debug("Api id %s does not meet member access mask requirements - failed validation." % api_id)
return False
return True
@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:
logger.debug("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:
logger.debug("Api id %s does not meet minimum blue access mask requirements - failed validation." % api_id)
return False
return True

View File

@ -0,0 +1,20 @@
from django.conf import settings
import logging
import requests
import requests_cache
import json
requests_cache.install_cache("{}/evewho".format(settings.EVEWHO_CACHE_DIR), backend="sqlite", expire_after=3600)
class EveWhoManager():
def __init__(self):
pass
@staticmethod
def get_corporation_members(corpid):
url = "http://evewho.com/api.php?type=corplist&id=%s" % corpid
jsondata = requests.get(url).content
data=json.loads(jsondata.decode())
return {row["character_id"]:{"name":row["name"], "id":row["character_id"]} for row in data["characters"]}

View File

@ -153,9 +153,9 @@ class MumbleManager:
logger.info("Added user to mumble with username %s" % username_clean) logger.info("Added user to mumble with username %s" % username_clean)
return username_clean, password return username_clean, password
except django.db.utils.IntegrityError as error: except django.db.utils.IntegrityError as error:
logger.exception("IntegrityError during mumble create_user occured.", exc_info=True) logger.exception("IntegrityError during mumble create_user occured.")
except: except:
logger.exception("Unhandled exception occured.", exc_info=True) logger.exception("Unhandled exception occured.")
logger.error("Exception prevented creation of mumble user. Returning blank for username, password.") logger.error("Exception prevented creation of mumble user. Returning blank for username, password.")
return "", "" return "", ""
@ -177,7 +177,7 @@ class MumbleManager:
logger.info("Added blue user to mumble with username %s" % username_clean) logger.info("Added blue user to mumble with username %s" % username_clean)
return username_clean, password return username_clean, password
except: except:
logger.exception("Unhandled exception occured.", exc_info=True) logger.exception("Unhandled exception occured.")
logger.error("Exception prevented creation of mumble blue user. Returning blank for username, password.") logger.error("Exception prevented creation of mumble blue user. Returning blank for username, password.")
return "", "" return "", ""
@ -207,7 +207,7 @@ class MumbleManager:
logger.info("Deleted user %s from mumble." % username) logger.info("Deleted user %s from mumble." % username)
return True return True
except: except:
logger.exception("Exception prevented deletion of user %s from mumble." % username, exc_info=True) logger.exception("Exception prevented deletion of user %s from mumble." % username)
return False return False
logger.error("User %s not found on mumble. Unable to delete." % username) logger.error("User %s not found on mumble. Unable to delete." % username)
return False return False
@ -228,7 +228,7 @@ class MumbleManager:
logger.info("Updated mumble user %s password." % username) logger.info("Updated mumble user %s password." % username)
return password return password
except: except:
logger.exception("Exception prevented updating of mumble user %s password." % username, exc_info=True) logger.exception("Exception prevented updating of mumble user %s password." % username)
return "" return ""
logger.error("User %s not found on mumble. Unable to update password." % username) logger.error("User %s not found on mumble. Unable to update password." % username)
return "" return ""
@ -250,11 +250,11 @@ class MumbleManager:
logger.debug("Adding mumble user %s to group %s" % (userid, mumble_groups[g])) logger.debug("Adding mumble user %s to group %s" % (userid, mumble_groups[g]))
MumbleManager._add_user_to_group(userid, mumble_groups[g]) MumbleManager._add_user_to_group(userid, mumble_groups[g])
except: except:
logger.exception("Exception occured while adding mumble user %s with id %s to group %s with id %s" % (username, userid, g, mumble_groups[g]), exc_info=True) logger.exception("Exception occured while adding mumble user %s with id %s to group %s with id %s" % (username, userid, g, mumble_groups[g]))
for g in remgroups: for g in remgroups:
try: try:
logger.debug("Deleting mumble user %s from group %s" % (userid, mumble_groups[g])) logger.debug("Deleting mumble user %s from group %s" % (userid, mumble_groups[g]))
MumbleManager._del_user_from_group(userid, mumble_groups[g]) MumbleManager._del_user_from_group(userid, mumble_groups[g])
except: except:
logger.exception("Exception occured while removing mumble user %s with id %s from group %s with id %s" % (username, userid, g, mumble_groups[g]), exc_info=True) logger.exception("Exception occured while removing mumble user %s with id %s from group %s with id %s" % (username, userid, g, mumble_groups[g]))

View File

@ -132,7 +132,7 @@ class Phpbb3Manager:
cursor.execute(Phpbb3Manager.SQL_CLEAR_USER_PERMISSIONS, [userid]) cursor.execute(Phpbb3Manager.SQL_CLEAR_USER_PERMISSIONS, [userid])
logger.info("Added phpbb user id %s to group id %s" % (userid, groupid)) logger.info("Added phpbb user id %s to group id %s" % (userid, groupid))
except: except:
logger.exception("Unable to add phpbb user id %s to group id %s" % (userid, groupid), exc_info=True) logger.exception("Unable to add phpbb user id %s to group id %s" % (userid, groupid))
pass pass
@staticmethod @staticmethod
@ -144,7 +144,7 @@ class Phpbb3Manager:
cursor.execute(Phpbb3Manager.SQL_CLEAR_USER_PERMISSIONS, [userid]) cursor.execute(Phpbb3Manager.SQL_CLEAR_USER_PERMISSIONS, [userid])
logger.info("Removed phpbb user id %s from group id %s" % (userid, groupid)) logger.info("Removed phpbb user id %s from group id %s" % (userid, groupid))
except: except:
logger.exception("Unable to remove phpbb user id %s from group id %s" % (userid, groupid), exc_info=True) logger.exception("Unable to remove phpbb user id %s from group id %s" % (userid, groupid))
pass pass
@staticmethod @staticmethod
@ -170,7 +170,7 @@ class Phpbb3Manager:
Phpbb3Manager.__add_avatar(username_clean, characterid) Phpbb3Manager.__add_avatar(username_clean, characterid)
logger.info("Added phpbb user %s" % username_clean) logger.info("Added phpbb user %s" % username_clean)
except: except:
logger.exception("Unable to add phpbb user %s" % username_clean, exc_info=True) logger.exception("Unable to add phpbb user %s" % username_clean)
pass pass
return username_clean, password return username_clean, password
@ -188,7 +188,7 @@ class Phpbb3Manager:
logger.info("Disabled phpbb user %s" % username) logger.info("Disabled phpbb user %s" % username)
return True return True
except TypeError as e: except TypeError as e:
logger.exception("TypeError occured while disabling user %s - failed to disable." % username, exc_info=True) logger.exception("TypeError occured while disabling user %s - failed to disable." % username)
return False return False
@staticmethod @staticmethod
@ -236,7 +236,7 @@ class Phpbb3Manager:
cursor.execute(Phpbb3Manager.SQL_REMOVE_USER_GROUP, [userid, groupid]) cursor.execute(Phpbb3Manager.SQL_REMOVE_USER_GROUP, [userid, groupid])
logger.info("Removed phpbb user %s from group %s" % (username, group)) logger.info("Removed phpbb user %s from group %s" % (username, group))
except: except:
logger.exception("Exception prevented removal of phpbb user %s with id %s from group %s with id %s" % (username, userid, group, groupid), exc_info=True) logger.exception("Exception prevented removal of phpbb user %s with id %s from group %s with id %s" % (username, userid, group, groupid))
pass pass
@staticmethod @staticmethod
@ -275,5 +275,5 @@ class Phpbb3Manager:
cursor.execute(Phpbb3Manager.SQL_DIS_USER, [email, password, username]) cursor.execute(Phpbb3Manager.SQL_DIS_USER, [email, password, username])
logger.info("Updated phpbb user %s info" % username) logger.info("Updated phpbb user %s info" % username)
except: except:
logger.exception("Unable to update phpbb user %s info." % username, exc_info=True) logger.exception("Unable to update phpbb user %s info." % username)
pass pass

View File

@ -162,7 +162,7 @@ class Teamspeak3Manager:
logger.debug("Local group does not exist for TS group %s. Creating TSgroup model %s" % (remote_groups[key], g)) logger.debug("Local group does not exist for TS group %s. Creating TSgroup model %s" % (remote_groups[key], g))
g.save() g.save()
except: except:
logger.exception("An unhandled exception has occured while syncing TS groups.", exc_info=True) logger.exception("An unhandled exception has occured while syncing TS groups.")
pass pass
@staticmethod @staticmethod

View File

@ -459,7 +459,7 @@ def activate_discord(request):
logger.info("Succesfully activated discord for user %s" % request.user) logger.info("Succesfully activated discord for user %s" % request.user)
return HttpResponseRedirect("/services/") return HttpResponseRedirect("/services/")
except: except:
logger.exception("An unhandled exception has occured.", exc_info=True) logger.exception("An unhandled exception has occured.")
pass pass
else: else:
logger.debug("Request is not type POST - providing empty form.") logger.debug("Request is not type POST - providing empty form.")

View File

@ -3401,6 +3401,11 @@ tbody.collapse.in {
box-shadow: 0 6px 12px rgba(0, 0, 0, .175) box-shadow: 0 6px 12px rgba(0, 0, 0, .175)
} }
.dropdown-menu.scrollable {
overflow: scroll;
max-height: 450px;
}
.dropdown-menu.pull-right { .dropdown-menu.pull-right {
right: 0; right: 0;
left: auto left: auto
@ -4235,6 +4240,10 @@ textarea.input-group-sm > .form-control, textarea.input-group-sm > .input-group-
line-height: 20px line-height: 20px
} }
.navbar-wide {
width: 100%;
}
@media (max-width: 767px) { @media (max-width: 767px) {
.navbar-nav .open .dropdown-menu { .navbar-nav .open .dropdown-menu {
position: static; position: static;

View File

@ -27,7 +27,7 @@ body {
margin: 0 0 0 250px; margin: 0 0 0 250px;
padding: 0 30px; padding: 0 30px;
border-left: 1px solid #e7e7e7; border-left: 1px solid #e7e7e7;
overflow: hidden; overflow: visible;
} }
} }

View File

@ -117,11 +117,18 @@
{% if perms.auth.corp_stats %} {% if perms.auth.corp_stats %}
<li> <li>
<a {% ifequal request.path "/corporation_stats" %} class="active" {% endifequal %} <a {% ifequal request.path "/corporation_stats/" %} class="active" {% endifequal %}
href="{% url 'auth_corp_stats' %}"><i href="{% url 'auth_corp_stats' %}"><i
class="fa fa-share-alt fa-fw grayiconecolor"></i> Corporation Stats</a> class="fa fa-share-alt fa-fw grayiconecolor"></i> Corporation Stats</a>
</li> </li>
{% endif %} {% endif %}
{% if perms.auth.corputils %}
<li>
<a {% ifequal request.path "/corputils/" %} class="active" {% endifequal %}
href="{% url 'auth_corp_member_view' %}"><i
class="fa fa-chain fa-fw grayiconecolor"></i> Member Tracking</a>
</li>
{% endif %}
{% if perms.auth.group_management %} {% if perms.auth.group_management %}
<li> <li>

View File

@ -15,31 +15,26 @@
<div class="col-md-4 col-md-offset-4"> <div class="col-md-4 col-md-offset-4">
<div class="row"> <div class="row">
<p class="text-center"> <p class="text-center">
Full API Key is required for auth services Member API keys require access mask {{MEMBER_API_MASK}} or greater for services.
</p> </p>
{% if MEMBER_API_ACCOUNT %}
<p class="text-center">
Member API keys need to be account-wide.
</p>
{% endif %}
<p class="text-center"> <p class="text-center">
<a target="_blank" <a target="_blank"
href="https://community.eveonline.com/support/api-key/CreatePredefined?accessMask={{MEMBER_API_MASK}}">Create href="https://community.eveonline.com/support/api-key/CreatePredefined?accessMask={{MEMBER_API_MASK}}">Create
a full API key</a> a full API key</a>
</p> </p>
{% if IS_CORP %} <p class="text-center">
Blue API keys require access mask {{BLUE_API_MASK}} or greater for services.
</p>
{% if BLUE_API_ACCOUNT %}
<p class="text-center"> <p class="text-center">
NOTE: If you are part of the corp do not check "Blue", this is for people who are blue to the BLUE API keys need to be account-wide.
corp
but are not in it. Blue access is limited.
</p>
{% else %}
<p class="text-center">
NOTE: If you are part of the alliance do not check "Blue", this is for people who are blue to the
alliance
but are not in it. Blue access is limited.
</p> </p>
{% endif %} {% endif %}
<p class="text-center"><b>Do not change the accessmask or deselect options or it will not work </b>
</p>
<p class="text-center"> <p class="text-center">
<a target="_blank" <a target="_blank"
href="https://community.eveonline.com/support/api-key/CreatePredefined?accessMask={{BLUE_API_MASK}}">Create href="https://community.eveonline.com/support/api-key/CreatePredefined?accessMask={{BLUE_API_MASK}}">Create

View File

@ -0,0 +1,187 @@
{% extends "public/base.html" %}
{% load bootstrap %}
{% load staticfiles %}
{% block title %}Alliance Auth{% endblock %}
{% block page_title %}Corporation Member Tracking{% endblock page_title %}
{% block content %}
<div class="col-lg-12">
<h1 class="page-header text-center">Corporation Member Data</h1>
{% if perms.auth.corputils %}
<div class="col-lg-12 container" id="example">
{% if corp %}
<div class="row">
<div class="col-lg-12">
<div class="panel panel-default">
<div class="panel-heading">Corporation</div>
<div class="panel-body">
<div class="col-lg-5 col-sm-2">
<img class="ra-avatar img-responsive" src="https://image.eveonline.com/Corporation/{{ corp.corporation_id }}_128.png">
</div>
<div class="col-lg-7 col-sm-2">
<h4 class="">{{ corp.corporation_name }}</h4>
<p>Ticker: {{ corp.corporation_ticker }}</p>
<p>Member count: {{ corp.member_count }}</p>
<p>Player count: {{characters_with_api|length}}</p>
<p>Unregistered characters: {{characters_without_api|length}}</p>
</div>
<div class="col-lg-12 col-sm-5">
<b>API Index:</b>
<div class="progress">
<div class="progress-bar progress-bar-striped" role="progressbar" aria-valuenow="{{characters_with_api|length}}" aria-valuemin="0" aria-valuemax="{{ corp.member_count }}" style="width: {% widthratio characters_with_api|length corp.member_count 100 %}%;">
{{characters_with_api|length}}/{{ corp.member_count }}
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<nav class="navbar navbar-default">
<div class="container-fluid">
<ul class="nav navbar-nav navbar-wide">
{% if membercorp_list %}
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Choose corporation <span class="caret"></span></a>
<ul class="dropdown-menu scrollable">
{% for membercorp_id, membercorp_name in membercorp_list %}
<li>
<a href="/corputils/{{ membercorp_id }}">{{ membercorp_name }}</a>
</li>
{% endfor %}
</ul>
</li>
{% endif %}
<li style="float: right">
<p class="navbar-btn">
<a href="https://zkillboard.com/corporation/{{ corp.corporation_id }}/" class="btn btn-default" target="_blank">{{ corp.corporation_name }} Killboard</a>
</p>
</li>
<li style="float: right">
<form class="navbar-form navbar-left" role="search" action={% url 'auth_corputils_search' %}{{ corp.corporation_id }}/ method="POST">
<div class="form-group">
{% csrf_token %}
{{ search_form.as_table }}
</div>
<button class="btn btn-default" type="submit">Search</button>
</form>
</li>
</ul>
</div>
</nav>
<ul class="nav nav-tabs">
<li class="active"><a data-toggle="tab" href="#gotapi">Registered Main Characters <b>({{characters_with_api|length}})</b></a></li>
<li><a data-toggle="tab" href="#noapi">Characters without API <b>({{characters_without_api|length}})</b></a></li>
</ul>
<div class="tab-content">
<div id="gotapi" class="tab-pane fade in active">
{% if characters_with_api %}
<div class="panel-body">
<div class="table-responsive">
<table class="table table-condensed table-hover table-striped">
<tr>
<th class="col-md-1"></th>
<th class="col-md-2">Main character</th>
<th class="col-md-2">Main corporation</th>
<th class="col-md-2">Character list</th>
<th class="col-md-5">Killboard</th>
</tr>
{% for maincharname, player in characters_with_api %}
<tr >
<td>
<img src="http://image.eveonline.com/Character/{{ player.main.character_id }}_32.jpg" class="img-circle">
</td>
<td>
<p>{{ maincharname }}</p>
</td>
<td>
{% if not corp.corporation_name == player.maincorp%}
<span class="label label-danger">
{{ player.maincorp }}
</span>
{% else %}
<span class="label label-success">
{{ player.maincorp }}
</span>
{% endif %}
</td>
<td>
{% for char in player.altlist %}
<p>{{ char.character_name }}</p>
{% endfor %}
</td>
<td>
{% for char in player.altlist %}
<p><a href="https://zkillboard.com/character/{{ char.character_id }}/" class="label label-danger" target="_blank">Killboard</a></p>
{% endfor %}
</td>
</tr>
{% endfor %}
</table>
</div>
</div>
{% else %}
<div class="alert alert-danger" role="alert">
<h3>Seems there are no characters in {{ corp.corporation_name }} tied to a registered API!</h3>
</div>
{% endif %}
</div>
<div id="noapi" class="tab-pane fade">
{% if characters_without_api %}
<div class="panel-body">
<div class="table-responsive">
<table class="table table-condensed table-hover table-striped">
<tr>
<th class="col-md-1"></th>
<th class="col-md-2">Character</th>
<th class="col-md-5">Killboard</th>
</tr>
{% for character_name, character_id in characters_without_api %}
<tr>
<td>
<img src="http://image.eveonline.com/Character/{{ character_id }}_32.jpg" class="img-circle">
</td>
<td>
<p>{{ character_name }}</p>
</td>
<td>
<a href="https://zkillboard.com/character/{{ character_id }}/" class="label label-danger" target="_blank">Killboard</a>
</td>
</tr>
{% endfor %}
</table>
</div>
</div>
{% else %}
<div class="alert alert-success" role="alert">
<h3>Good job! Every character in {{ corp.corporation_name }} seem to be tied to an API!</h3>
</div>
{% endif %}
</div>
</div>
{% else %}
<div class="container-fluid">
<div class="col-md-4 col-md-offset-4">
<div class="row">
<div class="alert alert-danger text-center" role="alert">No corporation model found. Contact your admin.</div>
</div>
</div>
</div>
</div>
{% endif %}
</div>
{% else %}
{% if IS_CORP %}
<div class="alert alert-danger" role="alert">You are not in the corporation.</div>
{% else %}
<div class="alert alert-danger" role="alert">You are not in the alliance.</div>
{% endif %}
{% endif %}
</div>
{% endblock content %}

View File

@ -0,0 +1,58 @@
{% extends "public/base.html" %}
{% load bootstrap %}
{% load staticfiles %}
{% block title %}Alliance Auth{% endblock %}
{% block page_title %}Corporation Member Tracking{% endblock page_title %}
{% block extra_css %}{% endblock extra_css %}
{% block content %}
<div class="col-lg-12">
{% if perms.auth.corputils %}
<h1 class="page-header text-center">Member Search Results
</h1>
<h2 class="text-center"><a href="{% url 'auth_corp_member_view' %}{{ corp.corporation_id }}">{{ corp.corporation_name }}</a></h2>
<div class="container-fluid">
<div class="panel panel-default">
<nav class="navbar navbar-default">
<div class="container-fluid">
<ul class="nav navbar-nav navbar-wide">
<li style="float: right">
<form class="navbar-form navbar-right" role="search" action={% url 'auth_corputils_search' %}{{ corp.corporation_id }}/ method="POST">
<div class="form-group">
{% csrf_token %}
{{ search_form.as_table }}
</div>
<button class="btn btn-default" type="submit">Search</button>
</form>
</li>
</ul>
</div>
</nav>
<div class="panel-body">
<table class="table table-condensed table-hover table-striped">
<tr>
<th>Character</th>
<th>Main Character</th>
</tr>
{% for member in members %}
<tr {% if not member.api_registered%} {% endif %} >
<td>{{ member.name }}{{ member.id }}</td>
<td>
{% if member.api_registered%}
{{ member.main }}
{% else %}
<span class="label label-danger">No API registered!</span>
{% endif %}
</td>
</tr>
{% endfor %}
</table>
</div>
</div>
</div>
{% endif %}
</div>
{% endblock content %}

View File

@ -19,6 +19,7 @@ def bootstrap_permissions():
Permission.objects.get_or_create(codename="human_resources", content_type=ct, name="human_resources") Permission.objects.get_or_create(codename="human_resources", content_type=ct, name="human_resources")
Permission.objects.get_or_create(codename="blue_member", content_type=ct, name="blue_member") Permission.objects.get_or_create(codename="blue_member", content_type=ct, name="blue_member")
Permission.objects.get_or_create(codename="corp_stats", content_type=ct, name="corp_stats") Permission.objects.get_or_create(codename="corp_stats", content_type=ct, name="corp_stats")
Permission.objects.get_or_create(codename="corputils", content_type=ct, name="corputils")
Permission.objects.get_or_create(codename="timer_management", content_type=ct, name="timer_management") Permission.objects.get_or_create(codename="timer_management", content_type=ct, name="timer_management")
Permission.objects.get_or_create(codename="timer_view", content_type=ct, name="timer_view") Permission.objects.get_or_create(codename="timer_view", content_type=ct, name="timer_view")
Permission.objects.get_or_create(codename="srp_management", content_type=ct, name="srp_management") Permission.objects.get_or_create(codename="srp_management", content_type=ct, name="srp_management")

View File

@ -21,10 +21,12 @@ def jabber_url(request):
return {'JABBER_URL': settings.JABBER_URL} return {'JABBER_URL': settings.JABBER_URL}
def member_api_mask(request): def member_api_mask(request):
return {'MEMBER_API_MASK': settings.MEMBER_API_MASK} return {'MEMBER_API_MASK': settings.MEMBER_API_MASK,
'MEMBER_API_ACCOUNT': settings.MEMBER_API_ACCOUNT}
def blue_api_mask(request): def blue_api_mask(request):
return {'BLUE_API_MASK': settings.BLUE_API_MASK} return {'BLUE_API_MASK': settings.BLUE_API_MASK,
'BLUE_API_ACCOUNT': settings.BLUE_API_ACCOUNT}
def domain_url(request): def domain_url(request):
return {'DOMAIN': settings.DOMAIN, 'MUMBLE_URL': settings.MUMBLE_URL, return {'DOMAIN': settings.DOMAIN, 'MUMBLE_URL': settings.MUMBLE_URL,