formatting storm

This commit is contained in:
Joel Falknau 2024-09-13 23:10:37 +10:00
parent ec5cf08eef
commit a99315ea55
No known key found for this signature in database
336 changed files with 1347 additions and 1370 deletions

View File

@ -1,8 +1,9 @@
# Generated by Django 3.1.4 on 2020-12-30 13:11 # Generated by Django 3.1.4 on 2020-12-30 13:11
from django.db import migrations, models
import uuid import uuid
from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):

View File

@ -21,7 +21,7 @@ def remove_aa_team_token(apps, schema_editor):
# Have to define some code to remove this identifier # Have to define some code to remove this identifier
# In case of migration rollback? # In case of migration rollback?
Tokens = apps.get_model('analytics', 'AnalyticsTokens') Tokens = apps.get_model('analytics', 'AnalyticsTokens')
token = Tokens.objects.filter(token="UA-186249766-2").delete() Tokens.objects.filter(token="UA-186249766-2").delete()
class Migration(migrations.Migration): class Migration(migrations.Migration):

View File

@ -1,6 +1,5 @@
# Generated by Django 3.1.4 on 2020-12-30 08:53 # Generated by Django 3.1.4 on 2020-12-30 08:53
from uuid import uuid4
from django.db import migrations from django.db import migrations

View File

@ -1,7 +1,7 @@
# Generated by Django 3.1.4 on 2020-12-30 08:53 # Generated by Django 3.1.4 on 2020-12-30 08:53
from django.db import migrations
from django.core.exceptions import ObjectDoesNotExist from django.core.exceptions import ObjectDoesNotExist
from django.db import migrations
def add_aa_team_token(apps, schema_editor): def add_aa_team_token(apps, schema_editor):
@ -51,7 +51,7 @@ def remove_aa_team_token(apps, schema_editor):
# Have to define some code to remove this identifier # Have to define some code to remove this identifier
# In case of migration rollback? # In case of migration rollback?
Tokens = apps.get_model('analytics', 'AnalyticsTokens') Tokens = apps.get_model('analytics', 'AnalyticsTokens')
token = Tokens.objects.filter(token="G-6LYSMYK8DE").delete() Tokens.objects.filter(token="G-6LYSMYK8DE").delete()
class Migration(migrations.Migration): class Migration(migrations.Migration):

View File

@ -1,9 +1,9 @@
from django.db import models
from django.core.exceptions import ValidationError
from django.utils.translation import gettext_lazy as _
from uuid import uuid4 from uuid import uuid4
from django.core.exceptions import ValidationError
from django.db import models
from django.utils.translation import gettext_lazy as _
class AnalyticsIdentifier(models.Model): class AnalyticsIdentifier(models.Model):
@ -11,6 +11,9 @@ class AnalyticsIdentifier(models.Model):
default=uuid4, default=uuid4,
editable=False) editable=False)
def __str__(self) -> str:
return f"{self.identifier}"
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
if not self.pk and AnalyticsIdentifier.objects.exists(): if not self.pk and AnalyticsIdentifier.objects.exists():
# Force a single object # Force a single object
@ -31,3 +34,6 @@ class AnalyticsTokens(models.Model):
token = models.CharField(max_length=254, blank=False) token = models.CharField(max_length=254, blank=False)
secret = models.CharField(max_length=254, blank=True) secret = models.CharField(max_length=254, blank=True)
send_stats = models.BooleanField(default=False) send_stats = models.BooleanField(default=False)
def __str__(self) -> str:
return self.name

View File

@ -1,16 +1,16 @@
import requests
import logging import logging
from django.conf import settings
from django.apps import apps import requests
from celery import shared_task from celery import shared_task
from .models import AnalyticsTokens, AnalyticsIdentifier
from .utils import ( from django.apps import apps
install_stat_addons, from django.conf import settings
install_stat_tokens,
install_stat_users)
from allianceauth import __version__ from allianceauth import __version__
from .models import AnalyticsIdentifier, AnalyticsTokens
from .utils import install_stat_addons, install_stat_tokens, install_stat_users
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
BASE_URL = "https://www.google-analytics.com" BASE_URL = "https://www.google-analytics.com"

View File

@ -1,10 +1,9 @@
from allianceauth.analytics.models import AnalyticsIdentifier
from django.core.exceptions import ValidationError
from django.test.testcases import TestCase
from uuid import UUID, uuid4 from uuid import UUID, uuid4
from django.core.exceptions import ValidationError
from django.test.testcases import TestCase
from allianceauth.analytics.models import AnalyticsIdentifier
# Identifiers # Identifiers
uuid_1 = "ab33e241fbf042b6aa77c7655a768af7" uuid_1 = "ab33e241fbf042b6aa77c7655a768af7"

View File

@ -2,12 +2,9 @@ import requests_mock
from django.test.utils import override_settings from django.test.utils import override_settings
from allianceauth.analytics.tasks import ( from allianceauth.analytics.tasks import analytics_event, send_ga_tracking_celery_event
analytics_event,
send_ga_tracking_celery_event)
from allianceauth.utils.testing import NoSocketsTestCase from allianceauth.utils.testing import NoSocketsTestCase
GOOGLE_ANALYTICS_DEBUG_URL = 'https://www.google-analytics.com/debug/mp/collect' GOOGLE_ANALYTICS_DEBUG_URL = 'https://www.google-analytics.com/debug/mp/collect'

View File

@ -1,10 +1,9 @@
from django.apps import apps from django.apps import apps
from allianceauth.authentication.models import User
from esi.models import Token
from allianceauth.analytics.utils import install_stat_users, install_stat_tokens, install_stat_addons
from django.test.testcases import TestCase from django.test.testcases import TestCase
from allianceauth.analytics.utils import install_stat_addons, install_stat_users
from allianceauth.authentication.models import User
def create_testdata(): def create_testdata():
User.objects.all().delete() User.objects.all().delete()

View File

@ -1,7 +1,9 @@
from django.apps import apps from django.apps import apps
from allianceauth.authentication.models import User
from esi.models import Token from esi.models import Token
from allianceauth.authentication.models import User
def install_stat_users() -> int: def install_stat_users() -> int:
"""Count and Return the number of User accounts """Count and Return the number of User accounts

View File

@ -1,5 +1,4 @@
from django.apps import AppConfig from django.apps import AppConfig
from django.core.checks import Warning, Error, register
class AllianceAuthConfig(AppConfig): class AllianceAuthConfig(AppConfig):

View File

@ -1,43 +1,21 @@
from django.contrib import admin from django.contrib import admin
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from django.contrib.auth.models import Group from django.contrib.auth.models import Group, Permission as BasePermission, User as BaseUser
from django.contrib.auth.models import Permission as BasePermission
from django.contrib.auth.models import User as BaseUser
from django.db.models import Count, Q from django.db.models import Count, Q
from django.db.models.functions import Lower from django.db.models.functions import Lower
from django.db.models.signals import ( from django.db.models.signals import m2m_changed, post_delete, post_save, pre_delete, pre_save
m2m_changed,
post_delete,
post_save,
pre_delete,
pre_save
)
from django.dispatch import receiver from django.dispatch import receiver
from django.urls import reverse from django.urls import reverse
from django.utils.html import format_html from django.utils.html import format_html
from django.utils.text import slugify from django.utils.text import slugify
from allianceauth.authentication.models import ( from allianceauth.authentication.models import CharacterOwnership, OwnershipRecord, State, UserProfile, get_guest_state
CharacterOwnership, from allianceauth.eveonline.models import EveAllianceInfo, EveCharacter, EveCorporationInfo, EveFactionInfo
OwnershipRecord,
State,
UserProfile,
get_guest_state
)
from allianceauth.eveonline.models import (
EveAllianceInfo,
EveCharacter,
EveCorporationInfo,
EveFactionInfo
)
from allianceauth.eveonline.tasks import update_character from allianceauth.eveonline.tasks import update_character
from allianceauth.hooks import get_hooks from allianceauth.hooks import get_hooks
from allianceauth.services.hooks import ServicesHook from allianceauth.services.hooks import ServicesHook
from .app_settings import ( from .app_settings import AUTHENTICATION_ADMIN_USERS_MAX_CHARS, AUTHENTICATION_ADMIN_USERS_MAX_GROUPS
AUTHENTICATION_ADMIN_USERS_MAX_CHARS,
AUTHENTICATION_ADMIN_USERS_MAX_GROUPS
)
from .forms import UserChangeForm, UserProfileForm from .forms import UserChangeForm, UserProfileForm
@ -132,10 +110,7 @@ def user_username(obj):
To be used for all user based admin lists To be used for all user based admin lists
""" """
link = reverse( link = reverse(
'admin:{}_{}_change'.format( f'admin:{obj._meta.app_label}_{type(obj).__name__.lower()}_change',
obj._meta.app_label,
type(obj).__name__.lower()
),
args=(obj.pk,) args=(obj.pk,)
) )
user_obj = obj.user if hasattr(obj, 'user') else obj user_obj = obj.user if hasattr(obj, 'user') else obj
@ -548,7 +523,7 @@ class BaseOwnershipAdmin(admin.ModelAdmin):
def get_readonly_fields(self, request, obj=None): def get_readonly_fields(self, request, obj=None):
if obj and obj.pk: if obj and obj.pk:
return 'owner_hash', 'character' return 'owner_hash', 'character'
return tuple() return ()
@admin.register(OwnershipRecord) @admin.register(OwnershipRecord)

View File

