aa-fleetfinder 2.6.0__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.

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.tasks import get_fleet_composition, open_fleet, send_fleet_invitation
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(Q(groups__group__in=groups) | Q(groups__isnull=True))
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
- context = {}
148
-
149
- if request.method == "POST":
150
- auth_groups = AuthGroup.objects.filter(internal=False).all()
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
- del request.session["modified_fleet_data"]
195
+ if isinstance(ex, HTTPNotFound):
196
+ error_detail = ex.swagger_result["error"]
163
197
  else:
164
- context = {"character_id": token.character_id, "auth_groups": auth_groups}
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
- logger.info(msg=f"Fleet created by {request.user}")
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
- fleet = Fleet.objects.get(fleet_id=fleet_id)
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
- if request.method == "POST":
256
- free_move = request.POST.get(key="free_move", default=False)
257
-
258
- if free_move == "on":
259
- free_move = True
260
-
261
- motd = request.POST.get(key="motd", default="")
262
- name = request.POST.get(key="name", default="")
263
- groups = request.POST.getlist(key="groups", default=[])
264
-
265
- try:
266
- open_fleet(
267
- character_id=request.POST["character_id"],
268
- motd=motd,
269
- free_move=free_move,
270
- name=name,
271
- groups=groups,
272
- )
273
- except HTTPNotFound as ex:
274
- esi_error_message = ex.swagger_result["error"]
275
- error_message = _(
276
- f"<h4>Error!</h4><p>ESI returned the following error: {esi_error_message}</p>"
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
- messages.error(request=request, message=mark_safe(s=error_message))
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
- if request.POST.get(key="origin", default="") == "edit":
282
- return redirect(to="fleetfinder:dashboard")
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
- if request.POST.get(key="origin", default="") == "create":
285
- request.session["modified_fleet_data"] = {
286
- "motd": motd,
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
- return redirect(to="fleetfinder:create_fleet")
406
+ messages.error(request, mark_safe(error_message))
293
407
 
294
- return redirect(to="fleetfinder:dashboard")
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 = {"fleet_member": [], "fleet_composition": []}
335
-
336
- for member in fleet.fleet:
337
- data["fleet_member"].append(member)
338
-
339
- for ship, number in fleet.aggregate.items():
340
- data["fleet_composition"].append({"ship_type_name": ship, "number": number})
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)