Expanded functionality to full alliance support. The design may leave some things to wish for...

This commit is contained in:
Ydmir 2016-01-24 00:13:58 +01:00
parent 39a77829db
commit 25b89fdecb
8 changed files with 113 additions and 59 deletions

View File

@ -165,7 +165,8 @@ urlpatterns = patterns('',
#corputils #corputils
url(r'^corputils/$', 'corputils.views.corp_member_view', name='auth_corp_member_view'), 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<corpid>[0-9]+)/$', 'corputils.views.corp_member_view', name='auth_corp_member_view'),
url(r'^corputils/search/', 'corputils.views.corputils_search',
name="auth_corputils_search"), name="auth_corputils_search"),
# FLEET FITTINGS # FLEET FITTINGS

View File

@ -1,5 +1,15 @@
from django import forms 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): class CorputilsSearchForm(forms.Form):
search_string = forms.CharField(max_length=254, required=True, label="Search String") search_string = forms.CharField(max_length=254, required=True, label="Search String")

View File

@ -9,10 +9,13 @@ from collections import namedtuple
from authentication.managers import AuthServicesInfoManager from authentication.managers import AuthServicesInfoManager
from services.managers.eve_api_manager import EveApiManager from services.managers.eve_api_manager import EveApiManager
from services.managers.evewho_manager import EveWhoManager
from eveonline.models import EveCorporationInfo from eveonline.models import EveCorporationInfo
from eveonline.models import EveAllianceInfo
from eveonline.models import EveCharacter from eveonline.models import EveCharacter
from authentication.models import AuthServicesInfo from authentication.models import AuthServicesInfo
from forms import CorputilsSearchForm from forms import CorputilsSearchForm
from forms import SelectCorpForm
import logging 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. # Because corp-api only exist for the executor corp, this function will only be available in corporation mode.
@login_required @login_required
@permission_required('auth.corputils') @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) 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) if request.method == 'POST':
logger.debug("Got user %s authservicesinfo model %s" % (request.user, auth_info)) 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: 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() for char_id, member_data in member_list.items():
characters_with_api = {} try:
characters_without_api = [] char = EveCharacter.objects.get(character_id=char_id)
user = char.user
for char_id, member_data in member_list.items():
try: try:
char = EveCharacter.objects.get(character_id=char_id) mainid = int(AuthServicesInfoManager.get_auth_service_info(user=user).main_char_id)
user = char.user mainchar = EveCharacter.objects.get(character_id=mainid)
try: mainname = mainchar.character_name
mainid = int(AuthServicesInfoManager.get_auth_service_info(user=user).main_char_id) maincorp = mainchar.corporation_name
mainchar = EveCharacter.objects.get(character_id=mainid) except ValueError:
mainname = mainchar.character_name mainname = "User: " + user.username
maincorp = mainchar.corporation_name maincorp = None
except ValueError: characters_with_api.setdefault(mainname, Player(main=mainname,
mainname = "User: " + user.username maincorp=maincorp,
maincorp = None altlist=[])
characters_with_api.setdefault(mainname, Player(main=mainname, ).altlist.append(char.character_name)
maincorp=maincorp,
altlist=[])
).altlist.append(char.character_name)
except EveCharacter.DoesNotExist: except EveCharacter.DoesNotExist:
characters_without_api.append(member_data["name"]) 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, context = {"corp": corp,
"characters_with_api": sorted(characters_with_api.items()), "characters_with_api": sorted(characters_with_api.items()),
"characters_without_api": sorted(characters_without_api), "characters_without_api": sorted(characters_without_api),
"search_form": CorputilsSearchForm()} "search_form": CorputilsSearchForm()}
return render_to_response('registered/corputils.html',context, context_instance=RequestContext(request) )
else: return render_to_response('registered/corputils.html',context, context_instance=RequestContext(request) )
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))
@login_required @login_required
@ -82,7 +98,7 @@ def corputils_search(request):
searchstring = form.cleaned_data['search_string'] searchstring = form.cleaned_data['search_string']
logger.debug("Searching for player with character name %s for user %s" % (searchstring, request.user)) 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']) Member = namedtuple('Member', ['name', 'main', 'api_registered'])

View File

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

View File

@ -195,23 +195,17 @@ class EveApiManager():
return {} return {}
@staticmethod @staticmethod
def get_corp_membertracking(): def get_corp_membertracking(api, vcode):
if settings.IS_CORP: try:
if settings.CORP_API_ID and settings.CORP_API_VCODE: logger.debug("Getting corp membertracking with api id %s" % settings.CORP_API_ID)
try: api = evelink.api.API(api_key=(api, vcode))
logger.debug("Getting corp membertracking with api id %s" % settings.CORP_API_ID) corp = evelink.corp.Corp(api=api)
api = evelink.api.API(api_key=(settings.CORP_API_ID, settings.CORP_API_VCODE)) membertracking = corp.members()
corp = evelink.corp.Corp(api=api) results = membertracking.result
membertracking = corp.members() logger.debug("Got corp membertracking from settings: %s" % results)
results = membertracking.result return results
logger.debug("Got corp membertracking from settings: %s" % results) except evelink.api.APIError as error:
return results logger.exception("Unhandled APIError occured.", exc_info=True)
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.")
return {} return {}

View File

@ -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"]}

View File

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

View File

@ -1,5 +1,6 @@
{% extends "public/base.html" %} {% extends "public/base.html" %}
{% load bootstrap %} {% load bootstrap %}
{% load staticfiles %}
{% block title %}Alliance Auth{% endblock %} {% block title %}Alliance Auth{% endblock %}
{% block page_title %}Corporation Member Tracking{% endblock page_title %} {% block page_title %}Corporation Member Tracking{% endblock page_title %}
@ -16,7 +17,6 @@
<div class="col-lg-12"> <div class="col-lg-12">
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading">Corporation</div> <div class="panel-heading">Corporation</div>
<div class="panel-body"> <div class="panel-body">
<div class="col-lg-5 col-sm-2"><img class= <div class="col-lg-5 col-sm-2"><img class=
"ra-avatar img-responsive" src= "ra-avatar img-responsive" src=
@ -34,8 +34,21 @@
<p>Unregistered characters: {{characters_without_api|length}}</p> <p>Unregistered characters: {{characters_without_api|length}}</p>
</div> </div>
<div class="text-right"> <div class="text-right">
{% if form %}
<div class="container-fluid">
<div class="col-md-4 col-md-offset-4">
<div class="row">
<form class="form-signin" role="form" action="" method="POST">
{% csrf_token %}
{{ form|bootstrap }}
<br/>
<button class="btn btn-lg btn-primary btn-block" type="submit">Select corp</button>
</form>
</div>
</div>
</div>
{% endif %}
<!-- Button trigger modal --> <!-- Button trigger modal -->
<button type="button" class="btn btn-primary btn-sm" data-toggle="modal" data-target="#myModal"> <button type="button" class="btn btn-primary btn-sm" data-toggle="modal" data-target="#myModal">
Search Members Search Members