diff --git a/alliance_auth/urls.py b/alliance_auth/urls.py index e1b562ad..4d8a9163 100755 --- a/alliance_auth/urls.py +++ b/alliance_auth/urls.py @@ -165,7 +165,8 @@ urlpatterns = patterns('', #corputils url(r'^corputils/$', 'corputils.views.corp_member_view', name='auth_corp_member_view'), - url(r'corputils_search/', 'corputils.views.corputils_search', + url(r'^corputils/(?P[0-9]+)/$', 'corputils.views.corp_member_view', name='auth_corp_member_view'), + url(r'^corputils/search/', 'corputils.views.corputils_search', name="auth_corputils_search"), # FLEET FITTINGS diff --git a/corputils/forms.py b/corputils/forms.py index 1d1ba9a2..969b5d24 100644 --- a/corputils/forms.py +++ b/corputils/forms.py @@ -1,5 +1,15 @@ from django import forms +from django.conf import settings +from eveonline.models import EveCorporationInfo +from eveonline.models import EveAllianceInfo + +class SelectCorpForm(forms.Form): + alliance = EveAllianceInfo.objects.get(alliance_id=settings.ALLIANCE_ID) + alliancecorps = EveCorporationInfo.objects.filter(alliance=alliance) + corpnamelist = [(int(corp.corporation_id), str(corp.corporation_name)) for corp in alliancecorps] + corpnamelist.sort(key=lambda tup: tup[1]) + corpid = forms.ChoiceField(corpnamelist, required=True, label="Corporation") class CorputilsSearchForm(forms.Form): search_string = forms.CharField(max_length=254, required=True, label="Search String") diff --git a/corputils/views.py b/corputils/views.py index 2e909029..ab62cc8a 100644 --- a/corputils/views.py +++ b/corputils/views.py @@ -9,10 +9,13 @@ 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 forms import SelectCorpForm import logging @@ -22,51 +25,64 @@ 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): +def corp_member_view(request, corpid = settings.CORP_ID): logger.debug("corp_member_view called by user %s" % request.user) - # Get the corp the member is in - auth_info = AuthServicesInfo.objects.get(user=request.user) - logger.debug("Got user %s authservicesinfo model %s" % (request.user, auth_info)) + + if request.method == 'POST': + form = SelectCorpForm(request.POST) + if form.is_valid(): + return HttpResponseRedirect("/corputils/"+form.cleaned_data["corpid"]) + else: + return HttpResponseRedirect("/corputils/") + + corp = EveCorporationInfo.objects.get(corporation_id=corpid) + Player = namedtuple("Player", ["main", "maincorp", "altlist"]) if settings.IS_CORP: - corp = EveCorporationInfo.objects.get(corporation_id=settings.CORP_ID) + member_list = EveApiManager.get_corp_membertracking(settings.CORP_API_ID, settings.CORP_API_VCODE) + else: + member_list = EveWhoManager.get_corporation_members(corpid) - Player = namedtuple("Player", ["main", "maincorp", "altlist"]) + characters_with_api = {} + characters_without_api = [] - member_list = EveApiManager.get_corp_membertracking() - characters_with_api = {} - characters_without_api = [] - - for char_id, member_data in member_list.items(): + for char_id, member_data in member_list.items(): + try: + char = EveCharacter.objects.get(character_id=char_id) + user = char.user 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 - except ValueError: - mainname = "User: " + user.username - maincorp = None - characters_with_api.setdefault(mainname, Player(main=mainname, - maincorp=maincorp, - altlist=[]) - ).altlist.append(char.character_name) + 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 + except ValueError: + mainname = "User: " + user.username + maincorp = None + characters_with_api.setdefault(mainname, Player(main=mainname, + maincorp=maincorp, + altlist=[]) + ).altlist.append(char.character_name) - except EveCharacter.DoesNotExist: - characters_without_api.append(member_data["name"]) + except EveCharacter.DoesNotExist: + characters_without_api.append(member_data["name"]) + if not settings.IS_CORP: + form = SelectCorpForm() + context = {"form": form, + "corp": corp, + "characters_with_api": sorted(characters_with_api.items()), + "characters_without_api": sorted(characters_without_api), + "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), "search_form": CorputilsSearchForm()} - return render_to_response('registered/corputils.html',context, context_instance=RequestContext(request) ) - else: - logger.error("Not running in corporation mode. Cannot provide corp member tracking data." % (request.user, auth_info.main_char_id)) - return render_to_response('registered/corputils.html', None, context_instance=RequestContext(request)) + + return render_to_response('registered/corputils.html',context, context_instance=RequestContext(request) ) @login_required @@ -82,7 +98,7 @@ def corputils_search(request): searchstring = form.cleaned_data['search_string'] logger.debug("Searching for player with character name %s for user %s" % (searchstring, request.user)) - member_list = EveApiManager.get_corp_membertracking() + member_list = EveApiManager.get_corp_membertracking(settings.CORP_API_ID, settings.CORP_API_VCODE) Member = namedtuple('Member', ['name', 'main', 'api_registered']) diff --git a/requirements.txt b/requirements.txt index 66027f49..ce742155 100755 --- a/requirements.txt +++ b/requirements.txt @@ -5,6 +5,7 @@ evelink dnspython passlib requests>=2.9.1 +json # Django Stuff # django==1.6.5 diff --git a/services/managers/eve_api_manager.py b/services/managers/eve_api_manager.py index e646d19d..db8face6 100644 --- a/services/managers/eve_api_manager.py +++ b/services/managers/eve_api_manager.py @@ -195,23 +195,17 @@ class EveApiManager(): return {} @staticmethod - def get_corp_membertracking(): - if settings.IS_CORP: - if settings.CORP_API_ID and settings.CORP_API_VCODE: - try: - logger.debug("Getting corp membertracking with api id %s" % settings.CORP_API_ID) - api = evelink.api.API(api_key=(settings.CORP_API_ID, settings.CORP_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.", exc_info=True) - else: - logger.error("No corp API key supplied in settings. Unable to get standings.") - else: - logger.error("Membertracking function only works in corporation mode.") + 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.", exc_info=True) return {} diff --git a/services/managers/evewho_manager.py b/services/managers/evewho_manager.py new file mode 100644 index 00000000..364c11f2 --- /dev/null +++ b/services/managers/evewho_manager.py @@ -0,0 +1,19 @@ + +from django.conf import settings + +import logging +import requests +import json + + +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"]} for row in data["characters"]} diff --git a/stock/templates/public/base.html b/stock/templates/public/base.html index 746c7933..9769302c 100755 --- a/stock/templates/public/base.html +++ b/stock/templates/public/base.html @@ -121,13 +121,13 @@ href="{% url 'auth_corp_stats' %}"> Corporation Stats - {% if IS_CORP %} -
  • - Member Tracking -
  • - {% endif %} + {% endif %} + {% if perms.auth.corputils %} +
  • + Member Tracking +
  • {% endif %} {% if perms.auth.group_management %} diff --git a/stock/templates/registered/corputils.html b/stock/templates/registered/corputils.html index c8185ed3..16c3884a 100644 --- a/stock/templates/registered/corputils.html +++ b/stock/templates/registered/corputils.html @@ -1,5 +1,6 @@ {% extends "public/base.html" %} {% load bootstrap %} +{% load staticfiles %} {% block title %}Alliance Auth{% endblock %} {% block page_title %}Corporation Member Tracking{% endblock page_title %} @@ -16,7 +17,6 @@
    Corporation
    -
    Unregistered characters: {{characters_without_api|length}}

    -
    + {% if form %} +
    +
    +
    + +
    +
    +
    + {% endif %}