From f602f80f06abaed728b82c0babaa7cfbcfaff8fd Mon Sep 17 00:00:00 2001 From: Joel Falknau Date: Thu, 8 Oct 2026 21:42:37 +1000 Subject: [PATCH] typehint corputils --- allianceauth/corputils/auth_hooks.py | 15 +++++++++++---- allianceauth/corputils/managers.py | 18 +++++++++++++----- allianceauth/corputils/models.py | 17 +++++++++++------ allianceauth/corputils/providers.py | 14 +++++++++----- allianceauth/corputils/tasks.py | 4 ++-- allianceauth/corputils/views.py | 21 +++++++++++++++------ 6 files changed, 61 insertions(+), 28 deletions(-) diff --git a/allianceauth/corputils/auth_hooks.py b/allianceauth/corputils/auth_hooks.py index 4414898c..bdaad3cd 100644 --- a/allianceauth/corputils/auth_hooks.py +++ b/allianceauth/corputils/auth_hooks.py @@ -1,3 +1,7 @@ +__lazy_modules__ = ["django.http"] + +from typing import TYPE_CHECKING + from django.utils.translation import gettext_lazy as _ from allianceauth import hooks @@ -5,9 +9,12 @@ from allianceauth.corputils import urls from allianceauth.menu.hooks import MenuItemHook from allianceauth.services.hooks import UrlHook +if TYPE_CHECKING: + from django.http import HttpRequest + class CorpStats(MenuItemHook): - def __init__(self): + def __init__(self) -> None: MenuItemHook.__init__( self, _('Corporation Stats'), @@ -16,7 +23,7 @@ class CorpStats(MenuItemHook): navactive=['corputils:'] ) - def render(self, request): + def render(self, request: "HttpRequest") -> str: if request.user.has_perm('corputils.view_corp_corpstats') or request.user.has_perm( 'corputils.view_alliance_corpstats') or request.user.has_perm( 'corputils.add_corpstats') or request.user.has_perm('corputils.view_state_corpstats'): @@ -25,10 +32,10 @@ class CorpStats(MenuItemHook): @hooks.register('menu_item_hook') -def register_menu(): +def register_menu() -> CorpStats: return CorpStats() @hooks.register('url_hook') -def register_url(): +def register_url() -> UrlHook: return UrlHook(urls, 'corputils', r'^corpstats/') diff --git a/allianceauth/corputils/managers.py b/allianceauth/corputils/managers.py index f7bca4f9..5dcc304d 100644 --- a/allianceauth/corputils/managers.py +++ b/allianceauth/corputils/managers.py @@ -1,12 +1,20 @@ +__lazy_modules__ = ["allianceauth.corputils.models", "django.contrib.auth.models"] + import logging +from typing import TYPE_CHECKING from django.db import models +if TYPE_CHECKING: + from django.contrib.auth.models import User + + from allianceauth.corputils.models import CorpStats # noqa: F401 + logger = logging.getLogger(__name__) -class CorpStatsQuerySet(models.QuerySet): - def visible_to(self, user): +class CorpStatsQuerySet(models.QuerySet["CorpStats"]): + def visible_to(self, user: "User") -> "CorpStatsQuerySet": # superusers get all visible if user.is_superuser: logger.debug(f'Returning all corpstats for superuser {user}.') @@ -41,9 +49,9 @@ class CorpStatsQuerySet(models.QuerySet): return self.none() -class CorpStatsManager(models.Manager): - def get_queryset(self): +class CorpStatsManager(models.Manager["CorpStats"]): + def get_queryset(self) -> CorpStatsQuerySet: return CorpStatsQuerySet(self.model, using=self._db) - def visible_to(self, user): + def visible_to(self, user: "User") -> CorpStatsQuerySet: return self.get_queryset().visible_to(user) diff --git a/allianceauth/corputils/models.py b/allianceauth/corputils/models.py index 4f1062ca..b97168dd 100644 --- a/allianceauth/corputils/models.py +++ b/allianceauth/corputils/models.py @@ -1,5 +1,7 @@ +__lazy_modules__ = ["django.contrib.auth.models"] + import logging -from typing import ClassVar +from typing import TYPE_CHECKING, ClassVar from django.db import models @@ -19,6 +21,9 @@ from .providers import ( post_universe_names, ) +if TYPE_CHECKING: + from django.contrib.auth.models import User + logger = logging.getLogger(__name__) @@ -130,16 +135,16 @@ class CorpStats(models.Model): def mains(self) -> models.QuerySet["CorpMember"]: return self.members.filter(pk__in=[m.pk for m in self.members.all() if m.main_character and int(m.main_character.character_id) == int(m.character_id)]) - def visible_to(self, user) -> bool: + def visible_to(self, user: "User") -> bool: return CorpStats.objects.filter(pk=self.pk).visible_to(user).exists() - def can_update(self, user) -> bool: + def can_update(self, user: "User") -> bool: return self.token.user == user or self.visible_to(user) - def corp_logo(self, size=128) -> str: + def corp_logo(self, size: int = 128) -> str: return self.corp.logo_url(size) - def alliance_logo(self, size=128) -> str: + def alliance_logo(self, size: int = 128) -> str: if self.corp.alliance: return self.corp.alliance.logo_url(size) else: @@ -187,7 +192,7 @@ class CorpMember(models.Model): def registered(self) -> bool: return CharacterOwnership.objects.filter(character__character_id=self.character_id).exists() - def portrait_url(self, size=32) -> str: + def portrait_url(self, size: int = 32) -> str: return EveCharacter.generic_portrait_url(self.character_id, size) @property diff --git a/allianceauth/corputils/providers.py b/allianceauth/corputils/providers.py index 836ae032..267d7975 100644 --- a/allianceauth/corputils/providers.py +++ b/allianceauth/corputils/providers.py @@ -1,15 +1,19 @@ +__lazy_modules__ = ["esi.models", "esi.stubs"] + from typing import TYPE_CHECKING -from esi.models import Token from esi.openapi_clients import ESIClientProvider from .. import __title__, __url__, __version__ from . import __esi_compatibility_date__ if TYPE_CHECKING: + from esi.models import Token from esi.stubs import ( - CharactersDetail, CorporationsCorporationIdMembersGet, - PostUniverseNamesOperation, PostUniverseNamesOperationBody, + CharactersDetail, + CorporationsCorporationIdMembersGet, + PostUniverseNamesOperation, + PostUniverseNamesOperationBody, ) esi = ESIClientProvider( @@ -24,11 +28,11 @@ esi = ESIClientProvider( ]) -def get_characters_character_id(character_id: int, use_etag=True) -> "CharactersDetail": +def get_characters_character_id(character_id: int, use_etag: bool = True) -> "CharactersDetail": return esi.client.Character.GetCharactersCharacterId(character_id=character_id).result(use_etag=use_etag) -def get_corporations_corporation_id_members(corporation_id: int, token: Token) -> "CorporationsCorporationIdMembersGet": +def get_corporations_corporation_id_members(corporation_id: int, token: "Token") -> "CorporationsCorporationIdMembersGet": return esi.client.Corporation.GetCorporationsCorporationIdMembers(corporation_id=corporation_id, token=token).result() diff --git a/allianceauth/corputils/tasks.py b/allianceauth/corputils/tasks.py index fda7c5fb..81225f4f 100644 --- a/allianceauth/corputils/tasks.py +++ b/allianceauth/corputils/tasks.py @@ -4,12 +4,12 @@ from allianceauth.corputils.models import CorpStats @shared_task -def update_corpstats(pk): +def update_corpstats(pk: int) -> None: cs = CorpStats.objects.get(pk=pk) cs.update() @shared_task -def update_all_corpstats(): +def update_all_corpstats() -> None: for cs in CorpStats.objects.all(): update_corpstats.delay(cs.pk) diff --git a/allianceauth/corputils/views.py b/allianceauth/corputils/views.py index 1a900168..13025917 100644 --- a/allianceauth/corputils/views.py +++ b/allianceauth/corputils/views.py @@ -1,10 +1,13 @@ +__lazy_modules__ = ["django.contrib.auth.models", "django.http", "esi.models"] + +from typing import TYPE_CHECKING + from django.contrib import messages from django.contrib.auth.decorators import ( login_required, permission_required, user_passes_test, ) from django.core.exceptions import ObjectDoesNotExist, PermissionDenied from django.db import IntegrityError -from django.http import HttpResponseRedirect from django.shortcuts import get_object_or_404, redirect, render from django.utils.translation import gettext_lazy as _ @@ -16,8 +19,14 @@ from allianceauth.eveonline.models import EveCharacter, EveCorporationInfo from .models import CorpMember, CorpStats from .providers import get_characters_character_id +if TYPE_CHECKING: + from django.contrib.auth.models import User + from django.http import HttpRequest, HttpResponse, HttpResponseRedirect -def access_corpstats_test(user): + from esi.models import Token + + +def access_corpstats_test(user: "User") -> bool: return user.has_perm('corputils.view_corp_corpstats') or user.has_perm( 'corputils.view_alliance_corpstats') or user.has_perm('corputils.view_state_corpstats') or user.has_perm( 'corputils.add_corpstats') @@ -27,7 +36,7 @@ def access_corpstats_test(user): @user_passes_test(access_corpstats_test) @permission_required('corputils.add_corpstats') @token_required(scopes='esi-corporations.read_corporation_membership.v1') -def corpstats_add(request, token) -> HttpResponseRedirect: +def corpstats_add(request: "HttpRequest", token: "Token") -> "HttpResponseRedirect": try: if EveCharacter.objects.filter(character_id=token.character_id).exists(): corp_id = EveCharacter.objects.get(character_id=token.character_id).corporation_id @@ -51,7 +60,7 @@ def corpstats_add(request, token) -> HttpResponseRedirect: @login_required @user_passes_test(access_corpstats_test) -def corpstats_view(request, corp_id=None): +def corpstats_view(request: "HttpRequest", corp_id: int | None = None) -> "HttpResponse": corpstats = None # get requested model @@ -133,7 +142,7 @@ def corpstats_view(request, corp_id=None): @login_required @user_passes_test(access_corpstats_test) -def corpstats_update(request, corp_id): +def corpstats_update(request: "HttpRequest", corp_id: int) -> "HttpResponse": corp = get_object_or_404(EveCorporationInfo, corporation_id=corp_id) corpstats = get_object_or_404(CorpStats, corp=corp) try: @@ -148,7 +157,7 @@ def corpstats_update(request, corp_id): @login_required @user_passes_test(access_corpstats_test) -def corpstats_search(request): +def corpstats_search(request: "HttpRequest") -> "HttpResponse": results = [] search_string = request.GET.get('search_string', None) if search_string: