aa-killtracker 0.12.0__py3-none-any.whl → 0.12.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,21 +1,14 @@
1
- import json
2
1
  from unittest.mock import patch
3
2
 
4
- import dhooks_lite
5
- import requests_mock
6
3
  from bs4 import BeautifulSoup
7
4
  from markdown import markdown
8
5
 
9
- from django.core.cache import cache
10
6
  from django.test import TestCase
11
7
  from eveuniverse.models import EveConstellation, EveRegion, EveSolarSystem, EveType
12
8
 
13
- from app_utils.json import JSONDateTimeDecoder
14
9
  from app_utils.testing import NoSocketsTestCase
15
10
 
16
11
  from killtracker.core.killmails import Killmail
17
- from killtracker.exceptions import WebhookTooManyRequests
18
- from killtracker.models import Webhook
19
12
 
20
13
  from ..testdata.factories import TrackerFactory
21
14
  from ..testdata.helpers import LoadTestDataMixin, load_killmail
@@ -23,47 +16,6 @@ from ..testdata.helpers import LoadTestDataMixin, load_killmail
23
16
  MODELS_PATH = "killtracker.models.trackers"
24
17
 
25
18
 
26
- class TestWebhookQueue(LoadTestDataMixin, TestCase):
27
- @classmethod
28
- def setUpClass(cls):
29
- super().setUpClass()
30
-
31
- def setUp(self) -> None:
32
- self.webhook_1.main_queue.clear()
33
- self.webhook_1.error_queue.clear()
34
-
35
- def test_reset_failed_messages(self):
36
- message = "Test message"
37
- self.webhook_1.error_queue.enqueue(message)
38
- self.webhook_1.error_queue.enqueue(message)
39
- self.assertEqual(self.webhook_1.error_queue.size(), 2)
40
- self.assertEqual(self.webhook_1.main_queue.size(), 0)
41
- self.webhook_1.reset_failed_messages()
42
- self.assertEqual(self.webhook_1.error_queue.size(), 0)
43
- self.assertEqual(self.webhook_1.main_queue.size(), 2)
44
-
45
- def test_discord_message_asjson_normal(self):
46
- embed = dhooks_lite.Embed(description="my_description")
47
- result = Webhook._discord_message_asjson(
48
- content="my_content",
49
- username="my_username",
50
- avatar_url="my_avatar_url",
51
- embeds=[embed],
52
- )
53
- message_python = json.loads(result, cls=JSONDateTimeDecoder)
54
- expected = {
55
- "content": "my_content",
56
- "embeds": [{"description": "my_description", "type": "rich"}],
57
- "username": "my_username",
58
- "avatar_url": "my_avatar_url",
59
- }
60
- self.assertDictEqual(message_python, expected)
61
-
62
- def test_discord_message_asjson_empty(self):
63
- with self.assertRaises(ValueError):
64
- Webhook._discord_message_asjson("")
65
-
66
-
67
19
  class TestHasLocalizationClause(LoadTestDataMixin, NoSocketsTestCase):
68
20
  def test_has_localization_filter_1(self):
69
21
  tracker = TrackerFactory.build(webhook=self.webhook_1, exclude_high_sec=True)
@@ -137,102 +89,6 @@ class TestSaveMethod(LoadTestDataMixin, NoSocketsTestCase):
137
89
  self.assertFalse(tracker.color)
138
90
 
139
91
 