@ -25,7 +25,7 @@ def _clean_setting(
if not required_type: if not required_type:
required_type = type(default_value) required_type = type(default_value)
if min_value is None and required_type == int: if min_value is None and required_type is int:
min_value = 0 min_value = 0
if (hasattr(settings, name) if (hasattr(settings, name)

View File

@ -1,5 +1,5 @@
from django.apps import AppConfig from django.apps import AppConfig
from django.core.checks import register, Tags from django.core.checks import Tags, register
class AuthenticationConfig(AppConfig): class AuthenticationConfig(AppConfig):

View File

@ -1,6 +1,7 @@
from allianceauth.hooks import DashboardItemHook
from allianceauth import hooks from allianceauth import hooks
from .views import dashboard_characters, dashboard_esi_check, dashboard_groups, dashboard_admin from allianceauth.hooks import DashboardItemHook
from .views import dashboard_admin, dashboard_characters, dashboard_esi_check, dashboard_groups
class UserCharactersHook(DashboardItemHook): class UserCharactersHook(DashboardItemHook):

View File

@ -1,10 +1,9 @@
import logging import logging
from django.contrib.auth.backends import ModelBackend from django.contrib.auth.backends import ModelBackend
from django.contrib.auth.models import User, Permission from django.contrib.auth.models import Permission, User
from .models import UserProfile, CharacterOwnership, OwnershipRecord
from .models import CharacterOwnership, OwnershipRecord, UserProfile
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)

View File

@ -1,5 +1,5 @@
from django.core.checks import Error
from django.conf import settings from django.conf import settings
from django.core.checks import Error
def check_login_scopes_setting(*args, **kwargs): def check_login_scopes_setting(*args, **kwargs):

View File

@ -2,7 +2,6 @@
import itertools import itertools
import logging import logging
from typing import Optional
from amqp.exceptions import ChannelError from amqp.exceptions import ChannelError
from celery import current_app from celery import current_app

View File

@ -1,15 +1,11 @@
from django.urls import include
from django.contrib.auth.decorators import user_passes_test
from django.core.exceptions import PermissionDenied
from functools import wraps
from typing import Optional
from collections.abc import Callable, Iterable from collections.abc import Callable, Iterable
from functools import wraps
from django.urls import include
from django.contrib import messages from django.contrib import messages
from django.contrib.auth.decorators import login_required, user_passes_test from django.contrib.auth.decorators import login_required, user_passes_test
from django.core.exceptions import PermissionDenied from django.core.exceptions import PermissionDenied
from django.shortcuts import redirect from django.shortcuts import redirect
from django.urls import include
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _

View File

@ -60,7 +60,7 @@ class UserChangeForm(BaseUserChangeForm):
{ {
"groups": _( "groups": _(
"You are not allowed to add or remove these " "You are not allowed to add or remove these "
"restricted groups: %s" % restricted_names "restricted groups: {}".format(restricted_names)
) )
} }
) )

View File

@ -1,5 +1,6 @@
from django.urls import include, path, re_path
from allianceauth.authentication import views from allianceauth.authentication import views
from django.urls import include, re_path, path
urlpatterns = [ urlpatterns = [
path('activate/complete/', views.activation_complete, name='registration_activation_complete'), path('activate/complete/', views.activation_complete, name='registration_activation_complete'),

View File

@ -1,4 +1,5 @@
from django.core.management.base import BaseCommand from django.core.management.base import BaseCommand
from allianceauth.authentication.models import UserProfile from allianceauth.authentication.models import UserProfile
@ -11,8 +12,7 @@ class Command(BaseCommand):
if profiles.exists(): if profiles.exists():
for profile in profiles: for profile in profiles:
self.stdout.write(self.style.ERROR( self.stdout.write(self.style.ERROR(
'{} does not have an ownership. Resetting user {} main character.'.format(profile.main_character, f'{profile.main_character} does not have an ownership. Resetting user {profile.user} main character.'))
profile.user)))
profile.main_character = None profile.main_character = None
profile.save() profile.save()
self.stdout.write(self.style.WARNING(f'Reset {profiles.count()} main characters.')) self.stdout.write(self.style.WARNING(f'Reset {profiles.count()} main characters.'))

View File

@ -1,7 +1,7 @@
import logging import logging
from django.db import transaction from django.db import transaction
from django.db.models import Manager, QuerySet, Q from django.db.models import Manager, Q, QuerySet
from allianceauth.eveonline.models import EveCharacter from allianceauth.eveonline.models import EveCharacter

View File

@ -1,8 +1,8 @@
import logging
from django.conf import settings from django.conf import settings
from django.utils.deprecation import MiddlewareMixin from django.utils.deprecation import MiddlewareMixin
import logging
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)

View File

@ -1,8 +1,8 @@
# Generated by Django 1.10.1 on 2016-09-05 21:38 # Generated by Django 1.10.1 on 2016-09-05 21:38
import django.db.models.deletion
from django.conf import settings from django.conf import settings
from django.db import migrations, models from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration): class Migration(migrations.Migration):

View File

@ -2,6 +2,7 @@
from django.db import migrations from django.db import migrations
def create_permissions(apps, schema_editor): def create_permissions(apps, schema_editor):
User = apps.get_model('auth', 'User') User = apps.get_model('auth', 'User')
ContentType = apps.get_model('contenttypes', 'ContentType') ContentType = apps.get_model('contenttypes', 'ContentType')

View File

@ -2,6 +2,7 @@
from django.db import migrations from django.db import migrations
def delete_permissions(apps, schema_editor): def delete_permissions(apps, schema_editor):
User = apps.get_model('auth', 'User') User = apps.get_model('auth', 'User')
ContentType = apps.get_model('contenttypes', 'ContentType') ContentType = apps.get_model('contenttypes', 'ContentType')

View File

@ -2,6 +2,7 @@
from django.db import migrations from django.db import migrations
def count_completed_fields(model): def count_completed_fields(model):
return len([True for key, value in model.__dict__.items() if bool(value)]) return len([True for key, value in model.__dict__.items() if bool(value)])

View File

@ -1,8 +1,8 @@
# Generated by Django 1.10.1 on 2017-01-07 07:11 # Generated by Django 1.10.1 on 2017-01-07 07:11
import django.db.models.deletion
from django.conf import settings from django.conf import settings
from django.db import migrations, models from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration): class Migration(migrations.Migration):

View File

@ -1,6 +1,7 @@
# Generated by Django 1.10.5 on 2017-01-12 00:59 # Generated by Django 1.10.5 on 2017-01-12 00:59
from django.db import migrations, models from django.db import migrations
def remove_permissions(apps, schema_editor): def remove_permissions(apps, schema_editor):
ContentType = apps.get_model('contenttypes', 'ContentType') ContentType = apps.get_model('contenttypes', 'ContentType')

View File

@ -1,9 +1,9 @@
# Generated by Django 1.10.2 on 2016-12-11 23:14 # Generated by Django 1.10.2 on 2016-12-11 23:14
from django.db import migrations
import logging import logging
from django.db import migrations
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)

View File

@ -1,11 +1,12 @@
# Generated by Django 1.10.5 on 2017-03-22 23:09 # Generated by Django 1.10.5 on 2017-03-22 23:09
import allianceauth.authentication.models
import django.db.models.deletion import django.db.models.deletion
from django.conf import settings from django.conf import settings
from django.contrib.auth.hashers import make_password from django.contrib.auth.hashers import make_password
from django.db import migrations, models from django.db import migrations, models
import allianceauth.authentication.models
def create_guest_state(apps, schema_editor): def create_guest_state(apps, schema_editor):
State = apps.get_model('authentication', 'State') State = apps.get_model('authentication', 'State')

View File

@ -1,8 +1,8 @@
# Generated by Django 2.0.4 on 2018-04-14 18:28 # Generated by Django 2.0.4 on 2018-04-14 18:28
import django.db.models.deletion
from django.conf import settings from django.conf import settings
from django.db import migrations, models from django.db import migrations, models
import django.db.models.deletion
def create_initial_records(apps, schema_editor): def create_initial_records(apps, schema_editor):

View File

@ -1,11 +1,11 @@
import logging import logging
from django.contrib.auth.models import User, Permission from django.contrib.auth.models import Permission, User
from django.db import models, transaction from django.db import models, transaction
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from allianceauth.eveonline.models import EveCharacter, EveCorporationInfo, EveAllianceInfo, EveFactionInfo
from allianceauth.eveonline.models import EveAllianceInfo, EveCharacter, EveCorporationInfo, EveFactionInfo
from allianceauth.notifications import notify from allianceauth.notifications import notify
from django.conf import settings
from .managers import CharacterOwnershipManager, StateManager from .managers import CharacterOwnershipManager, StateManager
@ -60,8 +60,7 @@ def get_guest_state_pk():
class UserProfile(models.Model): class UserProfile(models.Model):
class Meta:
default_permissions = ('change',)
class Language(models.TextChoices): class Language(models.TextChoices):
""" """
@ -108,10 +107,15 @@ class UserProfile(models.Model):
_("Theme"), _("Theme"),
max_length=200, max_length=200,
blank=True, blank=True,
null=True,
help_text="Bootstrap 5 Themes from https://bootswatch.com/ or Community Apps" help_text="Bootstrap 5 Themes from https://bootswatch.com/ or Community Apps"
) )
class Meta:
default_permissions = ('change',)
def __str__(self) -> str:
return str(self.user)
def assign_state(self, state=None, commit=True): def assign_state(self, state=None, commit=True):
if not state: if not state:
state = State.objects.get_for_user(self.user) state = State.objects.get_for_user(self.user)
@ -122,7 +126,7 @@ class UserProfile(models.Model):
self.save(update_fields=['state']) self.save(update_fields=['state'])
notify( notify(
self.user, self.user,
_('State changed to: %s' % state), _('State changed to: {}'.format(state)),
_('Your user\'s state is now: %(state)s') _('Your user\'s state is now: %(state)s')
% ({'state': state}), % ({'state': state}),
'info' 'info'
@ -137,19 +141,18 @@ class UserProfile(models.Model):
sender=self.__class__, user=self.user, state=self.state sender=self.__class__, user=self.user, state=self.state
) )
def __str__(self):
return str(self.user)
class CharacterOwnership(models.Model): class CharacterOwnership(models.Model):
class Meta:
default_permissions = ('change', 'delete')
ordering = ['user', 'character__character_name']
character = models.OneToOneField(EveCharacter, on_delete=models.CASCADE, related_name='character_ownership') character = models.OneToOneField(EveCharacter, on_delete=models.CASCADE, related_name='character_ownership')
owner_hash = models.CharField(max_length=28, unique=True) owner_hash = models.CharField(max_length=28, unique=True)
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='character_ownerships') user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='character_ownerships')
objects = CharacterOwnershipManager() objects = CharacterOwnershipManager()
class Meta:
default_permissions = ('change', 'delete')
ordering = ['user', 'character__character_name']
def __str__(self): def __str__(self):
return f"{self.user}: {self.character}" return f"{self.user}: {self.character}"

View File

@ -1,19 +1,16 @@
import logging import logging
from .models import (
CharacterOwnership,
UserProfile,
get_guest_state,
State,
OwnershipRecord)
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.db.models import Q from django.db.models import Q
from django.db.models.signals import pre_save, post_save, pre_delete, post_delete, m2m_changed from django.db.models.signals import m2m_changed, post_delete, post_save, pre_delete, pre_save
from django.dispatch import receiver, Signal from django.dispatch import Signal, receiver
from esi.models import Token from esi.models import Token
from allianceauth.eveonline.models import EveCharacter from allianceauth.eveonline.models import EveCharacter
from .models import CharacterOwnership, OwnershipRecord, State, UserProfile, get_guest_state
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
state_changed = Signal() state_changed = Signal()
@ -108,8 +105,7 @@ def record_character_ownership(sender, instance, created, *args, **kwargs):
def validate_main_character(sender, instance, *args, **kwargs): def validate_main_character(sender, instance, *args, **kwargs):
try: try:
if instance.user.profile.main_character == instance.character: if instance.user.profile.main_character == instance.character:
logger.info("Ownership of a main character {} has been revoked. Resetting {} main character.".format( logger.info(f"Ownership of a main character {instance.character} has been revoked. Resetting {instance.user} main character.")
instance.character, instance.user))
# clear main character as user no longer owns them # clear main character as user no longer owns them
instance.user.profile.main_character = None instance.user.profile.main_character = None
instance.user.profile.save() instance.user.profile.save()

View File

@ -1,7 +1,7 @@
"""Counters for Task Statistics.""" """Counters for Task Statistics."""
import datetime as dt import datetime as dt
from typing import NamedTuple, Optional from typing import NamedTuple
from .event_series import EventSeries from .event_series import EventSeries

View File

@ -2,7 +2,6 @@
import datetime as dt import datetime as dt
import logging import logging
from typing import List, Optional
from pytz import utc from pytz import utc
from redis import Redis from redis import Redis

View File

@ -1,7 +1,11 @@
"""Signals for Task Statistics.""" """Signals for Task Statistics."""
from celery.signals import ( from celery.signals import (
task_failure, task_internal_error, task_retry, task_success, worker_ready, task_failure,
task_internal_error,
task_retry,
task_success,
worker_ready,
) )
from django.conf import settings from django.conf import settings

View File

@ -4,7 +4,10 @@ from django.test import TestCase
from django.utils.timezone import now from django.utils.timezone import now
from allianceauth.authentication.task_statistics.counters import ( from allianceauth.authentication.task_statistics.counters import (
dashboard_results, failed_tasks, retried_tasks, succeeded_tasks, dashboard_results,
failed_tasks,
retried_tasks,
succeeded_tasks,
) )

View File

@ -4,7 +4,8 @@ from unittest.mock import patch
from redis import RedisError from redis import RedisError
from allianceauth.authentication.task_statistics.helpers import ( from allianceauth.authentication.task_statistics.helpers import (
_RedisStub, get_redis_client_or_stub, _RedisStub,
get_redis_client_or_stub,
) )
MODULE_PATH = "allianceauth.authentication.task_statistics.helpers" MODULE_PATH = "allianceauth.authentication.task_statistics.helpers"

View File

@ -10,8 +10,8 @@ from allianceauth.authentication.task_statistics.counters import (
succeeded_tasks, succeeded_tasks,
) )
from allianceauth.authentication.task_statistics.signals import ( from allianceauth.authentication.task_statistics.signals import (
reset_counters,
is_enabled, is_enabled,
reset_counters,
) )
from allianceauth.eveonline.tasks import update_character from allianceauth.eveonline.tasks import update_character

View File

@ -1,9 +1,10 @@
import logging import logging
from esi.errors import TokenExpiredError, TokenInvalidError, IncompleteResponseError
from esi.models import Token
from celery import shared_task from celery import shared_task
from esi.errors import IncompleteResponseError, TokenExpiredError, TokenInvalidError
from esi.models import Token
from allianceauth.authentication.models import CharacterOwnership from allianceauth.authentication.models import CharacterOwnership
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -22,8 +23,7 @@ def check_character_ownership(owner_hash):
continue continue
except (KeyError, IncompleteResponseError): except (KeyError, IncompleteResponseError):
# We can't validate the hash hasn't changed but also can't assume it has. Abort for now. # We can't validate the hash hasn't changed but also can't assume it has. Abort for now.
logger.warning("Failed to validate owner hash of {} due to problems contacting SSO servers.".format( logger.warning(f"Failed to validate owner hash of {tokens[0].character_name} due to problems contacting SSO servers.")
tokens[0].character_name))
break break
if not t.character_owner_hash == old_hash: if not t.character_owner_hash == old_hash:
@ -33,7 +33,7 @@ def check_character_ownership(owner_hash):
break break
if not Token.objects.filter(character_owner_hash=owner_hash).exists(): if not Token.objects.filter(character_owner_hash=owner_hash).exists():
logger.info('No tokens found with owner hash %s. Revoking ownership.' % owner_hash) logger.info(f'No tokens found with owner hash {owner_hash}. Revoking ownership.')
CharacterOwnership.objects.filter(owner_hash=owner_hash).delete() CharacterOwnership.objects.filter(owner_hash=owner_hash).delete()

View File

@ -1,12 +1,7 @@
from django.db.models.signals import (
m2m_changed,
post_save,
pre_delete,
pre_save
)
from django.urls import reverse
from unittest import mock from unittest import mock
from django.urls import reverse
MODULE_PATH = 'allianceauth.authentication' MODULE_PATH = 'allianceauth.authentication'
@ -17,9 +12,7 @@ def patch(target, *args, **kwargs):
def get_admin_change_view_url(obj: object) -> str: def get_admin_change_view_url(obj: object) -> str:
"""returns URL to admin change view for given object""" """returns URL to admin change view for given object"""
return reverse( return reverse(
'admin:{}_{}_change'.format( f'admin:{obj._meta.app_label}_{type(obj).__name__.lower()}_change',
obj._meta.app_label, type(obj).__name__.lower()
),
args=(obj.pk,) args=(obj.pk,)
) )

View File

@ -5,7 +5,8 @@ from amqp.exceptions import ChannelError
from django.test import TestCase from django.test import TestCase
from allianceauth.authentication.core.celery_workers import ( from allianceauth.authentication.core.celery_workers import (
active_tasks_count, queued_tasks_count, active_tasks_count,
queued_tasks_count,
) )
MODULE_PATH = "allianceauth.authentication.core.celery_workers" MODULE_PATH = "allianceauth.authentication.core.celery_workers"

View File

@ -1,42 +1,37 @@
from bs4 import BeautifulSoup from unittest.mock import MagicMock, patch
from urllib.parse import quote from urllib.parse import quote
from unittest.mock import patch, MagicMock
from bs4 import BeautifulSoup
from django_webtest import WebTest from django_webtest import WebTest
from django.contrib.admin.sites import AdminSite from django.contrib.admin.sites import AdminSite
from django.contrib.auth.models import Group from django.contrib.auth.models import Group
from django.test import TestCase, RequestFactory, Client from django.test import Client, RequestFactory, TestCase
from allianceauth.authentication.models import ( from allianceauth.authentication.models import CharacterOwnership, OwnershipRecord, State
CharacterOwnership, State, OwnershipRecord from allianceauth.eveonline.models import EveAllianceInfo, EveCharacter, EveCorporationInfo, EveFactionInfo
)
from allianceauth.eveonline.models import (
EveCharacter, EveCorporationInfo, EveAllianceInfo, EveFactionInfo
)
from allianceauth.services.hooks import ServicesHook from allianceauth.services.hooks import ServicesHook
from allianceauth.tests.auth_utils import AuthUtils from allianceauth.tests.auth_utils import AuthUtils
from ..admin import ( from ..admin import (
BaseUserAdmin, BaseUserAdmin,
CharacterOwnershipAdmin, CharacterOwnershipAdmin,
StateAdmin,
MainCorporationsFilter,
MainAllianceFilter, MainAllianceFilter,
MainCorporationsFilter,
MainFactionFilter, MainFactionFilter,
OwnershipRecordAdmin, OwnershipRecordAdmin,
StateAdmin,
User, User,
UserAdmin, UserAdmin,
make_service_hooks_sync_nickname_action,
make_service_hooks_update_groups_action,
update_main_character_model,
user_main_organization, user_main_organization,
user_profile_pic, user_profile_pic,
user_username, user_username,
update_main_character_model,
make_service_hooks_update_groups_action,
make_service_hooks_sync_nickname_action
) )
from . import get_admin_change_view_url, get_admin_search_url from . import get_admin_change_view_url, get_admin_search_url
MODULE_PATH = 'allianceauth.authentication.admin' MODULE_PATH = 'allianceauth.authentication.admin'
@ -327,15 +322,15 @@ class TestUserAdmin(TestCaseWithTestData):
def test_user_username_u1(self): def test_user_username_u1(self):
expected = ( expected = (
'<strong><a href="/admin/authentication/user/{}/change/">' f'<strong><a href="/admin/authentication/user/{self.user_1.pk}/change/">'
'Bruce_Wayne</a></strong><br>Bruce Wayne'.format(self.user_1.pk) 'Bruce_Wayne</a></strong><br>Bruce Wayne'
) )
self.assertEqual(user_username(self.user_1), expected) self.assertEqual(user_username(self.user_1), expected)
def test_user_username_u3(self): def test_user_username_u3(self):
expected = ( expected = (
'<strong><a href="/admin/authentication/user/{}/change/">' f'<strong><a href="/admin/authentication/user/{self.user_3.pk}/change/">'
'Lex_Luthor</a></strong>'.format(self.user_3.pk) 'Lex_Luthor</a></strong>'
) )
self.assertEqual(user_username(self.user_3), expected) self.assertEqual(user_username(self.user_3), expected)

View File

