mirror of
https://gitlab.com/allianceauth/allianceauth.git
synced 2025-07-15 23:40:17 +02:00
commit
22b84588de
11
.idea/allianceauth.iml
generated
11
.idea/allianceauth.iml
generated
@ -6,21 +6,16 @@
|
||||
<option name="rootFolder" value="$MODULE_DIR$" />
|
||||
<option name="settingsModule" value="settings.py" />
|
||||
<option name="manageScript" value="manage.py" />
|
||||
<option name="environment" value="<map/>" />
|
||||
</configuration>
|
||||
</facet>
|
||||
</component>
|
||||
<component name="NewModuleRootManager">
|
||||
<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" />
|
||||
</component>
|
||||
<component name="TemplatesService">
|
||||
<option name="TEMPLATE_CONFIGURATION" value="Django" />
|
||||
<option name="TEMPLATE_FOLDERS">
|
||||
<list>
|
||||
<option value="$MODULE_DIR$/templates" />
|
||||
</list>
|
||||
</option>
|
||||
</component>
|
||||
</module>
|
||||
|
||||
</module>
|
@ -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 | 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 | 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_view ( Access to timerboard to view timers)
|
||||
auth | user | srp_management ( Allows for an individual to create and remove srp fleets and fleet data)
|
||||
|
@ -60,6 +60,7 @@ INSTALLED_APPS = (
|
||||
'srp',
|
||||
'sigtracker',
|
||||
'optimer',
|
||||
'corputils',
|
||||
)
|
||||
|
||||
MIDDLEWARE_CLASSES = (
|
||||
@ -157,6 +158,12 @@ USE_TZ = True
|
||||
STATIC_URL = '/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
|
||||
@ -448,6 +455,10 @@ LOGGING = {
|
||||
'handlers': ['log_file', 'console'],
|
||||
'level': 'DEBUG',
|
||||
},
|
||||
'corputils': {
|
||||
'handlers': ['log_file', 'console'],
|
||||
'level': 'DEBUG',
|
||||
},
|
||||
'util': {
|
||||
'handlers': ['log_file', 'console'],
|
||||
'level': 'DEBUG',
|
||||
|
@ -162,18 +162,24 @@ urlpatterns = patterns('',
|
||||
url(r'srp_request_reject/(\w+)', 'srp.views.srp_request_reject', name='auth_srp_request_reject'),
|
||||
url(r'srp_request_amount_update/(\w+)', 'srp.views.srp_request_update_amount_view',
|
||||
name="auth_srp_request_update_amount_view"),
|
||||
|
||||
# FLEET FITTINGS
|
||||
url(r'^fits/$', 'services.views.fleet_fits', name='auth_fleet_fits'),
|
||||
|
||||
# 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'),
|
||||
#corputils
|
||||
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'),
|
||||
|
||||
# FLEET FITTINGS
|
||||
url(r'^fits/$', 'services.views.fleet_fits', name='auth_fleet_fits'),
|
||||
|
||||
# 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
|
||||
url(r'^optimer/$', 'optimer.views.optimer_view', name='auth_optimer_view'),
|
||||
url(r'^add_optimer/$', 'optimer.views.add_optimer_view', name='auth_add_optimer_view'),
|
||||
url(r'^remove_optimer/(\w+)', 'optimer.views.remove_optimer', name='auth_remove_optimer'),
|
||||
|
||||
|
||||
)
|
||||
|
@ -1,6 +1,7 @@
|
||||
from django.conf import settings
|
||||
from celery.task import periodic_task
|
||||
from django.contrib.auth.models import User
|
||||
from django.contrib.auth.models import Group
|
||||
|
||||
from models import SyncGroupCache
|
||||
from celery.task.schedules import crontab
|
||||
@ -31,31 +32,15 @@ import logging
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
def disable_alliance_member(user, char_id):
|
||||
logger.debug("Disabling alliance member %s" % user)
|
||||
remove_member_permission(user, 'member')
|
||||
remove_user_from_group(user, settings.DEFAULT_AUTH_GROUP)
|
||||
remove_user_from_group(user,
|
||||
generate_corp_group_name(
|
||||
EveManager.get_character_by_id(char_id).corporation_name))
|
||||
def disable_member(user):
|
||||
logger.debug("Disabling member %s" % user)
|
||||
if user.user_permissions.all().exists():
|
||||
logger.info("Clearning user %s permission to deactivate user." % user)
|
||||
user.user_permissions.clear()
|
||||
if user.groups.all().exists():
|
||||
logger.info("Clearing user %s groups to deactivate user." % user)
|
||||
user.groups.clear()
|
||||
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():
|
||||
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))
|
||||
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
|
||||
@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)
|
||||
logger.debug("User %s has api key pairs %s" % (user, api_key_pairs))
|
||||
if api_key_pairs:
|
||||
valid_key = False
|
||||
authserviceinfo = AuthServicesInfo.objects.get(user=user)
|
||||
|
||||
authserviceinfo, c = AuthServicesInfo.objects.get_or_create(user=user)
|
||||
logger.debug("User %s has api keys. Proceeding to refresh." % user)
|
||||
if authserviceinfo.main_char_id:
|
||||
if authserviceinfo.main_char_id != "":
|
||||
#preserve old corp ID for corp change test on members
|
||||
oldcorp_id = 0
|
||||
if EveManager.get_character_by_id(authserviceinfo.main_char_id):
|
||||
oldcorp_id = EveCharacter.objects.get(character_id=authserviceinfo.main_char_id).corporation_id
|
||||
logger.debug("Determined user %s current main corp id %s" % (user, oldcorp_id))
|
||||
for api_key_pair in api_key_pairs:
|
||||
logger.debug("Running update on api key %s" % api_key_pair.api_id)
|
||||
if EveApiManager.api_key_is_valid(api_key_pair.api_id, api_key_pair.api_key):
|
||||
#check to ensure API key meets min spec
|
||||
logger.info("Determined api key %s is still active." % api_key_pair.api_id)
|
||||
still_valid = True
|
||||
if authserviceinfo.is_blue:
|
||||
if settings.BLUE_API_ACCOUNT:
|
||||
type = EveApiManager.check_api_is_type_account(api_key_pair.api_id, api_key_pair.api_key)
|
||||
if type == None:
|
||||
api_key_pair.error_count += 1
|
||||
api_key_pair.save()
|
||||
logger.info("API key %s incurred an error checking if type account. Error count is now %s" % (api_key_pair.api_id, api_key_pair.error_count))
|
||||
still_valid = None
|
||||
elif type == False:
|
||||
logger.info("Determined api key %s for blue user %s is no longer type account as requred." % (api_key_pair.api_id, user))
|
||||
still_valid = False
|
||||
full = EveApiManager.check_blue_api_is_full(api_key_pair.api_id, api_key_pair.api_key)
|
||||
if full == None:
|
||||
api_key_pair.error_count += 1
|
||||
api_key_pair.save()
|
||||
logger.info("API key %s incurred an error checking if meets mask requirements. Error count is now %s" % (api_key_pair.api_id, api_key_pair.error_count))
|
||||
still_valid = None
|
||||
elif full == False:
|
||||
logger.info("Determined api key %s for blue user %s no longer meets minimum access mask as required." % (api_key_pair.api_id, user))
|
||||
still_valid = False
|
||||
else:
|
||||
if settings.MEMBER_API_ACCOUNT:
|
||||
type = EveApiManager.check_api_is_type_account(api_key_pair.api_id, api_key_pair.api_key)
|
||||
if type == None:
|
||||
api_key_pair.error_count += 1
|
||||
api_key_pair.save()
|
||||
logger.info("API key %s incurred an error checking if type account. Error count is now %s" % (api_key_pair.api_id, api_key_pair.error_count))
|
||||
still_valid = None
|
||||
elif type == False:
|
||||
logger.info("Determined api key %s for user %s is no longer type account as required." % (api_key_pair.api_id, user))
|
||||
still_valid = False
|
||||
full = EveApiManager.check_api_is_full(api_key_pair.api_id, api_key_pair.api_key)
|
||||
if full == None:
|
||||
api_key_pair.error_count += 1
|
||||
api_key_pair.save()
|
||||
logger.info("API key %s incurred an error checking if meets mask requirements. Error count is now %s" % (api_key_pair.api_id, api_key_pair.error_count))
|
||||
still_valid = None
|
||||
elif full == False:
|
||||
logger.info("Determined api key %s for user %s no longer meets minimum access mask as required." % (api_key_pair.api_id, user))
|
||||
still_valid = False
|
||||
if still_valid == None:
|
||||
if api_key_pair.error_count >= 3:
|
||||
logger.info("API key %s has incurred 3 or more errors. Assuming invalid." % api_key_pair.api_id)
|
||||
still_valid = False
|
||||
if still_valid == False:
|
||||
logger.debug("API key %s has failed validation; it and its characters will be deleted." % api_key_pair.api_id)
|
||||
EveManager.delete_characters_by_api_id(api_key_pair.api_id, user.id)
|
||||
EveManager.delete_api_key_pair(api_key_pair.api_id, user.id)
|
||||
else:
|
||||
if api_key_pair.error_count != 0:
|
||||
logger.info("Clearing error count for api %s as it passed validation" % api_key_pair.api_id)
|
||||
api_key_pair.error_count = 0
|
||||
api_key_pair.save()
|
||||
logger.info("Determined api key %s still meets requirements." % api_key_pair.api_id)
|
||||
# Update characters
|
||||
characters = EveApiManager.get_characters_from_api(api_key_pair.api_id,
|
||||
api_key_pair.api_key)
|
||||
EveManager.update_characters_from_list(characters)
|
||||
new_character = False
|
||||
for char in characters.result:
|
||||
# Ensure we have a model for all characters on key
|
||||
if not EveManager.check_if_character_exist(characters.result[char]['name']):
|
||||
new_character = True
|
||||
logger.debug("API key %s has a new character on the account: %s" % (api_key_pair.api_id, characters.result[char]['name']))
|
||||
if new_character:
|
||||
logger.debug("Creating new character %s from api key %s" % (characters.result[char]['name'], api_key_pair.api_id))
|
||||
EveManager.create_characters_from_list(characters, user, api_key_pair.api_key)
|
||||
valid_key = True
|
||||
else:
|
||||
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)
|
||||
|
||||
for api_key_pair in api_key_pairs:
|
||||
logger.debug("Running update on api key %s" % api_key_pair.api_id)
|
||||
if EveApiManager.api_key_is_valid(api_key_pair.api_id, api_key_pair.api_key):
|
||||
#check to ensure API key meets min spec
|
||||
logger.info("Determined api key %s is still active." % api_key_pair.api_id)
|
||||
still_valid = True
|
||||
state = determine_membership_by_user(user)
|
||||
if state == "BLUE":
|
||||
if settings.BLUE_API_ACCOUNT:
|
||||
type = EveApiManager.check_api_is_type_account(api_key_pair.api_id, api_key_pair.api_key)
|
||||
if type == None:
|
||||
api_key_pair.error_count += 1
|
||||
api_key_pair.save()
|
||||
logger.info("API key %s incurred an error checking if type account. Error count is now %s" % (api_key_pair.api_id, api_key_pair.error_count))
|
||||
still_valid = None
|
||||
elif type == False:
|
||||
logger.info("Determined api key %s for blue user %s is no longer type account as requred." % (api_key_pair.api_id, user))
|
||||
still_valid = False
|
||||
full = EveApiManager.check_blue_api_is_full(api_key_pair.api_id, api_key_pair.api_key)
|
||||
if full == None:
|
||||
api_key_pair.error_count += 1
|
||||
api_key_pair.save()
|
||||
logger.info("API key %s incurred an error checking if meets mask requirements. Error count is now %s" % (api_key_pair.api_id, api_key_pair.error_count))
|
||||
still_valid = None
|
||||
elif full == False:
|
||||
logger.info("Determined api key %s for blue user %s no longer meets minimum access mask as required." % (api_key_pair.api_id, user))
|
||||
still_valid = False
|
||||
elif state == "MEMBER":
|
||||
if settings.MEMBER_API_ACCOUNT:
|
||||
type = EveApiManager.check_api_is_type_account(api_key_pair.api_id, api_key_pair.api_key)
|
||||
if type == None:
|
||||
api_key_pair.error_count += 1
|
||||
api_key_pair.save()
|
||||
logger.info("API key %s incurred an error checking if type account. Error count is now %s" % (api_key_pair.api_id, api_key_pair.error_count))
|
||||
still_valid = None
|
||||
elif type == False:
|
||||
logger.info("Determined api key %s for user %s is no longer type account as required." % (api_key_pair.api_id, user))
|
||||
still_valid = False
|
||||
full = EveApiManager.check_api_is_full(api_key_pair.api_id, api_key_pair.api_key)
|
||||
if full == None:
|
||||
api_key_pair.error_count += 1
|
||||
api_key_pair.save()
|
||||
logger.info("API key %s incurred an error checking if meets mask requirements. Error count is now %s" % (api_key_pair.api_id, api_key_pair.error_count))
|
||||
still_valid = None
|
||||
elif full == False:
|
||||
logger.info("Determined api key %s for user %s no longer meets minimum access mask as required." % (api_key_pair.api_id, user))
|
||||
still_valid = False
|
||||
if still_valid == None:
|
||||
if api_key_pair.error_count >= 3:
|
||||
logger.info("API key %s has incurred 3 or more errors. Assuming invalid." % api_key_pair.api_id)
|
||||
still_valid = False
|
||||
if still_valid == False:
|
||||
logger.debug("API key %s has failed validation; it and its characters will be deleted." % api_key_pair.api_id)
|
||||
EveManager.delete_characters_by_api_id(api_key_pair.api_id, user.id)
|
||||
EveManager.delete_api_key_pair(api_key_pair.api_id, user.id)
|
||||
elif still_valid == True:
|
||||
if api_key_pair.error_count != 0:
|
||||
logger.info("Clearing error count for api %s as it passed validation" % api_key_pair.api_id)
|
||||
api_key_pair.error_count = 0
|
||||
api_key_pair.save()
|
||||
logger.info("Determined api key %s still meets requirements." % api_key_pair.api_id)
|
||||
# Update characters
|
||||
characters = EveApiManager.get_characters_from_api(api_key_pair.api_id, api_key_pair.api_key)
|
||||
EveManager.update_characters_from_list(characters)
|
||||
new_character = False
|
||||
for char in characters.result:
|
||||
# Ensure we have a model for all characters on key
|
||||
if not EveManager.check_if_character_exist(characters.result[char]['name']):
|
||||
new_character = True
|
||||
logger.debug("API key %s has a new character on the account: %s" % (api_key_pair.api_id, characters.result[char]['name']))
|
||||
if new_character:
|
||||
logger.debug("Creating new character %s from api key %s" % (characters.result[char]['name'], api_key_pair.api_id))
|
||||
EveManager.create_characters_from_list(characters, user, api_key_pair.api_key)
|
||||
else:
|
||||
logger.debug("API key %s is no longer valid; it and its characters will be deleted." % api_key_pair.api_id)
|
||||
EveManager.delete_characters_by_api_id(api_key_pair.api_id, user.id)
|
||||
EveManager.delete_api_key_pair(api_key_pair.api_id, user.id)
|
||||
# Check our main character
|
||||
if EveCharacter.objects.filter(character_id=authserviceinfo.main_char_id).exists() is False:
|
||||
logger.info("User %s main character id %s missing model. Clearning main character." % (user, authserviceinfo.main_char_id))
|
||||
authserviceinfo.main_char_id = ''
|
||||
authserviceinfo.save()
|
||||
else:
|
||||
logger.warn("User %s has no main character id, unable to validate membership.")
|
||||
set_state(user)
|
||||
|
||||
|
||||
# Run Every 2 hours
|
||||
|
0
corputils/__init__.py
Normal file
0
corputils/__init__.py
Normal file
0
corputils/admin.py
Normal file
0
corputils/admin.py
Normal file
8
corputils/forms.py
Normal file
8
corputils/forms.py
Normal 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
0
corputils/models.py
Normal file
0
corputils/tests.py
Normal file
0
corputils/tests.py
Normal file
158
corputils/views.py
Normal file
158
corputils/views.py
Normal 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/")
|
||||
|
@ -3,49 +3,44 @@ from django.conf import settings
|
||||
|
||||
from services.managers.eve_api_manager import EveApiManager
|
||||
from eveonline.managers import EveManager
|
||||
from eveonline.models import EveCharacter
|
||||
|
||||
from celerytask.tasks import determine_membership_by_character
|
||||
|
||||
import logging
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
class UpdateKeyForm(forms.Form):
|
||||
user_state = None
|
||||
|
||||
api_id = forms.CharField(max_length=254, required=True, label="Key ID")
|
||||
api_key = forms.CharField(max_length=254, required=True, label="Verification Code")
|
||||
is_blue = forms.BooleanField(label="Blue to corp/alliance", required=False)
|
||||
|
||||
def clean(self):
|
||||
if EveManager.check_if_api_key_pair_exist(self.cleaned_data['api_id']):
|
||||
logger.debug("UpdateKeyForm failed cleaning as API id %s already exists." % self.cleaned_data['api_id'])
|
||||
raise forms.ValidationError(u'API key already exist')
|
||||
super(UpdateKeyForm, self).clean()
|
||||
|
||||
check_blue = False
|
||||
try:
|
||||
check_blue = self.cleaned_data['is_blue']
|
||||
except:
|
||||
pass
|
||||
if 'api_id' in self.cleaned_data and 'api_key' in self.cleaned_data:
|
||||
if EveManager.check_if_api_key_pair_exist(self.cleaned_data['api_id']):
|
||||
logger.debug("UpdateKeyForm failed cleaning as API id %s already exists." % self.cleaned_data['api_id'])
|
||||
raise forms.ValidationError(u'API key already exist')
|
||||
|
||||
if check_blue:
|
||||
if settings.BLUE_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 blue api key account requirement." % self.cleaned_data['api_id'])
|
||||
raise forms.ValidationError(u'API not of type account')
|
||||
|
||||
if not EveApiManager.check_blue_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 blue api access mask requirement." % self.cleaned_data['api_id'])
|
||||
raise forms.ValidationError(u'API supplied is too restricted. Minimum access mask is ' + str(settings.BLUE_API_MASK))
|
||||
|
||||
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))
|
||||
chars = EveApiManager.get_characters_from_api(self.cleaned_data['api_id'], self.cleaned_data['api_key']).result
|
||||
states = []
|
||||
states.append(self.user_state)
|
||||
for char in chars:
|
||||
evechar = EveCharacter()
|
||||
evechar.character_name = chars[char]['name']
|
||||
evechar.corporation_id = chars[char]['corp']['id']
|
||||
evechar.alliance_id = chars[char]['alliance']['id']
|
||||
state = determine_membership_by_character(evechar)
|
||||
logger.debug("API ID %s character %s has state %s" % (self.cleaned_data['api_id'], evechar, state))
|
||||
states.append(state)
|
||||
|
||||
if 'MEMBER' in states:
|
||||
if EveApiManager.validate_member_api(self.cleaned_data['api_id'], self.cleaned_data['api_key']) is False:
|
||||
raise forms.ValidationError(u'API 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
|
||||
|
@ -20,11 +20,14 @@ from eveonline.models import EveCorporationInfo
|
||||
from eveonline.models import EveCharacter
|
||||
from eveonline.models import EveApiKeyPair
|
||||
from authentication.models import AuthServicesInfo
|
||||
from celerytask.tasks import determine_membership_by_user
|
||||
from celerytask.tasks import set_state
|
||||
|
||||
import logging
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def disable_member(user, char_id):
|
||||
logger.debug("Disabling user %s with character id %s" % (user, char_id))
|
||||
remove_member_permission(user, 'member')
|
||||
@ -46,8 +49,10 @@ def disable_blue_member(user):
|
||||
@login_required
|
||||
def add_api_key(request):
|
||||
logger.debug("add_api_key called by user %s" % request.user)
|
||||
user_state = determine_membership_by_user(request.user)
|
||||
if request.method == 'POST':
|
||||
form = UpdateKeyForm(request.POST)
|
||||
form.user_state=user_state
|
||||
logger.debug("Request type POST with form valid: %s" % form.is_valid())
|
||||
if form.is_valid():
|
||||
EveManager.create_api_keypair(form.cleaned_data['api_id'],
|
||||
@ -65,6 +70,7 @@ def add_api_key(request):
|
||||
else:
|
||||
logger.debug("Providing empty update key form for user %s" % request.user)
|
||||
form = UpdateKeyForm()
|
||||
form.user_state = user_state
|
||||
context = {'form': form, 'apikeypairs': EveManager.get_api_key_pairs(request.user.id)}
|
||||
return render_to_response('registered/addapikey.html', context,
|
||||
context_instance=RequestContext(request))
|
||||
@ -115,41 +121,8 @@ def characters_view(request):
|
||||
def main_character_change(request, char_id):
|
||||
logger.debug("main_character_change called by user %s for character id %s" % (request.user, char_id))
|
||||
if EveManager.check_if_character_owned_by_user(char_id, request.user):
|
||||
previousmainid = AuthServicesInfoManager.get_auth_service_info(request.user).main_char_id
|
||||
AuthServicesInfoManager.update_main_char_Id(char_id, request.user)
|
||||
# Check if character is in the alliance
|
||||
character_info = EveManager.get_character_by_id(char_id)
|
||||
corporation_info = EveManager.get_corporation_info_by_id(character_info.corporation_id)
|
||||
logger.debug("User %s changing main character to %s in corp %s" % (request.user, character_info, corporation_info))
|
||||
if (settings.IS_CORP and EveManager.get_charater_corporation_id_by_id(char_id) == settings.CORP_ID) or (not settings.IS_CORP and EveManager.get_charater_alliance_id_by_id(char_id) == settings.ALLIANCE_ID):
|
||||
add_member_permission(request.user, 'member')
|
||||
add_user_to_group(request.user, settings.DEFAULT_AUTH_GROUP)
|
||||
add_user_to_group(request.user,
|
||||
generate_corp_group_name(EveManager.get_character_by_id(char_id).corporation_name))
|
||||
logger.info("User %s transitioned to full member by chaning main character to %s" % (request.user, character_info))
|
||||
|
||||
elif corporation_info != None:
|
||||
if corporation_info.is_blue:
|
||||
add_member_permission(request.user, 'blue_member')
|
||||
add_user_to_group(request.user, settings.DEFAULT_BLUE_GROUP)
|
||||
AuthServicesInfoManager.update_is_blue(True, request.user)
|
||||
logger.info("User %s transitioned to blue by changing main character to %s" % (request.user, character_info))
|
||||
else:
|
||||
if check_if_user_has_permission(request.user, 'member'):
|
||||
disable_member(request.user, previousmainid)
|
||||
|
||||
if check_if_user_has_permission(request.user, 'blue_member'):
|
||||
disable_blue_member(request.user)
|
||||
logger.info("User %s disabled as new main character %s not member nor blue." % (request.user, character_info))
|
||||
else:
|
||||
# TODO: disable serivces
|
||||
if check_if_user_has_permission(request.user, 'member'):
|
||||
disable_member(request.user, previousmainid)
|
||||
|
||||
if check_if_user_has_permission(request.user, 'blue_member'):
|
||||
disable_blue_member(request.user)
|
||||
logger.info("User %s disabled as new main character %s does not have corp model to check." % (request.user, character_info))
|
||||
|
||||
set_state(request.user)
|
||||
return HttpResponseRedirect("/characters")
|
||||
return HttpResponseRedirect("/characters")
|
||||
|
||||
|
@ -49,7 +49,7 @@ def group_accept_request(request, group_request_id):
|
||||
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))
|
||||
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
|
||||
|
||||
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))
|
||||
group_request.delete()
|
||||
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
|
||||
|
||||
return HttpResponseRedirect("/group/management/")
|
||||
@ -84,7 +84,7 @@ def group_leave_accept_request(request, group_request_id):
|
||||
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))
|
||||
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
|
||||
|
||||
return HttpResponseRedirect("/group/management/")
|
||||
@ -101,7 +101,7 @@ def group_leave_reject_request(request, group_request_id):
|
||||
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))
|
||||
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
|
||||
|
||||
return HttpResponseRedirect("/group/management/")
|
||||
|
@ -22,236 +22,236 @@ logger = logging.getLogger(__name__)
|
||||
|
||||
@login_required
|
||||
def hr_application_management_view(request):
|
||||
logger.debug("hr_application_management_view called by user %s" % request.user)
|
||||
personal_app = None
|
||||
corp_applications = None
|
||||
logger.debug("hr_application_management_view called by user %s" % request.user)
|
||||
personal_app = None
|
||||
corp_applications = None
|
||||
|
||||
if request.user.is_superuser:
|
||||
logger.debug("User %s is superuser: returning all applications." % request.user)
|
||||
corp_applications = HRApplication.objects.all()
|
||||
else:
|
||||
# Get the corp the member is in
|
||||
auth_info = AuthServicesInfo.objects.get(user=request.user)
|
||||
if auth_info.main_char_id != "":
|
||||
try:
|
||||
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)
|
||||
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)
|
||||
if EveCorporationInfo.objects.filter(corporation_id=main_char.corporation_id).exists():
|
||||
corp = EveCorporationInfo.objects.get(corporation_id=main_char.corporation_id)
|
||||
corp_applications = HRApplication.objects.filter(corp=corp).filter(approved_denied=None)
|
||||
else:
|
||||
corp_applications = None
|
||||
else:
|
||||
corp_applications = None
|
||||
except:
|
||||
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
|
||||
context = {'personal_apps': HRApplication.objects.all().filter(user=request.user),
|
||||
'applications': corp_applications,
|
||||
'search_form': HRApplicationSearchForm()}
|
||||
if request.user.is_superuser:
|
||||
logger.debug("User %s is superuser: returning all applications." % request.user)
|
||||
corp_applications = HRApplication.objects.all()
|
||||
else:
|
||||
# Get the corp the member is in
|
||||
auth_info = AuthServicesInfo.objects.get(user=request.user)
|
||||
if auth_info.main_char_id != "":
|
||||
try:
|
||||
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)
|
||||
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)
|
||||
if EveCorporationInfo.objects.filter(corporation_id=main_char.corporation_id).exists():
|
||||
corp = EveCorporationInfo.objects.get(corporation_id=main_char.corporation_id)
|
||||
corp_applications = HRApplication.objects.filter(corp=corp).filter(approved_denied=None)
|
||||
else:
|
||||
corp_applications = None
|
||||
else:
|
||||
corp_applications = None
|
||||
except:
|
||||
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
|
||||
context = {'personal_apps': HRApplication.objects.all().filter(user=request.user),
|
||||
'applications': corp_applications,
|
||||
'search_form': HRApplicationSearchForm()}
|
||||
|
||||
return render_to_response('registered/hrapplicationmanagement.html',
|
||||
context, context_instance=RequestContext(request))
|
||||
return render_to_response('registered/hrapplicationmanagement.html',
|
||||
context, context_instance=RequestContext(request))
|
||||
|
||||
|
||||
@login_required
|
||||
def hr_application_create_view(request):
|
||||
logger.debug("hr_application_create_view called by user %s" % request.user)
|
||||
success = False
|
||||
logger.debug("hr_application_create_view called by user %s" % request.user)
|
||||
success = False
|
||||
|
||||
if request.method == 'POST':
|
||||
form = HRApplicationForm(request.POST)
|
||||
logger.debug("Request type POST with form valid: %s" % form.is_valid())
|
||||
if form.is_valid():
|
||||
application = HRApplication()
|
||||
application.user = request.user
|
||||
application.character_name = form.cleaned_data['character_name']
|
||||
application.full_api_id = form.cleaned_data['full_api_id']
|
||||
application.full_api_key = form.cleaned_data['full_api_key']
|
||||
application.corp = EveCorporationInfo.objects.get(corporation_id=form.cleaned_data['corp'])
|
||||
application.is_a_spi = form.cleaned_data['is_a_spi']
|
||||
application.about = form.cleaned_data['about']
|
||||
application.extra = form.cleaned_data['extra']
|
||||
application.save()
|
||||
success = True
|
||||
logger.info("Created HRApplication for user %s to corp %s" % (request.user, application.corp))
|
||||
else:
|
||||
logger.debug("Providing empty form.")
|
||||
form = HRApplicationForm()
|
||||
if request.method == 'POST':
|
||||
form = HRApplicationForm(request.POST)
|
||||
logger.debug("Request type POST with form valid: %s" % form.is_valid())
|
||||
if form.is_valid():
|
||||
application = HRApplication()
|
||||
application.user = request.user
|
||||
application.character_name = form.cleaned_data['character_name']
|
||||
application.full_api_id = form.cleaned_data['full_api_id']
|
||||
application.full_api_key = form.cleaned_data['full_api_key']
|
||||
application.corp = EveCorporationInfo.objects.get(corporation_id=form.cleaned_data['corp'])
|
||||
application.is_a_spi = form.cleaned_data['is_a_spi']
|
||||
application.about = form.cleaned_data['about']
|
||||
application.extra = form.cleaned_data['extra']
|
||||
application.save()
|
||||
success = True
|
||||
logger.info("Created HRApplication for user %s to corp %s" % (request.user, application.corp))
|
||||
else:
|
||||
logger.debug("Providing empty form.")
|
||||
form = HRApplicationForm()
|
||||
|
||||
context = {'form': form, 'success': success}
|
||||
return render_to_response('registered/hrcreateapplication.html',
|
||||
context, context_instance=RequestContext(request))
|
||||
context = {'form': form, 'success': success}
|
||||
return render_to_response('registered/hrcreateapplication.html',
|
||||
context, context_instance=RequestContext(request))
|
||||
|
||||
|
||||
@login_required
|
||||
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))
|
||||
if HRApplication.objects.filter(id=app_id).exists():
|
||||
application = HRApplication.objects.get(id=app_id)
|
||||
logger.debug("Got application id %s: %s" % (app_id, application))
|
||||
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))
|
||||
application = HRApplication()
|
||||
else:
|
||||
logger.error("Unable to locate HRApplication matching id %s - returning blank application to user %s" % (app_id, request.user))
|
||||
application = HRApplication()
|
||||
context = {'application': application}
|
||||
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():
|
||||
application = HRApplication.objects.get(id=app_id)
|
||||
logger.debug("Got application id %s: %s" % (app_id, application))
|
||||
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))
|
||||
application = HRApplication()
|
||||
else:
|
||||
logger.error("Unable to locate HRApplication matching id %s - returning blank application to user %s" % (app_id, request.user))
|
||||
application = HRApplication()
|
||||
context = {'application': application}
|
||||
|
||||
return render_to_response('registered/hrapplicationview.html',
|
||||
context, context_instance=RequestContext(request))
|
||||
return render_to_response('registered/hrapplicationview.html',
|
||||
context, context_instance=RequestContext(request))
|
||||
|
||||
|
||||
@login_required
|
||||
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))
|
||||
if HRApplication.objects.filter(id=app_id).exists():
|
||||
application = HRApplication.objects.get(id=app_id)
|
||||
if application.user == request.user:
|
||||
application.delete()
|
||||
logger.info("Deleted HRApplication with id %s for user %s to corp %s" % (app_id, request.user, application.corp))
|
||||
else:
|
||||
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/")
|
||||
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():
|
||||
application = HRApplication.objects.get(id=app_id)
|
||||
if application.user == request.user:
|
||||
application.delete()
|
||||
logger.info("Deleted HRApplication with id %s for user %s to corp %s" % (app_id, request.user, application.corp))
|
||||
else:
|
||||
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/")
|
||||
|
||||
|
||||
@login_required
|
||||
@permission_required('auth.human_resources')
|
||||
def hr_application_view(request, app_id):
|
||||
logger.debug("hr_application_view called by user %s for app id %s" % (request.user, app_id))
|
||||
if request.method == 'POST':
|
||||
form = HRApplicationCommentForm(request.POST)
|
||||
logger.debug("Request type POST contains form valid: %s" % form.is_valid())
|
||||
if form.is_valid():
|
||||
auth_info = AuthServicesInfo.objects.get(user=request.user)
|
||||
logger.debug("hr_application_view called by user %s for app id %s" % (request.user, app_id))
|
||||
if request.method == 'POST':
|
||||
form = HRApplicationCommentForm(request.POST)
|
||||
logger.debug("Request type POST contains form valid: %s" % form.is_valid())
|
||||
if form.is_valid():
|
||||
auth_info = AuthServicesInfo.objects.get(user=request.user)
|
||||
|
||||
comment = HRApplicationComment()
|
||||
comment.application = HRApplication.objects.get(id=int(form.cleaned_data['app_id']))
|
||||
comment.commenter_user = request.user
|
||||
comment.commenter_character = EveCharacter.objects.get(character_id=auth_info.main_char_id)
|
||||
comment.comment = form.cleaned_data['comment']
|
||||
comment.save()
|
||||
logger.info("Saved comment by user %s to hrapplication %s" % (request.user, comment.application))
|
||||
comment = HRApplicationComment()
|
||||
comment.application = HRApplication.objects.get(id=int(form.cleaned_data['app_id']))
|
||||
comment.commenter_user = request.user
|
||||
comment.commenter_character = EveCharacter.objects.get(character_id=auth_info.main_char_id)
|
||||
comment.comment = form.cleaned_data['comment']
|
||||
comment.save()
|
||||
logger.info("Saved comment by user %s to hrapplication %s" % (request.user, comment.application))
|
||||
|
||||
else:
|
||||
logger.debug("Returning blank HRApplication comment form.")
|
||||
form = HRApplicationCommentForm()
|
||||
else:
|
||||
logger.debug("Returning blank HRApplication comment form.")
|
||||
form = HRApplicationCommentForm()
|
||||
|
||||
if HRApplication.objects.filter(id=app_id).exists():
|
||||
application = HRApplication.objects.get(id=app_id)
|
||||
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)))
|
||||
else:
|
||||
application = HRApplication()
|
||||
comments = []
|
||||
logger.error("HRAppllication with id %s not found - returning blank applicatin to user %s" % request.user)
|
||||
if HRApplication.objects.filter(id=app_id).exists():
|
||||
application = HRApplication.objects.get(id=app_id)
|
||||
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)))
|
||||
else:
|
||||
application = HRApplication()
|
||||
comments = []
|
||||
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',
|
||||
context, context_instance=RequestContext(request))
|
||||
return render_to_response('registered/hrapplicationview.html',
|
||||
context, context_instance=RequestContext(request))
|
||||
|
||||
|
||||
@login_required
|
||||
@permission_required('auth.human_resources')
|
||||
def hr_application_remove(request, 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():
|
||||
application = HRApplication.objects.get(id=app_id)
|
||||
if application:
|
||||
logger.info("Deleted HRApplication id %s on behalf of user %s" % (app_id, request.user))
|
||||
application.delete()
|
||||
else:
|
||||
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():
|
||||
application = HRApplication.objects.get(id=app_id)
|
||||
if application:
|
||||
logger.info("Deleted HRApplication id %s on behalf of user %s" % (app_id, request.user))
|
||||
application.delete()
|
||||
else:
|
||||
logger.error("Unable to delete HRApplication with id %s on behalf of user %s: application is NoneType" % (app_id, request.user))
|
||||
else:
|
||||
logger.error("Unable to delete HRApplication with id %s on behalf of user %s: application not found." % (app_id, request.user))
|
||||
else:
|
||||
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
|
||||
@permission_required('auth.human_resources')
|
||||
def hr_application_approve(request, 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():
|
||||
auth_info = AuthServicesInfo.objects.get(user=request.user)
|
||||
application = HRApplication.objects.get(id=app_id)
|
||||
application.approved_denied = True
|
||||
application.reviewer_user = request.user
|
||||
application.reviewer_character = EveCharacter.objects.get(character_id=auth_info.main_char_id)
|
||||
application.save()
|
||||
logger.info("HRApplication for user %s to corp %s approved by %s" % (application.user, application.corp, request.user))
|
||||
else:
|
||||
logger.error("User %s unable to approve HRApplication id %s - hrapplication with that id not found." % (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():
|
||||
auth_info = AuthServicesInfo.objects.get(user=request.user)
|
||||
application = HRApplication.objects.get(id=app_id)
|
||||
application.approved_denied = True
|
||||
application.reviewer_user = request.user
|
||||
application.reviewer_character = EveCharacter.objects.get(character_id=auth_info.main_char_id)
|
||||
application.save()
|
||||
logger.info("HRApplication for user %s to corp %s approved by %s" % (application.user, application.corp, request.user))
|
||||
else:
|
||||
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
|
||||
@permission_required('auth.human_resources')
|
||||
def hr_application_reject(request, 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():
|
||||
auth_info = AuthServicesInfo.objects.get(user=request.user)
|
||||
application = HRApplication.objects.get(id=app_id)
|
||||
application.approved_denied = False
|
||||
application.reviewer_user = request.user
|
||||
application.reviewer_character = EveCharacter.objects.get(character_id=auth_info.main_char_id)
|
||||
application.save()
|
||||
logger.info("HRApplication for user %s to corp %s rejected by %s" % (application.user, application.corp, request.user))
|
||||
else:
|
||||
logger.error("User %s unable to reject HRApplication id %s - hrapplication with that id not found." % (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():
|
||||
auth_info = AuthServicesInfo.objects.get(user=request.user)
|
||||
application = HRApplication.objects.get(id=app_id)
|
||||
application.approved_denied = False
|
||||
application.reviewer_user = request.user
|
||||
application.reviewer_character = EveCharacter.objects.get(character_id=auth_info.main_char_id)
|
||||
application.save()
|
||||
logger.info("HRApplication for user %s to corp %s rejected by %s" % (application.user, application.corp, request.user))
|
||||
else:
|
||||
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
|
||||
@permission_required('auth.human_resources')
|
||||
def hr_application_search(request):
|
||||
logger.debug("hr_application_search called by user %s" % request.user)
|
||||
if request.method == 'POST':
|
||||
form = HRApplicationSearchForm(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']
|
||||
applications = []
|
||||
logger.debug("Searching for application with character name %s for user %s" % (searchstring, request.user))
|
||||
logger.debug("hr_application_search called by user %s" % request.user)
|
||||
if request.method == 'POST':
|
||||
form = HRApplicationSearchForm(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']
|
||||
applications = []
|
||||
logger.debug("Searching for application with character name %s for user %s" % (searchstring, request.user))
|
||||
|
||||
for application in HRApplication.objects.all():
|
||||
if searchstring in application.character_name:
|
||||
applications.append(application)
|
||||
logger.info("Found %s HRApplications for user %s matching search string %s" % (len(applications), request.user, searchstring))
|
||||
for application in HRApplication.objects.all():
|
||||
if searchstring in application.character_name:
|
||||
applications.append(application)
|
||||
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',
|
||||
context, context_instance=RequestContext(request))
|
||||
else:
|
||||
logger.debug("Form invalid - returning for user %s to retry." % request.user)
|
||||
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))
|
||||
else:
|
||||
logger.debug("Form invalid - returning for user %s to retry." % request.user)
|
||||
context = {'applications': None, 'search_form': form}
|
||||
return render_to_response('registered/hrapplicationsearchview.html',
|
||||
context, context_instance=RequestContext(request))
|
||||
|
||||
else:
|
||||
logger.debug("Returning empty search form for user %s" % request.user)
|
||||
return HttpResponseRedirect("/hr_application_management/")
|
||||
|
||||
else:
|
||||
logger.debug("Returning empty search form for user %s" % request.user)
|
||||
return HttpResponseRedirect("/hr_application_management/")
|
||||
|
||||
|
||||
@login_required
|
||||
@permission_required('auth.human_resources')
|
||||
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))
|
||||
if HRApplication.objects.filter(id=app_id).exists():
|
||||
auth_info = AuthServicesInfo.objects.get(user=request.user)
|
||||
application = HRApplication.objects.get(id=app_id)
|
||||
application.reviewer_inprogress_character = EveCharacter.objects.get(character_id=auth_info.main_char_id)
|
||||
application.save()
|
||||
logger.info("Marked HRApplication for user %s to corp %s in progress by user %s" % (application.user, application.corp, request.user))
|
||||
else:
|
||||
logger.error("Unable to mark HRApplication id %s in progress by user %s - hrapplication matching id not found." % (app_id, request.user))
|
||||
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():
|
||||
auth_info = AuthServicesInfo.objects.get(user=request.user)
|
||||
application = HRApplication.objects.get(id=app_id)
|
||||
application.reviewer_inprogress_character = EveCharacter.objects.get(character_id=auth_info.main_char_id)
|
||||
application.save()
|
||||
logger.info("Marked HRApplication for user %s to corp %s in progress by user %s" % (application.user, application.corp, request.user))
|
||||
else:
|
||||
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))
|
||||
|
@ -5,6 +5,7 @@ evelink
|
||||
dnspython
|
||||
passlib
|
||||
requests>=2.9.1
|
||||
requests_cache
|
||||
|
||||
# Django Stuff #
|
||||
django==1.6.5
|
||||
|
@ -399,7 +399,7 @@ class DiscordManager:
|
||||
logger.info("Added user to discord server %s with id %s" % (settings.DISCORD_SERVER_ID, user_id))
|
||||
return user_id
|
||||
except:
|
||||
logger.exception("An unhandled exception has occured.", exc_info=True)
|
||||
logger.exception("An unhandled exception has occured.")
|
||||
return ""
|
||||
|
||||
@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))
|
||||
return True
|
||||
except:
|
||||
logger.exception("An unhandled exception has occured.", exc_info=True)
|
||||
logger.exception("An unhandled exception has occured.")
|
||||
return False
|
||||
|
@ -22,7 +22,7 @@ class EveApiManager():
|
||||
account = evelink.account.Account(api=api)
|
||||
chars = account.characters()
|
||||
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))
|
||||
return chars
|
||||
@ -38,7 +38,7 @@ class EveApiManager():
|
||||
logger.debug("Retrieved corp sheet for id %s: %s" % (corp_id, response))
|
||||
ticker = response[0]['ticker']
|
||||
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))
|
||||
return ticker
|
||||
@ -53,7 +53,7 @@ class EveApiManager():
|
||||
alliance = eve.alliances()
|
||||
results = alliance[0][int(alliance_id)]
|
||||
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)
|
||||
return results
|
||||
|
||||
@ -67,7 +67,7 @@ class EveApiManager():
|
||||
corpinfo = corp.corporation_sheet(corp_id=int(corp_id))
|
||||
results = corpinfo[0]
|
||||
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)
|
||||
return results
|
||||
|
||||
@ -82,7 +82,7 @@ class EveApiManager():
|
||||
return info[0]['type'] == "account"
|
||||
|
||||
except evelink.api.APIError as error:
|
||||
logger.exception("Unhandled APIError occured.", exc_info=True)
|
||||
logger.exception("Unhandled APIError occured.")
|
||||
return None
|
||||
|
||||
|
||||
@ -97,7 +97,7 @@ class EveApiManager():
|
||||
return info[0]['access_mask'] & int(settings.MEMBER_API_MASK) == int(settings.MEMBER_API_MASK)
|
||||
|
||||
except evelink.api.APIError as error:
|
||||
logger.exception("Unhandled APIError occured.", exc_info=True)
|
||||
logger.exception("Unhandled APIError occured.")
|
||||
return None
|
||||
|
||||
@staticmethod
|
||||
@ -111,7 +111,7 @@ class EveApiManager():
|
||||
return info[0]['access_mask'] & int(settings.BLUE_API_MASK) == int(settings.BLUE_API_MASK)
|
||||
|
||||
except evelink.api.APIError as error:
|
||||
logger.exception("Unhandled APIError occured.", exc_info=True)
|
||||
logger.exception("Unhandled APIError occured.")
|
||||
return None
|
||||
|
||||
|
||||
@ -126,7 +126,7 @@ class EveApiManager():
|
||||
return info
|
||||
|
||||
except evelink.api.APIError as error:
|
||||
logger.exception("Unhandled APIError occured.", exc_info=True)
|
||||
logger.exception("Unhandled APIError occured.")
|
||||
return None
|
||||
|
||||
@staticmethod
|
||||
@ -139,7 +139,7 @@ class EveApiManager():
|
||||
logger.info("Verified api id %s is still valid." % api_id)
|
||||
return True
|
||||
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)
|
||||
return False
|
||||
@ -154,7 +154,7 @@ class EveApiManager():
|
||||
logger.info("Verified API server is online and reachable.")
|
||||
return True
|
||||
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.")
|
||||
return False
|
||||
@ -170,7 +170,7 @@ class EveApiManager():
|
||||
logger.debug("Confirmed id %s is a corp." % corp_id)
|
||||
return True
|
||||
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)
|
||||
return False
|
||||
@ -183,7 +183,7 @@ class EveApiManager():
|
||||
api = evelink.api.API(api_key=(settings.CORP_API_ID, settings.CORP_API_VCODE))
|
||||
corp = evelink.corp.Corp(api=api)
|
||||
corpinfo = corp.contacts()
|
||||
results = corpinfo[0]
|
||||
results = corpinfo.result
|
||||
logger.debug("Got corp standings from settings: %s" % results)
|
||||
return results
|
||||
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.")
|
||||
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
|
||||
def check_if_id_is_alliance(alliance_id):
|
||||
logger.debug("Checking if id %s is an alliance." % alliance_id)
|
||||
@ -199,12 +214,12 @@ class EveApiManager():
|
||||
api = evelink.api.API()
|
||||
eve = evelink.eve.EVE(api=api)
|
||||
alliance = eve.alliances()
|
||||
results = alliance[0][int(alliance_id)]
|
||||
results = alliance.result[int(alliance_id)]
|
||||
if results:
|
||||
logger.debug("Confirmed id %s is an alliance." % alliance_id)
|
||||
return True
|
||||
except evelink.api.APIError as error:
|
||||
logger.exception("APIError occured while checking if id %s is an alliance. Possibly not alliance?" % alliance_id, 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)
|
||||
return False
|
||||
@ -220,7 +235,7 @@ class EveApiManager():
|
||||
logger.debug("Confirmed id %s is a character." % character_id)
|
||||
return True
|
||||
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)
|
||||
return False
|
||||
@ -239,11 +254,11 @@ class EveApiManager():
|
||||
logger.debug("Verified alliance id %s does not exist." % alliance_id)
|
||||
return False
|
||||
except evelink.api.APIError as error:
|
||||
logger.exception("Unhandled APIError occured.", exc_info=True)
|
||||
logger.exception("Unhandled APIError occured.")
|
||||
return False
|
||||
except ValueError as error:
|
||||
#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
|
||||
logger.warn("Exception prevented verification of alliance id %s existance. Assuming false." % alliance_id)
|
||||
return False
|
||||
@ -263,7 +278,30 @@ class EveApiManager():
|
||||
return False
|
||||
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
|
||||
logger.exception("Unhandled APIError occured.", exc_info=True)
|
||||
logger.exception("Unhandled APIError occured.")
|
||||
return False
|
||||
logger.warn("Exception prevented verification of corp id %s existance. Assuming false." % corp_id)
|
||||
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
|
||||
|
20
services/managers/evewho_manager.py
Normal file
20
services/managers/evewho_manager.py
Normal 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"]}
|
@ -153,9 +153,9 @@ class MumbleManager:
|
||||
logger.info("Added user to mumble with username %s" % username_clean)
|
||||
return username_clean, password
|
||||
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:
|
||||
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.")
|
||||
return "", ""
|
||||
|
||||
@ -177,7 +177,7 @@ class MumbleManager:
|
||||
logger.info("Added blue user to mumble with username %s" % username_clean)
|
||||
return username_clean, password
|
||||
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.")
|
||||
return "", ""
|
||||
|
||||
@ -207,7 +207,7 @@ class MumbleManager:
|
||||
logger.info("Deleted user %s from mumble." % username)
|
||||
return True
|
||||
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
|
||||
logger.error("User %s not found on mumble. Unable to delete." % username)
|
||||
return False
|
||||
@ -228,7 +228,7 @@ class MumbleManager:
|
||||
logger.info("Updated mumble user %s password." % username)
|
||||
return password
|
||||
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 ""
|
||||
logger.error("User %s not found on mumble. Unable to update password." % username)
|
||||
return ""
|
||||
@ -250,11 +250,11 @@ class MumbleManager:
|
||||
logger.debug("Adding mumble user %s to group %s" % (userid, mumble_groups[g]))
|
||||
MumbleManager._add_user_to_group(userid, mumble_groups[g])
|
||||
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:
|
||||
try:
|
||||
logger.debug("Deleting mumble user %s from group %s" % (userid, mumble_groups[g]))
|
||||
MumbleManager._del_user_from_group(userid, mumble_groups[g])
|
||||
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]))
|
||||
|
@ -132,7 +132,7 @@ class Phpbb3Manager:
|
||||
cursor.execute(Phpbb3Manager.SQL_CLEAR_USER_PERMISSIONS, [userid])
|
||||
logger.info("Added phpbb user id %s to group id %s" % (userid, groupid))
|
||||
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
|
||||
|
||||
@staticmethod
|
||||
@ -144,7 +144,7 @@ class Phpbb3Manager:
|
||||
cursor.execute(Phpbb3Manager.SQL_CLEAR_USER_PERMISSIONS, [userid])
|
||||
logger.info("Removed phpbb user id %s from group id %s" % (userid, groupid))
|
||||
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
|
||||
|
||||
@staticmethod
|
||||
@ -170,7 +170,7 @@ class Phpbb3Manager:
|
||||
Phpbb3Manager.__add_avatar(username_clean, characterid)
|
||||
logger.info("Added phpbb user %s" % username_clean)
|
||||
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
|
||||
|
||||
return username_clean, password
|
||||
@ -188,7 +188,7 @@ class Phpbb3Manager:
|
||||
logger.info("Disabled phpbb user %s" % username)
|
||||
return True
|
||||
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
|
||||
|
||||
@staticmethod
|
||||
@ -236,7 +236,7 @@ class Phpbb3Manager:
|
||||
cursor.execute(Phpbb3Manager.SQL_REMOVE_USER_GROUP, [userid, groupid])
|
||||
logger.info("Removed phpbb user %s from group %s" % (username, group))
|
||||
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
|
||||
|
||||
@staticmethod
|
||||
@ -275,5 +275,5 @@ class Phpbb3Manager:
|
||||
cursor.execute(Phpbb3Manager.SQL_DIS_USER, [email, password, username])
|
||||
logger.info("Updated phpbb user %s info" % username)
|
||||
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
|
||||
|
@ -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))
|
||||
g.save()
|
||||
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
|
||||
|
||||
@staticmethod
|
||||
|
@ -459,7 +459,7 @@ def activate_discord(request):
|
||||
logger.info("Succesfully activated discord for user %s" % request.user)
|
||||
return HttpResponseRedirect("/services/")
|
||||
except:
|
||||
logger.exception("An unhandled exception has occured.", exc_info=True)
|
||||
logger.exception("An unhandled exception has occured.")
|
||||
pass
|
||||
else:
|
||||
logger.debug("Request is not type POST - providing empty form.")
|
||||
|
11
stock/static/css/bootstrap.min.css
vendored
11
stock/static/css/bootstrap.min.css
vendored
@ -3401,6 +3401,11 @@ tbody.collapse.in {
|
||||
box-shadow: 0 6px 12px rgba(0, 0, 0, .175)
|
||||
}
|
||||
|
||||
.dropdown-menu.scrollable {
|
||||
overflow: scroll;
|
||||
max-height: 450px;
|
||||
}
|
||||
|
||||
.dropdown-menu.pull-right {
|
||||
right: 0;
|
||||
left: auto
|
||||
@ -4235,6 +4240,10 @@ textarea.input-group-sm > .form-control, textarea.input-group-sm > .input-group-
|
||||
line-height: 20px
|
||||
}
|
||||
|
||||
.navbar-wide {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
@media (max-width: 767px) {
|
||||
.navbar-nav .open .dropdown-menu {
|
||||
position: static;
|
||||
@ -6663,4 +6672,4 @@ button.close {
|
||||
.hidden-print {
|
||||
display: none !important
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -27,7 +27,7 @@ body {
|
||||
margin: 0 0 0 250px;
|
||||
padding: 0 30px;
|
||||
border-left: 1px solid #e7e7e7;
|
||||
overflow: hidden;
|
||||
overflow: visible;
|
||||
}
|
||||
}
|
||||
|
||||
@ -346,4 +346,4 @@ table.dataTable thead .sorting:after {
|
||||
|
||||
.panel-yellow a:hover {
|
||||
color: #df8a13;
|
||||
}
|
||||
}
|
||||
|
@ -117,11 +117,18 @@
|
||||
|
||||
{% if perms.auth.corp_stats %}
|
||||
<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
|
||||
class="fa fa-share-alt fa-fw grayiconecolor"></i> Corporation Stats</a>
|
||||
</li>
|
||||
{% 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 %}
|
||||
<li>
|
||||
|
@ -15,31 +15,26 @@
|
||||
<div class="col-md-4 col-md-offset-4">
|
||||
<div class="row">
|
||||
<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>
|
||||
|
||||
{% if MEMBER_API_ACCOUNT %}
|
||||
<p class="text-center">
|
||||
Member API keys need to be account-wide.
|
||||
</p>
|
||||
{% endif %}
|
||||
<p class="text-center">
|
||||
<a target="_blank"
|
||||
href="https://community.eveonline.com/support/api-key/CreatePredefined?accessMask={{MEMBER_API_MASK}}">Create
|
||||
a full API key</a>
|
||||
</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">
|
||||
NOTE: If you are part of the corp do not check "Blue", this is for people who are blue to the
|
||||
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.
|
||||
BLUE API keys need to be account-wide.
|
||||
</p>
|
||||
{% 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">
|
||||
<a target="_blank"
|
||||
href="https://community.eveonline.com/support/api-key/CreatePredefined?accessMask={{BLUE_API_MASK}}">Create
|
||||
|
187
stock/templates/registered/corputils.html
Normal file
187
stock/templates/registered/corputils.html
Normal 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 %}
|
58
stock/templates/registered/corputilssearchview.html
Normal file
58
stock/templates/registered/corputilssearchview.html
Normal 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 %}
|
@ -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="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="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_view", content_type=ct, name="timer_view")
|
||||
Permission.objects.get_or_create(codename="srp_management", content_type=ct, name="srp_management")
|
||||
|
@ -21,10 +21,12 @@ def jabber_url(request):
|
||||
return {'JABBER_URL': settings.JABBER_URL}
|
||||
|
||||
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):
|
||||
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):
|
||||
return {'DOMAIN': settings.DOMAIN, 'MUMBLE_URL': settings.MUMBLE_URL,
|
||||
|
Loading…
x
Reference in New Issue
Block a user