140
- @requests_mock.Mocker()
141
- class TestWebhookSendMessage(LoadTestDataMixin, TestCase):
142
- def setUp(self) -> None:
143
- self.message = Webhook._discord_message_asjson(content="Test message")
144
- cache.clear()
145
-
146
- def test_when_send_ok_returns_true(self, requests_mocker):
147
- # given
148
- requests_mocker.register_uri(
149
- "POST",
150
- self.webhook_1.url,
151
- status_code=200,
152
- json={
153
- "name": "test webhook",
154
- "type": 1,
155
- "channel_id": "199737254929760256",
156
- "token": "3d89bb7572e0fb30d8128367b3b1b44fecd1726de135cbe28a41f8b2f777c372ba2939e72279b94526ff5d1bd4358d65cf11",
157
- "avatar": None,
158
- "guild_id": "199737254929760256",
159
- "id": "223704706495545344",
160
- "application_id": None,
161
- "user": {
162
- "username": "test",
163
- "discriminator": "7479",
164
- "id": "190320984123768832",
165
- "avatar": "b004ec1740a63ca06ae2e14c5cee11f3",
166
- "public_flags": 131328,
167
- },
168
- },
169
- )
170
- # when
171
- response = self.webhook_1.send_message_to_webhook(self.message)
172
- # then
173
- self.assertTrue(response.status_ok)
174
- self.assertTrue(requests_mocker.called)
175
-
176
- def test_when_send_not_ok_returns_false(self, requests_mocker):
177
- # given
178
- requests_mocker.register_uri("POST", self.webhook_1.url, status_code=404)
179
- # when
180
- response = self.webhook_1.send_message_to_webhook(self.message)
181
- # then
182
- self.assertFalse(response.status_ok)
183
- self.assertTrue(requests_mocker.called)
184
-
185
- def test_too_many_requests_normal(self, requests_mocker):
186
- # given
187
- requests_mocker.register_uri(
188
- "POST",
189
- self.webhook_1.url,
190
- status_code=429,
191
- json={
192
- "global": False,
193
- "message": "You are being rate limited.",
194
- "retry_after": 2000,
195
- },
196
- headers={
197
- "x-ratelimit-remaining": "5",
198
- "x-ratelimit-reset-after": "60",
199
- "Retry-After": "2000",
200
- },
201
- )
202
- # when/then
203
- try:
204
- self.webhook_1.send_message_to_webhook(self.message)
205
- except Exception as ex:
206
- self.assertIsInstance(ex, WebhookTooManyRequests)
207
- self.assertEqual(ex.retry_after, 2002)
208
- else:
209
- self.fail("Did not raise excepted exception")
210
-
211
- self.assertAlmostEqual(
212
- cache.ttl(self.webhook_1._blocked_cache_key()), 2002, delta=5
213
- )
214
-
215
- def test_too_many_requests_no_retry_value(self, requests_mocker):
216
- # given
217
- requests_mocker.register_uri(
218
- "POST",
219
- self.webhook_1.url,
220
- status_code=429,
221
- headers={
222
- "x-ratelimit-remaining": "5",
223
- "x-ratelimit-reset-after": "60",
224
- },
225
- )
226
- # when/then
227
- try:
228
- self.webhook_1.send_message_to_webhook(self.message)
229
- except Exception as ex:
230
- self.assertIsInstance(ex, WebhookTooManyRequests)
231
- self.assertEqual(ex.retry_after, WebhookTooManyRequests.DEFAULT_RESET_AFTER)
232
- else:
233
- self.fail("Did not raise excepted exception")
234
-
235
-
236
92
  @patch(MODELS_PATH + ".Webhook.enqueue_message")
237
93
  class TestTrackerGenerateKillmailMessage(LoadTestDataMixin, TestCase):
238
94
  def setUp(self) -> None:
@@ -0,0 +1,150 @@
1
+ import json
2
+
3
+ import dhooks_lite
4
+ import requests_mock
5
+
6
+ from django.core.cache import cache
7
+ from django.test import TestCase
8
+
9
+ from app_utils.json import JSONDateTimeDecoder
10
+
11
+ from killtracker.exceptions import WebhookTooManyRequests
12
+ from killtracker.models import Webhook
13
+ from killtracker.tests.testdata.helpers import LoadTestDataMixin
14
+
15
+
16
+ class TestWebhookQueue(LoadTestDataMixin, TestCase):
17
+ @classmethod
18
+ def setUpClass(cls):
19
+ super().setUpClass()
20
+
21
+ def setUp(self) -> None:
22
+ self.webhook_1.main_queue.clear()
23
+ self.webhook_1.error_queue.clear()
24
+
25
+ def test_reset_failed_messages(self):
26
+ message = "Test message"
27
+ self.webhook_1.error_queue.enqueue(message)
28
+ self.webhook_1.error_queue.enqueue(message)
29
+ self.assertEqual(self.webhook_1.error_queue.size(), 2)
30
+ self.assertEqual(self.webhook_1.main_queue.size(), 0)
31
+ self.webhook_1.reset_failed_messages()
32
+ self.assertEqual(self.webhook_1.error_queue.size(), 0)
33
+ self.assertEqual(self.webhook_1.main_queue.size(), 2)
34
+
35
+ def test_discord_message_asjson_normal(self):
36
+ embed = dhooks_lite.Embed(description="my_description")
37
+ result = Webhook._discord_message_asjson(
38
+ content="my_content",
39
+ username="my_username",
40
+ avatar_url="my_avatar_url",
41
+ embeds=[embed],
42
+ )
43
+ message_python = json.loads(result, cls=JSONDateTimeDecoder)
44
+ expected = {
45
+ "content": "my_content",
46
+ "embeds": [{"description": "my_description", "type": "rich"}],
47
+ "username": "my_username",
48
+ "avatar_url": "my_avatar_url",
49
+ }
50
+ self.assertDictEqual(message_python, expected)
51
+
52
+ def test_discord_message_asjson_empty(self):
53
+ with self.assertRaises(ValueError):
54
+ Webhook._discord_message_asjson("")
55
+
56
+
57
+ @requests_mock.Mocker()
58
+ class TestWebhookSendMessage(LoadTestDataMixin, TestCase):
59
+ def setUp(self) -> None:
60
+ self.message = Webhook._discord_message_asjson(content="Test message")
61
+ cache.clear()
62
+
63
+ def test_when_send_ok_returns_true(self, requests_mocker):
64
+ # given
65
+ requests_mocker.register_uri(
66
+ "POST",
67
+ self.webhook_1.url,
68
+ status_code=200,
69
+ json={
70
+ "name": "test webhook",
71
+ "type": 1,
72
+ "channel_id": "199737254929760256",
73
+ "token": "3d89bb7572e0fb30d8128367b3b1b44fecd1726de135cbe28a41f8b2f777c372ba2939e72279b94526ff5d1bd4358d65cf11",
74
+ "avatar": None,
75
+ "guild_id": "199737254929760256",
76
+ "id": "223704706495545344",
77
+ "application_id": None,
78
+ "user": {
79
+ "username": "test",
80
+ "discriminator": "7479",
81
+ "id": "190320984123768832",
82
+ "avatar": "b004ec1740a63ca06ae2e14c5cee11f3",
83
+ "public_flags": 131328,
84
+ },
85
+ },
86
+ )
87
+ # when
88
+ response = self.webhook_1.send_message_to_webhook(self.message)
89
+ # then
90
+ self.assertTrue(response.status_ok)
91
+ self.assertTrue(requests_mocker.called)
92
+
93
+ def test_when_send_not_ok_returns_false(self, requests_mocker):
94
+ # given
95
+ requests_mocker.register_uri("POST", self.webhook_1.url, status_code=404)
96
+ # when
97
+ response = self.webhook_1.send_message_to_webhook(self.message)
98
+ # then
99
+ self.assertFalse(response.status_ok)
100
+ self.assertTrue(requests_mocker.called)
101
+
102
+ def test_too_many_requests_normal(self, requests_mocker):
103
+ # given
104
+ requests_mocker.register_uri(
105
+ "POST",
106
+ self.webhook_1.url,
107
+ status_code=429,
108
+ json={
109
+ "global": False,
110
+ "message": "You are being rate limited.",
111
+ "retry_after": 2000,
112
+ },
113
+ headers={
114
+ "x-ratelimit-remaining": "5",
115
+ "x-ratelimit-reset-after": "60",
116
+ "Retry-After": "2000",
117
+ },
118
+ )
119
+ # when/then
120
+ try:
121
+ self.webhook_1.send_message_to_webhook(self.message)
122
+ except Exception as ex:
123
+ self.assertIsInstance(ex, WebhookTooManyRequests)
124
+ self.assertEqual(ex.retry_after, 2002)
125
+ else:
126
+ self.fail("Did not raise excepted exception")
127
+
128
+ self.assertAlmostEqual(
129
+ cache.ttl(self.webhook_1._blocked_cache_key()), 2002, delta=5
130
+ )
131
+
132
+ def test_too_many_requests_no_retry_value(self, requests_mocker):
133
+ # given
134
+ requests_mocker.register_uri(
135
+ "POST",
136
+ self.webhook_1.url,
137
+ status_code=429,
138
+ headers={
139
+ "x-ratelimit-remaining": "5",
140
+ "x-ratelimit-reset-after": "60",
141
+ },
142
+ )
143
+ # when/then
144
+ try:
145
+ self.webhook_1.send_message_to_webhook(self.message)
146
+ except Exception as ex:
147
+ self.assertIsInstance(ex, WebhookTooManyRequests)
148
+ self.assertEqual(ex.retry_after, WebhookTooManyRequests.DEFAULT_RESET_AFTER)
149
+ else:
150
+ self.fail("Did not raise excepted exception")
@@ -1,16 +1,15 @@
1
1
  from django.contrib.auth.models import User