@ -1,4 +1,5 @@
from unittest.mock import Mock, patch from unittest.mock import Mock, patch
from django.test import TestCase from django.test import TestCase
from .. import app_settings from .. import app_settings
@ -83,7 +84,7 @@ class TestSetAppSetting(TestCase):
self.assertEqual(result, 50) self.assertEqual(result, 50)
@patch(MODULE_PATH + '.app_settings.settings') @patch(MODULE_PATH + '.app_settings.settings')
def test_default_for_invalid_type_int(self, mock_settings): def test_default_for_outofrange_int(self, mock_settings):
mock_settings.TEST_SETTING_DUMMY = 1000 mock_settings.TEST_SETTING_DUMMY = 1000
result = app_settings._clean_setting( result = app_settings._clean_setting(
'TEST_SETTING_DUMMY', 'TEST_SETTING_DUMMY',
@ -96,7 +97,7 @@ class TestSetAppSetting(TestCase):
def test_default_is_none_needs_required_type(self, mock_settings): def test_default_is_none_needs_required_type(self, mock_settings):
mock_settings.TEST_SETTING_DUMMY = 'invalid type' mock_settings.TEST_SETTING_DUMMY = 'invalid type'
with self.assertRaises(ValueError): with self.assertRaises(ValueError):
result = app_settings._clean_setting( app_settings._clean_setting(
'TEST_SETTING_DUMMY', 'TEST_SETTING_DUMMY',
default_value=None default_value=None
) )

View File

@ -1,13 +1,13 @@
from django.contrib.auth.models import User, Group from django.contrib.auth.models import Group, User
from django.test import TestCase from django.test import TestCase
from esi.models import Token
from allianceauth.eveonline.models import EveCharacter from allianceauth.eveonline.models import EveCharacter
from allianceauth.tests.auth_utils import AuthUtils from allianceauth.tests.auth_utils import AuthUtils
from esi.models import Token
from ..backends import StateBackend from ..backends import StateBackend
from ..models import CharacterOwnership, UserProfile, OwnershipRecord from ..models import CharacterOwnership, OwnershipRecord, UserProfile
MODULE_PATH = 'allianceauth.authentication' MODULE_PATH = 'allianceauth.authentication'

View File

@ -6,12 +6,11 @@ from django.contrib.auth.models import AnonymousUser
from django.http.response import HttpResponse from django.http.response import HttpResponse
from django.test import TestCase from django.test import TestCase
from django.test.client import RequestFactory from django.test.client import RequestFactory
from django.urls import reverse, URLPattern from django.urls import URLPattern, reverse
from allianceauth.eveonline.models import EveCharacter from allianceauth.eveonline.models import EveCharacter
from allianceauth.tests.auth_utils import AuthUtils from allianceauth.tests.auth_utils import AuthUtils
from ..decorators import decorate_url_patterns, main_character_required from ..decorators import decorate_url_patterns, main_character_required
from ..models import CharacterOwnership from ..models import CharacterOwnership
@ -47,7 +46,7 @@ class DecoratorTestCase(TestCase):
@mock.patch(MODULE_PATH + '.decorators.messages') @mock.patch(MODULE_PATH + '.decorators.messages')
def test_login_redirect(self, m): def test_login_redirect(self, m):
setattr(self.request, 'user', AnonymousUser()) self.request.user = AnonymousUser()
response = self.dummy_view(self.request) response = self.dummy_view(self.request)
self.assertEqual(response.status_code, 302) self.assertEqual(response.status_code, 302)
url = getattr(response, 'url', None) url = getattr(response, 'url', None)
@ -55,7 +54,7 @@ class DecoratorTestCase(TestCase):
@mock.patch(MODULE_PATH + '.decorators.messages') @mock.patch(MODULE_PATH + '.decorators.messages')
def test_main_character_redirect(self, m): def test_main_character_redirect(self, m):
setattr(self.request, 'user', self.no_main_user) self.request.user = self.no_main_user
response = self.dummy_view(self.request) response = self.dummy_view(self.request)
self.assertEqual(response.status_code, 302) self.assertEqual(response.status_code, 302)
url = getattr(response, 'url', None) url = getattr(response, 'url', None)
@ -63,7 +62,7 @@ class DecoratorTestCase(TestCase):
@mock.patch(MODULE_PATH + '.decorators.messages') @mock.patch(MODULE_PATH + '.decorators.messages')
def test_successful_request(self, m): def test_successful_request(self, m):
setattr(self.request, 'user', self.main_user) self.request.user = self.main_user
response = self.dummy_view(self.request) response = self.dummy_view(self.request)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)

View File

@ -1,10 +1,10 @@
from unittest import mock
from allianceauth.authentication.middleware import UserSettingsMiddleware
from unittest.mock import Mock from unittest.mock import Mock
from django.http import HttpResponse
from django.http import HttpResponse
from django.test.testcases import TestCase from django.test.testcases import TestCase
from allianceauth.authentication.middleware import UserSettingsMiddleware
class TestUserSettingsMiddlewareSaveLang(TestCase): class TestUserSettingsMiddlewareSaveLang(TestCase):
@ -39,7 +39,7 @@ class TestUserSettingsMiddlewareSaveLang(TestCase):
of a non-existent (anonymous) user of a non-existent (anonymous) user
""" """
self.request.user.is_anonymous = True self.request.user.is_anonymous = True
response = self.middleware.process_response( self.middleware.process_response(
self.request, self.request,
self.response self.response
) )
@ -52,7 +52,7 @@ class TestUserSettingsMiddlewareSaveLang(TestCase):
does the middleware change a language not set in the DB does the middleware change a language not set in the DB
""" """
self.request.user.profile.language = None self.request.user.profile.language = None
response = self.middleware.process_response( self.middleware.process_response(
self.request, self.request,
self.response self.response
) )
@ -64,7 +64,7 @@ class TestUserSettingsMiddlewareSaveLang(TestCase):
""" """
Tests the middleware will change a language setting Tests the middleware will change a language setting
""" """
response = self.middleware.process_response( self.middleware.process_response(
self.request, self.request,
self.response self.response
) )
@ -158,7 +158,7 @@ class TestUserSettingsMiddlewareLoginFlow(TestCase):
tests the middleware will set night_mode if not set tests the middleware will set night_mode if not set
""" """
self.request.session = {} self.request.session = {}
response = self.middleware.process_response( self.middleware.process_response(
self.request, self.request,
self.response self.response
) )
@ -168,7 +168,7 @@ class TestUserSettingsMiddlewareLoginFlow(TestCase):
""" """
tests the middleware will set night_mode if set. tests the middleware will set night_mode if set.
""" """
response = self.middleware.process_response( self.middleware.process_response(
self.request, self.request,
self.response self.response
) )

View File

@ -3,12 +3,12 @@ from unittest import mock
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.test import TestCase from django.test import TestCase
from allianceauth.eveonline.models import EveCharacter, EveCorporationInfo,\
EveAllianceInfo, EveFactionInfo
from allianceauth.tests.auth_utils import AuthUtils
from esi.errors import IncompleteResponseError from esi.errors import IncompleteResponseError
from esi.models import Token from esi.models import Token
from allianceauth.eveonline.models import EveAllianceInfo, EveCharacter, EveCorporationInfo, EveFactionInfo
from allianceauth.tests.auth_utils import AuthUtils
from ..models import CharacterOwnership, State, get_guest_state from ..models import CharacterOwnership, State, get_guest_state
from ..tasks import check_character_ownership from ..tasks import check_character_ownership

View File

@ -1,19 +1,11 @@
from django.db.models.signals import post_save
from django.test.testcases import TestCase
from allianceauth.authentication.models import User, UserProfile from allianceauth.authentication.models import User, UserProfile
from allianceauth.eveonline.models import ( from allianceauth.eveonline.models import EveAllianceInfo, EveCharacter, EveCorporationInfo
EveCharacter,
EveCorporationInfo,
EveAllianceInfo
)
from django.db.models.signals import (
pre_save,
post_save,
pre_delete,
m2m_changed
)
from allianceauth.tests.auth_utils import AuthUtils from allianceauth.tests.auth_utils import AuthUtils
from django.test.testcases import TestCase
from unittest.mock import Mock
from . import patch from . import patch

View File

@ -9,8 +9,12 @@ from django.core.cache import cache
from django.test import TestCase from django.test import TestCase
from allianceauth.templatetags.admin_status import ( from allianceauth.templatetags.admin_status import (
_current_notifications, _current_version_summary, _fetch_list_from_gitlab, _current_notifications,
_fetch_notification_issues_from_gitlab, _latests_versions, status_overview, _current_version_summary,
_fetch_list_from_gitlab,
_fetch_notification_issues_from_gitlab,
_latests_versions,
status_overview,
) )
MODULE_PATH = 'allianceauth.templatetags' MODULE_PATH = 'allianceauth.templatetags'
@ -127,7 +131,7 @@ class TestNotifications(TestCase):
# when # when
result = _current_notifications() result = _current_notifications()
# then # then
self.assertEqual(result['notifications'], list()) self.assertEqual(result['notifications'], [])
@patch(MODULE_PATH + '.admin_status.cache') @patch(MODULE_PATH + '.admin_status.cache')
def test_current_notifications_is_none(self, mock_cache): def test_current_notifications_is_none(self, mock_cache):
@ -136,7 +140,7 @@ class TestNotifications(TestCase):
# when # when
result = _current_notifications() result = _current_notifications()
# then # then
self.assertEqual(result['notifications'], list()) self.assertEqual(result['notifications'], [])
class TestCeleryQueueLength(TestCase): class TestCeleryQueueLength(TestCase):

View File

@ -1,12 +1,13 @@
import json import json
import requests_mock
from unittest.mock import patch from unittest.mock import patch
import requests_mock
from django.test import RequestFactory, TestCase from django.test import RequestFactory, TestCase
from allianceauth.authentication.views import task_counts, esi_check
from allianceauth.tests.auth_utils import AuthUtils
from allianceauth.authentication.constants import ESI_ERROR_MESSAGE_OVERRIDES from allianceauth.authentication.constants import ESI_ERROR_MESSAGE_OVERRIDES
from allianceauth.authentication.views import esi_check, task_counts
from allianceauth.tests.auth_utils import AuthUtils
MODULE_PATH = "allianceauth.authentication.views" MODULE_PATH = "allianceauth.authentication.views"

View File

@ -1,11 +1,6 @@
import logging import logging
import requests import requests
from django_registration.backends.activation.views import (
REGISTRATION_SALT, ActivationView as BaseActivationView,
RegistrationView as BaseRegistrationView,
)
from django_registration.signals import user_registered
from django.conf import settings from django.conf import settings
from django.contrib import messages from django.contrib import messages
@ -18,6 +13,12 @@ from django.shortcuts import redirect, render
from django.template.loader import render_to_string from django.template.loader import render_to_string
from django.urls import reverse, reverse_lazy from django.urls import reverse, reverse_lazy
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django_registration.backends.activation.views import (
REGISTRATION_SALT,
ActivationView as BaseActivationView,
RegistrationView as BaseRegistrationView,
)
from django_registration.signals import user_registered
from esi.decorators import token_required from esi.decorators import token_required
from esi.models import Token from esi.models import Token
@ -32,7 +33,7 @@ from .models import CharacterOwnership
if 'allianceauth.eveonline.autogroups' in settings.INSTALLED_APPS: if 'allianceauth.eveonline.autogroups' in settings.INSTALLED_APPS:
_has_auto_groups = True _has_auto_groups = True
from allianceauth.eveonline.autogroups.models import * # noqa: F401, F403 from allianceauth.eveonline.autogroups.models import * # noqa: F403
else: else:
_has_auto_groups = False _has_auto_groups = False
@ -87,7 +88,7 @@ def dashboard_esi_check(request):
@login_required @login_required
def dashboard(request): def dashboard(request):
_dash_items = list() _dash_items = []
hooks = get_hooks('dashboard_hook') hooks = get_hooks('dashboard_hook')
items = [fn() for fn in hooks] items = [fn() for fn in hooks]
items.sort(key=lambda i: i.order) items.sort(key=lambda i: i.order)
@ -164,9 +165,7 @@ def main_character_change(request, token):
request.user.profile.save(update_fields=['main_character']) request.user.profile.save(update_fields=['main_character'])
messages.success(request, _('Changed main character to %s') % co.character) messages.success(request, _('Changed main character to %s') % co.character)
logger.info( logger.info(
'Changed user {user} main character to {char}'.format( f'Changed user {request.user} main character to {co.character}'
user=request.user, char=co.character
)
) )
return redirect("authentication:dashboard") return redirect("authentication:dashboard")
@ -176,10 +175,9 @@ def add_character(request, token):
if CharacterOwnership.objects.filter(character__character_id=token.character_id).filter( if CharacterOwnership.objects.filter(character__character_id=token.character_id).filter(
owner_hash=token.character_owner_hash).filter(user=request.user).exists(): owner_hash=token.character_owner_hash).filter(user=request.user).exists():
messages.success(request, _( messages.success(request, _(
'Added %(name)s to your account.' % ({'name': token.character_name}))) 'Added {name} to your account.'.format(name=token.character_name)))
else: else:
messages.error(request, _('Failed to add %(name)s to your account: they already have an account.' % ( messages.error(request, _('Failed to add {name} to your account: they already have an account.'.format(name=token.character_name)))
{'name': token.character_name})))
return redirect('authentication:dashboard') return redirect('authentication:dashboard')
@ -294,7 +292,7 @@ class RegistrationView(BaseRegistrationView):
return redirect(settings.LOGIN_URL) return redirect(settings.LOGIN_URL)
if not getattr(settings, 'REGISTRATION_VERIFY_EMAIL', True): if not getattr(settings, 'REGISTRATION_VERIFY_EMAIL', True):
# Keep the request so the user can be automagically logged in. # Keep the request so the user can be automagically logged in.
setattr(self, 'request', request) self.request = request
return super().dispatch(request, *args, **kwargs) return super().dispatch(request, *args, **kwargs)
def register(self, form): def register(self, form):

View File

@ -2,6 +2,7 @@
import os import os
import shutil import shutil
from optparse import OptionParser from optparse import OptionParser
from django.core.management import call_command from django.core.management import call_command
from django.core.management.commands.startproject import Command as BaseStartProject from django.core.management.commands.startproject import Command as BaseStartProject
@ -43,7 +44,7 @@ def create_project(parser, options, args):
# Call the command with extra context # Call the command with extra context
call_command(StartProject(), *args, **command_options) call_command(StartProject(), *args, **command_options)
print(f"Success! {args[0]} has been created.") # noqa print(f"Success! {args[0]} has been created.")
def update_settings(parser, options, args): def update_settings(parser, options, args):
@ -62,7 +63,7 @@ def update_settings(parser, options, args):
# next check if given path is to the project, so the app is within it # next check if given path is to the project, so the app is within it
settings_path = os.path.join(project_path, project_name, 'settings/base.py') settings_path = os.path.join(project_path, project_name, 'settings/base.py')
if not os.path.exists(settings_path): if not os.path.exists(settings_path):
parser.error("Unable to locate the Alliance Auth project at %s" % project_path) parser.error(f"Unable to locate the Alliance Auth project at {project_path}")
# first find the path to the Alliance Auth template settings # first find the path to the Alliance Auth template settings
import allianceauth import allianceauth

View File

@ -1,12 +1,16 @@
from django import db
from django.core.checks import CheckMessage, Error, register, Warning
from allianceauth.utils.cache import get_redis_client
from django.utils import timezone
from packaging.version import InvalidVersion, Version as Pep440Version
from celery import current_app
from django.conf import settings
from sqlite3.dbapi2 import sqlite_version_info
import datetime import datetime
from sqlite3.dbapi2 import sqlite_version_info
from celery import current_app
from packaging.version import InvalidVersion, Version as Pep440Version
from django import db
from django.conf import settings
from django.core.checks import CheckMessage, Error, Warning, register
from django.utils import timezone
from allianceauth.utils.cache import get_redis_client
""" """
A = System Packages A = System Packages
B = Configuration B = Configuration
@ -101,7 +105,6 @@ def system_package_mariadb(app_configs, **kwargs) -> list[CheckMessage]:
errors.append(Error(f"MariaDB {mariadb_version.public} EOL", hint="https://mariadb.org/download/?t=repo-config", id="allianceauth.checks.A011")) errors.append(Error(f"MariaDB {mariadb_version.public} EOL", hint="https://mariadb.org/download/?t=repo-config", id="allianceauth.checks.A011"))
elif mariadb_version.major == 11 and mariadb_version.minor == 1: elif mariadb_version.major == 11 and mariadb_version.minor == 1:
errors.append(Warning(f"MariaDB {mariadb_version.public} Non LTS", hint="https://mariadb.org/download/?t=repo-config", id="allianceauth.checks.A019")) errors.append(Warning(f"MariaDB {mariadb_version.public} Non LTS", hint="https://mariadb.org/download/?t=repo-config", id="allianceauth.checks.A019"))
if timezone.now() > timezone.datetime(year=2024, month=8, day=21, tzinfo=datetime.timezone.utc):
errors.append(Error(f"MariaDB {mariadb_version.public} EOL", hint="https://mariadb.org/download/?t=repo-config", id="allianceauth.checks.A012")) errors.append(Error(f"MariaDB {mariadb_version.public} EOL", hint="https://mariadb.org/download/?t=repo-config", id="allianceauth.checks.A012"))
elif mariadb_version.major == 11 and mariadb_version.minor in [0, 3]: # Demote versions down here once EOL elif mariadb_version.major == 11 and mariadb_version.minor in [0, 3]: # Demote versions down here once EOL
errors.append(Error(f"MariaDB {mariadb_version.public} EOL", hint="https://mariadb.org/download/?t=repo-config.", id="allianceauth.checks.A013")) errors.append(Error(f"MariaDB {mariadb_version.public} EOL", hint="https://mariadb.org/download/?t=repo-config.", id="allianceauth.checks.A013"))
@ -168,7 +171,7 @@ def celery_settings(app_configs, **kwargs) -> list[CheckMessage]:
errors.append(Error("Celery Priorities are not set", hint="https://gitlab.com/allianceauth/allianceauth/-/commit/8861ec0a61790eca0261f1adc1cc04ca5f243cbc", id="allianceauth.checks.B003")) errors.append(Error("Celery Priorities are not set", hint="https://gitlab.com/allianceauth/allianceauth/-/commit/8861ec0a61790eca0261f1adc1cc04ca5f243cbc", id="allianceauth.checks.B003"))
try: try:
if current_app.conf.broker_connection_retry_on_startup != True: if current_app.conf.broker_connection_retry_on_startup is not True:
errors.append(Error("Celery broker_connection_retry_on_startup not set correctly", hint="https://gitlab.com/allianceauth/allianceauth/-/commit/380c41400b535447839e5552df2410af35a75280", id="allianceauth.checks.B004")) errors.append(Error("Celery broker_connection_retry_on_startup not set correctly", hint="https://gitlab.com/allianceauth/allianceauth/-/commit/380c41400b535447839e5552df2410af35a75280", id="allianceauth.checks.B004"))
except KeyError: except KeyError:
errors.append(Error("Celery broker_connection_retry_on_startup not set", hint="https://gitlab.com/allianceauth/allianceauth/-/commit/380c41400b535447839e5552df2410af35a75280", id="allianceauth.checks.B004")) errors.append(Error("Celery broker_connection_retry_on_startup not set", hint="https://gitlab.com/allianceauth/allianceauth/-/commit/380c41400b535447839e5552df2410af35a75280", id="allianceauth.checks.B004"))

View File

@ -1,4 +1,5 @@
from django.conf import settings from django.conf import settings
from .views import NightModeRedirectView from .views import NightModeRedirectView

View File

@ -1,6 +1,6 @@
from django.contrib import admin from django.contrib import admin
from .models import CorpStats, CorpMember from .models import CorpMember, CorpStats
admin.site.register(CorpStats) admin.site.register(CorpStats)
admin.site.register(CorpMember) admin.site.register(CorpMember)

View File

@ -1,8 +1,9 @@
from allianceauth.menu.hooks import MenuItemHook
from allianceauth.services.hooks import UrlHook
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from allianceauth import hooks from allianceauth import hooks
from allianceauth.corputils import urls from allianceauth.corputils import urls
from allianceauth.menu.hooks import MenuItemHook
from allianceauth.services.hooks import UrlHook
class CorpStats(MenuItemHook): class CorpStats(MenuItemHook):

View File

@ -1,6 +1,7 @@
from django.db import models
import logging import logging
from django.db import models
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -8,7 +9,7 @@ class CorpStatsQuerySet(models.QuerySet):
def visible_to(self, user): def visible_to(self, user):
# superusers get all visible # superusers get all visible
if user.is_superuser: if user.is_superuser:
logger.debug('Returning all corpstats for superuser %s.' % user) logger.debug(f'Returning all corpstats for superuser {user}.')
return self return self
try: try:
@ -36,7 +37,7 @@ class CorpStatsQuerySet(models.QuerySet):
query |= q query |= q
return self.filter(query) return self.filter(query)
except AssertionError: except AssertionError:
logger.debug('User %s has no main character. No corpstats visible.' % user) logger.debug(f'User {user} has no main character. No corpstats visible.')
return self.none() return self.none()

View File

@ -1,7 +1,7 @@
# Generated by Django 1.10.1 on 2016-12-14 21:36 # Generated by Django 1.10.1 on 2016-12-14 21:36
from django.db import migrations, models
import django.db.models.deletion import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):

