Remove references to legacy is_blue attributes

Provide simple EVE model creation forms with ID, populate the rest from providers
Correct handling of non-main characters in signals
This commit is contained in:
Adarnof 2017-03-25 17:59:38 -04:00
parent 54262a850d
commit 64e7c6093e
6 changed files with 98 additions and 38 deletions

View File

@ -113,5 +113,7 @@ def assign_state_on_reactivate(sender, instance, *args, **kwargs):
@receiver(post_save, sender=EveCharacter) @receiver(post_save, sender=EveCharacter)
def check_state_on_character_update(sender, instance, *args, **kwargs): def check_state_on_character_update(sender, instance, *args, **kwargs):
# if this is a main character updating, check that user's state # if this is a main character updating, check that user's state
if instance.userprofile: try:
instance.userprofile.assign_state() instance.userprofile.assign_state()
except UserProfile.DoesNotExist:
pass

View File

@ -16,8 +16,6 @@ class CorpStatsQuerySet(models.QuerySet):
queries.append(models.Q(corp__corporation_id=char.corporation_id)) queries.append(models.Q(corp__corporation_id=char.corporation_id))
if user.has_perm('corputils.view_alliance_corpstats'): if user.has_perm('corputils.view_alliance_corpstats'):
queries.append(models.Q(corp__alliance__alliance_id=char.alliance_id)) queries.append(models.Q(corp__alliance__alliance_id=char.alliance_id))
if user.has_perm('corputils.view_blue_corpstats'):
queries.append(models.Q(corp__is_blue=True))
# filter based on queries # filter based on queries
if queries: if queries:

View File

@ -1,14 +1,81 @@
from __future__ import unicode_literals from __future__ import unicode_literals
from django.contrib import admin from django.contrib import admin
from django import forms
from django.core.exceptions import ObjectDoesNotExist from django.core.exceptions import ObjectDoesNotExist
from eveonline.models import EveCharacter from eveonline.models import EveCharacter
from eveonline.models import EveAllianceInfo from eveonline.models import EveAllianceInfo
from eveonline.models import EveCorporationInfo from eveonline.models import EveCorporationInfo
from eveonline.managers import EveManager
admin.site.register(EveAllianceInfo) from eveonline.providers import ObjectNotFound
admin.site.register(EveCorporationInfo)
class EveEntityForm(forms.ModelForm):
id = forms.IntegerField(min_value=1)
entity_type_name = None # override in subclass
entity_model_class = None
def clean_id(self):
try:
assert getattr(EveManager, 'get_%s' % self.entity_type_name)(self.cleaned_data['id'])
except (AssertionError, ObjectNotFound):
raise forms.ValidationError('%s with ID %s not found.' % (self.entity_type_name, self.cleaned_data['id']))
if self.entity_model_class.objects.filter(
**{'%s_id' % self.entity_type_name: self.cleaned_data['id']}).exists():
raise forms.ValidationError(
'%s with ID %s already exists.' % (self.entity_type_name, self.cleaned_data['id']))
return self.cleaned_data['id']
def save(self, commit=True):
return getattr(EveManager, 'create_%s' % self.entity_type_name)(self.cleaned_data['id'])
def save_m2m(self):
pass
class EveCharacterForm(EveEntityForm):
entity_model_class = EveCharacter
entity_type_name = 'character'
class Meta:
fields = ['id']
model = EveCharacter
class EveCorporationForm(EveEntityForm):
entity_model_class = EveCorporationInfo
entity_type_name = 'corporation'
class Meta:
fields = ['id']
model = EveCorporationInfo
class EveAllianceForm(EveEntityForm):
entity_model_class = EveAllianceInfo
entity_type_name = 'alliance'
class Meta:
fields = ['id']
model = EveAllianceInfo
@admin.register(EveCorporationInfo)
class EveCorporationInfoAdmin(admin.ModelAdmin):
def get_form(self, request, obj=None, **kwargs):
if not obj or not obj.pk:
return EveCorporationForm
return super(EveCorporationInfoAdmin, self).get_form(request, obj=obj, **kwargs)
@admin.register(EveAllianceInfo)
class EveAllianceInfoAdmin(admin.ModelAdmin):
def get_form(self, request, obj=None, **kwargs):
if not obj or not obj.pk:
return EveAllianceForm
return super(EveAllianceInfoAdmin, self).get_form(request, obj=obj, **kwargs)
@admin.register(EveCharacter)
class EveCharacterAdmin(admin.ModelAdmin): class EveCharacterAdmin(admin.ModelAdmin):
search_fields = ['character_name', 'corporation_name', 'alliance_name', 'character_ownership__user__username'] search_fields = ['character_name', 'corporation_name', 'alliance_name', 'character_ownership__user__username']
list_display = ('character_name', 'corporation_name', 'alliance_name', 'user', 'main_character') list_display = ('character_name', 'corporation_name', 'alliance_name', 'user', 'main_character')
@ -27,5 +94,7 @@ class EveCharacterAdmin(admin.ModelAdmin):
except (AttributeError, ObjectDoesNotExist): except (AttributeError, ObjectDoesNotExist):
return None return None
def get_form(self, request, obj=None, **kwargs):
admin.site.register(EveCharacter, EveCharacterAdmin) if not obj or not obj.pk:
return EveCharacterForm
return super(EveCharacterAdmin, self).get_form(request, obj=obj, **kwargs)

