mirror of
https://gitlab.com/allianceauth/allianceauth.git
synced 2025-07-09 12:30:15 +02:00
FAT uses ESI tokens to get character location/ship - closes #564 Pull corp memebrship data from ESI Additional permissions for non-api viewing. - migration to convert permissions from old users. Standardize EVE datasource responses. - allow different sources for EVE data types. Allow empty values for character alliance id and name Allow multiple corps and alliances to be considered 'members'
125 lines
5.2 KiB
Python
125 lines
5.2 KiB
Python
from __future__ import unicode_literals
|
|
from django.conf import settings
|
|
from django.contrib.auth.decorators import login_required, permission_required, user_passes_test
|
|
from django.shortcuts import render, redirect, get_object_or_404
|
|
from django.contrib import messages
|
|
from django.core.exceptions import PermissionDenied
|
|
from django.db import IntegrityError
|
|
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
|
|
from django.conf import settings
|
|
from eveonline.models import EveCharacter, EveCorporationInfo
|
|
from corputils.models import CorpStats
|
|
from esi.decorators import token_required
|
|
|
|
MEMBERS_PER_PAGE = int(getattr(settings, 'CORPSTATS_MEMBERS_PER_PAGE', 20))
|
|
|
|
def get_page(model_list, page_num):
|
|
p = Paginator(model_list, MEMBERS_PER_PAGE)
|
|
try:
|
|
members = p.page(page_num)
|
|
except PageNotAnInteger:
|
|
members = p.page(1)
|
|
except EmptyPage:
|
|
members = p.page(p.num_pages)
|
|
return members
|
|
|
|
def access_corpstats_test(user):
|
|
return user.has_perm('corputils.view_corp_corpstats') or user.has_perm('corputils.view_alliance_corpstats') or user.has_perm('corputils.view_blue_corpstats')
|
|
|
|
@login_required
|
|
@user_passes_test(access_corpstats_test)
|
|
@permission_required('corputils.add_corpstats')
|
|
@token_required(scopes='esi-corporations.read_corporation_membership.v1')
|
|
def corpstats_add(request, token):
|
|
try:
|
|
if EveCharacter.objects.filter(character_id=token.character_id).exists():
|
|
corp_id = EveCharacter.objects.get(character_id=token.character_id).corporation_id
|
|
else:
|
|
corp_id = token.get_esi_client().Character.get_characters_character_id(character_id=token.character_id).result()['corporation_id']
|
|
corp = EveCorporationInfo.objects.get(corporation_id=corp_id)
|
|
cs = CorpStats.objects.create(token=token, corp=corp)
|
|
cs.update()
|
|
assert cs.pk # ensure update was succesful
|
|
if CorpStats.objects.filter(pk=cs.pk).visible_to(request.user).exists():
|
|
return redirect('corputils:view_corp', corp_id=corp.corporation_id)
|
|
except EveCorporationInfo.DoesNotExist:
|
|
messages.error(request, 'Unrecognized corporation. Please ensure it is a member of the alliance or a blue.')
|
|
except IntegrityError:
|
|
messages.error(request, 'Selected corp already has a statistics module.')
|
|
except AssertionError:
|
|
messages.error(request, 'Failed to gather corporation statistics with selected token.')
|
|
return redirect('corputils:view')
|
|
|
|
@login_required
|
|
@user_passes_test(access_corpstats_test)
|
|
def corpstats_view(request, corp_id=None):
|
|
corpstats = None
|
|
show_apis = False
|
|
|
|
# get requested model
|
|
if corp_id:
|
|
corp = get_object_or_404(EveCorporationInfo, corporation_id=corp_id)
|
|
corpstats = get_object_or_404(CorpStats, corp=corp)
|
|
|
|
# get available models
|
|
available = CorpStats.objects.visible_to(request.user)
|
|
|
|
# ensure we can see the requested model
|
|
if corpstats and not corpstats in available:
|
|
raise PermissionDenied('You do not have permission to view the selected corporation statistics module.')
|
|
|
|
# get default model if none requested
|
|
if not corp_id and available.count() == 1:
|
|
corpstats = available[0]
|
|
|
|
context = {
|
|
'available': available,
|
|
}
|
|
|
|
# paginate
|
|
members = []
|
|
if corpstats:
|
|
page = request.GET.get('page', 1)
|
|
members = get_page(corpstats.get_member_objects(request.user), page)
|
|
|
|
if corpstats:
|
|
context.update({
|
|
'corpstats': corpstats.get_view_model(request.user),
|
|
'members': members,
|
|
})
|
|
|
|
return render(request, 'corputils/corpstats.html', context=context)
|
|
|
|
@login_required
|
|
@user_passes_test(access_corpstats_test)
|
|
def corpstats_update(request, corp_id):
|
|
corp = get_object_or_404(EveCorporationInfo, corporation_id=corp_id)
|
|
corpstats = get_object_or_404(CorpStats, corp=corp)
|
|
if corpstats.can_update(request.user):
|
|
corpstats.update()
|
|
else:
|
|
raise PermissionDenied('You do not have permission to update member data for the selected corporation statistics module.')
|
|
return redirect('corputils:view_corp', corp_id=corp.corporation_id)
|
|
|
|
@login_required
|
|
@user_passes_test(access_corpstats_test)
|
|
def corpstats_search(request):
|
|
results = []
|
|
search_string = request.GET.get('search_string', None)
|
|
if search_string:
|
|
has_similar = CorpStats.objects.filter(_members__icontains=search_string).visible_to(request.user)
|
|
for corpstats in has_similar:
|
|
similar = [(member_id, corpstats.members[member_id]) for member_id in corpstats.members if search_string.lower() in corpstats.members[member_id].lower()]
|
|
for s in similar:
|
|
results.append((corpstats, CorpStats.MemberObject(s[0], s[1], show_apis=corpstats.show_apis(request.user))))
|
|
page = request.GET.get('page', 1)
|
|
results = sorted(results, key=lambda x: x[1].character_name)
|
|
results_page = get_page(results, page)
|
|
context = {
|
|
'available': CorpStats.objects.visible_to(request.user),
|
|
'results': results_page,
|
|
'search_string': search_string,
|
|
}
|
|
return render(request, 'corputils/search.html', context=context)
|
|
return redirect('corputils:view')
|