View File

@ -66,7 +66,7 @@ def forward(apps, schema_editor):
g.permissions.add(perm_dict['corpstats']['alliance_apis'].pk) g.permissions.add(perm_dict['corpstats']['alliance_apis'].pk)
g.permissions.add(perm_dict['corpstats']['view_alliance_corpstats'].pk) g.permissions.add(perm_dict['corpstats']['view_alliance_corpstats'].pk)
for name, perm in perm_dict['user'].items(): for _name, perm in perm_dict['user'].items():
perm.delete() perm.delete()

View File

@ -1,9 +1,10 @@
# Generated by Django 1.10.5 on 2017-03-26 20:13 # Generated by Django 1.10.5 on 2017-03-26 20:13
from django.db import migrations, models
import django.db.models.deletion
import json import json
import django.db.models.deletion
from django.db import migrations, models
def convert_json_to_members(apps, schema_editor): def convert_json_to_members(apps, schema_editor):
CorpStats = apps.get_model('corputils', 'CorpStats') CorpStats = apps.get_model('corputils', 'CorpStats')

View File

@ -1,15 +1,17 @@
import logging import logging
import os import os
from allianceauth.authentication.models import CharacterOwnership, UserProfile
from bravado.exception import HTTPForbidden from bravado.exception import HTTPForbidden
from django.db import models from django.db import models
from esi.errors import TokenError from esi.errors import TokenError
from esi.models import Token from esi.models import Token
from allianceauth.eveonline.models import EveCorporationInfo, EveCharacter, EveAllianceInfo
from allianceauth.notifications import notify
from allianceauth.authentication.models import CharacterOwnership, UserProfile
from allianceauth.corputils.managers import CorpStatsManager from allianceauth.corputils.managers import CorpStatsManager
from allianceauth.eveonline.models import EveAllianceInfo, EveCharacter, EveCorporationInfo
from allianceauth.notifications import notify
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')
""" """
@ -31,6 +33,7 @@ class CorpStats(models.Model):
corp = models.OneToOneField(EveCorporationInfo, on_delete=models.CASCADE) corp = models.OneToOneField(EveCorporationInfo, on_delete=models.CASCADE)
last_update = models.DateTimeField(auto_now=True) last_update = models.DateTimeField(auto_now=True)
objects = CorpStatsManager()
class Meta: class Meta:
permissions = ( permissions = (
('view_corp_corpstats', 'Can view corp stats of their corporation.'), ('view_corp_corpstats', 'Can view corp stats of their corporation.'),
@ -40,7 +43,7 @@ class CorpStats(models.Model):
verbose_name = "corp stats" verbose_name = "corp stats"
verbose_name_plural = "corp stats" verbose_name_plural = "corp stats"
objects = CorpStatsManager()
def __str__(self): def __str__(self):
return f"{self.__class__.__name__} for {self.corp}" return f"{self.__class__.__name__} for {self.corp}"
@ -76,21 +79,21 @@ class CorpStats(models.Model):
logger.warning(f"{self} failed to update: {e}") logger.warning(f"{self} failed to update: {e}")
if self.token.user: if self.token.user:
notify( notify(
self.token.user, "%s failed to update with your ESI token." % self, self.token.user, f"{self} failed to update with your ESI token.",
message="Your token has expired or is no longer valid. Please add a new one to create a new CorpStats.", message="Your token has expired or is no longer valid. Please add a new one to create a new CorpStats.",
level="error") level="error")
self.delete() self.delete()
except HTTPForbidden as e: except HTTPForbidden as e:
logger.warning(f"{self} failed to update: {e}") logger.warning(f"{self} failed to update: {e}")
if self.token.user: if self.token.user:
notify(self.token.user, "%s failed to update with your ESI token." % self, message=f"{e.status_code}: {e.message}", level="error") notify(self.token.user, f"{self} failed to update with your ESI token.", message=f"{e.status_code}: {e.message}", level="error")
self.delete() self.delete()
except AssertionError: except AssertionError:
logger.warning("%s token character no longer in corp." % self) logger.warning(f"{self} token character no longer in corp.")
if self.token.user: if self.token.user:
notify( notify(
self.token.user, "%s cannot update with your ESI token." % self, self.token.user, f"{self} cannot update with your ESI token.",
message="%s cannot update with your ESI token as you have left corp." % self, level="error") message=f"{self} cannot update with your ESI token as you have left corp.", level="error")
self.delete() self.delete()
@property @property

View File

@ -1,4 +1,5 @@
from celery import shared_task from celery import shared_task
from allianceauth.corputils.models import CorpStats from allianceauth.corputils.models import CorpStats

View File

@ -1,14 +1,18 @@
from unittest import mock from unittest import mock
from django.test import TestCase
from allianceauth.tests.auth_utils import AuthUtils
from .models import CorpStats, CorpMember
from allianceauth.eveonline.models import EveCorporationInfo, EveAllianceInfo, EveCharacter
from esi.models import Token
from esi.errors import TokenError
from bravado.exception import HTTPForbidden from bravado.exception import HTTPForbidden
from django.contrib.auth.models import Permission from django.contrib.auth.models import Permission
from django.test import TestCase
from esi.errors import TokenError
from esi.models import Token
from allianceauth.authentication.models import CharacterOwnership from allianceauth.authentication.models import CharacterOwnership
from allianceauth.eveonline.models import EveAllianceInfo, EveCharacter, EveCorporationInfo
from allianceauth.tests.auth_utils import AuthUtils
from .models import CorpMember, CorpStats
class CorpStatsManagerTestCase(TestCase): class CorpStatsManagerTestCase(TestCase):

View File

@ -1,4 +1,5 @@
from django.urls import path from django.urls import path
from . import views from . import views
app_name = 'corputils' app_name = 'corputils'

View File

@ -1,16 +1,19 @@
import os 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, ObjectDoesNotExist from django.core.exceptions import ObjectDoesNotExist, PermissionDenied
from django.db import IntegrityError from django.db import IntegrityError
from django.shortcuts import render, redirect, get_object_or_404 from django.shortcuts import get_object_or_404, redirect, render
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_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, CorpMember from .models import CorpMember, CorpStats
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')
""" """

View File

@ -3,14 +3,15 @@ Admin classes for custom_css app
""" """
# Django # Django
from django.contrib import admin
# Django Solos # Django Solos
from solo.admin import SingletonModelAdmin from solo.admin import SingletonModelAdmin
from django.contrib import admin
from allianceauth.custom_css.forms import CustomCSSAdminForm
# Alliance Auth Custom CSS # Alliance Auth Custom CSS
from allianceauth.custom_css.models import CustomCSS from allianceauth.custom_css.models import CustomCSS
from allianceauth.custom_css.forms import CustomCSSAdminForm
@admin.register(CustomCSS) @admin.register(CustomCSS)

View File

@ -3,12 +3,12 @@ Forms for custom_css app
""" """
# Alliance Auth Custom CSS # Alliance Auth Custom CSS
from allianceauth.custom_css.models import CustomCSS
from allianceauth.custom_css.widgets import CssEditorWidget
# Django # Django
from django import forms from django import forms
from allianceauth.custom_css.models import CustomCSS
from allianceauth.custom_css.widgets import CssEditorWidget
class CustomCSSAdminForm(forms.ModelForm): class CustomCSSAdminForm(forms.ModelForm):
""" """

View File

@ -21,7 +21,6 @@ class CustomCSS(SingletonModel):
css = models.TextField( css = models.TextField(
blank=True, blank=True,
null=True,
verbose_name=_("Your custom CSS"), verbose_name=_("Your custom CSS"),
help_text=_("This CSS will be added to the site after the default CSS."), help_text=_("This CSS will be added to the site after the default CSS."),
) )

View File

@ -3,7 +3,7 @@ Custom template tags for custom_css app
""" """
# Alliance Auth Custom CSS # Alliance Auth Custom CSS
from allianceauth.custom_css.models import CustomCSS from pathlib import Path
# Django # Django
from django.conf import settings from django.conf import settings
@ -11,7 +11,7 @@ from django.template.defaulttags import register
from django.templatetags.static import static from django.templatetags.static import static
from django.utils.safestring import mark_safe from django.utils.safestring import mark_safe
from pathlib import Path from allianceauth.custom_css.models import CustomCSS
@register.simple_tag @register.simple_tag

View File

@ -6,7 +6,6 @@ Form widgets for custom_css app
from django import forms from django import forms
# Alliance Auth # Alliance Auth
from allianceauth.custom_css.models import CustomCSS
class CssEditorWidget(forms.Textarea): class CssEditorWidget(forms.Textarea):

View File

@ -1,12 +1,9 @@
from django import forms from django import forms
from django.contrib import admin from django.contrib import admin
from django.core.exceptions import ObjectDoesNotExist from django.core.exceptions import ObjectDoesNotExist
from .providers import ObjectNotFound
from .models import EveAllianceInfo from .models import EveAllianceInfo, EveCharacter, EveCorporationInfo, EveFactionInfo
from .models import EveCharacter from .providers import ObjectNotFound
from .models import EveCorporationInfo
from .models import EveFactionInfo
class EveEntityExistsError(forms.ValidationError): class EveEntityExistsError(forms.ValidationError):

View File

@ -1,9 +1,9 @@
from django.contrib import admin
from django.db import models
from .models import AutogroupsConfig, ManagedCorpGroup, ManagedAllianceGroup
import logging import logging
from django.contrib import admin
from django.db import models
from .models import AutogroupsConfig, ManagedAllianceGroup, ManagedCorpGroup
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)

View File

@ -6,4 +6,4 @@ class EveAutogroupsConfig(AppConfig):
label = 'eve_autogroups' label = 'eve_autogroups'
def ready(self): def ready(self):
import allianceauth.eveonline.autogroups.signals pass

View File

@ -1,7 +1,7 @@
# Generated by Django 1.11.6 on 2017-12-23 04:30 # Generated by Django 1.11.6 on 2017-12-23 04:30
from django.db import migrations, models
import django.db.models.deletion import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):

View File

@ -1,10 +1,11 @@
import logging import logging
from django.db import models, transaction
from django.contrib.auth.models import Group, User from django.contrib.auth.models import Group, User
from django.core.exceptions import ObjectDoesNotExist from django.core.exceptions import ObjectDoesNotExist
from django.db import models, transaction
from allianceauth.authentication.models import State from allianceauth.authentication.models import State
from allianceauth.eveonline.models import EveCorporationInfo, EveAllianceInfo from allianceauth.eveonline.models import EveAllianceInfo, EveCorporationInfo
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -80,15 +81,15 @@ class AutogroupsConfig(models.Model):
objects = AutogroupsConfigManager() objects = AutogroupsConfigManager()
def __str__(self):
return 'States: ' + (' '.join(list(self.states.all().values_list('name', flat=True))) if self.pk else str(None))
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
def __repr__(self): def __repr__(self):
return self.__class__.__name__ return self.__class__.__name__
def __str__(self):
return 'States: ' + (' '.join(list(self.states.all().values_list('name', flat=True))) if self.pk else str(None))
def update_all_states_group_membership(self): def update_all_states_group_membership(self):
list(map(self.update_group_membership_for_state, self.states.all())) list(map(self.update_group_membership_for_state, self.states.all()))
@ -235,7 +236,7 @@ class ManagedGroup(models.Model):
abstract = True abstract = True
def __str__(self): def __str__(self):
return "Managed Group: %s" % self.group.name return f"Managed Group: {self.group.name}"
class ManagedCorpGroup(ManagedGroup): class ManagedCorpGroup(ManagedGroup):
corp = models.ForeignKey(EveCorporationInfo, on_delete=models.CASCADE) corp = models.ForeignKey(EveCorporationInfo, on_delete=models.CASCADE)

