aa-fleetfinder 2.5.1__py3-none-any.whl → 2.6.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.
Potentially problematic release.
This version of aa-fleetfinder might be problematic. Click here for more details.
- {aa_fleetfinder-2.5.1.dist-info → aa_fleetfinder-2.6.1.dist-info}/METADATA +2 -2
- {aa_fleetfinder-2.5.1.dist-info → aa_fleetfinder-2.6.1.dist-info}/RECORD +27 -25
- fleetfinder/__init__.py +1 -1
- fleetfinder/locale/cs_CZ/LC_MESSAGES/django.po +20 -7
- fleetfinder/locale/de/LC_MESSAGES/django.mo +0 -0
- fleetfinder/locale/de/LC_MESSAGES/django.po +23 -10
- fleetfinder/locale/django.pot +21 -8
- fleetfinder/locale/es/LC_MESSAGES/django.po +23 -8
- fleetfinder/locale/fr_FR/LC_MESSAGES/django.po +20 -7
- fleetfinder/locale/it_IT/LC_MESSAGES/django.po +20 -7
- fleetfinder/locale/ja/LC_MESSAGES/django.po +20 -7
- fleetfinder/locale/ko_KR/LC_MESSAGES/django.po +23 -8
- fleetfinder/locale/nl_NL/LC_MESSAGES/django.po +20 -7
- fleetfinder/locale/pl_PL/LC_MESSAGES/django.po +20 -7
- fleetfinder/locale/ru/LC_MESSAGES/django.po +23 -8
- fleetfinder/locale/sk/LC_MESSAGES/django.po +20 -7
- fleetfinder/locale/uk/LC_MESSAGES/django.po +23 -8
- fleetfinder/locale/zh_Hans/LC_MESSAGES/django.po +23 -8
- fleetfinder/tasks.py +121 -150
- fleetfinder/templates/fleetfinder/dashboard.html +60 -47
- fleetfinder/templates/fleetfinder/fleet-details.html +7 -1
- fleetfinder/templates/fleetfinder/partials/body/form-fleet-details.html +8 -8
- fleetfinder/tests/test_tasks.py +140 -0
- fleetfinder/tests/test_views.py +416 -0
- fleetfinder/views.py +176 -62
- {aa_fleetfinder-2.5.1.dist-info → aa_fleetfinder-2.6.1.dist-info}/WHEEL +0 -0
- {aa_fleetfinder-2.5.1.dist-info → aa_fleetfinder-2.6.1.dist-info}/licenses/LICENSE +0 -0
fleetfinder/views.py
CHANGED
|
@@ -12,15 +12,18 @@ from django.db.models import Q
|
|
|
12
12
|
from django.http import JsonResponse
|
|
13
13
|
from django.shortcuts import redirect, render
|
|
14
14
|
from django.urls import reverse
|
|
15
|
+
from django.utils import timezone
|
|
15
16
|
from django.utils.safestring import mark_safe
|
|
16
17
|
from django.utils.translation import gettext_lazy as _
|
|
17
18
|
|
|
18
19
|
# Alliance Auth
|
|
19
20
|
from allianceauth.eveonline.evelinks.eveimageserver import character_portrait_url
|
|
20
21
|
from allianceauth.eveonline.models import EveCharacter
|
|
22
|
+
from allianceauth.framework.api.user import get_all_characters_from_user
|
|
21
23
|
from allianceauth.groupmanagement.models import AuthGroup
|
|
22
24
|
from allianceauth.services.hooks import get_extension_logger
|
|
23
25
|
from esi.decorators import token_required
|
|
26
|
+
from esi.models import Token
|
|
24
27
|
|
|
25
28
|
# Alliance Auth (External Libs)
|
|
26
29
|
from app_utils.logging import LoggerAddTag
|
|
@@ -28,11 +31,45 @@ from app_utils.logging import LoggerAddTag
|
|
|
28
31
|
# AA Fleet Finder
|
|
29
32
|
from fleetfinder import __title__
|
|
30
33
|
from fleetfinder.models import Fleet
|
|
31
|
-
from fleetfinder.
|
|
34
|
+
from fleetfinder.providers import esi
|
|
35
|
+
from fleetfinder.tasks import get_fleet_composition, send_fleet_invitation
|
|
32
36
|
|
|
33
37
|
logger = LoggerAddTag(my_logger=get_extension_logger(name=__name__), prefix=__title__)
|
|
34
38
|
|
|
35
39
|
|
|
40
|
+
@login_required()
|
|
41
|
+
@permission_required(perm="fleetfinder.access_fleetfinder")
|
|
42
|
+
def _get_and_validate_fleet(token: Token, character_id: int) -> tuple:
|
|
43
|
+
"""
|
|
44
|
+
Get fleet information and validate fleet commander permissions
|
|
45
|
+
|
|
46
|
+
:param token: Token object containing the access token
|
|
47
|
+
:type token: Token
|
|
48
|
+
:param character_id: The character ID of the fleet commander
|
|
49
|
+
:type character_id: int
|
|
50
|
+
:return: Tuple containing the fleet result, fleet commander, and fleet ID
|
|
51
|
+
:rtype: tuple
|
|
52
|
+
"""
|
|
53
|
+
|
|
54
|
+
fleet_result = esi.client.Fleets.get_characters_character_id_fleet(
|
|
55
|
+
character_id=token.character_id, token=token.valid_access_token()
|
|
56
|
+
).result()
|
|
57
|
+
|
|
58
|
+
logger.debug(f"Fleet result: {fleet_result}")
|
|
59
|
+
|
|
60
|
+
fleet_commander = EveCharacter.objects.get(character_id=token.character_id)
|
|
61
|
+
fleet_id = fleet_result.get("fleet_id")
|
|
62
|
+
fleet_boss_id = fleet_result.get("fleet_boss_id")
|
|
63
|
+
|
|
64
|
+
if not fleet_id:
|
|
65
|
+
raise ValueError(f"No fleet found for {fleet_commander.character_name}")
|
|
66
|
+
|
|
67
|
+
if fleet_boss_id != character_id:
|
|
68
|
+
raise ValueError(f"{fleet_commander.character_name} is not the fleet boss")
|
|
69
|
+
|
|
70
|
+
return fleet_result
|
|
71
|
+
|
|
72
|
+
|
|
36
73
|
@login_required()
|
|
37
74
|
@permission_required(perm="fleetfinder.access_fleetfinder")
|
|
38
75
|
def dashboard(request):
|
|
@@ -66,8 +103,13 @@ def ajax_dashboard(request) -> JsonResponse: # pylint: disable=too-many-locals
|
|
|
66
103
|
|
|
67
104
|
data = []
|
|
68
105
|
groups = request.user.groups.all()
|
|
106
|
+
user_characters = get_all_characters_from_user(user=request.user)
|
|
69
107
|
fleets = (
|
|
70
|
-
Fleet.objects.filter(
|
|
108
|
+
Fleet.objects.filter(
|
|
109
|
+
Q(groups__group__in=groups)
|
|
110
|
+
| Q(groups__isnull=True)
|
|
111
|
+
| Q(fleet_commander__in=user_characters)
|
|
112
|
+
)
|
|
71
113
|
.distinct()
|
|
72
114
|
.order_by("name")
|
|
73
115
|
)
|
|
@@ -144,26 +186,30 @@ def create_fleet(request, token):
|
|
|
144
186
|
:return:
|
|
145
187
|
"""
|
|
146
188
|
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
if "modified_fleet_data" in request.session:
|
|
153
|
-
context["motd"] = request.session["modified_fleet_data"].get("motd", "")
|
|
154
|
-
context["name"] = request.session["modified_fleet_data"].get("name", "")
|
|
155
|
-
context["groups"] = request.session["modified_fleet_data"].get("groups", "")
|
|
156
|
-
context["is_free_move"] = request.session["modified_fleet_data"].get(
|
|
157
|
-
"free_move", ""
|
|
158
|
-
)
|
|
159
|
-
context["character_id"] = token.character_id
|
|
160
|
-
context["auth_groups"] = auth_groups
|
|
189
|
+
# Validate the token and check if the character is in a fleet and is the fleet boss
|
|
190
|
+
try:
|
|
191
|
+
_get_and_validate_fleet(token, token.character_id)
|
|
192
|
+
except (HTTPNotFound, ValueError) as ex:
|
|
193
|
+
logger.debug(f"Error during fleet creation: {ex}", exc_info=True)
|
|
161
194
|
|
|
162
|
-
|
|
195
|
+
if isinstance(ex, HTTPNotFound):
|
|
196
|
+
error_detail = ex.swagger_result["error"]
|
|
163
197
|
else:
|
|
164
|
-
|
|
198
|
+
error_detail = str(ex)
|
|
199
|
+
|
|
200
|
+
error_message = _(
|
|
201
|
+
f"<h4>Error!</h4><p>There was an error creating the fleet: {error_detail}</p>"
|
|
202
|
+
)
|
|
203
|
+
|
|
204
|
+
messages.error(request, mark_safe(error_message))
|
|
165
205
|
|
|
166
|
-
|
|
206
|
+
return redirect("fleetfinder:dashboard")
|
|
207
|
+
|
|
208
|
+
if request.method != "POST":
|
|
209
|
+
return redirect("fleetfinder:dashboard")
|
|
210
|
+
|
|
211
|
+
auth_groups = AuthGroup.objects.filter(internal=False)
|
|
212
|
+
context = {"character_id": token.character_id, "auth_groups": auth_groups}
|
|
167
213
|
|
|
168
214
|
return render(
|
|
169
215
|
request=request,
|
|
@@ -183,7 +229,22 @@ def edit_fleet(request, fleet_id):
|
|
|
183
229
|
:return:
|
|
184
230
|
"""
|
|
185
231
|
|
|
186
|
-
|
|
232
|
+
try:
|
|
233
|
+
fleet = Fleet.objects.get(fleet_id=fleet_id)
|
|
234
|
+
except Fleet.DoesNotExist:
|
|
235
|
+
logger.debug(f"Fleet with ID {fleet_id} does not exist.")
|
|
236
|
+
|
|
237
|
+
messages.error(
|
|
238
|
+
request,
|
|
239
|
+
mark_safe(
|
|
240
|
+
_(
|
|
241
|
+
"<h4>Error!</h4><p>Fleet does not exist or is no longer available.</p>"
|
|
242
|
+
)
|
|
243
|
+
),
|
|
244
|
+
)
|
|
245
|
+
|
|
246
|
+
return redirect("fleetfinder:dashboard")
|
|
247
|
+
|
|
187
248
|
auth_groups = AuthGroup.objects.filter(internal=False)
|
|
188
249
|
|
|
189
250
|
context = {
|
|
@@ -192,6 +253,8 @@ def edit_fleet(request, fleet_id):
|
|
|
192
253
|
"fleet": fleet,
|
|
193
254
|
}
|
|
194
255
|
|
|
256
|
+
logger.debug("Context for fleet edit: %s", context)
|
|
257
|
+
|
|
195
258
|
logger.info(msg=f"Fleet {fleet_id} edit view by {request.user}")
|
|
196
259
|
|
|
197
260
|
return render(
|
|
@@ -252,46 +315,97 @@ def save_fleet(request):
|
|
|
252
315
|
:return:
|
|
253
316
|
"""
|
|
254
317
|
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
318
|
+
def _edit_or_create_fleet(
|
|
319
|
+
character_id: int,
|
|
320
|
+
free_move: bool,
|
|
321
|
+
name: str,
|
|
322
|
+
groups: list,
|
|
323
|
+
motd: str = None, # pylint: disable=unused-argument
|
|
324
|
+
) -> None:
|
|
325
|
+
"""
|
|
326
|
+
Edit or create a fleet from a fleet in EVE Online
|
|
327
|
+
|
|
328
|
+
:param character_id: The character ID of the fleet commander
|
|
329
|
+
:type character_id: int
|
|
330
|
+
:param free_move: Whether the fleet is free move or not
|
|
331
|
+
:type free_move: bool
|
|
332
|
+
:param name: Name of the fleet
|
|
333
|
+
:type name: str
|
|
334
|
+
:param groups: Groups that are allowed to access the fleet
|
|
335
|
+
:type groups: list[AuthGroup]
|
|
336
|
+
:param motd: Message of the Day for the fleet
|
|
337
|
+
:type motd: str
|
|
338
|
+
:return: None
|
|
339
|
+
:rtype: None
|
|
340
|
+
"""
|
|
341
|
+
|
|
342
|
+
required_scopes = ["esi-fleets.read_fleet.v1", "esi-fleets.write_fleet.v1"]
|
|
343
|
+
token = Token.get_token(character_id=character_id, scopes=required_scopes)
|
|
344
|
+
|
|
345
|
+
fleet_result = _get_and_validate_fleet(token, character_id)
|
|
346
|
+
fleet_commander = EveCharacter.objects.get(character_id=character_id)
|
|
347
|
+
fleet_id = fleet_result.get("fleet_id")
|
|
348
|
+
|
|
349
|
+
fleet, created = Fleet.objects.get_or_create(
|
|
350
|
+
fleet_id=fleet_id,
|
|
351
|
+
defaults={
|
|
352
|
+
"created_at": timezone.now(),
|
|
353
|
+
# "motd": motd,
|
|
354
|
+
"is_free_move": free_move,
|
|
355
|
+
"fleet_commander": fleet_commander,
|
|
356
|
+
"name": name,
|
|
357
|
+
},
|
|
358
|
+
)
|
|
359
|
+
|
|
360
|
+
if not created:
|
|
361
|
+
fleet.is_free_move = free_move
|
|
362
|
+
fleet.name = name
|
|
363
|
+
fleet.save()
|
|
364
|
+
|
|
365
|
+
fleet.groups.set(groups)
|
|
366
|
+
|
|
367
|
+
esi.client.Fleets.put_fleets_fleet_id(
|
|
368
|
+
fleet_id=fleet_id,
|
|
369
|
+
token=token.valid_access_token(),
|
|
370
|
+
# new_settings={"is_free_move": free_move, "motd": motd},
|
|
371
|
+
new_settings={"is_free_move": free_move},
|
|
372
|
+
).result()
|
|
373
|
+
|
|
374
|
+
if request.method != "POST":
|
|
375
|
+
return redirect("fleetfinder:dashboard")
|
|
376
|
+
|
|
377
|
+
# Extract form data
|
|
378
|
+
form_data = {
|
|
379
|
+
"character_id": int(request.POST["character_id"]),
|
|
380
|
+
"free_move": request.POST.get("free_move") == "on",
|
|
381
|
+
# "motd": request.POST.get("motd", ""),
|
|
382
|
+
"name": request.POST.get("name", ""),
|
|
383
|
+
"groups": request.POST.getlist("groups", []),
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
logger.debug(f"Form data for fleet creation: {form_data}")
|
|
387
|
+
|
|
388
|
+
try:
|
|
389
|
+
_edit_or_create_fleet(**form_data)
|
|
390
|
+
except HTTPNotFound as ex:
|
|
391
|
+
logger.debug(f"ESI returned 404 for fleet creation: {ex}", exc_info=True)
|
|
278
392
|
|
|
279
|
-
|
|
393
|
+
esi_error = ex.swagger_result.get("error", "Unknown error")
|
|
394
|
+
error_message = _(
|
|
395
|
+
f"<h4>Error!</h4><p>ESI returned the following error: {esi_error}</p>"
|
|
396
|
+
)
|
|
280
397
|
|
|
281
|
-
|
|
282
|
-
|
|
398
|
+
messages.error(request, mark_safe(error_message))
|
|
399
|
+
except ValueError as ex:
|
|
400
|
+
logger.debug(f"Value error during fleet creation: {ex}", exc_info=True)
|
|
283
401
|
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
"name": name,
|
|
288
|
-
"free_move": free_move,
|
|
289
|
-
"groups": groups,
|
|
290
|
-
}
|
|
402
|
+
error_message = _(
|
|
403
|
+
f"<h4>Error!</h4><p>There was an error creating the fleet: {ex}</p>"
|
|
404
|
+
)
|
|
291
405
|
|
|
292
|
-
|
|
406
|
+
messages.error(request, mark_safe(error_message))
|
|
293
407
|
|
|
294
|
-
return redirect(
|
|
408
|
+
return redirect("fleetfinder:dashboard")
|
|
295
409
|
|
|
296
410
|
|
|
297
411
|
@login_required()
|
|
@@ -331,12 +445,12 @@ def ajax_fleet_details(
|
|
|
331
445
|
|
|
332
446
|
fleet = get_fleet_composition(fleet_id)
|
|
333
447
|
|
|
334
|
-
data = {
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
448
|
+
data = {
|
|
449
|
+
"fleet_member": list(fleet.fleet),
|
|
450
|
+
"fleet_composition": [
|
|
451
|
+
{"ship_type_name": ship, "number": number}
|
|
452
|
+
for ship, number in fleet.aggregate.items()
|
|
453
|
+
],
|
|
454
|
+
}
|
|
341
455
|
|
|
342
456
|
return JsonResponse(data=data, safe=False)
|
|
File without changes
|
|
File without changes
|