diff --git a/alliance_auth/settings.py.example b/alliance_auth/settings.py.example old mode 100755 new mode 100644 index d2bde0f5..eb539b20 --- a/alliance_auth/settings.py.example +++ b/alliance_auth/settings.py.example @@ -449,6 +449,19 @@ DISCOURSE_API_KEY = os.environ.get('AA_DISCOURSE_API_KEY', '') IPS4_URL = os.environ.get('AA_IPS4_URL', 'http://yourdomain.com/ips4') IPS4_API_KEY = os.environ.get('AA_IPS4_API_KEY', '') +###################################### +# Fleet-Up Configuration +###################################### +# FLEETUP_APP_KEY - The app key from http://fleet-up.com/Api/MyApps +# FLEETUP_USER_ID - The user id from http://fleet-up.com/Api/MyKeys +# FLEETUP_API_ID - The API id from http://fleet-up.com/Api/MyKeys +# FLEETUP_GROUP_ID - The id of the group you want to pull data from, see http://fleet-up.com/Api/Endpoints#groups_mygroupmemberships +###################################### +FLEETUP_APP_KEY = os.environ.get('AA_FLEETUP_APP_KEY', '') +FLEETUP_USER_ID = os.environ.get('AA_FLEETUP_USER_ID', '') +FLEETUP_API_ID = os.environ.get('AA_FLEETUP_API_ID', '') +FLEETUP_GROUP_ID = os.environ.get('AA_FLEETUP_GROUP_ID', '') + ##################################### # Logging Configuration ##################################### @@ -557,4 +570,3 @@ LOGGING = { }, } } - diff --git a/alliance_auth/urls.py b/alliance_auth/urls.py index 7bb36e8d..e64b9761 100755 --- a/alliance_auth/urls.py +++ b/alliance_auth/urls.py @@ -211,6 +211,13 @@ urlpatterns = patterns('', # FLEET FITTINGS url(r'^fits/$', 'services.views.fleet_fits', name='auth_fleet_fits'), + #Fleetup + url(r'^fleetup/$', 'fleetup.views.fleetup_view', name='auth_fleetup_view'), + url(r'^fleetup/fittings/$', 'fleetup.views.fleetup_fittings', name='auth_fleetup_fittings'), + url(r'^fleetup/fittings/(?P[0-9]+)/$', 'fleetup.views.fleetup_fitting'), + url(r'^fleetup/doctrines/$', 'fleetup.views.fleetup_doctrines', name='auth_fleetup_doctrines'), + url(r'^fleetup/characters/$', 'fleetup.views.fleetup_characters', name='auth_fleetup_characters'), + url(r'^fleetup/doctrines/(?P[0-9]+)/$', 'fleetup.views.fleetup_doctrine'), # Sig Tracker url(r'^sigtracker/$', 'sigtracker.views.sigtracker_view', name='auth_signature_view'), diff --git a/fleetup/__init__.py b/fleetup/__init__.py new file mode 100755 index 00000000..e69de29b diff --git a/fleetup/admin.py b/fleetup/admin.py new file mode 100755 index 00000000..e69de29b diff --git a/fleetup/forms.py b/fleetup/forms.py new file mode 100755 index 00000000..e69de29b diff --git a/fleetup/models.py b/fleetup/models.py new file mode 100755 index 00000000..e69de29b diff --git a/fleetup/tests.py b/fleetup/tests.py new file mode 100755 index 00000000..e69de29b diff --git a/fleetup/views.py b/fleetup/views.py new file mode 100755 index 00000000..1595c244 --- /dev/null +++ b/fleetup/views.py @@ -0,0 +1,101 @@ +import datetime +from operator import itemgetter, attrgetter, methodcaller + +from django.utils.timezone import utc + +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.contrib.auth.decorators import user_passes_test +from django.shortcuts import HttpResponseRedirect +from django.template.defaulttags import register +from django.contrib.humanize.templatetags.humanize import intword + +from collections import namedtuple + +from authentication.managers import AuthServicesInfoManager +from util import check_if_user_has_permission +from services.managers.eve_api_manager import EveApiManager +from services.managers.fleetup_manager import FleetUpManager +from eveonline.models import EveCorporationInfo +from eveonline.models import EveAllianceInfo +from eveonline.models import EveCharacter +from authentication.models import AuthServicesInfo + +import logging + +logger = logging.getLogger(__name__) + +@register.filter +def get_item(dictionary, key): + return dictionary.get(key) + +def fleetup_util_test(user): + return check_if_user_has_permission(user, 'member') or check_if_user_has_permission(user, 'blue_member') + +@login_required +@user_passes_test(fleetup_util_test) +def fleetup_view(request): + logger.debug("fleetup_view called by user %s" % request.user) + + operations_list = FleetUpManager.get_fleetup_operations() + timers_list = FleetUpManager.get_fleetup_timers() + now = datetime.datetime.now().strftime('%H:%M:%S') + + context = {"timers_list": sorted(timers_list.items()), + "operations_list": sorted(operations_list.items()), + "now": now} + + return render_to_response('registered/fleetup.html',context, context_instance=RequestContext(request) ) + +@login_required +@permission_required('auth.corp_stats') +def fleetup_characters(request): + logger.debug("fleetup_characters called by user %s" % request.user) + + member_list = FleetUpManager.get_fleetup_members() + + context = {"member_list": sorted(member_list.items())} + + return render_to_response('registered/fleetupcharacters.html',context, context_instance=RequestContext(request) ) + +@login_required +@user_passes_test(fleetup_util_test) +def fleetup_fittings(request): + logger.debug("fleetup_fittings called by user %s" % request.user) + fitting_list = FleetUpManager.get_fleetup_fittings() + context = {"fitting_list": sorted(fitting_list.items())} + return render_to_response('registered/fleetupfittingsview.html',context, context_instance=RequestContext(request) ) + +@login_required +@user_passes_test(fleetup_util_test) +def fleetup_fitting(request, fittingnumber): + logger.debug("fleetup_fitting called by user %s" % request.user) + fitting_eft = FleetUpManager.get_fleetup_fitting_eft(fittingnumber) + fitting_data = FleetUpManager.get_fleetup_fitting(fittingnumber) + doctrinenumber = FleetUpManager.get_fleetup_doctrineid(fittingnumber) + doctrines_list = FleetUpManager.get_fleetup_doctrine(doctrinenumber) + context = {"fitting_eft": fitting_eft, + "fitting_data": fitting_data, + "doctrines_list": doctrines_list} + return render_to_response('registered/fleetupfitting.html',context, context_instance=RequestContext(request) ) + + +@login_required +@user_passes_test(fleetup_util_test) +def fleetup_doctrines(request): + logger.debug("fleetup_doctrines called by user %s" % request.user) + doctrines_list = FleetUpManager.get_fleetup_doctrines() + context = {"doctrines_list": doctrines_list} + return render_to_response('registered/fleetupdoctrinesview.html',context, context_instance=RequestContext(request) ) + +@login_required +@user_passes_test(fleetup_util_test) +def fleetup_doctrine(request, doctrinenumber): + logger.debug("fleetup_doctrine called by user %s" % request.user) + doctrine = FleetUpManager.get_fleetup_doctrine(doctrinenumber) + context = {"doctrine": doctrine} + return render_to_response('registered/fleetupdoctrine.html',context, context_instance=RequestContext(request) ) + diff --git a/log/.gitignore b/log/.gitignore old mode 100644 new mode 100755 diff --git a/services/managers/fleetup_manager.py b/services/managers/fleetup_manager.py new file mode 100644 index 00000000..09f08d85 --- /dev/null +++ b/services/managers/fleetup_manager.py @@ -0,0 +1,142 @@ +from django.conf import settings +from django.http import HttpResponse +from datetime import datetime + +import logging +import requests +import json + +appkey = settings.FLEETUP_APP_KEY +userid = settings.FLEETUP_USER_ID +apiid = settings.FLEETUP_API_ID +groupid = settings.FLEETUP_GROUP_ID + +class FleetUpManager(): + def __init__(self): + pass + + @staticmethod + def get_fleetup_members(): + url = "http://api.fleet-up.com/Api.svc/" + str(appkey) + "/" + str(userid) + "/" + str(apiid) + "/GroupCharacters/" + str(groupid) + "" + try: + jsondata = requests.get(url).content + except requests.exceptions.ConnectionError: + return HttpResponse("Can't connect to Fleet-Up API, is it offline?!") + fmembers=json.loads(jsondata.decode()) + + return {row["UserId"]:{"user_id":row["UserId"], + "char_name":row["EveCharName"], + "char_id":row["EveCharId"], + "corporation":row["Corporation"]} for row in fmembers["Data"]} + + @staticmethod + def get_fleetup_operations(): + url = "http://api.fleet-up.com/Api.svc/" + str(appkey) + "/" + str(userid) + "/" + str(apiid) + "/Operations/" + str(groupid) + "" + try: + jsondata = requests.get(url).content + except requests.exceptions.ConnectionError: + return HttpResponse("Can't connect to Fleet-Up API, is it offline?!") + foperations=json.loads(jsondata.decode()) + + return {row["StartString"]:{"subject":row["Subject"], + "start": (datetime.strptime(row["StartString"], "%Y-%m-%d %H:%M:%S")), + "end": (datetime.strptime(row["EndString"], "%Y-%m-%d %H:%M:%S")), + "operation_id":row["OperationId"], + "location":row["Location"], + "location_info":row["LocationInfo"], + "details":row["Details"], + "url":row["Url"], + "doctrine":row["Doctrines"], + "organizer":row["Organizer"]} for row in foperations["Data"]} + + @staticmethod + def get_fleetup_timers(): + url = "http://api.fleet-up.com/Api.svc/" + str(appkey) + "/" + str(userid) + "/" + str(apiid) + "/Timers/" + str(groupid) + "" + try: + jsondata = requests.get(url).content + except requests.exceptions.ConnectionError: + return HttpResponse("Can't connect to Fleet-Up API, is it offline?!") + ftimers=json.loads(jsondata.decode()) + + return {row["ExpiresString"]:{"solarsystem":row["SolarSystem"], + "planet":row["Planet"], + "moon":row["Moon"], + "owner":row["Owner"], + "type":row["Type"], + "timer_type":row["TimerType"], + "expires": (datetime.strptime(row["ExpiresString"], "%Y-%m-%d %H:%M:%S")), + "notes":row["Notes"]} for row in ftimers["Data"]} + + @staticmethod + def get_fleetup_doctrines(): + url = "http://api.fleet-up.com/Api.svc/" + str(appkey) + "/" + str(userid) + "/" + str(apiid) + "/Doctrines/" + str(groupid) + "" + try: + jsondata = requests.get(url).content + except requests.exceptions.ConnectionError: + return HttpResponse("Can't connect to Fleet-Up API, is it offline?!") + fdoctrines=json.loads(jsondata.decode()) + + return {"fleetup_doctrines":fdoctrines["Data"]} + + @staticmethod + def get_fleetup_doctrine(doctrinenumber): + url = "http://api.fleet-up.com/Api.svc/" + str(appkey) + "/" + str(userid) + "/" + str(apiid) + "/DoctrineFittings/%s" % doctrinenumber + try: + jsondata = requests.get(url).content + except requests.exceptions.ConnectionError: + return HttpResponse("Can't connect to Fleet-Up API, is it offline?!") + fdoctrine=json.loads(jsondata.decode()) + + return {"fitting_doctrine":fdoctrine} + + @staticmethod + def get_fleetup_fittings(): + url = "http://api.fleet-up.com/Api.svc/" + str(appkey) + "/" + str(userid) + "/" + str(apiid) + "/Fittings/" + str(groupid) + "" + try: + jsondata = requests.get(url).content + except requests.exceptions.ConnectionError: + return HttpResponse("Can't connect to Fleet-Up API, is it offline?!") + ffittings=json.loads(jsondata.decode()) + + return {row["FittingId"]:{"fitting_id":row["FittingId"], + "name":row["Name"], + "icon_id":row["EveTypeId"], + "hull":row["HullType"], + "shiptype":row["ShipType"], + "estimated":row["EstPrice"], + "faction":row["Faction"], + "categories":row["Categories"], + "last_update":(datetime.strptime(row["LastUpdatedString"], "%Y-%m-%d %H:%M:%S"))} for row in ffittings["Data"]} + + @staticmethod + def get_fleetup_fitting(fittingnumber): + url = "http://api.fleet-up.com/Api.svc/" + str(appkey) + "/" + str(userid) + "/" + str(apiid) + "/Fitting/%s" % fittingnumber + try: + jsondata = requests.get(url).content + except requests.exceptions.ConnectionError: + return HttpResponse("Can't connect to Fleet-Up API, is it offline?!") + ffitting=json.loads(jsondata.decode()) + + return {"fitting_data":ffitting["Data"]} + + @staticmethod + def get_fleetup_doctrineid(fittingnumber): + url = "http://api.fleet-up.com/Api.svc/" + str(appkey) + "/" + str(userid) + "/" + str(apiid) + "/Fitting/%s" % fittingnumber + try: + jsondata = requests.get(url).content + except requests.exceptions.ConnectionError: + return HttpResponse("Can't connect to Fleet-Up API, is it offline?!") + fdoctrineid=json.loads(jsondata.decode()) + + return fdoctrineid['Data']['Doctrines'][0]['DoctrineId'] + + @staticmethod + def get_fleetup_fitting_eft(fittingnumber): + url = "http://api.fleet-up.com/Api.svc/" + str(appkey) + "/" + str(userid) + "/" + str(apiid) + "/Fitting/%s/eft" % fittingnumber + try: + jsondata = requests.get(url).content + except requests.exceptions.ConnectionError: + return HttpResponse("Can't connect to Fleet-Up API, is it offline?!") + ffittingeft=json.loads(jsondata.decode()) + + return {"fitting_eft":ffittingeft["Data"]["FittingData"]} diff --git a/stock/templates/public/base.html b/stock/templates/public/base.html index bb9ea2d4..5afb5ac6 100755 --- a/stock/templates/public/base.html +++ b/stock/templates/public/base.html @@ -146,6 +146,12 @@ href="{% url 'auth_fleet_fits' %}"> Fleet Doctrines +
  • + Fleet-Up +
  • + {% endif %} {% if perms.auth.member or perms.auth.blue_member %} diff --git a/stock/templates/registered/fleetup.html b/stock/templates/registered/fleetup.html new file mode 100644 index 00000000..df0d5243 --- /dev/null +++ b/stock/templates/registered/fleetup.html @@ -0,0 +1,217 @@ +{% extends "public/base.html" %} +{% load bootstrap %} +{% load staticfiles %} + +{% block title %}Alliance Auth{% endblock %} +{% block page_title %}FleetUp{% endblock page_title %} + +{% block content %} +
    + +
    + + +
    +
    +
    + {% if operations_list %} + {% for subject, start in operations_list %} +
    +
    +

    {{ start.subject }}

    +
    +
    + + + + + + + + + + + + + + + +
    StartEnd
    {{ start.start|date:"l d M H:i" }} Eve Time{{ start.end|date:"l d M H:i" }} Eve Time
    +

    {{ start.details }}

    + +
    + + + + + + + + + + + + + +
    LocationDoctrineOrganizerURL
    + {{ start.location }} - {{ start.location_info }} Dotlan + + {% if start.doctrine %} + {% for doctrine in start.doctrine %} + + {{ doctrine.Name }} + + {% endfor %} + + {% else %} + TBA + {% endif %} + + {{ start.organizer }} + + {% ifequal start.url "" %} +
    No link
    + {% else %} + External link + {% endifequal %} +
    +
    +
    +
    + {% endfor %} + {% else %} +

    There seems to be no Operations in the near future, go make ISK!

    + {% endif %} +
    +
    +
    +
    +

    Current Eve Time:

    +
    +
    +
    +
    +
    + {% if timers_list %} +
    +
    +

    Timers

    +
    +
    + + {% for notes, type in timers_list %} + + + + + {% endfor %} +
    + {{ type.solarsystem }} + + {{ type.expires|date:"l d M H:i" }} +
    +
    +
    + {% endif %} +
    +
    +
    +
    + {% if timers_list %} +
    +
    +

    Timers

    +
    +
    +
    + + + + + + + + + + {% for notes, type in timers_list %} + + + + + + + + + {% endfor %} +
    TypeStructureLocationExpires(EVE-time)OwnerNote
    + {% ifequal type.type "Final" %} + + {{ type.type }}{% else %}{{ type.type }}{% endifequal %} + + {{ type.timer_type }} + + {{ type.solarsystem }} - Planet:{{ type.planet }} Moon:{{ type.moon }} + + {{ type.expires|date:"l d M H:i" }} + + {{ type.owner }} + + {{ type.notes }} +
    +
    +
    +
    + {% else %} +

    There seems to be no Timers in the near future, this does not mean there isn't any!

    + {% endif %} +
    +
    +
    + +
    +
    + + + +{% endblock content %} diff --git a/stock/templates/registered/fleetupcharacters.html b/stock/templates/registered/fleetupcharacters.html new file mode 100644 index 00000000..f5b6a6fa --- /dev/null +++ b/stock/templates/registered/fleetupcharacters.html @@ -0,0 +1,71 @@ +{% extends "public/base.html" %} +{% load bootstrap %} +{% load staticfiles %} + +{% block title %}Alliance Auth{% endblock %} +{% block page_title %}FleetUp{% endblock page_title %} + +{% block content %} +
    +{% if perms.auth.corp_stats %} + +
    +
    +

    Characters registered on Fleet-Up.com

    +
    +
    +
    +
    + + + + + + + + {% for char_name, user_id in member_list %} + + + + + + {% endfor %} +
    CharacterCorporationFleet-Up(id)
    + + +

    {{ user_id.char_name }}

    +
    +

    {{ user_id.corporation }}

    +
    +

    {{ user_id.user_id }}

    +
    +
    +
    +
    +
    +{% endif %} +
    +{% endblock content %} \ No newline at end of file diff --git a/stock/templates/registered/fleetupdoctrine.html b/stock/templates/registered/fleetupdoctrine.html new file mode 100644 index 00000000..1ad3a2a8 --- /dev/null +++ b/stock/templates/registered/fleetupdoctrine.html @@ -0,0 +1,90 @@ +{% extends "public/base.html" %} +{% load bootstrap %} +{% load staticfiles %} + +{% block title %}Alliance Auth{% endblock %} +{% block page_title %}FleetUp - Doctrine{% endblock page_title %} + +{% block content %} +
    + +
    + {% for a, j in doctrine.items %} + {% regroup j.Data|dictsort:"Role" by Role as role_list %} + + {% for Role in role_list %} + +
    +
    +

    {{ Role.grouper }}

    +
    +
    + + + + + + + + + + + {% for item in Role.list %} + + + + + + + + + + {% endfor %} +
    NameRoleHull typeShip typeEstimated ISKCategories
    + + + {{ item.Name }} + + {{ item.Role }} + + {{ item.HullType }} + + {{ item.ShipType }} + + {% load humanize %}{{ item.EstPrice|intword }} + + {% for categories in item.Categories %} + {{ categories }}, + {% endfor %} +
    +
    +
    + {% endfor %} +
    + {% endfor %} +
    + +{% endblock content %} diff --git a/stock/templates/registered/fleetupdoctrinesview.html b/stock/templates/registered/fleetupdoctrinesview.html new file mode 100644 index 00000000..5544ae9f --- /dev/null +++ b/stock/templates/registered/fleetupdoctrinesview.html @@ -0,0 +1,85 @@ +{% extends "public/base.html" %} +{% load bootstrap %} +{% load staticfiles %} + +{% block title %}Alliance Auth{% endblock %} +{% block page_title %}FleetUp{% endblock page_title %} + +{% block content %} +
    + +
    + {% if doctrines_list %} + {% for a, j in doctrines_list.items %} + {% regroup j|dictsort:"FolderName" by FolderName as folder_list %} + {% for FolderName in folder_list %} +
    +
    +
    +

    {{ FolderName.grouper }}

    +
    +
    + + + + + + + + + {% for item in FolderName.list %} + + + + + + + + {% endfor %} +
    NameDoctrineLast updated
    + + + {{ item.Name }} + + {{ item.FolderName }} + + {{ item.LastUpdatedString }} +
    +
    +
    +
    + {% endfor %} +
    + {% endfor %} + + {% else %} +

    There seems to be no Doctrines in here at the moment!

    + {% endif %} +
    + + +{% endblock content %} \ No newline at end of file diff --git a/stock/templates/registered/fleetupfitting.html b/stock/templates/registered/fleetupfitting.html new file mode 100644 index 00000000..32f462aa --- /dev/null +++ b/stock/templates/registered/fleetupfitting.html @@ -0,0 +1,152 @@ +{% extends "public/base.html" %} +{% load bootstrap %} +{% load staticfiles %} + +{% block title %}Alliance Auth{% endblock %} +{% block page_title %}FleetUp - Doctrine{% endblock page_title %} + +{% block content %} +
    + +
    +
    +
    + {% for x, y in fitting_data.items %} +
    +
    +

    This fit is part of a doctrine

    +
    +
    + {% for doctrin in y.Doctrines %} +

    {{ doctrin.Name }}

    +
    +

    Role in doctrine: {{ doctrin.Role }}

    +
    +
    +

    Priority:

    +
    +
    +
    +
    + {{ doctrin.Priority }}/5 +
    +
    +
    + + {% endfor %} +
    +
    +
    +
    +

    Fit categories

    +
    +
    + {% for category in y.Categories %} + {{ category }} + {% endfor %} +
    +
    + {% endfor %} +
    +
    +

    All fits in this Doctrine

    +
    +
    +
    + {% for arbit, orbit in doctrines_list.items %} + + {% for fitting in orbit.Data %} + + +

    {{ fitting.Name }}

    +

    {{ fitting.Role }} - {{ fitting.ShipType }}

    +
    + {% endfor %} + {% endfor %} +
    +
    +
    +
    +
    +
    +
    + {% for a, j in fitting_data.items %} +

    {{ j.Name }}

    +
    +
    +
    + +
    +
    +

    Hull: {{ j.HullType }}

    +

    Ship: {{ j.ShipType }}

    + {% load humanize %} +

    Estimated price: {{ j.EstPrice|intword }} ISK

    +
    + {% regroup j.FittingData by Slot as fitting_list %} + + + + + + {% for Slot in fitting_list %} + + + + {% for item in Slot.list %} + + + + + {% endfor %} + {% endfor %} +
    {{ Slot.grouper }}
    {{ item.Quantity }}x {{ item.TypeName }}
    +
    + {% endfor %} +
    +
    + +
    +
    +
    +

    EFT/Export

    +
    +
    + {% for data in fitting_eft.items %} + {% autoescape off %} +
    {{ fitting_eft.fitting_eft }}
    + {% endautoescape %} + {% endfor %} +
    +
    +
    +
    +
    +
    + +{% endblock content %} \ No newline at end of file diff --git a/stock/templates/registered/fleetupfittingsview.html b/stock/templates/registered/fleetupfittingsview.html new file mode 100644 index 00000000..14e8d9f7 --- /dev/null +++ b/stock/templates/registered/fleetupfittingsview.html @@ -0,0 +1,78 @@ +{% extends "public/base.html" %} +{% load bootstrap %} +{% load staticfiles %} + +{% block title %}Alliance Auth{% endblock %} +{% block page_title %}FleetUp{% endblock page_title %} + +{% block content %} +
    + +
    + {% if fitting_list %} + + + + + + + + + + {% for id, fittings in fitting_list %} + + + + + + + + + + + {% endfor %} +
    NameHullShip typeEstimated ISKCategories
    + + + {{ fittings.name }} + + {{ fittings.hull }} + + {{ fittings.shiptype }} + + {% load humanize %}{{ fittings.estimated|intword }} + + {% for categories in fittings.categories %} + {{ categories }}, + {% endfor %} +
    + {% else %} +

    There seems to be no Doctrines in here at the moment!

    + {% endif %} +
    +
    + +{% endblock content %} \ No newline at end of file