View File

@ -58,28 +58,26 @@ class EveManager(object):
return cls.get_adapter().get_alliance(alliance_id) return cls.get_adapter().get_alliance(alliance_id)
@staticmethod @staticmethod
def create_alliance(id, is_blue=False): def create_alliance(id):
return EveManager.create_alliance_obj(EveManager.get_alliance(id), is_blue=is_blue) return EveManager.create_alliance_obj(EveManager.get_alliance(id))
@staticmethod @staticmethod
def create_alliance_obj(alliance, is_blue=False): def create_alliance_obj(alliance):
return EveAllianceInfo.objects.create( return EveAllianceInfo.objects.create(
alliance_id=alliance.id, alliance_id=alliance.id,
alliance_name=alliance.name, alliance_name=alliance.name,
alliance_ticker=alliance.ticker, alliance_ticker=alliance.ticker,
executor_corp_id=alliance.executor_corp_id, executor_corp_id=alliance.executor_corp_id,
is_blue=is_blue,
) )
@staticmethod @staticmethod
def update_alliance(id, is_blue=None): def update_alliance(id):
return EveManager.update_alliance_obj(EveManager.get_alliance(id), is_blue=is_blue) return EveManager.update_alliance_obj(EveManager.get_alliance(id))
@staticmethod @staticmethod
def update_alliance_obj(alliance, is_blue=None): def update_alliance_obj(alliance):
model = EveAllianceInfo.objects.get(alliance_id=alliance.id) model = EveAllianceInfo.objects.get(alliance_id=alliance.id)
model.executor_corp_id = alliance.executor_corp_id model.executor_corp_id = alliance.executor_corp_id
model.is_blue = model.is_blue if is_blue is None else is_blue
model.save() model.save()
return model return model
@ -89,23 +87,21 @@ class EveManager(object):
alliance = EveManager.get_alliance(id) alliance = EveManager.get_alliance(id)
for corp_id in alliance.corp_ids: for corp_id in alliance.corp_ids:
if not EveCorporationInfo.objects.filter(corporation_id=corp_id).exists(): if not EveCorporationInfo.objects.filter(corporation_id=corp_id).exists():
EveManager.create_corporation(corp_id, is_blue=alliance_model.is_blue) EveManager.create_corporation(corp_id)
EveCorporationInfo.objects.filter(corporation_id__in=alliance.corp_ids).update(alliance=alliance_model) EveCorporationInfo.objects.filter(corporation_id__in=alliance.corp_ids).update(alliance=alliance_model)
EveCorporationInfo.objects.filter(alliance=alliance_model).exclude(corporation_id__in=alliance.corp_ids).update( EveCorporationInfo.objects.filter(alliance=alliance_model).exclude(corporation_id__in=alliance.corp_ids).update(
alliance=None) alliance=None)
if alliance_model.is_blue:
EveCorporationInfo.objects.filter(alliance=alliance_model).update(is_blue=True)
@classmethod @classmethod
def get_corporation(cls, corp_id): def get_corporation(cls, corp_id):
return cls.get_adapter().get_corp(corp_id) return cls.get_adapter().get_corp(corp_id)
@staticmethod @staticmethod
def create_corporation(id, is_blue=False): def create_corporation(id):
return EveManager.create_corporation_obj(EveManager.get_corporation(id), is_blue=is_blue) return EveManager.create_corporation_obj(EveManager.get_corporation(id))
@staticmethod @staticmethod
def create_corporation_obj(corp, is_blue=False): def create_corporation_obj(corp):
try: try:
alliance = EveAllianceInfo.objects.get(alliance_id=corp.alliance_id) alliance = EveAllianceInfo.objects.get(alliance_id=corp.alliance_id)
except EveAllianceInfo.DoesNotExist: except EveAllianceInfo.DoesNotExist:
@ -116,22 +112,20 @@ class EveManager(object):
corporation_ticker=corp.ticker, corporation_ticker=corp.ticker,
member_count=corp.members, member_count=corp.members,
alliance=alliance, alliance=alliance,
is_blue=is_blue,
) )
@staticmethod @staticmethod
def update_corporation(id, is_blue=None): def update_corporation(id):
return EveManager.update_corporation_obj(EveManager.get_corporation(id), is_blue=is_blue) return EveManager.update_corporation_obj(EveManager.get_corporation(id))
@staticmethod @staticmethod
def update_corporation_obj(corp, is_blue=None): def update_corporation_obj(corp):
model = EveCorporationInfo.objects.get(corporation_id=corp.id) model = EveCorporationInfo.objects.get(corporation_id=corp.id)
model.member_count = corp.members model.member_count = corp.members
try: try:
model.alliance = EveAllianceInfo.objects.get(alliance_id=corp.alliance_id) model.alliance = EveAllianceInfo.objects.get(alliance_id=corp.alliance_id)
except EveAllianceInfo.DoesNotExist: except EveAllianceInfo.DoesNotExist:
model.alliance = None model.alliance = None
model.is_blue = model.is_blue if is_blue is None else is_blue
model.save() model.save()
return model return model

View File

@ -12,13 +12,13 @@ import logging
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@task @task
def update_corp(corp_id, is_blue=None): def update_corp(corp_id):
EveManager.update_corporation(corp_id, is_blue=is_blue) EveManager.update_corporation(corp_id)
@task @task
def update_alliance(alliance_id, is_blue=None): def update_alliance(alliance_id):
EveManager.update_alliance(alliance_id, is_blue=is_blue) EveManager.update_alliance(alliance_id)
EveManager.populate_alliance(alliance_id) EveManager.populate_alliance(alliance_id)
@ -26,24 +26,22 @@ def update_alliance(alliance_id, is_blue=None):
def run_corp_update(): def run_corp_update():
# generate member corps # generate member corps
for corp_id in settings.STR_CORP_IDS + settings.STR_BLUE_CORP_IDS: for corp_id in settings.STR_CORP_IDS + settings.STR_BLUE_CORP_IDS:
is_blue = True if corp_id in settings.STR_BLUE_CORP_IDS else False
try: try:
if EveCorporationInfo.objects.filter(corporation_id=corp_id).exists(): if EveCorporationInfo.objects.filter(corporation_id=corp_id).exists():
update_corp(corp_id, is_blue=is_blue) update_corp(corp_id)
else: else:
EveManager.create_corporation(corp_id, is_blue=is_blue) EveManager.create_corporation(corp_id)
except ObjectNotFound: except ObjectNotFound:
logger.warn('Bad corp ID in settings: %s' % corp_id) logger.warn('Bad corp ID in settings: %s' % corp_id)
# generate member alliances # generate member alliances
for alliance_id in settings.STR_ALLIANCE_IDS + settings.STR_BLUE_ALLIANCE_IDS: for alliance_id in settings.STR_ALLIANCE_IDS + settings.STR_BLUE_ALLIANCE_IDS:
is_blue = True if alliance_id in settings.STR_BLUE_ALLIANCE_IDS else False
try: try:
if EveAllianceInfo.objects.filter(alliance_id=alliance_id).exists(): if EveAllianceInfo.objects.filter(alliance_id=alliance_id).exists():
logger.debug("Updating existing owner alliance model with id %s" % alliance_id) logger.debug("Updating existing owner alliance model with id %s" % alliance_id)
update_alliance(alliance_id, is_blue=is_blue) update_alliance(alliance_id)
else: else:
EveManager.create_alliance(alliance_id, is_blue=is_blue) EveManager.create_alliance(alliance_id)
EveManager.populate_alliance(alliance_id) EveManager.populate_alliance(alliance_id)
except ObjectNotFound: except ObjectNotFound:
logger.warn('Bad alliance ID in settings: %s' % alliance_id) logger.warn('Bad alliance ID in settings: %s' % alliance_id)

View File

@ -49,7 +49,6 @@ class CorpStat(object):
self.corp = EveCorporationInfo.objects.get(corporation_id=corp_id) self.corp = EveCorporationInfo.objects.get(corporation_id=corp_id)
self.n_fats = Fat.objects.filter(character__corporation_id=self.corp.corporation_id).filter( self.n_fats = Fat.objects.filter(character__corporation_id=self.corp.corporation_id).filter(
fatlink__fatdatetime__gte=start_of_month).filter(fatlink__fatdatetime__lte=start_of_next_month).count() fatlink__fatdatetime__gte=start_of_month).filter(fatlink__fatdatetime__lte=start_of_next_month).count()
self.blue = self.corp.is_blue
def avg_fat(self): def avg_fat(self):
return "%.2f" % (float(self.n_fats) / float(self.corp.member_count)) return "%.2f" % (float(self.n_fats) / float(self.corp.member_count))