2
+ from django.test import TestCase
2
3
  from django.urls import reverse
3
4
  from django_webtest import WebTest
4
- from eveuniverse.models import EveType
5
5
 
6
6
  from allianceauth.eveonline.models import EveCorporationInfo
7
- from app_utils.testing import create_fake_user
7
+ from app_utils.testdata_factories import UserFactory
8
8
 
9
9
  from killtracker.models import Tracker, Webhook
10
10
 
11
- from .testdata.factories import TrackerFactory
11
+ from .testdata.factories import TrackerFactory, WebhookFactory
12
12
  from .testdata.helpers import LoadTestDataMixin
13
- from .testdata.load_eveuniverse import load_eveuniverse
14
13
 
15
14
 
16
15
  class TestTrackerChangeList(LoadTestDataMixin, WebTest):
@@ -97,34 +96,6 @@ class TestTrackerValidations(LoadTestDataMixin, WebTest):
97
96
  self.assertIn("Please correct the error below", response.text)
98
97
  self.assertEqual(Tracker.objects.count(), 0)
99
98
 
100
- def test_can_not_have_same_options_attacker_alliances(self):
101
- form = self._open_page()
102
- form["exclude_attacker_alliances"] = [
103
- self.alliance_3001.pk,
104
- self.alliance_3011.pk,
105
- ]
106
- form["require_attacker_alliances"] = [self.alliance_3001.pk]
107
- response = form.submit()
108
-
109
- # assert results
110
- self.assertEqual(response.status_code, 200)
111
- self.assertIn("Please correct the error below", response.text)
112
- self.assertEqual(Tracker.objects.count(), 0)
113
-
114
- def test_can_not_have_same_options_attacker_corporations(self):
115
- form = self._open_page()
116
- form["exclude_attacker_corporations"] = [
117
- self.corporation_2001.pk,
118
- self.corporation_2011.pk,
119
- ]
120
- form["require_attacker_corporations"] = [self.corporation_2011.pk]
121
- response = form.submit()
122
-
123
- # assert results
124
- self.assertEqual(response.status_code, 200)
125
- self.assertIn("Please correct the error below", response.text)
126
- self.assertEqual(Tracker.objects.count(), 0)
127
-
128
99
  def test_min_attackers_must_be_less_than_max_attackers(self):
129
100
  form = self._open_page()
130
101
  form["require_min_attackers"] = 10
@@ -161,142 +132,32 @@ class TestTrackerValidations(LoadTestDataMixin, WebTest):
161
132
  self.assertEqual(Tracker.objects.count(), 0)
162
133
 
163
134
 
164
- class TestTrackerChangeForm(WebTest):
135
+ class TestTrackerValidations2(TestCase):
165
136
  @classmethod
166
- def setUpClass(cls) -> None:
137
+ def setUpClass(cls):
167
138
  super().setUpClass()
168
- cls.user = create_fake_user(1001, "Bruce Wayne")
169
- cls.user.is_staff = True
170
- cls.user.is_superuser = True
171
- cls.user.save()
172
- load_eveuniverse()
173
- cls.npc_type = EveType.objects.get(id=23320)
174
-
175
- def test_do_not_show_npcs_when_not_used_and_not_enabled(self):
176
- # given
177
- tracker = TrackerFactory()
178
- url = reverse("admin:killtracker_tracker_change", args=[tracker.id])
179
- self.app.set_user(self.user)
180
- # when
181
- response = self.app.get(url)
182
- # then
183
- self.assertEqual(response.status_code, 200)
184
- form = response.form
185
- require_attackers_ship_types_ids = {
186
- int(obj[0]) for obj in form["require_attackers_ship_types"].options
187
- }
188
- self.assertNotIn(self.npc_type.id, require_attackers_ship_types_ids)
189
- require_attackers_ship_groups_ids = {
190
- int(obj[0]) for obj in form["require_attackers_ship_groups"].options
191
- }
192
- self.assertNotIn(self.npc_type.eve_group_id, require_attackers_ship_groups_ids)
193
-
194
- def test_show_npcs_when_in_use(self):
195
- # given
196
- tracker = TrackerFactory()
197
- tracker.require_attackers_ship_types.add(self.npc_type)
198
- url = reverse("admin:killtracker_tracker_change", args=[tracker.id])
199
- self.app.set_user(self.user)
200
- # when
201
- response = self.app.get(url)
202
- # then
203
- self.assertEqual(response.status_code, 200)
204
- form = response.form
205
- require_attackers_ship_types_ids = {
206
- int(obj[0]) for obj in form["require_attackers_ship_types"].options
207
- }
208
- self.assertIn(self.npc_type.id, require_attackers_ship_types_ids)
209
- require_attackers_ship_groups_ids = {
210
- int(obj[0]) for obj in form["require_attackers_ship_groups"].options
211
- }
212
- self.assertIn(self.npc_type.eve_group_id, require_attackers_ship_groups_ids)
139
+ cls.user = UserFactory(is_staff=True, is_superuser=True)
140
+ cls.webhook = WebhookFactory()
141
+ cls.url_add = reverse("admin:killtracker_tracker_add")
142
+ cls.url_changelist = reverse("admin:killtracker_tracker_changelist")
213
143
 
214
- def test_show_npcs_when_enabled(self):
144
+ def test_should_add_new_tracker(self):
215
145
  # given
216
- tracker = TrackerFactory()
217
- tracker.require_attackers_ship_types.add(self.npc_type)
218
- url = reverse("admin:killtracker_tracker_change", args=[tracker.id])
219
- self.app.set_user(self.user)
220
- self.app.session["killtracker_toogle_npc"] = True
221
- # when
222
- response = self.app.get(url)
223
- # then
224
- self.assertEqual(response.status_code, 200)
225
- form = response.form
226
- require_attackers_ship_types_ids = {
227
- int(obj[0]) for obj in form["require_attackers_ship_types"].options
228
- }
229
- self.assertIn(self.npc_type.id, require_attackers_ship_types_ids)
230
- require_attackers_ship_groups_ids = {
231
- int(obj[0]) for obj in form["require_attackers_ship_groups"].options
146
+ self.client.force_login(self.user)
147
+ data = {
148
+ "name": "Dummy",
149
+ "webhook": self.webhook.pk,
150
+ "_save": "Save",
151
+ "is_enabled": "on",
152
+ "color": "#000000",
153
+ "ping_type": "PN",
154
+ "is_posting_name": "on",
232
155
  }
233
- self.assertIn(self.npc_type.eve_group_id, require_attackers_ship_groups_ids)
234
156
 
235
- def test_can_enable_npcs(self):
236
- # given
237
- tracker = TrackerFactory()
238
- url = reverse("admin:killtracker_tracker_change", args=[tracker.id])
239
- self.app.set_user(self.user)
240
- initial_page = self.app.get(url)
241
157
  # when
242
- response = initial_page.click(linkid="toogle-npc").follow()
243
- # then
244
- self.assertEqual(response.status_code, 200)
245
- form = response.form
246
- require_attackers_ship_types_ids = {
247
- int(obj[0]) for obj in form["require_attackers_ship_types"].options
248
- }
249
- self.assertIn(self.npc_type.id, require_attackers_ship_types_ids)
250
- require_attackers_ship_groups_ids = {
251
- int(obj[0]) for obj in form["require_attackers_ship_groups"].options
252
- }
253
- self.assertIn(self.npc_type.eve_group_id, require_attackers_ship_groups_ids)
254
-
255
-
256
- class TestTrackerAddForm(WebTest):
257
- @classmethod
258
- def setUpClass(cls) -> None:
259
- super().setUpClass()
260
- cls.user = create_fake_user(1001, "Bruce Wayne")
261
- cls.user.is_staff = True
262
- cls.user.is_superuser = True
263
- cls.user.save()
264
- load_eveuniverse()
265
- cls.npc_type = EveType.objects.get(id=23320)
158
+ response = self.client.post(self.url_add, data=data)
266
159
 
267
- def test_do_not_show_npcs_when_not_enabled(self):
268
- # given
269
- url = reverse("admin:killtracker_tracker_add")
270
- self.app.set_user(self.user)
271
- # when
272
- response = self.app.get(url)
273
- # then
274
- self.assertEqual(response.status_code, 200)
275
- form = response.form
276
- require_attackers_ship_types_ids = {
277
- int(obj[0]) for obj in form["require_attackers_ship_types"].options
278
- }
279
- self.assertNotIn(self.npc_type.id, require_attackers_ship_types_ids)
280
- require_attackers_ship_groups_ids = {
281
- int(obj[0]) for obj in form["require_attackers_ship_groups"].options
282
- }
283
- self.assertNotIn(self.npc_type.eve_group_id, require_attackers_ship_groups_ids)
284
-
285
- def test_can_enable_npcs(self):
286
- # given
287
- url = reverse("admin:killtracker_tracker_add")
288
- self.app.set_user(self.user)
289
- initial_page = self.app.get(url)
290
- # when
291
- response = initial_page.click(linkid="toogle-npc").follow()
292
160
  # then
293
- self.assertEqual(response.status_code, 200)
294
- form = response.form
295
- require_attackers_ship_types_ids = {
296
- int(obj[0]) for obj in form["require_attackers_ship_types"].options
297
- }
298
- self.assertIn(self.npc_type.id, require_attackers_ship_types_ids)
299
- require_attackers_ship_groups_ids = {
300
- int(obj[0]) for obj in form["require_attackers_ship_groups"].options
301
- }
302
- self.assertIn(self.npc_type.eve_group_id, require_attackers_ship_groups_ids)
161
+ self.assertEqual(response.status_code, 302)
162
+ self.assertEqual(response.url, self.url_changelist)
163
+ self.assertTrue(Tracker.objects.filter(name="Dummy").exists())
@@ -19,7 +19,7 @@ PACKAGE_PATH = "killtracker"
19
19
  @patch("celery.app.task.Context.called_directly", False) # make retry work with eager
20
20
  @override_settings(CELERY_ALWAYS_EAGER=True)
21
21
  @patch(PACKAGE_PATH + ".tasks.is_esi_online", lambda: True)
22
- @patch(PACKAGE_PATH + ".models.trackers.dhooks_lite.Webhook.execute", spec=True)
22
+ @patch(PACKAGE_PATH + ".models.webhooks.dhooks_lite.Webhook.execute", spec=True)
23
23
  @requests_mock.Mocker()
24
24
  class TestTasksEnd2End(LoadTestDataMixin, TestCase):
25
25
  @classmethod
@@ -348,7 +348,7 @@ class TestStoreKillmail(TestTrackerBase):
348
348
 
349
349
 
350
350
  @override_settings(CELERY_ALWAYS_EAGER=True, CELERY_EAGER_PROPAGATES_EXCEPTIONS=True)
351
- @patch("killtracker.models.trackers.dhooks_lite.Webhook.execute", spec=True)
351
+ @patch("killtracker.models.webhooks.dhooks_lite.Webhook.execute", spec=True)
352
352
  @patch(MODULE_PATH + ".logger", spec=True)
353
353
  class TestSendTestKillmailsToWebhook(TestTrackerBase):
354
354
  def setUp(self) -> None:
killtracker/auth_hooks.py DELETED
@@ -1,9 +0,0 @@
1
- from allianceauth import hooks
2
- from allianceauth.services.hooks import UrlHook
3
-
4
- from . import urls
5
-
6
-
7
- @hooks.register("url_hook")
8
- def register_urls():
9
- return UrlHook(urls, "killtracker", r"^killtracker/")
@@ -1,16 +0,0 @@
1
- {% extends "admin/change_form.html" %}
2
-
3
- {% block object-tools %}
4
- <ul class="object-tools">
5
- {% if change %}
6
- {% if not is_popup %}
7
- {% block object-tools-items %}
8
- {{ block.super }}
9
- {% include "admin/killtracker/tracker/toogle_npc_button.html" %}
10
- {% endblock %}
11
- {% endif %}
12
- {% else %}
13
- {% include "admin/killtracker/tracker/toogle_npc_button.html" %}
14
- {% endif %}
15
- </ul>
16
- {% endblock %}
@@ -1,23 +0,0 @@
1
- {% load i18n %}
2
-
3
- <li>
4
- {% if not is_using_npc %}
5
- <a
6
- id="toogle-npc"
7
- {% if not change %}
8
- href="{% url 'killtracker:admin_killtracker_toogle_npc' %}"
9
- {% else %}
10
- href="{% url 'killtracker:admin_killtracker_toogle_npc' object_id %}"
11
- {% endif %}
12
- class="btn"
13
- title="Click to toogle">
14
- {% if request.session.killtracker_toogle_npc %}
15
- {% translate "NPC types: enabled" %}
16
- {% else %}
17
- {% translate "NPC types: disabled" %}
18
- {% endif %}
19
- </a>
20
- {% else %}
21
- <p class="btn">NPC types in use</p>
22
- {% endif %}
23
- </li>
killtracker/urls.py DELETED
@@ -1,20 +0,0 @@
1
- """Routes for killtracker."""
2
-
3
- from django.urls import path
4
-
5
- from . import views
6
-
7
- app_name = "killtracker"
8
-
9
- urlpatterns = [
10
- path(
11
- "admin_killtracker_toogle_npc/<int:object_id>/",
12
- views.admin_killtracker_toogle_npc,
13
- name="admin_killtracker_toogle_npc",
14
- ),
15
- path(
16
- "admin_killtracker_toogle_npc/",
17
- views.admin_killtracker_toogle_npc,
18
- name="admin_killtracker_toogle_npc",
19
- ),
20
- ]
killtracker/views.py DELETED
@@ -1,27 +0,0 @@
1
- """Views for killtracker."""
2
-
3
- from typing import Optional
4
-
5
- from django.contrib.admin.views.decorators import staff_member_required
6
- from django.contrib.auth.decorators import login_required
7
- from django.shortcuts import redirect
8
-
9
- from allianceauth.services.hooks import get_extension_logger
10
- from app_utils.logging import LoggerAddTag
11
-
12
- from . import __title__
13
- from .constants import SESSION_KEY_TOOGLE_NPC
14
-
15
- logger = LoggerAddTag(get_extension_logger(__name__), __title__)
16
-
17
-
18
- @login_required
19
- @staff_member_required
20
- def admin_killtracker_toogle_npc(request, object_id: Optional[int] = None):
21
- """Enable or disable the toogle to show NPC types."""
22
- request.session[SESSION_KEY_TOOGLE_NPC] = not request.session.get(
23
- SESSION_KEY_TOOGLE_NPC, False
24
- )
25
- if object_id:
26
- return redirect("admin:killtracker_tracker_change", object_id)
27
- return redirect("admin:killtracker_tracker_add")