View File

@ -1,7 +1,9 @@
import logging import logging
from django.db.models.signals import m2m_changed, post_save, pre_delete, pre_save
from django.dispatch import receiver from django.dispatch import receiver
from django.db.models.signals import pre_save, post_save, pre_delete, m2m_changed
from allianceauth.authentication.models import UserProfile, State from allianceauth.authentication.models import State, UserProfile
from allianceauth.eveonline.models import EveCharacter from allianceauth.eveonline.models import EveCharacter
from .models import AutogroupsConfig from .models import AutogroupsConfig

View File

@ -1,7 +1,10 @@
from unittest import mock from unittest import mock
from django.db.models.signals import pre_save, post_save, pre_delete, m2m_changed
from django.db.models.signals import m2m_changed, post_save, pre_delete, pre_save
from allianceauth.authentication.models import UserProfile from allianceauth.authentication.models import UserProfile
from allianceauth.authentication.signals import reassess_on_profile_save from allianceauth.authentication.signals import reassess_on_profile_save
from .. import signals from .. import signals
from ..models import AutogroupsConfig from ..models import AutogroupsConfig

View File

@ -1,4 +1,5 @@
from django.test import TestCase from django.test import TestCase
from allianceauth.tests.auth_utils import AuthUtils from allianceauth.tests.auth_utils import AuthUtils
from ..models import AutogroupsConfig from ..models import AutogroupsConfig

View File

@ -1,15 +1,11 @@
from django.test import TestCase
from django.contrib.auth.models import Group from django.contrib.auth.models import Group
from django.db import transaction from django.test import TestCase
from allianceauth.eveonline.models import EveAllianceInfo, EveCharacter, EveCorporationInfo
from allianceauth.tests.auth_utils import AuthUtils from allianceauth.tests.auth_utils import AuthUtils
from allianceauth.eveonline.models import EveCharacter, EveCorporationInfo, EveAllianceInfo
from ..models import AutogroupsConfig, get_users_for_state from ..models import AutogroupsConfig, get_users_for_state
from . import connect_signals, disconnect_signals, patch
from . import patch, connect_signals, disconnect_signals
class AutogroupsConfigTestCase(TestCase): class AutogroupsConfigTestCase(TestCase):

View File

@ -1,13 +1,11 @@
from django.test import TestCase
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.test import TestCase
from allianceauth.eveonline.models import EveAllianceInfo, EveCharacter, EveCorporationInfo
from allianceauth.tests.auth_utils import AuthUtils from allianceauth.tests.auth_utils import AuthUtils
from allianceauth.eveonline.models import EveCharacter, EveCorporationInfo, EveAllianceInfo
from ..models import AutogroupsConfig from ..models import AutogroupsConfig
from . import connect_signals, disconnect_signals, patch
from . import patch, disconnect_signals, connect_signals
class SignalsTestCase(TestCase): class SignalsTestCase(TestCase):

View File

@ -1,14 +1,8 @@
# this module generates profile URLs for dotlan # this module generates profile URLs for dotlan
from urllib.parse import urljoin, quote from urllib.parse import quote, urljoin
from . import (
_ESI_CATEGORY_ALLIANCE,
_ESI_CATEGORY_CORPORATION,
_ESI_CATEGORY_REGION,
_ESI_CATEGORY_SOLARSYSTEM
)
from . import _ESI_CATEGORY_ALLIANCE, _ESI_CATEGORY_CORPORATION, _ESI_CATEGORY_REGION, _ESI_CATEGORY_SOLARSYSTEM
_BASE_URL = 'http://evemaps.dotlan.net' _BASE_URL = 'http://evemaps.dotlan.net'

View File

@ -1,10 +1,4 @@
from . import ( from . import _ESI_CATEGORY_ALLIANCE, _ESI_CATEGORY_CHARACTER, _ESI_CATEGORY_CORPORATION, _ESI_CATEGORY_INVENTORYTYPE
_ESI_CATEGORY_ALLIANCE,
_ESI_CATEGORY_CHARACTER,
_ESI_CATEGORY_CORPORATION,
_ESI_CATEGORY_INVENTORYTYPE
)
_EVE_IMAGE_SERVER_URL = 'https://images.evetech.net' _EVE_IMAGE_SERVER_URL = 'https://images.evetech.net'
_DEFAULT_IMAGE_SIZE = 32 _DEFAULT_IMAGE_SIZE = 32
@ -70,10 +64,7 @@ def _eve_entity_image_url(
if variant: if variant:
if variant not in categories[category]['variants']: if variant not in categories[category]['variants']:
raise ValueError('Invalid variant {} for category {}'.format( raise ValueError(f'Invalid variant {variant} for category {category}')
variant,
category
))
else: else:
variant = categories[category]['variants'][0] variant = categories[category]['variants'][0]
@ -81,13 +72,7 @@ def _eve_entity_image_url(
raise ValueError(f'Invalid tenant {tenant}') raise ValueError(f'Invalid tenant {tenant}')
# compose result URL # compose result URL
result = '{}/{}/{}/{}?size={}'.format( result = f'{_EVE_IMAGE_SERVER_URL}/{endpoint}/{entity_id}/{variant}?size={size}'
_EVE_IMAGE_SERVER_URL,
endpoint,
entity_id,
variant,
size
)
if tenant: if tenant:
result += f'&tenant={tenant}' result += f'&tenant={tenant}'

View File

@ -4,11 +4,10 @@ from urllib.parse import urljoin
from . import ( from . import (
_ESI_CATEGORY_ALLIANCE, _ESI_CATEGORY_ALLIANCE,
_ESI_CATEGORY_CORPORATION,
_ESI_CATEGORY_CHARACTER, _ESI_CATEGORY_CHARACTER,
_ESI_CATEGORY_CORPORATION,
) )
_BASE_URL = 'https://evewho.com' _BASE_URL = 'https://evewho.com'

View File

@ -1,8 +1,6 @@
from django.test import TestCase from django.test import TestCase
from ...models import EveCharacter, EveCorporationInfo, EveAllianceInfo from .. import dotlan, eveimageserver, evewho, zkillboard
from .. import dotlan, zkillboard, evewho, eveimageserver
from ...templatetags import evelinks
class TestEveWho(TestCase): class TestEveWho(TestCase):

View File

@ -1,8 +1,8 @@
from django.test import TestCase from django.test import TestCase
from ...models import EveCharacter, EveCorporationInfo, EveAllianceInfo from ...models import EveAllianceInfo, EveCharacter, EveCorporationInfo
from .. import eveimageserver, evewho, dotlan, zkillboard
from ...templatetags import evelinks from ...templatetags import evelinks
from .. import dotlan, eveimageserver, evewho, zkillboard
class TestTemplateTags(TestCase): class TestTemplateTags(TestCase):

View File

@ -4,13 +4,12 @@ from urllib.parse import urljoin
from . import ( from . import (
_ESI_CATEGORY_ALLIANCE, _ESI_CATEGORY_ALLIANCE,
_ESI_CATEGORY_CORPORATION,
_ESI_CATEGORY_CHARACTER, _ESI_CATEGORY_CHARACTER,
_ESI_CATEGORY_CORPORATION,
_ESI_CATEGORY_REGION, _ESI_CATEGORY_REGION,
_ESI_CATEGORY_SOLARSYSTEM _ESI_CATEGORY_SOLARSYSTEM,
) )
_BASE_URL = 'https://zkillboard.com' _BASE_URL = 'https://zkillboard.com'

View File

@ -1,6 +1,7 @@
import logging import logging
from django.db import models from django.db import models
from . import providers from . import providers
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)

View File

@ -1,8 +1,8 @@
# Generated by Django 1.10.1 on 2016-09-05 21:39 # Generated by Django 1.10.1 on 2016-09-05 21:39
import django.db.models.deletion
from django.conf import settings from django.conf import settings
from django.db import migrations, models from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration): class Migration(migrations.Migration):

