aa-killtracker 0.12.1__py3-none-any.whl → 0.14.0__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.
- {aa_killtracker-0.12.1.dist-info → aa_killtracker-0.14.0.dist-info}/METADATA +35 -7
- {aa_killtracker-0.12.1.dist-info → aa_killtracker-0.14.0.dist-info}/RECORD +15 -15
- killtracker/__init__.py +1 -1
- killtracker/app_settings.py +45 -22
- killtracker/core/killmails.py +21 -2
- killtracker/tests/core/test_discord_messages_1.py +3 -4
- killtracker/tests/core/test_discord_messages_2.py +2 -3
- killtracker/tests/core/test_killmails.py +62 -4
- killtracker/tests/models/test_killmails.py +6 -4
- killtracker/tests/models/test_trackers_1.py +2 -3
- killtracker/tests/models/test_trackers_2.py +2 -3
- killtracker/tests/test_admin.py +1 -1
- killtracker/tests/test_integration.py +1 -0
- {aa_killtracker-0.12.1.dist-info → aa_killtracker-0.14.0.dist-info}/LICENSE +0 -0
- {aa_killtracker-0.12.1.dist-info → aa_killtracker-0.14.0.dist-info}/WHEEL +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: aa-killtracker
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.14.0
|
4
4
|
Summary: "An app for running killmail trackers with Alliance Auth and Discord.
|
5
5
|
Author-email: Erik Kalkoken <kalkoken87@gmail.com>
|
6
6
|
Requires-Python: >=3.8
|
@@ -8,6 +8,7 @@ Description-Content-Type: text/markdown
|
|
8
8
|
Classifier: Environment :: Web Environment
|
9
9
|
Classifier: Framework :: Django
|
10
10
|
Classifier: Framework :: Django :: 4.0
|
11
|
+
Classifier: Framework :: Django :: 4.2
|
11
12
|
Classifier: Intended Audience :: End Users/Desktop
|
12
13
|
Classifier: License :: OSI Approved :: MIT License
|
13
14
|
Classifier: Operating System :: OS Independent
|
@@ -26,7 +27,7 @@ Requires-Dist: django-eveuniverse>=1.3
|
|
26
27
|
Requires-Dist: redis-simple-mq>=0.5
|
27
28
|
Project-URL: Home, https://gitlab.com/ErikKalkoken/aa-killtracker
|
28
29
|
|
29
|
-
#
|
30
|
+
# Killtracker
|
30
31
|
|
31
32
|
An app for running killmail trackers with Alliance Auth and Discord.
|
32
33
|
|
@@ -99,19 +100,45 @@ pip install aa-killtracker
|
|
99
100
|
|
100
101
|
### Step 3 - Configure settings
|
101
102
|
|
102
|
-
Configure your
|
103
|
+
Configure your AA settings (`local.py`) as follows:
|
103
104
|
|
104
|
-
|
105
|
-
|
105
|
+
### Installed apps
|
106
|
+
|
107
|
+
Add `'killtracker'` to `INSTALLED_APPS`.
|
108
|
+
|
109
|
+
### Killtracker configuration
|
110
|
+
|
111
|
+
Add below lines to your settings file:
|
106
112
|
|
107
113
|
```python
|
114
|
+
# aa-killtracker
|
108
115
|
CELERYBEAT_SCHEDULE['killtracker_run_killtracker'] = {
|
109
116
|
'task': 'killtracker.tasks.run_killtracker',
|
110
117
|
'schedule': crontab(minute='*/1'),
|
111
118
|
}
|
119
|
+
KILLTRACKER_QUEUE_ID = "" # Put your unique queue ID here
|
120
|
+
```
|
121
|
+
|
122
|
+
### Queue ID
|
123
|
+
|
124
|
+
Please note that the queue ID must be globally unique for all users of the zKillboard API, so choose carefully.
|
125
|
+
|
126
|
+
We suggest to use your alliance name or alliance tag (without any spaces and special characters) as queue ID.
|
127
|
+
|
128
|
+
We recommend using only characters (upper and lower case) and numbers,
|
129
|
+
but no spaces or any special characters when choosing your ID.
|
130
|
+
|
131
|
+
Example (don't use this exact example):
|
132
|
+
|
133
|
+
```Python
|
134
|
+
KILLTRACKER_QUEUE_ID = "Voltron9000"
|
112
135
|
```
|
113
136
|
|
114
|
-
|
137
|
+
If you are running multiple instances of Killtracker please choose a different queue ID for each of them.
|
138
|
+
|
139
|
+
### Additional settings (optional)
|
140
|
+
|
141
|
+
Add additional settings if you want to change any defaults. See [Settings](#settings) for the full list.
|
115
142
|
|
116
143
|
### Step 4 - Finalize installation
|
117
144
|
|
@@ -212,6 +239,7 @@ Name | Description | Default
|
|
212
239
|
`KILLTRACKER_KILLMAIL_MAX_AGE_FOR_TRACKER`| Ignore killmails that are older than the given number in minutes. Sometimes killmails appear belated on ZKB, this feature ensures they don't create new alerts | `60`
|
213
240
|
`KILLTRACKER_MAX_KILLMAILS_PER_RUN`| Maximum number of killmails retrieved from ZKB by task run. This value should be set such that the task that fetches new killmails from ZKB every minute will reliable finish within one minute. To test this run a "Catch all" tracker and see how many killmails your system is capable of processing. Note that you can get that information from the worker's log file. It will look something like this: `Total killmails received from ZKB in 49 secs: 251` | `250`
|
214
241
|
`KILLTRACKER_PURGE_KILLMAILS_AFTER_DAYS`| Killmails older than set number of days will be purged from the database. If you want to keep all killmails set this to 0. Note that this setting is only relevant if you have storing killmails enabled. | `30`
|
215
|
-
`
|
242
|
+
`KILLTRACKER_QUEUE_ID`| Unique ID used to identify this server when fetching killmails from zKillboard. This setting is mandatory. | ``
|
216
243
|
`KILLTRACKER_STORING_KILLMAILS_ENABLED`| If set to true Killtracker will automatically store all received killmails in the local database. This can be useful if you want to run analytics on killmails etc. However, please note that Killtracker itself currently does not use stored killmails in any way. | `False`
|
244
|
+
`KILLTRACKER_WEBHOOK_SET_AVATAR`| Wether app sets the name and avatar icon of a webhook. When False the webhook will use it's own values as set on the platform | `True`
|
217
245
|
|
@@ -1,6 +1,6 @@
|
|
1
|
-
killtracker/__init__.py,sha256=
|
1
|
+
killtracker/__init__.py,sha256=qmlkoj0QbgRePuQ6rH64unfUejmQPj_Ebs9EzZSrYAs,356
|
2
2
|
killtracker/admin.py,sha256=CHudWND2slzqCt046xdf2lzhFaAuEsNKiF7ptaXm1wQ,13696
|
3
|
-
killtracker/app_settings.py,sha256=
|
3
|
+
killtracker/app_settings.py,sha256=aN93musXOQ0AAVVWz67oSy9ryEiNXrcCCz6G2NlJ5QQ,3608
|
4
4
|
killtracker/apps.py,sha256=CfmDvqVXmoy6sumpjXKldhSlJt5xDiQW3XLBfCqH3-c,307
|
5
5
|
killtracker/constants.py,sha256=W7-VARE3B4_sdzV_9k7qunUzlxTcdSAeSp_ZJVnbUhw,2514
|
6
6
|
killtracker/exceptions.py,sha256=aFY6qxQOta1V-qvgKp19Cgy6M16O7Si8moc2205OsX0,846
|
@@ -10,7 +10,7 @@ killtracker/providers.py,sha256=smkZe_rKHkZeWFzJ0RhIhJVcbrZUpLYR5fKCge-dpXY,348
|
|
10
10
|
killtracker/tasks.py,sha256=u_ZAOEeFZWW6qpWcB0HCzgbN0VjA1ZZDHdKPJGHKl0U,7884
|
11
11
|
killtracker/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
12
12
|
killtracker/core/discord_messages.py,sha256=mOKiMWq-3WnaSUFbfgVmlkAedGTZ7OWcVxLp7n58-Z0,14132
|
13
|
-
killtracker/core/killmails.py,sha256=
|
13
|
+
killtracker/core/killmails.py,sha256=V8mXnp0rVqS3EcHgwU4BWq_h900B0dfGbdgAqvPOTSI,20306
|
14
14
|
killtracker/management/commands/killtracker_load_eve.py,sha256=5P2wr6LU-EMl9_gG-DKP2yw3eFXOU7ApeuGAWEbvCKk,1159
|
15
15
|
killtracker/migrations/0001_initial_new.py,sha256=WszI5DmNFtk45IZ2Zul3_Ak-VXmye9ffJKFAsGIxoXA,27818
|
16
16
|
killtracker/migrations/0001_squashed_all.py,sha256=KXwOcRayjGGGmleg7-aTcXeIi-92Mn4BaGkEY3iE9Vc,26221
|
@@ -33,19 +33,19 @@ killtracker/static/killtracker/killtracker_logo.png,sha256=3jc9zmYHqP60Np5piP5Rf
|
|
33
33
|
killtracker/static/killtracker/zkb_icon.png,sha256=wuVfgyTbTs9qS4KGbDAH3Q9KVPgHqYV5eaVrjEmTjsE,328
|
34
34
|
killtracker/templates/admin/killtracker/tracker/killmail_test.html,sha256=TI2ON8qf9pW4rX6G7pT990ZadkipwncQgGUC0FPcWQY,649
|
35
35
|
killtracker/tests/__init__.py,sha256=CEt5qqp6ptDrx1lwuA6epZ5bzh1CwUJYXeMZqWK9jT0,278
|
36
|
-
killtracker/tests/test_admin.py,sha256=
|
36
|
+
killtracker/tests/test_admin.py,sha256=XFAlF_Q4h5Z_agkmRtB30GmCayqQPblLolFrN41xu7Q,5659
|
37
37
|
killtracker/tests/test_admin_2.py,sha256=rP0EscM9qUil_ZuXute3R8TQY2P5XSjmxHLbziCGcVw,1140
|
38
38
|
killtracker/tests/test_exceptions.py,sha256=wheTwm0JOBqYVI-DJM4KK2usFAZT1Q-O52VMOnSAz8Y,326
|
39
|
-
killtracker/tests/test_integration.py,sha256=
|
39
|
+
killtracker/tests/test_integration.py,sha256=EX0IQGU_Vwsmjeoqeprg13VuW8AT9I8CT1bm3_cvfPs,3226
|
40
40
|
killtracker/tests/test_tasks.py,sha256=ZDoCUBd-1kSOKrvSeTrlDaSGFmzHieT5ef0iBz6nr2I,13929
|
41
41
|
killtracker/tests/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
42
|
-
killtracker/tests/core/test_discord_messages_1.py,sha256=
|
43
|
-
killtracker/tests/core/test_discord_messages_2.py,sha256=
|
44
|
-
killtracker/tests/core/test_killmails.py,sha256=
|
42
|
+
killtracker/tests/core/test_discord_messages_1.py,sha256=1cYpj4E9pNqQOeE7yWeV1mme-JYGIHfSIibOauEHi88,3101
|
43
|
+
killtracker/tests/core/test_discord_messages_2.py,sha256=AppA_FUFQA5I35UKjaEwn_ZQcnscqillR1SIo1unwJg,4774
|
44
|
+
killtracker/tests/core/test_killmails.py,sha256=GdU5glj9as4l17GQpzZvNCaXzLM2fP2LLhbF7JOUogU,14148
|
45
45
|
killtracker/tests/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
46
|
-
killtracker/tests/models/test_killmails.py,sha256=
|
47
|
-
killtracker/tests/models/test_trackers_1.py,sha256=
|
48
|
-
killtracker/tests/models/test_trackers_2.py,sha256=
|
46
|
+
killtracker/tests/models/test_killmails.py,sha256=0ytwIGbTPb1OTzmK8B9VnR1ylxMuaYtp2tvCXzNOwNc,8293
|
47
|
+
killtracker/tests/models/test_trackers_1.py,sha256=h9RNQ8h4bCf_LsbyO-wycbFn3WcmADZS4qnmo2B1RMo,35242
|
48
|
+
killtracker/tests/models/test_trackers_2.py,sha256=FmtaWBjV32NlIjYPaG5Kh87oES5ChoDMVJ4ol2uWopE,5404
|
49
49
|
killtracker/tests/models/test_webhook.py,sha256=E4BgmQw9mI5ZenV6ncYHbBonlEeWvvdilAS8IKFkbjw,5246
|
50
50
|
killtracker/tests/testdata/__init__.py,sha256=9aQhf8V-DseZMWjJ_QMXOba6CypoHFSVpYRZEUh-oFc,212
|
51
51
|
killtracker/tests/testdata/create_eveuniverse.py,sha256=Ewr5OBiQwjK1kwDCRh3A3f0Z-CCPi8Gp8dpsPgVAU4A,966
|
@@ -59,7 +59,7 @@ killtracker/tests/testdata/killmails.json,sha256=HKfpXQJ_ikymBSewh4wWixYpLwC3kNB
|
|
59
59
|
killtracker/tests/testdata/load_eveuniverse.py,sha256=FitVc12E_ob56ezK5Y1q07Kbyc7N8poHiCNaLRGU4Jg,388
|
60
60
|
killtracker/tools/drop_tables_killtracker.sql,sha256=fJrGY23NKRunpYC3hI-klFkWub4sBuhfP8TaT__zjPg,1726
|
61
61
|
killtracker/tools/generate_conditions_text.py,sha256=CiXBtaH2KY6JHpuxNlGmxLI6GsvxKKBX5xhXsSz3Rno,768
|
62
|
-
aa_killtracker-0.
|
63
|
-
aa_killtracker-0.
|
64
|
-
aa_killtracker-0.
|
65
|
-
aa_killtracker-0.
|
62
|
+
aa_killtracker-0.14.0.dist-info/LICENSE,sha256=XZiwB_S_40_HhnvLg5xvtBb3g1oGjPrk0rpFwk8iInE,1070
|
63
|
+
aa_killtracker-0.14.0.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81
|
64
|
+
aa_killtracker-0.14.0.dist-info/METADATA,sha256=3RNa9LwqMBs6kQUdcSusm5qm883oTXuz1z1brXzRxqA,13380
|
65
|
+
aa_killtracker-0.14.0.dist-info/RECORD,,
|
killtracker/__init__.py
CHANGED
killtracker/app_settings.py
CHANGED
@@ -2,77 +2,100 @@
|
|
2
2
|
|
3
3
|
from app_utils.app_settings import clean_setting
|
4
4
|
|
5
|
-
# Timeout for lock to ensure atomic access to ZKB RedisQ
|
6
5
|
KILLTRACKER_REDISQ_LOCK_TIMEOUT = clean_setting("KILLTRACKER_REDISQ_LOCK_TIMEOUT", 5)
|
6
|
+
"""Timeout for lock to ensure atomic access to ZKB RedisQ."""
|
7
7
|
|
8
|
-
# ignore killmails that are older than the given number in minutes
|
9
|
-
# sometimes killmails appear belated on ZKB,
|
10
|
-
# this feature ensures they don't create new alerts
|
11
8
|
KILLTRACKER_KILLMAIL_MAX_AGE_FOR_TRACKER = clean_setting(
|
12
9
|
"KILLTRACKER_KILLMAIL_MAX_AGE_FOR_TRACKER", 60
|
13
10
|
)
|
11
|
+
"""Ignore killmails that are older than the given number in minutes
|
12
|
+
sometimes killmails appear belated on ZKB,
|
13
|
+
this feature ensures they don't create new alerts.
|
14
|
+
"""
|
14
15
|
|
15
|
-
# Maximum number of killmails retrieved from ZKB by task run
|
16
16
|
KILLTRACKER_MAX_KILLMAILS_PER_RUN = clean_setting(
|
17
17
|
"KILLTRACKER_MAX_KILLMAILS_PER_RUN", 200
|
18
18
|
)
|
19
|
+
"""Maximum number of killmails retrieved from ZKB by task run."""
|
19
20
|
|
20
|
-
# Killmails older than set number of days will be purged from the database.
|
21
|
-
# If you want to keep all killmails set this to 0.
|
22
21
|
KILLTRACKER_PURGE_KILLMAILS_AFTER_DAYS = clean_setting(
|
23
22
|
"KILLTRACKER_PURGE_KILLMAILS_AFTER_DAYS", 30
|
24
23
|
)
|
24
|
+
"""Killmails older than set number of days will be purged from the database.
|
25
|
+
If you want to keep all killmails set this to 0.
|
26
|
+
"""
|
27
|
+
|
28
|
+
KILLTRACKER_QUEUE_ID = clean_setting("KILLTRACKER_QUEUE_ID", "")
|
29
|
+
"""Unique ID used to identify this server when fetching killmails from zKillboard.
|
30
|
+
|
31
|
+
Please note that the queue ID must be globally unique for all users of the zKillboard API, so choose carefully.
|
32
|
+
|
33
|
+
We recommend using only characters (upper and lower case) and numbers,
|
34
|
+
but no spaces or any special characters when choosing your ID.
|
35
|
+
|
36
|
+
Example: ``"Voltron9000"`` (don't use this exact example)
|
37
|
+
|
38
|
+
We suggest to use your alliance or corporation name (without spaces and special characters) as queue ID.
|
39
|
+
|
40
|
+
If you are running multiple instances of Killtracker please choose a different queue ID for each of them.
|
41
|
+
|
42
|
+
This setting is mandatory.
|
43
|
+
"""
|
44
|
+
|
25
45
|
|
26
|
-
# whether killmails retrieved from ZKB are stored in the database
|
27
46
|
KILLTRACKER_STORING_KILLMAILS_ENABLED = clean_setting(
|
28
47
|
"KILLTRACKER_STORING_KILLMAILS_ENABLED", False
|
29
48
|
)
|
49
|
+
"""Whether killmails retrieved from ZKB are stored in the database."""
|
30
50
|
|
31
|
-
# Wether app sets the name and avatar icon of a webhook.
|
32
|
-
# When False the webhook will use it's own values as set on the platform
|
33
51
|
KILLTRACKER_WEBHOOK_SET_AVATAR = clean_setting("KILLTRACKER_WEBHOOK_SET_AVATAR", True)
|
52
|
+
"""Wether app sets the name and avatar icon of a webhook.
|
53
|
+
When False the webhook will use it's own values as set on the platform.
|
54
|
+
"""
|
34
55
|
|
35
|
-
|
36
|
-
# Wether NPC types (e.g. Guristas Assaulter) can be selected as attacker types
|
37
|
-
# when creating trackers
|
38
56
|
KILLTRACKER_SHOW_NPC_TYPES = clean_setting("KILLTRACKER_SHOW_NPC_TYPES", True)
|
57
|
+
"""Wether NPC types (e.g. Guristas Assaulter) can be selected as attacker types
|
58
|
+
when creating trackers.
|
59
|
+
"""
|
60
|
+
|
39
61
|
|
40
62
|
#####################
|
41
63
|
# INTERNAL SETTINGS
|
42
64
|
|
43
|
-
# Max duration to wait for new killmails from redisq in seconds
|
44
65
|
KILLTRACKER_REDISQ_TTW = clean_setting("KILLTRACKER_REDISQ_TTW", 5)
|
66
|
+
"""Max duration to wait for new killmails from redisq in seconds."""
|
45
67
|
|
46
|
-
# Tasks hard timeout
|
47
68
|
KILLTRACKER_TASKS_TIMEOUT = clean_setting("KILLTRACKER_TASKS_TIMEOUT", 1_800)
|
69
|
+
"""Tasks hard timeout."""
|
48
70
|
|
49
|
-
# delay in seconds between every message sent to Discord
|
50
|
-
# this needs to be >= 1 to prevent 429 Too Many Request errors
|
51
71
|
KILLTRACKER_DISCORD_SEND_DELAY = clean_setting(
|
52
72
|
"KILLTRACKER_DISCORD_SEND_DELAY", default_value=2, min_value=1, max_value=900
|
53
73
|
)
|
74
|
+
"""Delay in seconds between every message sent to Discord
|
75
|
+
this needs to be >= 1 to prevent 429 Too Many Request errors.
|
76
|
+
"""
|
54
77
|
|
55
|
-
# Maximum retries when generating a message from a killmail
|
56
78
|
KILLTRACKER_GENERATE_MESSAGE_MAX_RETRIES = clean_setting(
|
57
79
|
"KILLTRACKER_GENERATE_MESSAGE_MAX_RETRIES", 3
|
58
80
|
)
|
81
|
+
"""Maximum retries when generating a message from a killmail."""
|
59
82
|
|
60
|
-
# Delay when retrying to generate a message in seconds
|
61
83
|
KILLTRACKER_GENERATE_MESSAGE_RETRY_COUNTDOWN = clean_setting(
|
62
84
|
"KILLTRACKER_GENERATE_MESSAGE_RETRY_COUNTDOWN", 10
|
63
85
|
)
|
86
|
+
"""Delay when retrying to generate a message in seconds."""
|
64
87
|
|
65
|
-
# Cache duration for objects in tasks in seconds
|
66
88
|
KILLTRACKER_TASK_OBJECTS_CACHE_TIMEOUT = clean_setting(
|
67
89
|
"KILLTRACKER_TASK_OBJECTS_CACHE_TIMEOUT", 60
|
68
90
|
)
|
91
|
+
"""Cache duration for objects in tasks in seconds."""
|
69
92
|
|
70
|
-
# Minimum delay when retrying a task
|
71
93
|
KILLTRACKER_TASK_MINIMUM_RETRY_DELAY = clean_setting(
|
72
94
|
"KILLTRACKER_TASK_MINIMUM_RETRY_DELAY", default_value=0.05
|
73
95
|
)
|
96
|
+
"""Minimum delay when retrying a task."""
|
74
97
|
|
75
|
-
# Max lifetime of killmails in temporary storage in seconds
|
76
98
|
KILLTRACKER_STORAGE_KILLMAILS_LIFETIME = clean_setting(
|
77
99
|
"KILLTRACKER_STORAGE_KILLMAILS_LIFETIME", 3_600 * 1
|
78
100
|
)
|
101
|
+
"""Max lifetime of killmails in temporary storage in seconds."""
|
killtracker/core/killmails.py
CHANGED
@@ -8,6 +8,7 @@ from dataclasses import asdict, dataclass
|
|
8
8
|
from datetime import datetime
|
9
9
|
from http import HTTPStatus
|
10
10
|
from typing import List, Optional, Set
|
11
|
+
from urllib.parse import quote_plus
|
11
12
|
|
12
13
|
import requests
|
13
14
|
from dacite import DaciteError, from_dict
|
@@ -16,6 +17,7 @@ from simplejson.errors import JSONDecodeError
|
|
16
17
|
|
17
18
|
from django.conf import settings
|
18
19
|
from django.core.cache import cache
|
20
|
+
from django.core.exceptions import ImproperlyConfigured
|
19
21
|
from django.utils.dateparse import parse_datetime
|
20
22
|
from eveuniverse.models import EveType
|
21
23
|
|
@@ -26,6 +28,7 @@ from app_utils.logging import LoggerAddTag
|
|
26
28
|
|
27
29
|
from killtracker import USER_AGENT_TEXT, __title__
|
28
30
|
from killtracker.app_settings import (
|
31
|
+
KILLTRACKER_QUEUE_ID,
|
29
32
|
KILLTRACKER_REDISQ_LOCK_TIMEOUT,
|
30
33
|
KILLTRACKER_REDISQ_TTW,
|
31
34
|
KILLTRACKER_STORAGE_KILLMAILS_LIFETIME,
|
@@ -43,6 +46,8 @@ REQUESTS_TIMEOUT = (5, 30)
|
|
43
46
|
MAIN_MINIMUM_COUNT = 2
|
44
47
|
MAIN_MINIMUM_SHARE = 0.25
|
45
48
|
|
49
|
+
# TODO: Factor out logic for accessing the API to another module
|
50
|
+
|
46
51
|
|
47
52
|
@dataclass
|
48
53
|
class _KillmailBase:
|
@@ -385,15 +390,27 @@ class Killmail(_KillmailBase):
|
|
385
390
|
|
386
391
|
Returns None if no killmail is received.
|
387
392
|
"""
|
388
|
-
|
393
|
+
if not KILLTRACKER_QUEUE_ID:
|
394
|
+
raise ImproperlyConfigured(
|
395
|
+
"You need to define a queue ID in your settings."
|
396
|
+
)
|
397
|
+
|
398
|
+
if "," in KILLTRACKER_QUEUE_ID:
|
399
|
+
raise ImproperlyConfigured("A queue ID must not contains commas.")
|
400
|
+
|
389
401
|
redis = get_redis_client()
|
402
|
+
params = {
|
403
|
+
"queueID": quote_plus(KILLTRACKER_QUEUE_ID),
|
404
|
+
"ttw": KILLTRACKER_REDISQ_TTW,
|
405
|
+
}
|
390
406
|
try:
|
407
|
+
logger.info("Trying to fetch killmail from ZKB RedisQ...")
|
391
408
|
with redis.lock(
|
392
409
|
cls.lock_key(), blocking_timeout=KILLTRACKER_REDISQ_LOCK_TIMEOUT
|
393
410
|
):
|
394
411
|
response = requests.get(
|
395
412
|
ZKB_REDISQ_URL,
|
396
|
-
params=
|
413
|
+
params=params,
|
397
414
|
timeout=REQUESTS_TIMEOUT,
|
398
415
|
headers={"User-Agent": USER_AGENT_TEXT},
|
399
416
|
)
|
@@ -407,7 +424,9 @@ class Killmail(_KillmailBase):
|
|
407
424
|
if response.status_code == HTTPStatus.TOO_MANY_REQUESTS:
|
408
425
|
logger.error("429 Client Error: Too many requests: %s", response.text)
|
409
426
|
return None
|
427
|
+
|
410
428
|
response.raise_for_status()
|
429
|
+
|
411
430
|
try:
|
412
431
|
data = response.json()
|
413
432
|
except JSONDecodeError:
|
@@ -3,15 +3,14 @@ import dhooks_lite
|
|
3
3
|
from app_utils.testing import NoSocketsTestCase
|
4
4
|
|
5
5
|
from killtracker.core import discord_messages
|
6
|
-
|
7
|
-
from ..testdata.factories import (
|
6
|
+
from killtracker.tests.testdata.factories import (
|
8
7
|
EveEntityVariant,
|
9
8
|
KillmailFactory,
|
10
9
|
TrackerFactory,
|
11
10
|
random_eve_entity,
|
12
11
|
)
|
13
|
-
from
|
14
|
-
from
|
12
|
+
from killtracker.tests.testdata.helpers import load_eve_entities
|
13
|
+
from killtracker.tests.testdata.load_eveuniverse import load_eveuniverse
|
15
14
|
|
16
15
|
|
17
16
|
class TestCreateEmbed(NoSocketsTestCase):
|
@@ -10,9 +10,8 @@ from app_utils.django import app_labels
|
|
10
10
|
|
11
11
|
from killtracker.core.killmails import Killmail
|
12
12
|
from killtracker.models import Tracker
|
13
|
-
|
14
|
-
from
|
15
|
-
from ..testdata.helpers import LoadTestDataMixin, load_killmail
|
13
|
+
from killtracker.tests.testdata.factories import TrackerFactory
|
14
|
+
from killtracker.tests.testdata.helpers import LoadTestDataMixin, load_killmail
|
16
15
|
|
17
16
|
DISCORD_MESSAGES_PATH = "killtracker.core.discord_messages"
|
18
17
|
|
@@ -6,6 +6,7 @@ import requests_mock
|
|
6
6
|
from redis.exceptions import LockError
|
7
7
|
|
8
8
|
from django.core.cache import cache
|
9
|
+
from django.core.exceptions import ImproperlyConfigured
|
9
10
|
from django.test import TestCase
|
10
11
|
from django.utils.dateparse import parse_datetime
|
11
12
|
from django.utils.timezone import now
|
@@ -20,18 +21,19 @@ from killtracker.core.killmails import (
|
|
20
21
|
_EntityCount,
|
21
22
|
)
|
22
23
|
from killtracker.exceptions import KillmailDoesNotExist
|
23
|
-
|
24
|
-
from
|
25
|
-
from
|
26
|
-
from ..testdata.helpers import killmails_data, load_killmail
|
24
|
+
from killtracker.tests import CacheStub
|
25
|
+
from killtracker.tests.testdata.factories import KillmailFactory
|
26
|
+
from killtracker.tests.testdata.helpers import killmails_data, load_killmail
|
27
27
|
|
28
28
|
MODULE_PATH = "killtracker.core.killmails"
|
29
29
|
unittest.util._MAX_LENGTH = 1000
|
30
|
+
requests_mock.mock.case_sensitive = True
|
30
31
|
|
31
32
|
|
32
33
|
@requests_mock.Mocker()
|
33
34
|
@patch(MODULE_PATH + ".get_redis_client")
|
34
35
|
class TestCreateFromZkbRedisq(NoSocketsTestCase):
|
36
|
+
@patch(MODULE_PATH + ".KILLTRACKER_QUEUE_ID", "dummy")
|
35
37
|
def test_should_return_killmail(self, requests_mocker, mock_redis):
|
36
38
|
# given
|
37
39
|
requests_mocker.register_uri(
|
@@ -71,6 +73,7 @@ class TestCreateFromZkbRedisq(NoSocketsTestCase):
|
|
71
73
|
self.assertFalse(killmail.zkb.is_solo)
|
72
74
|
self.assertFalse(killmail.zkb.is_awox)
|
73
75
|
|
76
|
+
@patch(MODULE_PATH + ".KILLTRACKER_QUEUE_ID", "dummy")
|
74
77
|
def test_should_return_none_when_zkb_returns_empty_package(
|
75
78
|
self, requests_mocker, mock_redis
|
76
79
|
):
|
@@ -83,6 +86,7 @@ class TestCreateFromZkbRedisq(NoSocketsTestCase):
|
|
83
86
|
# then
|
84
87
|
self.assertIsNone(killmail)
|
85
88
|
|
89
|
+
@patch(MODULE_PATH + ".KILLTRACKER_QUEUE_ID", "dummy")
|
86
90
|
def test_should_handle_zkb_data_has_no_solar_system(
|
87
91
|
self, requests_mocker, mock_redis
|
88
92
|
):
|
@@ -98,6 +102,7 @@ class TestCreateFromZkbRedisq(NoSocketsTestCase):
|
|
98
102
|
# then
|
99
103
|
self.assertIsNotNone(killmail)
|
100
104
|
|
105
|
+
@patch(MODULE_PATH + ".KILLTRACKER_QUEUE_ID", "dummy")
|
101
106
|
def test_should_return_none_when_zkb_returns_429_error(
|
102
107
|
self, requests_mocker, mock_redis
|
103
108
|
):
|
@@ -110,6 +115,7 @@ class TestCreateFromZkbRedisq(NoSocketsTestCase):
|
|
110
115
|
# then
|
111
116
|
self.assertIsNone(killmail)
|
112
117
|
|
118
|
+
@patch(MODULE_PATH + ".KILLTRACKER_QUEUE_ID", "dummy")
|
113
119
|
def test_should_return_none_when_zkb_returns_general_error(
|
114
120
|
self, requests_mocker, mock_redis
|
115
121
|
):
|
@@ -127,6 +133,7 @@ You can only have one request to listen.php in flight at any time, otherwise you
|
|
127
133
|
# then
|
128
134
|
self.assertIsNone(killmail)
|
129
135
|
|
136
|
+
@patch(MODULE_PATH + ".KILLTRACKER_QUEUE_ID", "dummy")
|
130
137
|
def test_should_return_none_when_zkb_does_not_return_json(
|
131
138
|
self, requests_mocker, mock_redis
|
132
139
|
):
|
@@ -139,6 +146,7 @@ You can only have one request to listen.php in flight at any time, otherwise you
|
|
139
146
|
# then
|
140
147
|
self.assertIsNone(killmail)
|
141
148
|
|
149
|
+
@patch(MODULE_PATH + ".KILLTRACKER_QUEUE_ID", "dummy")
|
142
150
|
def test_should_return_none_if_lock_not_acquired(self, requests_mocker, mock_redis):
|
143
151
|
# given
|
144
152
|
mock_redis.return_value.lock.side_effect = LockError
|
@@ -147,6 +155,56 @@ You can only have one request to listen.php in flight at any time, otherwise you
|
|
147
155
|
# then
|
148
156
|
self.assertIsNone(killmail)
|
149
157
|
|
158
|
+
@patch(MODULE_PATH + ".KILLTRACKER_QUEUE_ID", "Voltron9000")
|
159
|
+
def test_should_have_queue_id_in_request(self, requests_mocker, mock_redis):
|
160
|
+
# given
|
161
|
+
requests_mocker.register_uri(
|
162
|
+
"GET", ZKB_REDISQ_URL, status_code=200, json={"package": None}
|
163
|
+
)
|
164
|
+
# when
|
165
|
+
Killmail.create_from_zkb_redisq()
|
166
|
+
# then
|
167
|
+
qs = requests_mocker.last_request.qs
|
168
|
+
self.assertIn("queueID", qs)
|
169
|
+
queue_id = qs["queueID"]
|
170
|
+
self.assertEqual(len(queue_id), 1)
|
171
|
+
self.assertEqual(queue_id[0], "Voltron9000")
|
172
|
+
|
173
|
+
@patch(MODULE_PATH + ".KILLTRACKER_QUEUE_ID", "")
|
174
|
+
def test_should_abort_when_no_queue_id_defined(self, requests_mocker, mock_redis):
|
175
|
+
# given
|
176
|
+
requests_mocker.register_uri(
|
177
|
+
"GET", ZKB_REDISQ_URL, status_code=200, json={"package": None}
|
178
|
+
)
|
179
|
+
# when/then
|
180
|
+
with self.assertRaises(ImproperlyConfigured):
|
181
|
+
Killmail.create_from_zkb_redisq()
|
182
|
+
|
183
|
+
@patch(MODULE_PATH + ".KILLTRACKER_QUEUE_ID", "Möchtegern")
|
184
|
+
def test_should_urlize_queue_ids(self, requests_mocker, mock_redis):
|
185
|
+
# given
|
186
|
+
requests_mocker.register_uri(
|
187
|
+
"GET", ZKB_REDISQ_URL, status_code=200, json={"package": None}
|
188
|
+
)
|
189
|
+
# when
|
190
|
+
Killmail.create_from_zkb_redisq()
|
191
|
+
# then
|
192
|
+
qs = requests_mocker.last_request.qs
|
193
|
+
self.assertIn("queueID", qs)
|
194
|
+
queue_id = qs["queueID"]
|
195
|
+
self.assertEqual(len(queue_id), 1)
|
196
|
+
self.assertEqual(queue_id[0], "M%C3%B6chtegern")
|
197
|
+
|
198
|
+
@patch(MODULE_PATH + ".KILLTRACKER_QUEUE_ID", "alpha,bravo")
|
199
|
+
def test_should_not_accept_list_for_queue_id(self, requests_mocker, mock_redis):
|
200
|
+
# given
|
201
|
+
requests_mocker.register_uri(
|
202
|
+
"GET", ZKB_REDISQ_URL, status_code=200, json={"package": None}
|
203
|
+
)
|
204
|
+
# when/then
|
205
|
+
with self.assertRaises(ImproperlyConfigured):
|
206
|
+
Killmail.create_from_zkb_redisq()
|
207
|
+
|
150
208
|
|
151
209
|
class TestKillmailSerialization(NoSocketsTestCase):
|
152
210
|
def test_dict_serialization(self):
|
@@ -7,15 +7,17 @@ from eveuniverse.models import EveEntity
|
|
7
7
|
from app_utils.testing import NoSocketsTestCase
|
8
8
|
|
9
9
|
from killtracker.models import EveKillmail
|
10
|
-
|
11
|
-
|
12
|
-
|
10
|
+
from killtracker.tests.testdata.factories import (
|
11
|
+
EveKillmailAttackerFactory,
|
12
|
+
EveKillmailFactory,
|
13
|
+
)
|
14
|
+
from killtracker.tests.testdata.helpers import (
|
13
15
|
LoadTestDataMixin,
|
14
16
|
load_eve_entities,
|
15
17
|
load_eve_killmails,
|
16
18
|
load_killmail,
|
17
19
|
)
|
18
|
-
from
|
20
|
+
from killtracker.tests.testdata.load_eveuniverse import load_eveuniverse
|
19
21
|
|
20
22
|
MODELS_PATH = "killtracker.models.killmails"
|
21
23
|
|
@@ -22,14 +22,13 @@ from app_utils.testing import NoSocketsTestCase, add_character_to_user_2
|
|
22
22
|
from killtracker.constants import EveGroupId
|
23
23
|
from killtracker.core.killmails import Killmail, _EntityCount
|
24
24
|
from killtracker.models import Tracker
|
25
|
-
|
26
|
-
from ..testdata.factories import (
|
25
|
+
from killtracker.tests.testdata.factories import (
|
27
26
|
KillmailAttackerFactory,
|
28
27
|
KillmailFactory,
|
29
28
|
KillmailVictimFactory,
|
30
29
|
TrackerFactory,
|
31
30
|
)
|
32
|
-
from
|
31
|
+
from killtracker.tests.testdata.helpers import LoadTestDataMixin, load_killmail
|
33
32
|
|
34
33
|
MODELS_PATH = "killtracker.models"
|
35
34
|
|
@@ -9,9 +9,8 @@ from eveuniverse.models import EveConstellation, EveRegion, EveSolarSystem, EveT
|
|
9
9
|
from app_utils.testing import NoSocketsTestCase
|
10
10
|
|
11
11
|
from killtracker.core.killmails import Killmail
|
12
|
-
|
13
|
-
from
|
14
|
-
from ..testdata.helpers import LoadTestDataMixin, load_killmail
|
12
|
+
from killtracker.tests.testdata.factories import TrackerFactory
|
13
|
+
from killtracker.tests.testdata.helpers import LoadTestDataMixin, load_killmail
|
15
14
|
|
16
15
|
MODELS_PATH = "killtracker.models.trackers"
|
17
16
|
|
killtracker/tests/test_admin.py
CHANGED
@@ -62,7 +62,7 @@ class TestTrackerValidations(LoadTestDataMixin, WebTest):
|
|
62
62
|
# user tries to add new notification rule
|
63
63
|
add_page = self.app.get(self.url_add)
|
64
64
|
self.assertEqual(add_page.status_code, 200)
|
65
|
-
form = add_page.
|
65
|
+
form = add_page.forms["tracker_form"]
|
66
66
|
form["name"] = "Test Tracker"
|
67
67
|
form["webhook"] = self.webhook_1.pk
|
68
68
|
return form
|
@@ -18,6 +18,7 @@ PACKAGE_PATH = "killtracker"
|
|
18
18
|
|
19
19
|
@patch("celery.app.task.Context.called_directly", False) # make retry work with eager
|
20
20
|
@override_settings(CELERY_ALWAYS_EAGER=True)
|
21
|
+
@patch(PACKAGE_PATH + ".core.killmails.KILLTRACKER_QUEUE_ID", "dummy")
|
21
22
|
@patch(PACKAGE_PATH + ".tasks.is_esi_online", lambda: True)
|
22
23
|
@patch(PACKAGE_PATH + ".models.webhooks.dhooks_lite.Webhook.execute", spec=True)
|
23
24
|
@requests_mock.Mocker()
|
File without changes
|
File without changes
|