aa-killtracker 0.12.1__tar.gz → 0.14.0__tar.gz

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.
Files changed (66) hide show
  1. {aa_killtracker-0.12.1 → aa_killtracker-0.14.0}/PKG-INFO +35 -7
  2. {aa_killtracker-0.12.1 → aa_killtracker-0.14.0}/README.md +33 -6
  3. {aa_killtracker-0.12.1 → aa_killtracker-0.14.0}/killtracker/__init__.py +1 -1
  4. aa_killtracker-0.14.0/killtracker/app_settings.py +101 -0
  5. {aa_killtracker-0.12.1 → aa_killtracker-0.14.0}/killtracker/core/killmails.py +21 -2
  6. {aa_killtracker-0.12.1 → aa_killtracker-0.14.0}/killtracker/tests/core/test_discord_messages_1.py +3 -4
  7. {aa_killtracker-0.12.1 → aa_killtracker-0.14.0}/killtracker/tests/core/test_discord_messages_2.py +2 -3
  8. {aa_killtracker-0.12.1 → aa_killtracker-0.14.0}/killtracker/tests/core/test_killmails.py +62 -4
  9. {aa_killtracker-0.12.1 → aa_killtracker-0.14.0}/killtracker/tests/models/test_killmails.py +6 -4
  10. {aa_killtracker-0.12.1 → aa_killtracker-0.14.0}/killtracker/tests/models/test_trackers_1.py +2 -3
  11. {aa_killtracker-0.12.1 → aa_killtracker-0.14.0}/killtracker/tests/models/test_trackers_2.py +2 -3
  12. {aa_killtracker-0.12.1 → aa_killtracker-0.14.0}/killtracker/tests/test_admin.py +1 -1
  13. {aa_killtracker-0.12.1 → aa_killtracker-0.14.0}/killtracker/tests/test_integration.py +1 -0
  14. {aa_killtracker-0.12.1 → aa_killtracker-0.14.0}/pyproject.toml +1 -0
  15. aa_killtracker-0.12.1/killtracker/app_settings.py +0 -78
  16. {aa_killtracker-0.12.1 → aa_killtracker-0.14.0}/LICENSE +0 -0
  17. {aa_killtracker-0.12.1 → aa_killtracker-0.14.0}/killtracker/admin.py +0 -0
  18. {aa_killtracker-0.12.1 → aa_killtracker-0.14.0}/killtracker/apps.py +0 -0
  19. {aa_killtracker-0.12.1 → aa_killtracker-0.14.0}/killtracker/constants.py +0 -0
  20. {aa_killtracker-0.12.1 → aa_killtracker-0.14.0}/killtracker/core/__init__.py +0 -0
  21. {aa_killtracker-0.12.1 → aa_killtracker-0.14.0}/killtracker/core/discord_messages.py +0 -0
  22. {aa_killtracker-0.12.1 → aa_killtracker-0.14.0}/killtracker/exceptions.py +0 -0
  23. {aa_killtracker-0.12.1 → aa_killtracker-0.14.0}/killtracker/forms.py +0 -0
  24. {aa_killtracker-0.12.1 → aa_killtracker-0.14.0}/killtracker/management/commands/killtracker_load_eve.py +0 -0
  25. {aa_killtracker-0.12.1 → aa_killtracker-0.14.0}/killtracker/managers.py +0 -0
  26. {aa_killtracker-0.12.1 → aa_killtracker-0.14.0}/killtracker/migrations/0001_initial_new.py +0 -0
  27. {aa_killtracker-0.12.1 → aa_killtracker-0.14.0}/killtracker/migrations/0001_squashed_all.py +0 -0
  28. {aa_killtracker-0.12.1 → aa_killtracker-0.14.0}/killtracker/migrations/0002_fix_webhook_notes_field.py +0 -0
  29. {aa_killtracker-0.12.1 → aa_killtracker-0.14.0}/killtracker/migrations/0002_tracker_require_attackers_weapon_groups_and_more.py +0 -0
  30. {aa_killtracker-0.12.1 → aa_killtracker-0.14.0}/killtracker/migrations/0003_add_state_clauses.py +0 -0
  31. {aa_killtracker-0.12.1 → aa_killtracker-0.14.0}/killtracker/migrations/0003_optimize_tracker_form.py +0 -0
  32. {aa_killtracker-0.12.1 → aa_killtracker-0.14.0}/killtracker/migrations/0004_django4_update.py +0 -0
  33. {aa_killtracker-0.12.1 → aa_killtracker-0.14.0}/killtracker/migrations/0005_add_final_blow_clause_and_more.py +0 -0
  34. {aa_killtracker-0.12.1 → aa_killtracker-0.14.0}/killtracker/migrations/0006_evetypeplus.py +0 -0
  35. {aa_killtracker-0.12.1 → aa_killtracker-0.14.0}/killtracker/migrations/0007_restructure_killsmails.py +0 -0
  36. {aa_killtracker-0.12.1 → aa_killtracker-0.14.0}/killtracker/migrations/0008_copy_data_to_new_structure.py +0 -0
  37. {aa_killtracker-0.12.1 → aa_killtracker-0.14.0}/killtracker/migrations/0009_remove_old_models.py +0 -0
  38. {aa_killtracker-0.12.1 → aa_killtracker-0.14.0}/killtracker/migrations/__init__.py +0 -0
  39. {aa_killtracker-0.12.1 → aa_killtracker-0.14.0}/killtracker/models/__init__.py +0 -0
  40. {aa_killtracker-0.12.1 → aa_killtracker-0.14.0}/killtracker/models/killmails.py +0 -0
  41. {aa_killtracker-0.12.1 → aa_killtracker-0.14.0}/killtracker/models/trackers.py +0 -0
  42. {aa_killtracker-0.12.1 → aa_killtracker-0.14.0}/killtracker/models/webhooks.py +0 -0
  43. {aa_killtracker-0.12.1 → aa_killtracker-0.14.0}/killtracker/providers.py +0 -0
  44. {aa_killtracker-0.12.1 → aa_killtracker-0.14.0}/killtracker/static/killtracker/killtracker_logo.png +0 -0
  45. {aa_killtracker-0.12.1 → aa_killtracker-0.14.0}/killtracker/static/killtracker/zkb_icon.png +0 -0
  46. {aa_killtracker-0.12.1 → aa_killtracker-0.14.0}/killtracker/tasks.py +0 -0
  47. {aa_killtracker-0.12.1 → aa_killtracker-0.14.0}/killtracker/templates/admin/killtracker/tracker/killmail_test.html +0 -0
  48. {aa_killtracker-0.12.1 → aa_killtracker-0.14.0}/killtracker/tests/__init__.py +0 -0
  49. {aa_killtracker-0.12.1 → aa_killtracker-0.14.0}/killtracker/tests/core/__init__.py +0 -0
  50. {aa_killtracker-0.12.1 → aa_killtracker-0.14.0}/killtracker/tests/models/__init__.py +0 -0
  51. {aa_killtracker-0.12.1 → aa_killtracker-0.14.0}/killtracker/tests/models/test_webhook.py +0 -0
  52. {aa_killtracker-0.12.1 → aa_killtracker-0.14.0}/killtracker/tests/test_admin_2.py +0 -0
  53. {aa_killtracker-0.12.1 → aa_killtracker-0.14.0}/killtracker/tests/test_exceptions.py +0 -0
  54. {aa_killtracker-0.12.1 → aa_killtracker-0.14.0}/killtracker/tests/test_tasks.py +0 -0
  55. {aa_killtracker-0.12.1 → aa_killtracker-0.14.0}/killtracker/tests/testdata/__init__.py +0 -0
  56. {aa_killtracker-0.12.1 → aa_killtracker-0.14.0}/killtracker/tests/testdata/create_eveuniverse.py +0 -0
  57. {aa_killtracker-0.12.1 → aa_killtracker-0.14.0}/killtracker/tests/testdata/evealliances.json +0 -0
  58. {aa_killtracker-0.12.1 → aa_killtracker-0.14.0}/killtracker/tests/testdata/evecorporations.json +0 -0
  59. {aa_killtracker-0.12.1 → aa_killtracker-0.14.0}/killtracker/tests/testdata/eveentities.json +0 -0
  60. {aa_killtracker-0.12.1 → aa_killtracker-0.14.0}/killtracker/tests/testdata/eveuniverse.json +0 -0
  61. {aa_killtracker-0.12.1 → aa_killtracker-0.14.0}/killtracker/tests/testdata/factories.py +0 -0
  62. {aa_killtracker-0.12.1 → aa_killtracker-0.14.0}/killtracker/tests/testdata/helpers.py +0 -0
  63. {aa_killtracker-0.12.1 → aa_killtracker-0.14.0}/killtracker/tests/testdata/killmails.json +0 -0
  64. {aa_killtracker-0.12.1 → aa_killtracker-0.14.0}/killtracker/tests/testdata/load_eveuniverse.py +0 -0
  65. {aa_killtracker-0.12.1 → aa_killtracker-0.14.0}/killtracker/tools/drop_tables_killtracker.sql +0 -0
  66. {aa_killtracker-0.12.1 → aa_killtracker-0.14.0}/killtracker/tools/generate_conditions_text.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: aa-killtracker
3
- Version: 0.12.1
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
- # killtracker
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 Auth settings (`local.py`) as follows:
103
+ Configure your AA settings (`local.py`) as follows:
103
104
 
104
- - Add `'killtracker'` to `INSTALLED_APPS`
105
- - Add below lines to your settings file:
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
- - Optional: Add additional settings if you want to change any defaults. See [Settings](#settings) for the full list.
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
- `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`
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,4 +1,4 @@
1
- # killtracker
1
+ # Killtracker
2
2
 
3
3
  An app for running killmail trackers with Alliance Auth and Discord.
4
4
 
@@ -71,19 +71,45 @@ pip install aa-killtracker
71
71
 
72
72
  ### Step 3 - Configure settings
73
73
 
74
- Configure your Auth settings (`local.py`) as follows:
74
+ Configure your AA settings (`local.py`) as follows:
75
75
 
76
- - Add `'killtracker'` to `INSTALLED_APPS`
77
- - Add below lines to your settings file:
76
+ ### Installed apps
77
+
78
+ Add `'killtracker'` to `INSTALLED_APPS`.
79
+
80
+ ### Killtracker configuration
81
+
82
+ Add below lines to your settings file:
78
83
 
79
84
  ```python
85
+ # aa-killtracker
80
86
  CELERYBEAT_SCHEDULE['killtracker_run_killtracker'] = {
81
87
  'task': 'killtracker.tasks.run_killtracker',
82
88
  'schedule': crontab(minute='*/1'),
83
89
  }
90
+ KILLTRACKER_QUEUE_ID = "" # Put your unique queue ID here
91
+ ```
92
+
93
+ ### Queue ID
94
+
95
+ Please note that the queue ID must be globally unique for all users of the zKillboard API, so choose carefully.
96
+
97
+ We suggest to use your alliance name or alliance tag (without any spaces and special characters) as queue ID.
98
+
99
+ We recommend using only characters (upper and lower case) and numbers,
100
+ but no spaces or any special characters when choosing your ID.
101
+
102
+ Example (don't use this exact example):
103
+
104
+ ```Python
105
+ KILLTRACKER_QUEUE_ID = "Voltron9000"
84
106
  ```
85
107
 
86
- - Optional: Add additional settings if you want to change any defaults. See [Settings](#settings) for the full list.
108
+ If you are running multiple instances of Killtracker please choose a different queue ID for each of them.
109
+
110
+ ### Additional settings (optional)
111
+
112
+ Add additional settings if you want to change any defaults. See [Settings](#settings) for the full list.
87
113
 
88
114
  ### Step 4 - Finalize installation
89
115
 
@@ -184,5 +210,6 @@ Name | Description | Default
184
210
  `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`
185
211
  `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`
186
212
  `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`
187
- `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`
213
+ `KILLTRACKER_QUEUE_ID`| Unique ID used to identify this server when fetching killmails from zKillboard. This setting is mandatory. | ``
188
214
  `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`
215
+ `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`
@@ -3,7 +3,7 @@
3
3
  # pylint: disable = invalid-name
4
4
  default_app_config = "killtracker.apps.KillmailsConfig"
5
5
 
6
- __version__ = "0.12.1"
6
+ __version__ = "0.14.0"
7
7
  __title__ = "Killtracker"
8
8
 
9
9
  APP_NAME = "aa-killtracker"
@@ -0,0 +1,101 @@
1
+ """Settings for killtracker."""
2
+
3
+ from app_utils.app_settings import clean_setting
4
+
5
+ KILLTRACKER_REDISQ_LOCK_TIMEOUT = clean_setting("KILLTRACKER_REDISQ_LOCK_TIMEOUT", 5)
6
+ """Timeout for lock to ensure atomic access to ZKB RedisQ."""
7
+
8
+ KILLTRACKER_KILLMAIL_MAX_AGE_FOR_TRACKER = clean_setting(
9
+ "KILLTRACKER_KILLMAIL_MAX_AGE_FOR_TRACKER", 60
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
+ """
15
+
16
+ KILLTRACKER_MAX_KILLMAILS_PER_RUN = clean_setting(
17
+ "KILLTRACKER_MAX_KILLMAILS_PER_RUN", 200
18
+ )
19
+ """Maximum number of killmails retrieved from ZKB by task run."""
20
+
21
+ KILLTRACKER_PURGE_KILLMAILS_AFTER_DAYS = clean_setting(
22
+ "KILLTRACKER_PURGE_KILLMAILS_AFTER_DAYS", 30
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
+
45
+
46
+ KILLTRACKER_STORING_KILLMAILS_ENABLED = clean_setting(
47
+ "KILLTRACKER_STORING_KILLMAILS_ENABLED", False
48
+ )
49
+ """Whether killmails retrieved from ZKB are stored in the database."""
50
+
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
+ """
55
+
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
+
61
+
62
+ #####################
63
+ # INTERNAL SETTINGS
64
+
65
+ KILLTRACKER_REDISQ_TTW = clean_setting("KILLTRACKER_REDISQ_TTW", 5)
66
+ """Max duration to wait for new killmails from redisq in seconds."""
67
+
68
+ KILLTRACKER_TASKS_TIMEOUT = clean_setting("KILLTRACKER_TASKS_TIMEOUT", 1_800)
69
+ """Tasks hard timeout."""
70
+
71
+ KILLTRACKER_DISCORD_SEND_DELAY = clean_setting(
72
+ "KILLTRACKER_DISCORD_SEND_DELAY", default_value=2, min_value=1, max_value=900
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
+ """
77
+
78
+ KILLTRACKER_GENERATE_MESSAGE_MAX_RETRIES = clean_setting(
79
+ "KILLTRACKER_GENERATE_MESSAGE_MAX_RETRIES", 3
80
+ )
81
+ """Maximum retries when generating a message from a killmail."""
82
+
83
+ KILLTRACKER_GENERATE_MESSAGE_RETRY_COUNTDOWN = clean_setting(
84
+ "KILLTRACKER_GENERATE_MESSAGE_RETRY_COUNTDOWN", 10
85
+ )
86
+ """Delay when retrying to generate a message in seconds."""
87
+
88
+ KILLTRACKER_TASK_OBJECTS_CACHE_TIMEOUT = clean_setting(
89
+ "KILLTRACKER_TASK_OBJECTS_CACHE_TIMEOUT", 60
90
+ )
91
+ """Cache duration for objects in tasks in seconds."""
92
+
93
+ KILLTRACKER_TASK_MINIMUM_RETRY_DELAY = clean_setting(
94
+ "KILLTRACKER_TASK_MINIMUM_RETRY_DELAY", default_value=0.05
95
+ )
96
+ """Minimum delay when retrying a task."""
97
+
98
+ KILLTRACKER_STORAGE_KILLMAILS_LIFETIME = clean_setting(
99
+ "KILLTRACKER_STORAGE_KILLMAILS_LIFETIME", 3_600 * 1
100
+ )
101
+ """Max lifetime of killmails in temporary storage in seconds."""
@@ -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
- logger.info("Trying to fetch killmail from ZKB RedisQ...")
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={"ttw": KILLTRACKER_REDISQ_TTW},
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 ..testdata.helpers import load_eve_entities
14
- from ..testdata.load_eveuniverse import load_eveuniverse
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 ..testdata.factories import TrackerFactory
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 .. import CacheStub
25
- from ..testdata.factories import KillmailFactory
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
- from ..testdata.factories import EveKillmailAttackerFactory, EveKillmailFactory
12
- from ..testdata.helpers import (
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 ..testdata.load_eveuniverse import load_eveuniverse
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 ..testdata.helpers import LoadTestDataMixin, load_killmail
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 ..testdata.factories import TrackerFactory
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
 
@@ -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.form
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()
@@ -13,6 +13,7 @@ classifiers = [
13
13
  "Environment :: Web Environment",
14
14
  "Framework :: Django",
15
15
  "Framework :: Django :: 4.0",
16
+ "Framework :: Django :: 4.2",
16
17
  "Intended Audience :: End Users/Desktop",
17
18
  "License :: OSI Approved :: MIT License",
18
19
  "Operating System :: OS Independent",
@@ -1,78 +0,0 @@
1
- """Settings for killtracker."""
2
-
3
- from app_utils.app_settings import clean_setting
4
-
5
- # Timeout for lock to ensure atomic access to ZKB RedisQ
6
- KILLTRACKER_REDISQ_LOCK_TIMEOUT = clean_setting("KILLTRACKER_REDISQ_LOCK_TIMEOUT", 5)
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
- KILLTRACKER_KILLMAIL_MAX_AGE_FOR_TRACKER = clean_setting(
12
- "KILLTRACKER_KILLMAIL_MAX_AGE_FOR_TRACKER", 60
13
- )
14
-
15
- # Maximum number of killmails retrieved from ZKB by task run
16
- KILLTRACKER_MAX_KILLMAILS_PER_RUN = clean_setting(
17
- "KILLTRACKER_MAX_KILLMAILS_PER_RUN", 200
18
- )
19
-
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
- KILLTRACKER_PURGE_KILLMAILS_AFTER_DAYS = clean_setting(
23
- "KILLTRACKER_PURGE_KILLMAILS_AFTER_DAYS", 30
24
- )
25
-
26
- # whether killmails retrieved from ZKB are stored in the database
27
- KILLTRACKER_STORING_KILLMAILS_ENABLED = clean_setting(
28
- "KILLTRACKER_STORING_KILLMAILS_ENABLED", False
29
- )
30
-
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
- KILLTRACKER_WEBHOOK_SET_AVATAR = clean_setting("KILLTRACKER_WEBHOOK_SET_AVATAR", True)
34
-
35
-
36
- # Wether NPC types (e.g. Guristas Assaulter) can be selected as attacker types
37
- # when creating trackers
38
- KILLTRACKER_SHOW_NPC_TYPES = clean_setting("KILLTRACKER_SHOW_NPC_TYPES", True)
39
-
40
- #####################
41
- # INTERNAL SETTINGS
42
-
43
- # Max duration to wait for new killmails from redisq in seconds
44
- KILLTRACKER_REDISQ_TTW = clean_setting("KILLTRACKER_REDISQ_TTW", 5)
45
-
46
- # Tasks hard timeout
47
- KILLTRACKER_TASKS_TIMEOUT = clean_setting("KILLTRACKER_TASKS_TIMEOUT", 1_800)
48
-
49
- # delay in seconds between every message sent to Discord
50
- # this needs to be >= 1 to prevent 429 Too Many Request errors
51
- KILLTRACKER_DISCORD_SEND_DELAY = clean_setting(
52
- "KILLTRACKER_DISCORD_SEND_DELAY", default_value=2, min_value=1, max_value=900
53
- )
54
-
55
- # Maximum retries when generating a message from a killmail
56
- KILLTRACKER_GENERATE_MESSAGE_MAX_RETRIES = clean_setting(
57
- "KILLTRACKER_GENERATE_MESSAGE_MAX_RETRIES", 3
58
- )
59
-
60
- # Delay when retrying to generate a message in seconds
61
- KILLTRACKER_GENERATE_MESSAGE_RETRY_COUNTDOWN = clean_setting(
62
- "KILLTRACKER_GENERATE_MESSAGE_RETRY_COUNTDOWN", 10
63
- )
64
-
65
- # Cache duration for objects in tasks in seconds
66
- KILLTRACKER_TASK_OBJECTS_CACHE_TIMEOUT = clean_setting(
67
- "KILLTRACKER_TASK_OBJECTS_CACHE_TIMEOUT", 60
68
- )
69
-
70
- # Minimum delay when retrying a task
71
- KILLTRACKER_TASK_MINIMUM_RETRY_DELAY = clean_setting(
72
- "KILLTRACKER_TASK_MINIMUM_RETRY_DELAY", default_value=0.05
73
- )
74
-
75
- # Max lifetime of killmails in temporary storage in seconds
76
- KILLTRACKER_STORAGE_KILLMAILS_LIFETIME = clean_setting(
77
- "KILLTRACKER_STORAGE_KILLMAILS_LIFETIME", 3_600 * 1
78
- )
File without changes