diff --git a/allianceauth/groupmanagement/auth_hooks.py b/allianceauth/groupmanagement/auth_hooks.py new file mode 100644 index 00000000..a8484abd --- /dev/null +++ b/allianceauth/groupmanagement/auth_hooks.py @@ -0,0 +1,37 @@ +from django.utils.translation import ugettext_lazy as _ + +from allianceauth.services.hooks import MenuItemHook, UrlHook +from allianceauth import hooks + +from . import urls +from .managers import GroupManager + + +class GroupManagementMenuItem(MenuItemHook): + """ This class ensures only authorized users will see the menu entry """ + def __init__(self): + # setup menu entry for sidebar + MenuItemHook.__init__( + self, + text=_('Group Management'), + classes='fas fa-users-cog fa-fw', + url_name='groupmanagement:management', + order=50, + navactive=['groupmanagement:management'] + ) + + def render(self, request): + if GroupManager.can_manage_groups(request.user): + self.count = GroupManager.pending_requests_count_for_user(request.user) + return MenuItemHook.render(self, request) + return '' + + +@hooks.register('menu_item_hook') +def register_menu(): + return GroupManagementMenuItem() + + +@hooks.register('url_hook') +def register_urls(): + return UrlHook(urls, 'group', r'^group/') diff --git a/allianceauth/groupmanagement/managers.py b/allianceauth/groupmanagement/managers.py index 89696364..20e7aad8 100644 --- a/allianceauth/groupmanagement/managers.py +++ b/allianceauth/groupmanagement/managers.py @@ -4,6 +4,7 @@ from django.contrib.auth.models import Group, User from django.db.models import Q, QuerySet from allianceauth.authentication.models import State +from .models import GroupRequest logger = logging.getLogger(__name__) @@ -101,3 +102,18 @@ class GroupManager: if user.is_authenticated: return cls.has_management_permission(user) or cls.get_group_leaders_groups(user).filter(pk=group.pk).exists() return False + + @classmethod + def pending_requests_count_for_user(cls, user: User) -> int: + """Returns the number of pending group requests for the given user""" + + if cls.has_management_permission(user): + return GroupRequest.objects.filter(status="pending").count() + else: + return ( + GroupRequest.objects + .filter(status="pending") + .filter(group__authgroup__group_leaders__exact=user) + .select_related("group__authgroup__group_leaders") + .count() + ) diff --git a/allianceauth/groupmanagement/models.py b/allianceauth/groupmanagement/models.py index 4a8fc4c9..c0fca555 100644 --- a/allianceauth/groupmanagement/models.py +++ b/allianceauth/groupmanagement/models.py @@ -4,7 +4,6 @@ from django.db import models from django.db.models.signals import post_save from django.dispatch import receiver from allianceauth.authentication.models import State -from datetime import datetime class GroupRequest(models.Model): diff --git a/allianceauth/groupmanagement/templatetags/__init__.py b/allianceauth/groupmanagement/templatetags/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/allianceauth/groupmanagement/templatetags/groupmanagement.py b/allianceauth/groupmanagement/templatetags/groupmanagement.py deleted file mode 100644 index f5084b7e..00000000 --- a/allianceauth/groupmanagement/templatetags/groupmanagement.py +++ /dev/null @@ -1,15 +0,0 @@ -from django import template -from django.contrib.auth.models import User - -from allianceauth.groupmanagement.managers import GroupManager - - -register = template.Library() - - -@register.filter -def can_manage_groups(user: User) -> bool: - """returns True if the given user can manage groups. Returns False otherwise.""" - if not isinstance(user, User): - return False - return GroupManager.can_manage_groups(user) diff --git a/allianceauth/groupmanagement/tests/test_managers.py b/allianceauth/groupmanagement/tests/test_managers.py index 3dcc7831..eb48490f 100644 --- a/allianceauth/groupmanagement/tests/test_managers.py +++ b/allianceauth/groupmanagement/tests/test_managers.py @@ -7,7 +7,7 @@ from django.urls import reverse from allianceauth.eveonline.models import EveCorporationInfo, EveAllianceInfo from allianceauth.tests.auth_utils import AuthUtils -from ..models import AuthGroup +from ..models import GroupRequest from ..managers import GroupManager @@ -15,6 +15,7 @@ class MockUserNotAuthenticated(): def __init__(self): self.is_authenticated = False + class GroupManagementVisibilityTestCase(TestCase): @classmethod def setUpTestData(cls): @@ -37,22 +38,20 @@ class GroupManagementVisibilityTestCase(TestCase): def _refresh_user(self): self.user = User.objects.get(pk=self.user.pk) - def test_get_group_leaders_groups(self): self.group1.authgroup.group_leaders.add(self.user) self.group2.authgroup.group_leader_groups.add(self.group1) self._refresh_user() groups = GroupManager.get_group_leaders_groups(self.user) - self.assertIn(self.group1, groups) #avail due to user - self.assertNotIn(self.group2, groups) #not avail due to group - self.assertNotIn(self.group3, groups) #not avail at all + self.assertIn(self.group1, groups) #avail due to user + self.assertNotIn(self.group2, groups) #not avail due to group + self.assertNotIn(self.group3, groups) #not avail at all self.user.groups.add(self.group1) self._refresh_user() groups = GroupManager.get_group_leaders_groups(self.user) - def test_can_manage_group(self): self.group1.authgroup.group_leaders.add(self.user) self.user.groups.add(self.group1) @@ -182,7 +181,6 @@ class TestGroupManager(TestCase): ]: self.assertFalse(GroupManager.joinable_group(x, member_state)) - def test_joinable_group_guest(self): guest_state = AuthUtils.get_guest_state() for x in [ @@ -200,7 +198,6 @@ class TestGroupManager(TestCase): ]: self.assertFalse(GroupManager.joinable_group(x, guest_state)) - def test_get_all_non_internal_groups(self): result = GroupManager.get_all_non_internal_groups() expected = { @@ -224,7 +221,7 @@ class TestGroupManager(TestCase): def test_get_joinable_groups_for_user_no_permission(self): AuthUtils.assign_state(self.user, AuthUtils.get_guest_state()) result = GroupManager.get_joinable_groups_for_user(self.user) - expected= {self.group_public_1, self.group_public_2} + expected = {self.group_public_1, self.group_public_2} self.assertSetEqual(set(result), expected) def test_get_joinable_groups_for_user_guest_w_permission_(self): @@ -335,3 +332,96 @@ class TestGroupManager(TestCase): self.assertFalse( GroupManager.can_manage_group(user, self.group_default) ) + + +class TestPendingRequestsCountForUser(TestCase): + + def setUp(self) -> None: + self.group_1 = Group.objects.create(name="Group 1") + self.group_2 = Group.objects.create(name="Group 2") + self.user_leader_1 = AuthUtils.create_member('Clark Kent') + self.group_1.authgroup.group_leaders.add(self.user_leader_1) + self.user_leader_2 = AuthUtils.create_member('Peter Parker') + self.group_2.authgroup.group_leaders.add(self.user_leader_2) + self.user_requestor = AuthUtils.create_member('Bruce Wayne') + + def test_single_request_for_leader(self): + # given user_leader_1 is leader of group_1 + # and user_leader_2 is leader of group_2 + # when user_requestor is requesting access to group 1 + # then return 1 for user_leader 1 and 0 for user_leader_2 + GroupRequest.objects.create( + status="pending", user=self.user_requestor, group=self.group_1 + ) + self.assertEqual( + GroupManager.pending_requests_count_for_user(self.user_leader_1), 1 + ) + self.assertEqual( + GroupManager.pending_requests_count_for_user(self.user_leader_2), 0 + ) + + def test_return_none_for_none_leader(self): + # given user_requestor is leader of no group + # when user_requestor is requesting access to group 1 + # then return 0 for user_requestor + GroupRequest.objects.create( + status="pending", user=self.user_requestor, group=self.group_1 + ) + self.assertEqual( + GroupManager.pending_requests_count_for_user(self.user_requestor), 0 + ) + + def test_single_leave_request(self): + # given user_leader_2 is leader of group_2 + # and user_requestor is member of group 2 + # when user_requestor is requesting to leave group 2 + # then return 1 for user_leader_2 + self.user_requestor.groups.add(self.group_2) + + GroupRequest.objects.create( + status="pending", + user=self.user_requestor, + group=self.group_2, + leave_request=True + ) + self.assertEqual( + GroupManager.pending_requests_count_for_user(self.user_leader_2), 1 + ) + + def test_join_and_leave_request(self): + # given user_leader_2 is leader of group_2 + # and user_requestor is member of group 2 + # when user_requestor is requesting to leave group 2 + # and user_requestor_2 is requesting to join group 2 + # then return 2 for user_leader_2 + self.user_requestor.groups.add(self.group_2) + user_requestor_2 = AuthUtils.create_member("Lex Luther") + GroupRequest.objects.create( + status="pending", + user=user_requestor_2, + group=self.group_2 + ) + GroupRequest.objects.create( + status="pending", + user=self.user_requestor, + group=self.group_2, + leave_request=True + ) + self.assertEqual( + GroupManager.pending_requests_count_for_user(self.user_leader_2), 2 + ) + + def test_single_request_for_user_with_management_perm(self): + # given user_leader_4 which is leafer of no group + # but has the management permissions + # when user_requestor is requesting access to group 1 + # then return 1 for user_leader_4 + user_leader_4 = AuthUtils.create_member("Lex Luther") + AuthUtils.add_permission_to_user_by_name("auth.group_management", user_leader_4) + user_leader_4 = User.objects.get(pk=user_leader_4.pk) + GroupRequest.objects.create( + status="pending", user=self.user_requestor, group=self.group_1 + ) + self.assertEqual( + GroupManager.pending_requests_count_for_user(self.user_leader_1), 1 + ) diff --git a/allianceauth/groupmanagement/tests/test_templatetags.py b/allianceauth/groupmanagement/tests/test_templatetags.py deleted file mode 100644 index f85090ec..00000000 --- a/allianceauth/groupmanagement/tests/test_templatetags.py +++ /dev/null @@ -1,27 +0,0 @@ -from unittest.mock import patch - -from django.test import TestCase -from allianceauth.tests.auth_utils import AuthUtils - -from ..templatetags.groupmanagement import can_manage_groups - -MODULE_PATH = 'allianceauth.groupmanagement.templatetags.groupmanagement' - - -@patch(MODULE_PATH + '.GroupManager.can_manage_groups') -class TestCanManageGroups(TestCase): - - def setUp(self): - self.user = AuthUtils.create_user('Bruce Wayne') - - def test_return_normal_result(self, mock_can_manage_groups): - mock_can_manage_groups.return_value = True - - self.assertTrue(can_manage_groups(self.user)) - self.assertTrue(mock_can_manage_groups.called) - - def test_return_false_if_not_user(self, mock_can_manage_groups): - mock_can_manage_groups.return_value = True - - self.assertFalse(can_manage_groups('invalid')) - self.assertFalse(mock_can_manage_groups.called) diff --git a/allianceauth/groupmanagement/urls.py b/allianceauth/groupmanagement/urls.py index f16cad7f..d2d57783 100644 --- a/allianceauth/groupmanagement/urls.py +++ b/allianceauth/groupmanagement/urls.py @@ -1,32 +1,29 @@ from . import views -from django.conf.urls import include, url +from django.conf.urls import url app_name = 'groupmanagement' urlpatterns = [ - url(r'^groups/', views.groups_view, name='groups'), - url(r'^group/', include([ - url(r'^management/', views.group_management, - name='management'), - url(r'^membership/$', views.group_membership, - name='membership'), - url(r'^membership/(\w+)/$', views.group_membership_list, - name='membership_list'), - url(r'^membership/(\w+)/audit/$', views.group_membership_audit, name="audit_log"), - url(r'^membership/(\w+)/remove/(\w+)/$', views.group_membership_remove, - name='membership_remove'), - url(r'^request_add/(\w+)', views.group_request_add, - name='request_add'), - url(r'^request/accept/(\w+)', views.group_accept_request, - name='accept_request'), - url(r'^request/reject/(\w+)', views.group_reject_request, - name='reject_request'), - - url(r'^request_leave/(\w+)', views.group_request_leave, - name='request_leave'), - url(r'leave_request/accept/(\w+)', views.group_leave_accept_request, - name='leave_accept_request'), - url(r'^leave_request/reject/(\w+)', views.group_leave_reject_request, - name='leave_reject_request'), - ])), + url(r'^groups/', views.groups_view, name='groups'), + url(r'^management/', views.group_management, + name='management'), + url(r'^membership/$', views.group_membership, + name='membership'), + url(r'^membership/(\w+)/$', views.group_membership_list, + name='membership_list'), + url(r'^membership/(\w+)/audit/$', views.group_membership_audit, name="audit_log"), + url(r'^membership/(\w+)/remove/(\w+)/$', views.group_membership_remove, + name='membership_remove'), + url(r'^request_add/(\w+)', views.group_request_add, + name='request_add'), + url(r'^request/accept/(\w+)', views.group_accept_request, + name='accept_request'), + url(r'^request/reject/(\w+)', views.group_reject_request, + name='reject_request'), + url(r'^request_leave/(\w+)', views.group_request_leave, + name='request_leave'), + url(r'leave_request/accept/(\w+)', views.group_leave_accept_request, + name='leave_accept_request'), + url(r'^leave_request/reject/(\w+)', views.group_leave_reject_request, + name='leave_reject_request'), ] diff --git a/allianceauth/hrapplications/auth_hooks.py b/allianceauth/hrapplications/auth_hooks.py index 3f735451..87faa9de 100644 --- a/allianceauth/hrapplications/auth_hooks.py +++ b/allianceauth/hrapplications/auth_hooks.py @@ -1,7 +1,10 @@ -from allianceauth.services.hooks import MenuItemHook, UrlHook from django.utils.translation import ugettext_lazy as _ + from allianceauth import hooks -from allianceauth.hrapplications import urls +from allianceauth.services.hooks import MenuItemHook, UrlHook + +from . import urls +from .models import Application class ApplicationsMenu(MenuItemHook): @@ -12,6 +15,11 @@ class ApplicationsMenu(MenuItemHook): 'hrapplications:index', navactive=['hrapplications:']) + def render(self, request): + app_count = Application.objects.pending_requests_count_for_user(request.user) + self.count = app_count if app_count and app_count > 0 else None + return MenuItemHook.render(self, request) + @hooks.register('menu_item_hook') def register_menu(): diff --git a/allianceauth/hrapplications/managers.py b/allianceauth/hrapplications/managers.py new file mode 100644 index 00000000..30ee5e74 --- /dev/null +++ b/allianceauth/hrapplications/managers.py @@ -0,0 +1,25 @@ +from django.contrib.auth.models import User +from django.db import models +from typing import Optional + + +class ApplicationManager(models.Manager): + + def pending_requests_count_for_user(self, user: User) -> Optional[int]: + """Returns the number of pending group requests for the given user""" + if user.is_superuser: + return self.filter(approved__isnull=True).count() + elif user.has_perm("auth.human_resources"): + main_character = user.profile.main_character + if main_character: + return ( + self + .select_related("form__corp") + .filter(form__corp__corporation_id=main_character.corporation_id) + .filter(approved__isnull=True) + .count() + ) + else: + return None + else: + return None diff --git a/allianceauth/hrapplications/models.py b/allianceauth/hrapplications/models.py index b5c8f39a..d8fbd068 100755 --- a/allianceauth/hrapplications/models.py +++ b/allianceauth/hrapplications/models.py @@ -2,8 +2,9 @@ from django.contrib.auth.models import User from django.db import models from sortedm2m.fields import SortedManyToManyField -from allianceauth.eveonline.models import EveCharacter -from allianceauth.eveonline.models import EveCorporationInfo +from allianceauth.eveonline.models import EveCharacter, EveCorporationInfo + +from .managers import ApplicationManager class ApplicationQuestion(models.Model): @@ -22,6 +23,7 @@ class ApplicationChoice(models.Model): def __str__(self): return self.choice_text + class ApplicationForm(models.Model): questions = SortedManyToManyField(ApplicationQuestion) corp = models.OneToOneField(EveCorporationInfo, on_delete=models.CASCADE) @@ -38,6 +40,8 @@ class Application(models.Model): reviewer_character = models.ForeignKey(EveCharacter, on_delete=models.SET_NULL, blank=True, null=True) created = models.DateTimeField(auto_now_add=True) + objects = ApplicationManager() + def __str__(self): return str(self.user) + " Application To " + str(self.form) diff --git a/allianceauth/hrapplications/tests.py b/allianceauth/hrapplications/tests.py index a39b155a..7dab4cd1 100644 --- a/allianceauth/hrapplications/tests.py +++ b/allianceauth/hrapplications/tests.py @@ -1 +1,103 @@ -# Create your tests here. +from django.contrib.auth.models import User +from django.test import TestCase + +from allianceauth.eveonline.models import EveCorporationInfo +from allianceauth.tests.auth_utils import AuthUtils + +from .models import Application, ApplicationForm, ApplicationQuestion, ApplicationChoice + + +class TestApplicationManagersPendingRequestsCountForUser(TestCase): + def setUp(self) -> None: + self.corporation_1 = EveCorporationInfo.objects.create( + corporation_id=2001, corporation_name="Wayne Tech", member_count=42 + ) + self.corporation_2 = EveCorporationInfo.objects.create( + corporation_id=2011, corporation_name="Lex Corp", member_count=666 + ) + question = ApplicationQuestion.objects.create(title="Dummy Question") + ApplicationChoice.objects.create(question=question, choice_text="yes") + ApplicationChoice.objects.create(question=question, choice_text="no") + self.form_corporation_1 = ApplicationForm.objects.create( + corp=self.corporation_1 + ) + self.form_corporation_1.questions.add(question) + self.form_corporation_2 = ApplicationForm.objects.create( + corp=self.corporation_2 + ) + self.form_corporation_2.questions.add(question) + + self.user_requestor = AuthUtils.create_member("Peter Parker") + + self.user_manager = AuthUtils.create_member("Bruce Wayne") + AuthUtils.add_main_character_2( + self.user_manager, + self.user_manager.username, + 1001, + self.corporation_1.corporation_id, + self.corporation_1.corporation_name, + ) + AuthUtils.add_permission_to_user_by_name( + "auth.human_resources", self.user_manager + ) + self.user_manager = User.objects.get(pk=self.user_manager.pk) + + def test_no_pending_application(self): + # given manager of corporation 1 has permission + # when no application is pending for corporation 1 + # return 0 + self.assertEqual( + Application.objects.pending_requests_count_for_user(self.user_manager), 0 + ) + + def test_single_pending_application(self): + # given manager of corporation 1 has permission + # when 1 application is pending for corporation 1 + # return 1 + Application.objects.create( + form=self.form_corporation_1, user=self.user_requestor + ) + self.assertEqual( + Application.objects.pending_requests_count_for_user(self.user_manager), 1 + ) + + def test_user_has_no_permission(self): + # given user has no permission + # when 1 application is pending + # return None + self.assertIsNone( + Application.objects.pending_requests_count_for_user(self.user_requestor) + ) + + def test_two_pending_applications_for_different_corporations_normal_manager(self): + # given manager of corporation 1 has permission + # when 1 application is pending for corporation 1 + # and 1 application is pending for corporation 2 + # return 1 + Application.objects.create( + form=self.form_corporation_1, user=self.user_requestor + ) + Application.objects.create( + form=self.form_corporation_2, user=self.user_requestor + ) + self.assertEqual( + Application.objects.pending_requests_count_for_user(self.user_manager), 1 + ) + + def test_two_pending_applications_for_different_corporations_manager_is_super(self): + # given manager of corporation 1 has permission + # when 1 application is pending for corporation 1 + # and 1 application is pending for corporation 2 + # return 1 + Application.objects.create( + form=self.form_corporation_1, user=self.user_requestor + ) + Application.objects.create( + form=self.form_corporation_2, user=self.user_requestor + ) + superuser = User.objects.create_superuser( + "Superman", "superman@example.com", "password" + ) + self.assertEqual( + Application.objects.pending_requests_count_for_user(superuser), 2 + ) diff --git a/allianceauth/services/hooks.py b/allianceauth/services/hooks.py index 455319f3..b75f12a1 100644 --- a/allianceauth/services/hooks.py +++ b/allianceauth/services/hooks.py @@ -139,6 +139,11 @@ class MenuItemHook: self.url_name = url_name self.template = 'public/menuitem.html' self.order = order if order is not None else 9999 + + # count is an integer shown next to the menu item as badge when count != None + # apps need to set the count in their child class, e.g. in render() method + self.count = None + navactive = navactive or [] navactive.append(url_name) self.navactive = navactive diff --git a/allianceauth/services/templates/public/menuitem.html b/allianceauth/services/templates/public/menuitem.html index 0469ed24..0058e09c 100644 --- a/allianceauth/services/templates/public/menuitem.html +++ b/allianceauth/services/templates/public/menuitem.html @@ -2,7 +2,10 @@ {% load navactive %}
  • - - {% trans item.text %} + + {% trans item.text %} + {% if item.count != None %} + {{ item.count }} + {% endif %}
  • diff --git a/allianceauth/srp/auth_hooks.py b/allianceauth/srp/auth_hooks.py index 0002e6b9..0db14f71 100644 --- a/allianceauth/srp/auth_hooks.py +++ b/allianceauth/srp/auth_hooks.py @@ -1,7 +1,10 @@ -from allianceauth.services.hooks import MenuItemHook, UrlHook from django.utils.translation import ugettext_lazy as _ + from allianceauth import hooks +from allianceauth.services.hooks import MenuItemHook, UrlHook + from . import urls +from .managers import SRPManager class SrpMenu(MenuItemHook): @@ -13,6 +16,8 @@ class SrpMenu(MenuItemHook): def render(self, request): if request.user.has_perm('srp.access_srp'): + app_count = SRPManager.pending_requests_count_for_user(request.user) + self.count = app_count if app_count and app_count > 0 else None return MenuItemHook.render(self, request) return '' diff --git a/allianceauth/srp/managers.py b/allianceauth/srp/managers.py index dd680506..84efa6ab 100644 --- a/allianceauth/srp/managers.py +++ b/allianceauth/srp/managers.py @@ -1,11 +1,13 @@ import logging -import os import requests +from django.contrib.auth.models import User + from allianceauth import NAME from allianceauth.eveonline.providers import provider +from .models import SrpUserRequest logger = logging.getLogger(__name__) @@ -50,3 +52,12 @@ class SRPManager: return ship_type, ship_value, victim_id else: raise ValueError("Invalid Kill ID or Hash.") + + @staticmethod + def pending_requests_count_for_user(user: User): + """returns the number of open SRP requests for given user + or None if user has no permission""" + if user.has_perm("auth.srp_management"): + return SrpUserRequest.objects.filter(srp_status="pending").count() + else: + return None diff --git a/allianceauth/srp/tests/test_managers.py b/allianceauth/srp/tests/test_managers.py index d6a54b28..8f8ed266 100755 --- a/allianceauth/srp/tests/test_managers.py +++ b/allianceauth/srp/tests/test_managers.py @@ -1,11 +1,16 @@ import inspect import json import os -from unittest.mock import patch, Mock +from unittest.mock import patch +from django.contrib.auth.models import User +from django.utils.timezone import now from django.test import TestCase +from allianceauth.tests.auth_utils import AuthUtils + from ..managers import SRPManager +from ..models import SrpUserRequest, SrpFleetMain MODULE_PATH = 'allianceauth.srp.managers' @@ -13,6 +18,7 @@ currentdir = os.path.dirname(os.path.abspath(inspect.getfile( inspect.currentframe() ))) + def load_data(filename): """loads given JSON file from `testdata` sub folder and returns content""" with open( @@ -52,7 +58,7 @@ class TestSrpManager(TestCase): mock_get.return_value.json.return_value = [''] with self.assertRaises(ValueError): - ship_type, ship_value, victim_id = SRPManager.get_kill_data(81973979) + SRPManager.get_kill_data(81973979) @patch(MODULE_PATH + '.provider') @patch(MODULE_PATH + '.requests.get') @@ -67,6 +73,34 @@ class TestSrpManager(TestCase): result.return_value = None with self.assertRaises(ValueError): - ship_type, ship_value, victim_id = SRPManager.get_kill_data(81973979) + SRPManager.get_kill_data(81973979) - + def test_pending_requests_count_for_user(self): + user = AuthUtils.create_member("Bruce Wayne") + + # when no permission to approve SRP requests + # then return None + self.assertIsNone(SRPManager.pending_requests_count_for_user(user)) + + # given permission to approve SRP requests + # when no open requests + # then return 0 + AuthUtils.add_permission_to_user_by_name("auth.srp_management", user) + user = User.objects.get(pk=user.pk) + self.assertEqual(SRPManager.pending_requests_count_for_user(user), 0) + + # given permission to approve SRP requests + # when 1 pending request + # then return 1 + fleet = SrpFleetMain.objects.create(fleet_time=now()) + SrpUserRequest.objects.create( + killboard_link="https://zkillboard.com/kill/79111612/", + srp_status="Pending", + srp_fleet_main=fleet, + ) + SrpUserRequest.objects.create( + killboard_link="https://zkillboard.com/kill/79111612/", + srp_status="Approved", + srp_fleet_main=fleet, + ) + self.assertEqual(SRPManager.pending_requests_count_for_user(user), 1) diff --git a/allianceauth/templates/allianceauth/side-menu.html b/allianceauth/templates/allianceauth/side-menu.html index 33a9f3cb..e1382027 100644 --- a/allianceauth/templates/allianceauth/side-menu.html +++ b/allianceauth/templates/allianceauth/side-menu.html @@ -1,7 +1,6 @@ {% load i18n %} {% load navactive %} {% load menu_items %} -{% load groupmanagement %}