View File

@ -1,8 +1,8 @@
# Generated by Django 1.10.2 on 2016-10-26 01:49 # Generated by Django 1.10.2 on 2016-10-26 01:49
import django.db.models.deletion
from django.conf import settings from django.conf import settings
from django.db import migrations, models from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration): class Migration(migrations.Migration):

View File

@ -1,7 +1,7 @@
# Generated by Django 1.11.5 on 2017-09-28 02:16 # Generated by Django 1.11.5 on 2017-09-28 02:16
from django.db import migrations, models
import django.db.models.deletion import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):

View File

@ -1,8 +1,8 @@
import logging import logging
from typing import Union
from django.core.exceptions import ObjectDoesNotExist from django.core.exceptions import ObjectDoesNotExist
from django.db import models from django.db import models
from esi.models import Token from esi.models import Token
from allianceauth.notifications import notify from allianceauth.notifications import notify
@ -80,7 +80,8 @@ class EveAllianceInfo(models.Model):
class Meta: class Meta:
indexes = [models.Index(fields=['executor_corp_id',])] indexes = [models.Index(fields=['executor_corp_id',])]
def __str__(self):
return self.alliance_name
def populate_alliance(self): def populate_alliance(self):
alliance = self.provider.get_alliance(self.alliance_id) alliance = self.provider.get_alliance(self.alliance_id)
for corp_id in alliance.corp_ids: for corp_id in alliance.corp_ids:
@ -100,8 +101,7 @@ class EveAllianceInfo(models.Model):
self.save() self.save()
return self return self
def __str__(self):
return self.alliance_name
@staticmethod @staticmethod
def generic_logo_url( def generic_logo_url(
@ -152,7 +152,8 @@ class EveCorporationInfo(models.Model):
class Meta: class Meta:
indexes = [models.Index(fields=['ceo_id',]),] indexes = [models.Index(fields=['ceo_id',]),]
def __str__(self):
return self.corporation_name
def update_corporation(self, corp: providers.Corporation = None): def update_corporation(self, corp: providers.Corporation = None):
if corp is None: if corp is None:
corp = self.provider.get_corporation(self.corporation_id) corp = self.provider.get_corporation(self.corporation_id)
@ -165,8 +166,7 @@ class EveCorporationInfo(models.Model):
self.save() self.save()
return self return self
def __str__(self):
return self.corporation_name
@staticmethod @staticmethod
def generic_logo_url( def generic_logo_url(
@ -209,10 +209,10 @@ class EveCharacter(models.Model):
corporation_name = models.CharField(max_length=254) corporation_name = models.CharField(max_length=254)
corporation_ticker = models.CharField(max_length=5) corporation_ticker = models.CharField(max_length=5)
alliance_id = models.PositiveIntegerField(blank=True, null=True, default=None) alliance_id = models.PositiveIntegerField(blank=True, null=True, default=None)
alliance_name = models.CharField(max_length=254, blank=True, null=True, default='') alliance_name = models.CharField(max_length=254, blank=True, default='')
alliance_ticker = models.CharField(max_length=5, blank=True, null=True, default='') alliance_ticker = models.CharField(max_length=5, blank=True, default='')
faction_id = models.PositiveIntegerField(blank=True, null=True, default=None) faction_id = models.PositiveIntegerField(blank=True, default=None)
faction_name = models.CharField(max_length=254, blank=True, null=True, default='') faction_name = models.CharField(max_length=254, blank=True, default='')
objects = EveCharacterManager() objects = EveCharacterManager()
provider = EveCharacterProviderManager() provider = EveCharacterProviderManager()

View File

@ -1,16 +1,16 @@
import logging import logging
import os import os
from bravado.exception import HTTPNotFound, HTTPUnprocessableEntity, HTTPError from bravado.exception import HTTPError, HTTPNotFound, HTTPUnprocessableEntity
from jsonschema.exceptions import RefResolutionError from jsonschema.exceptions import RefResolutionError
from django.conf import settings from django.conf import settings
from esi.clients import esi_client_factory from esi.clients import esi_client_factory
from allianceauth import __version__ from allianceauth import __version__
from allianceauth.utils.django import StartupCommand from allianceauth.utils.django import StartupCommand
SWAGGER_SPEC_PATH = os.path.join(os.path.dirname( SWAGGER_SPEC_PATH = os.path.join(os.path.dirname(
os.path.abspath(__file__)), 'swagger.json' os.path.abspath(__file__)), 'swagger.json'
) )

View File

@ -2,9 +2,8 @@ import logging
from celery import shared_task from celery import shared_task
from .models import EveAllianceInfo, EveCharacter, EveCorporationInfo
from . import providers from . import providers
from .models import EveAllianceInfo, EveCharacter, EveCorporationInfo
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)

View File

@ -14,8 +14,8 @@
from django import template from django import template
from ..models import EveCharacter, EveCorporationInfo, EveAllianceInfo from ..evelinks import dotlan, eveimageserver, evewho, zkillboard
from ..evelinks import eveimageserver, evewho, dotlan, zkillboard from ..models import EveAllianceInfo, EveCharacter, EveCorporationInfo
register = template.Library() register = template.Library()
@ -30,7 +30,7 @@ def _generic_character_url(
eve_obj: EveCharacter eve_obj: EveCharacter
) -> str: ) -> str:
"""returns character URL for given provider and object""" """returns character URL for given provider and object"""
my_func = getattr(provider, 'character_url') my_func = provider.character_url
if isinstance(eve_obj, EveCharacter): if isinstance(eve_obj, EveCharacter):
return my_func(getattr(eve_obj, obj_prop)) return my_func(getattr(eve_obj, obj_prop))
@ -47,8 +47,8 @@ def _generic_corporation_url(
eve_obj: object eve_obj: object
) -> str: ) -> str:
"""returns corporation URL for given provider and object""" """returns corporation URL for given provider and object"""
my_func = getattr(provider, 'corporation_url') my_func = provider.corporation_url
if isinstance(eve_obj, (EveCharacter, EveCorporationInfo)): if isinstance(eve_obj, EveCharacter | EveCorporationInfo):
return my_func(getattr(eve_obj, obj_prop)) return my_func(getattr(eve_obj, obj_prop))
elif eve_obj is None: elif eve_obj is None:
@ -64,7 +64,7 @@ def _generic_alliance_url(
eve_obj: object eve_obj: object
) -> str: ) -> str:
"""returns alliance URL for given provider and object""" """returns alliance URL for given provider and object"""
my_func = getattr(provider, 'alliance_url') my_func = provider.alliance_url
if isinstance(eve_obj, EveCharacter): if isinstance(eve_obj, EveCharacter):
if eve_obj.alliance_id: if eve_obj.alliance_id:

View File

@ -10,7 +10,7 @@ class BravadoResponseStub:
self.reason = reason self.reason = reason
self.status_code = status_code self.status_code = status_code
self.text = text self.text = text
self.headers = headers if headers else dict() self.headers = headers if headers else {}
self.raw_bytes = raw_bytes self.raw_bytes = raw_bytes
def __str__(self): def __str__(self):

View File

@ -2,8 +2,8 @@ from unittest import mock
from django.test import TestCase from django.test import TestCase
from ..models import EveCharacter, EveCorporationInfo, EveAllianceInfo from ..models import EveAllianceInfo, EveCharacter, EveCorporationInfo
from ..providers import Character, Corporation, Alliance from ..providers import Alliance, Character, Corporation
class EveCharacterProviderManagerTestCase(TestCase): class EveCharacterProviderManagerTestCase(TestCase):
@ -58,7 +58,7 @@ class EveCharacterManagerTestCase(TestCase):
@mock.patch('allianceauth.eveonline.managers.providers.provider') @mock.patch('allianceauth.eveonline.managers.providers.provider')
def test_update_character(self, provider): def test_update_character(self, provider):
# Also covers Model.update_character # Also covers Model.update_character
existing = EveCharacter.objects.create( EveCharacter.objects.create(
character_id=1234, character_id=1234,
character_name='character.name', character_name='character.name',
corporation_id=23457, corporation_id=23457,

View File

@ -2,6 +2,7 @@ from unittest.mock import Mock, patch
from django.core.exceptions import ObjectDoesNotExist from django.core.exceptions import ObjectDoesNotExist
from django.test import TestCase from django.test import TestCase
from esi.models import Token from esi.models import Token
from allianceauth.tests.auth_utils import AuthUtils from allianceauth.tests.auth_utils import AuthUtils
@ -62,7 +63,7 @@ class EveCharacterTestCase(TestCase):
) )
with self.assertRaises(EveCorporationInfo.DoesNotExist): with self.assertRaises(EveCorporationInfo.DoesNotExist):
character.corporation _ = character.corporation
def test_alliance_prop(self): def test_alliance_prop(self):
""" """
@ -111,7 +112,7 @@ class EveCharacterTestCase(TestCase):
) )
with self.assertRaises(EveAllianceInfo.DoesNotExist): with self.assertRaises(EveAllianceInfo.DoesNotExist):
character.alliance _ = character.alliance
def test_alliance_prop_none(self): def test_alliance_prop_none(self):
""" """
@ -169,7 +170,7 @@ class EveCharacterTestCase(TestCase):
) )
with self.assertRaises(EveFactionInfo.DoesNotExist): with self.assertRaises(EveFactionInfo.DoesNotExist):
character.faction _ = character.faction
def test_faction_prop_none(self): def test_faction_prop_none(self):
""" """

Some files were not shown because too many files have changed in this diff Show More