Increase Corpstats Performance

This commit is contained in:
Aaron Kable 2020-01-23 00:38:39 +00:00 committed by colcrunch
parent 801502ec77
commit ebff1387c1
2 changed files with 64 additions and 15 deletions

View File

@ -29,9 +29,9 @@
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading"> <div class="panel-heading">
<ul class="nav nav-pills pull-left"> <ul class="nav nav-pills pull-left">
<li class="active"><a href="#mains" data-toggle="pill">{% trans 'Mains' %} ({{ corpstats.main_count }})</a></li> <li class="active"><a href="#mains" data-toggle="pill">{% trans 'Mains' %} ({{ total_mains }})</a></li>
<li><a href="#members" data-toggle="pill">{% trans 'Members' %} ({{ corpstats.member_count }})</a></li> <li><a href="#members" data-toggle="pill">{% trans 'Members' %} ({{ corpstats.member_count }})</a></li>
<li><a href="#unregistered" data-toggle="pill">{% trans 'Unregistered' %} ({{ corpstats.unregistered_member_count }})</a></li> <li><a href="#unregistered" data-toggle="pill">{% trans 'Unregistered' %} ({{ unregistered.count }})</a></li>
</ul> </ul>
<div class="pull-right"> <div class="pull-right">
{% trans "Last update:" %} {{ corpstats.last_update|naturaltime }} {% trans "Last update:" %} {{ corpstats.last_update|naturaltime }}
@ -54,14 +54,14 @@
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{% for main in mains %} {% for id, main in mains.items %}
<tr> <tr>
<td class="text-center" style="vertical-align:middle"> <td class="text-center" style="vertical-align:middle">
<div class="thumbnail" <div class="thumbnail"
style="border: 0 none; box-shadow: none; background: transparent;"> style="border: 0 none; box-shadow: none; background: transparent;">
<img src="{{ main.portrait_url_64 }}" class="img-circle"> <img src="{{ main.main.portrait_url_64 }}" class="img-circle">
<div class="caption text-center"> <div class="caption text-center">
{{ main }} {{ main.main }}
</div> </div>
</div> </div>
</td> </td>
@ -119,16 +119,29 @@
</thead> </thead>
<tbody> <tbody>
{% for member in members %} {% for member in members %}
<tr {% if not member.registered %}class="danger"{% endif %}> <tr>
<td><img src="{{ member.portrait_url }}" class="img-circle"></td>
<td class="text-center">{{ member }}</td>
<td class="text-center"><a
href="https://zkillboard.com/character/{{ member.character_id }}/"
class="label label-danger"
target="_blank">{% trans "Killboard" %}</a></td>
<td class="text-center">{{ member.character_ownership.user.profile.main_character.character_name }}</td>
<td class="text-center">{{ member.character_ownership.user.profile.main_character.corporation_name }}</td>
<td class="text-center">{{ member.character_ownership.user.profile.main_character.alliance_name }}</td>
</tr>
{% endfor %}
{% for member in unregistered %}
<tr class="danger">
<td><img src="{{ member.portrait_url }}" class="img-circle"></td> <td><img src="{{ member.portrait_url }}" class="img-circle"></td>
<td class="text-center">{{ member.character_name }}</td> <td class="text-center">{{ member.character_name }}</td>
<td class="text-center"><a <td class="text-center"><a
href="https://zkillboard.com/character/{{ member.character_id }}/" href="https://zkillboard.com/character/{{ member.character_id }}/"
class="label label-danger" class="label label-danger"
target="_blank">{% trans "Killboard" %}</a></td> target="_blank">{% trans "Killboard" %}</a></td>
<td class="text-center">{{ member.main_character.character_name }}</td> <td class="text-center"></td>
<td class="text-center">{{ member.main_character.corporation_name }}</td> <td class="text-center"></td>
<td class="text-center">{{ member.main_character.alliance_name }}</td> <td class="text-center"></td>
</tr> </tr>
{% endfor %} {% endfor %}
</tbody> </tbody>

View File

@ -3,14 +3,14 @@ import os
from bravado.exception import HTTPError from bravado.exception import HTTPError
from django.contrib import messages from django.contrib import messages
from django.contrib.auth.decorators import login_required, permission_required, user_passes_test from django.contrib.auth.decorators import login_required, permission_required, user_passes_test
from django.core.exceptions import PermissionDenied from django.core.exceptions import PermissionDenied, ObjectDoesNotExist
from django.db import IntegrityError from django.db import IntegrityError
from django.shortcuts import render, redirect, get_object_or_404 from django.shortcuts import render, redirect, get_object_or_404
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from esi.decorators import token_required from esi.decorators import token_required
from allianceauth.eveonline.models import EveCharacter, EveCorporationInfo from allianceauth.eveonline.models import EveCharacter, EveCorporationInfo
from .models import CorpStats from .models import CorpStats, CorpMember
SWAGGER_SPEC_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'swagger.json') SWAGGER_SPEC_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'swagger.json')
""" """
@ -68,7 +68,7 @@ def corpstats_view(request, corp_id=None):
corpstats = get_object_or_404(CorpStats, corp=corp) corpstats = get_object_or_404(CorpStats, corp=corp)
# get available models # get available models
available = CorpStats.objects.visible_to(request.user).order_by('corp__corporation_name') available = CorpStats.objects.visible_to(request.user).order_by('corp__corporation_name').select_related('corp')
# ensure we can see the requested model # ensure we can see the requested model
if corpstats and corpstats not in available: if corpstats and corpstats not in available:
@ -89,13 +89,49 @@ def corpstats_view(request, corp_id=None):
} }
if corpstats: if corpstats:
members = corpstats.members.all() character_list = CorpMember.objects.filter(corpstats=corpstats)
mains = corpstats.mains.all() linked_chars = EveCharacter.objects.filter(
unregistered = corpstats.unregistered_members.all() character_id__in=character_list.values_list('character_id', flat=True))
linked_chars = linked_chars | EveCharacter.objects.filter(
character_ownership__user__profile__main_character__corporation_id=corpstats.corp.corporation_id)
linked_chars = linked_chars.select_related('character_ownership',
'character_ownership__user__profile__main_character') \
.prefetch_related('character_ownership__user__character_ownerships') \
.prefetch_related('character_ownership__user__character_ownerships__character')
members = []
mains = {}
temp_ids = []
for char in linked_chars:
try:
main = char.character_ownership.user.profile.main_character
if main is not None:
if main.character_id not in mains:
mains[main.character_id] = {'main':main, 'alts':[]}
mains[main.character_id]['alts'].append(char)
if char.corporation_id == corpstats.corp.corporation_id:
members.append(char)
temp_ids.append(char.character_id)
except ObjectDoesNotExist:
pass
unregistered = character_list.exclude(character_id__in=temp_ids)
members = members
mains = mains
total_mains = len(mains)
unregistered = unregistered
context.update({ context.update({
'corpstats': corpstats, 'corpstats': corpstats,
'members': members, 'members': members,
'mains': mains, 'mains': mains,
'total_mains': total_mains,
'unregistered': unregistered, 'unregistered': unregistered,
}) })