aa-fleetfinder 2.7.0__py3-none-any.whl → 2.7.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.

Files changed (35) hide show
  1. {aa_fleetfinder-2.7.0.dist-info → aa_fleetfinder-2.7.1.dist-info}/METADATA +1 -1
  2. {aa_fleetfinder-2.7.0.dist-info → aa_fleetfinder-2.7.1.dist-info}/RECORD +35 -29
  3. fleetfinder/__init__.py +1 -1
  4. fleetfinder/locale/cs_CZ/LC_MESSAGES/django.po +30 -20
  5. fleetfinder/locale/de/LC_MESSAGES/django.mo +0 -0
  6. fleetfinder/locale/de/LC_MESSAGES/django.po +35 -33
  7. fleetfinder/locale/django.pot +31 -21
  8. fleetfinder/locale/es/LC_MESSAGES/django.po +30 -20
  9. fleetfinder/locale/fr_FR/LC_MESSAGES/django.po +30 -20
  10. fleetfinder/locale/it_IT/LC_MESSAGES/django.po +30 -20
  11. fleetfinder/locale/ja/LC_MESSAGES/django.po +30 -20
  12. fleetfinder/locale/ko_KR/LC_MESSAGES/django.po +30 -20
  13. fleetfinder/locale/nl_NL/LC_MESSAGES/django.po +30 -20
  14. fleetfinder/locale/pl_PL/LC_MESSAGES/django.po +30 -20
  15. fleetfinder/locale/ru/LC_MESSAGES/django.po +30 -20
  16. fleetfinder/locale/sk/LC_MESSAGES/django.po +30 -20
  17. fleetfinder/locale/uk/LC_MESSAGES/django.po +30 -20
  18. fleetfinder/locale/zh_Hans/LC_MESSAGES/django.po +30 -20
  19. fleetfinder/static/fleetfinder/js/fleetfinder-dashboard.js +86 -0
  20. fleetfinder/static/fleetfinder/js/fleetfinder-dashboard.min.js +2 -0
  21. fleetfinder/static/fleetfinder/js/fleetfinder-dashboard.min.js.map +1 -0
  22. fleetfinder/static/fleetfinder/js/fleetfinder-fleet-details.js +154 -0
  23. fleetfinder/static/fleetfinder/js/fleetfinder-fleet-details.min.js +2 -0
  24. fleetfinder/static/fleetfinder/js/fleetfinder-fleet-details.min.js.map +1 -0
  25. fleetfinder/static/fleetfinder/js/fleetfinder.min.js +1 -1
  26. fleetfinder/static/fleetfinder/js/fleetfinder.min.js.map +1 -1
  27. fleetfinder/tasks.py +13 -5
  28. fleetfinder/templates/fleetfinder/base.html +11 -0
  29. fleetfinder/templates/fleetfinder/bundles/js/fleetfinder-js.html +6 -0
  30. fleetfinder/templates/fleetfinder/dashboard.html +8 -83
  31. fleetfinder/templates/fleetfinder/fleet-details.html +22 -150
  32. fleetfinder/tests/test_views.py +63 -0
  33. fleetfinder/views.py +32 -3
  34. {aa_fleetfinder-2.7.0.dist-info → aa_fleetfinder-2.7.1.dist-info}/WHEEL +0 -0
  35. {aa_fleetfinder-2.7.0.dist-info → aa_fleetfinder-2.7.1.dist-info}/licenses/LICENSE +0 -0
@@ -9,7 +9,7 @@ msgid ""
9
9
  msgstr ""
10
10
  "Project-Id-Version: AA Fleet Finder 2.2.1\n"
11
11
  "Report-Msgid-Bugs-To: https://github.com/ppfeufer/aa-fleetfinder/issues\n"
12
- "POT-Creation-Date: 2025-08-21 15:11+0200\n"
12
+ "POT-Creation-Date: 2025-08-23 16:51+0200\n"
13
13
  "PO-Revision-Date: 2025-08-21 13:16+0000\n"
14
14
  "Last-Translator: Peter Pfeufer <info@ppfeufer.de>\n"
15
15
  "Language-Team: Chinese (Simplified Han script) <https://weblate.ppfeufer.de/projects/alliance-auth-apps/aa-fleetfinder/zh_Hans/>\n"
@@ -21,8 +21,8 @@ msgstr ""
21
21
  "X-Generator: Weblate 5.13\n"
22
22
 
23
23
  #: fleetfinder/__init__.py:9 fleetfinder/models.py:24
24
- #: fleetfinder/templates/fleetfinder/base.html:6
25
- #: fleetfinder/templates/fleetfinder/base.html:10
24
+ #: fleetfinder/templates/fleetfinder/base.html:7
25
+ #: fleetfinder/templates/fleetfinder/base.html:11
26
26
  #: fleetfinder/templates/fleetfinder/create-fleet.html:7
27
27
  #: fleetfinder/templates/fleetfinder/edit-fleet.html:7
28
28
  #: fleetfinder/templates/fleetfinder/fleet-details.html:7
@@ -125,47 +125,47 @@ msgstr "编辑舰队"
125
125
  msgid "Fleet details"
126
126
  msgstr "舰队细节"
127
127
 
128
- #: fleetfinder/templates/fleetfinder/fleet-details.html:16
128
+ #: fleetfinder/templates/fleetfinder/fleet-details.html:20
129
129
  msgid "Fleet composition"
130
130
  msgstr "舰队组成"
131
131
 
132
- #: fleetfinder/templates/fleetfinder/fleet-details.html:25
133
- #: fleetfinder/templates/fleetfinder/fleet-details.html:51
132
+ #: fleetfinder/templates/fleetfinder/fleet-details.html:29
133
+ #: fleetfinder/templates/fleetfinder/fleet-details.html:55
134
134
  msgid "Ship class"
135
135
  msgstr "舰船等级"
136
136
 
137
- #: fleetfinder/templates/fleetfinder/fleet-details.html:26
137
+ #: fleetfinder/templates/fleetfinder/fleet-details.html:30
138
138
  msgid "Count"
139
139
  msgstr "计数"
140
140
 
141
- #: fleetfinder/templates/fleetfinder/fleet-details.html:41
141
+ #: fleetfinder/templates/fleetfinder/fleet-details.html:45
142
142
  msgid "Fleet members"
143
143
  msgstr "舰队成员"
144
144
 
145
- #: fleetfinder/templates/fleetfinder/fleet-details.html:50
145
+ #: fleetfinder/templates/fleetfinder/fleet-details.html:54
146
146
  msgid "Name"
147
147
  msgstr "名字"
148
148
 
149
- #: fleetfinder/templates/fleetfinder/fleet-details.html:52
149
+ #: fleetfinder/templates/fleetfinder/fleet-details.html:56
150
150
  msgid "System"
151
151
  msgstr "星系"
152
152
 
153
- #: fleetfinder/templates/fleetfinder/fleet-details.html:53
153
+ #: fleetfinder/templates/fleetfinder/fleet-details.html:57
154
154
  msgid "Action"
155
155
  msgstr "行动"
156
156
 
157
- #: fleetfinder/templates/fleetfinder/fleet-details.html:79
157
+ #: fleetfinder/templates/fleetfinder/fleet-details.html:80
158
158
  #, fuzzy
159
159
  #| msgid "Fleet members"
160
160
  msgid "Fleet boss"
161
161
  msgstr "舰队成员"
162
162
 
163
- #: fleetfinder/templates/fleetfinder/fleet-details.html:80
163
+ #: fleetfinder/templates/fleetfinder/fleet-details.html:81
164
164
  #: fleetfinder/templates/fleetfinder/modals/kick-fleet-member.html:10
165
165
  msgid "Kick member from fleet"
166
166
  msgstr ""
167
167
 
168
- #: fleetfinder/templates/fleetfinder/fleet-details.html:81
168
+ #: fleetfinder/templates/fleetfinder/fleet-details.html:82
169
169
  msgid "An unknown error occurred."
170
170
  msgstr ""
171
171
 
@@ -259,7 +259,7 @@ msgstr "编辑舰队宣传信息"
259
259
  msgid "<h4>Error!</h4><p>There was an error creating the fleet: {error_detail}</p>"
260
260
  msgstr "<h4>错误!</h4><p>ESI返回如下错误:{esi_error_message}</p>"
261
261
 
262
- #: fleetfinder/views.py:284
262
+ #: fleetfinder/views.py:284 fleetfinder/views.py:474
263
263
  msgid "<h4>Error!</h4><p>Fleet does not exist or is no longer available.</p>"
264
264
  msgstr ""
265
265
 
@@ -274,25 +274,35 @@ msgstr "<h4>错误!</h4><p>ESI返回如下错误:{esi_error_message}</p>"
274
274
  msgid "<h4>Error!</h4><p>There was an error creating the fleet: {ex}</p>"
275
275
  msgstr ""
276
276
 
277
- #: fleetfinder/views.py:517
277
+ #: fleetfinder/views.py:510
278
+ #, python-brace-format
279
+ msgid "Fleet with ID {fleet_id} does not exist."
280
+ msgstr ""
281
+
282
+ #: fleetfinder/views.py:516
283
+ #, python-brace-format
284
+ msgid "Error retrieving fleet composition: {ex}"
285
+ msgstr ""
286
+
287
+ #: fleetfinder/views.py:546
278
288
  msgid "Method not allowed"
279
289
  msgstr ""
280
290
 
281
- #: fleetfinder/views.py:527
291
+ #: fleetfinder/views.py:556
282
292
  msgid "Member ID required"
283
293
  msgstr ""
284
294
 
285
- #: fleetfinder/views.py:546
295
+ #: fleetfinder/views.py:575
286
296
  #, fuzzy
287
297
  #| msgid "Fleet invitation"
288
298
  msgid "Fleet not found"
289
299
  msgstr "舰队邀请"
290
300
 
291
- #: fleetfinder/views.py:550
301
+ #: fleetfinder/views.py:579
292
302
  msgid "Invalid request data"
293
303
  msgstr ""
294
304
 
295
- #: fleetfinder/views.py:554
305
+ #: fleetfinder/views.py:583
296
306
  msgid "Member not found in fleet"
297
307
  msgstr ""
298
308
 
@@ -0,0 +1,86 @@
1
+ /* global aaFleetFinderSettings, aaFleetFinderSettingsOverride, objectDeepMerge, fetchGet, fleetfinderBootstrapTooltip, DataTable */
2
+
3
+ $(document).ready(() => {
4
+ 'use strict';
5
+
6
+ const fleetFinderSettings = objectDeepMerge(aaFleetFinderSettings, aaFleetFinderSettingsOverride);
7
+
8
+ const table_fleet_overview = $('#table_available-fleets');
9
+ let dataTable = null;
10
+
11
+ /**
12
+ * Initialize or update the datatable.
13
+ * If the table already exists, it will be updated with new data.
14
+ * If it does not exist, a new DataTable will be created.
15
+ *
16
+ * @param {Object} data - The fleet data to populate the table.
17
+ */
18
+ const initializeOrUpdateTable = (data) => {
19
+ if (dataTable) {
20
+ // Update existing table
21
+ dataTable.clear().rows.add(data).draw();
22
+ } else {
23
+ // Initialize new table
24
+ dataTable = table_fleet_overview.DataTable({
25
+ language: {
26
+ url: fleetFinderSettings.dataTables.languageUrl
27
+ },
28
+ data: data,
29
+ columns: [
30
+ {
31
+ data: 'fleet_commander',
32
+ render: {
33
+ _: 'html',
34
+ sort: 'sort'
35
+ }
36
+ },
37
+ {
38
+ data: 'fleet_name'
39
+ },
40
+ {
41
+ data: 'created_at',
42
+ },
43
+ {
44
+ data: 'actions',
45
+ className: 'text-end',
46
+ },
47
+ ],
48
+ columnDefs: [
49
+ {
50
+ targets: 2,
51
+ render: DataTable.render.date(
52
+ fleetFinderSettings.dataTables.datetimeFormat
53
+ )
54
+ },
55
+ {
56
+ orderable: false,
57
+ targets: [3]
58
+ },
59
+ ],
60
+ order: [[0, 'asc']],
61
+ paging: false,
62
+ initComplete: () => {
63
+ // Initialize Bootstrap tooltips
64
+ fleetfinderBootstrapTooltip({selector: '#table_available-fleets'});
65
+ }
66
+ });
67
+ }
68
+ };
69
+
70
+ /**
71
+ * Fetch and update fleet data
72
+ */
73
+ const fetchFleetData = () => {
74
+ fetchGet({url: fleetFinderSettings.dataTables.url.dashboard})
75
+ .then(initializeOrUpdateTable)
76
+ .catch((error) => {
77
+ console.error('Error fetching fleet data:', error);
78
+ });
79
+ };
80
+
81
+ // Initial load
82
+ fetchFleetData();
83
+
84
+ // Refresh every 30 seconds
85
+ setInterval(fetchFleetData, 30000);
86
+ });
@@ -0,0 +1,2 @@
1
+ $(document).ready(()=>{'use strict';const e=objectDeepMerge(aaFleetFinderSettings,aaFleetFinderSettingsOverride),a=$('#table_available-fleets');let t=null;const r=r=>{t?t.clear().rows.add(r).draw():t=a.DataTable({language:{url:e.dataTables.languageUrl},data:r,columns:[{data:'fleet_commander',render:{_:'html',sort:'sort'}},{data:'fleet_name'},{data:'created_at'},{data:'actions',className:'text-end'}],columnDefs:[{targets:2,render:DataTable.render.date(e.dataTables.datetimeFormat)},{orderable:!1,targets:[3]}],order:[[0,'asc']],paging:!1,initComplete:()=>{fleetfinderBootstrapTooltip({selector:'#table_available-fleets'})}})},l=()=>{fetchGet({url:e.dataTables.url.dashboard}).then(r).catch(e=>{console.error('Error fetching fleet data:',e)})};l(),setInterval(l,3e4)});
2
+ //# sourceMappingURL=fleetfinder-dashboard.min.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["$","document","ready","fleetFinderSettings","objectDeepMerge","aaFleetFinderSettings","aaFleetFinderSettingsOverride","table_fleet_overview","dataTable","initializeOrUpdateTable","data","clear","rows","add","draw","DataTable","language","url","dataTables","languageUrl","columns","render","_","sort","className","columnDefs","targets","date","datetimeFormat","orderable","order","paging","initComplete","fleetfinderBootstrapTooltip","selector","fetchFleetData","fetchGet","dashboard","then","catch","error","console","setInterval"],"sources":["fleetfinder-dashboard.js"],"mappings":"AAEAA,EAAEC,UAAUC,MAAM,KACd,aAEA,MAAMC,EAAsBC,gBAAgBC,sBAAuBC,+BAE7DC,EAAuBP,EAAE,2BAC/B,IAAIQ,EAAY,KAShB,MAAMC,EAA2BC,IACzBF,EAEAA,EAAUG,QAAQC,KAAKC,IAAIH,GAAMI,OAGjCN,EAAYD,EAAqBQ,UAAU,CACvCC,SAAU,CACNC,IAAKd,EAAoBe,WAAWC,aAExCT,KAAMA,EACNU,QAAS,CACL,CACIV,KAAM,kBACNW,OAAQ,CACJC,EAAG,OACHC,KAAM,SAGd,CACIb,KAAM,cAEV,CACIA,KAAM,cAEV,CACIA,KAAM,UACNc,UAAW,aAGnBC,WAAY,CACR,CACIC,QAAS,EACTL,OAAQN,UAAUM,OAAOM,KACrBxB,EAAoBe,WAAWU,iBAGvC,CACIC,WAAW,EACXH,QAAS,CAAC,KAGlBI,MAAO,CAAC,CAAC,EAAG,QACZC,QAAQ,EACRC,aAAc,KAEVC,4BAA4B,CAACC,SAAU,gCASjDC,EAAiB,KACnBC,SAAS,CAACnB,IAAKd,EAAoBe,WAAWD,IAAIoB,YAC7CC,KAAK7B,GACL8B,MAAOC,IACJC,QAAQD,MAAM,6BAA8BA,MAKxDL,IAGAO,YAAYP,EAAgB","ignoreList":[]}
@@ -0,0 +1,154 @@
1
+ /* global objectDeepMerge, aaFleetFinderSettings, aaFleetFinderSettingsOverride, fetchGet, fetchPost, fleetfinderBootstrapTooltip */
2
+
3
+ $(document).ready(() => {
4
+ 'use strict';
5
+
6
+ const fleetFinderSettings = objectDeepMerge(aaFleetFinderSettings, aaFleetFinderSettingsOverride);
7
+
8
+ /* DataTables
9
+ ------------------------------------------------------------------------- */
10
+ const elements = {
11
+ tableFleetMembers: $('#table-fleet-members'),
12
+ tableFleetComposition: $('#table-fleet-composition'),
13
+ kickFleetMemberModal: $('#kick-fleet-member'),
14
+ kickFleetMemberCharacterName: $('#kick-fleet-member-character-name'),
15
+ modalButtonConfirmKickFleetMember: $('#modal-button-confirm-kick-fleet-member'),
16
+ warning: $('#fleetfinder-fleet-details-warning')
17
+ };
18
+ const dataTableConfig = {
19
+ language: {
20
+ url: fleetFinderSettings.dataTables.languageUrl
21
+ },
22
+ paging: false,
23
+ destroy: true
24
+ };
25
+
26
+ const populateDatatables = () => {
27
+ fetchGet({
28
+ url: fleetFinderSettings.dataTables.url.fleetDetails,
29
+ })
30
+ .then((data) => {
31
+ if (data.error) {
32
+ elements.warning.removeClass('d-none').text(data.error);
33
+
34
+ return;
35
+ }
36
+
37
+ elements.warning.addClass('d-none');
38
+
39
+ elements.tableFleetMembers.DataTable({
40
+ ...dataTableConfig,
41
+ data: data.fleet_member,
42
+ columns: [
43
+ {
44
+ render: (data, type, row) => {
45
+ const fwIcon = '<i class="fa-solid fa-star"></i>';
46
+
47
+ return row.is_fleet_boss ? `${row.character_name} <sup data-bs-tooltip="aa-fleetfinder" title="${fleetFinderSettings.l10n.fleetBoss}"><small>${fwIcon}</small></sup>` : row.character_name;
48
+ }
49
+ },
50
+ {data: 'ship_type_name'},
51
+ {data: 'solar_system_name'},
52
+ {
53
+ render: (data, type, row) => {
54
+ const fwIcon = '<i class="fa-solid fa-user-minus"></i>';
55
+ const dataAttributes = Object.entries({
56
+ 'data-character-id': row.character_id,
57
+ 'data-character-name': row.character_name,
58
+ 'data-bs-toggle': 'modal',
59
+ 'data-bs-target': '#kick-fleet-member',
60
+ 'data-bs-tooltip': 'aa-fleetfinder'
61
+ }).map(([key, value]) => {
62
+ return `${key}="${value}"`;
63
+ }).join(' ');
64
+
65
+ return row.is_fleet_boss ? '' : `<button type="button" class="btn btn-sm btn-danger" ${dataAttributes} title="${fleetFinderSettings.l10n.kickMemberFromFleet}">${fwIcon}</button>`;
66
+ },
67
+ orderable: false,
68
+ searchable: false,
69
+ width: '50px',
70
+ className: 'text-end'
71
+ }
72
+ ],
73
+ createdRow: (row, data, rowIndex) => {
74
+ $(row).attr('data-row-id', rowIndex);
75
+ $(row).attr('data-character-id', data.character_id);
76
+ },
77
+ initComplete: () => {
78
+ // Initialize Bootstrap tooltips
79
+ fleetfinderBootstrapTooltip({selector: '#table-fleet-members'});
80
+ }
81
+ });
82
+
83
+ elements.tableFleetComposition.DataTable({
84
+ ...dataTableConfig,
85
+ data: data.fleet_composition,
86
+ columns: [
87
+ {data: 'ship_type_name'},
88
+ {data: 'number', className: 'text-right', width: '100px'}
89
+ ],
90
+ order: [[1, 'desc']]
91
+ });
92
+ })
93
+ .catch((error) => {
94
+ console.error('Error fetching fleet details:', error);
95
+ });
96
+ };
97
+
98
+ populateDatatables();
99
+
100
+ setInterval(populateDatatables, 30000);
101
+
102
+ /* Modals
103
+ ------------------------------------------------------------------------- */
104
+ // Handle the kick fleet member modal
105
+ elements.kickFleetMemberModal
106
+ .on('show.bs.modal', (event) => {
107
+ const button = $(event.relatedTarget);
108
+ const characterId = button.data('character-id');
109
+ const characterName = button.data('character-name');
110
+ const link = fleetFinderSettings.dataTables.url.kickFleetMember;
111
+
112
+ // Populate the modal content
113
+ $('#kick-fleet-member-character-name').text(characterName);
114
+
115
+ $('#modal-button-confirm-kick-fleet-member')
116
+ // Remove any previous click handlers to avoid multiple bindings
117
+ .off('click.kickMember')
118
+ // Bind the click event for the confirmation button
119
+ .on('click.kickMember', () => {
120
+ fetchPost({
121
+ url: link,
122
+ csrfToken: fleetFinderSettings.csrfToken,
123
+ payload: {
124
+ memberId: characterId
125
+ },
126
+ responseIsJson: true
127
+ })
128
+ .then(() => {
129
+ populateDatatables();
130
+
131
+ $('#kick-fleet-member').modal('hide');
132
+ })
133
+ .catch((error) => {
134
+ console.error('Error kicking fleet member:', error);
135
+
136
+ $('#kick-fleet-member .modal-kick-fleet-member-error')
137
+ .removeClass('d-none')
138
+ .find('.modal-kick-fleet-member-error-message')
139
+ .text(error || fleetFinderSettings.l10n.unknownError);
140
+ });
141
+ });
142
+ })
143
+ .on('hide.bs.modal', () => {
144
+ // Reset modal content
145
+ $('#kick-fleet-member-character-name').empty();
146
+ $('#kick-fleet-member .modal-kick-fleet-member-error')
147
+ .addClass('d-none')
148
+ .find('.modal-kick-fleet-member-error-message')
149
+ .empty();
150
+
151
+ // Clean up event handler
152
+ $('#modal-button-confirm-kick-fleet-member').off('click.kickMember');
153
+ });
154
+ });
@@ -0,0 +1,2 @@
1
+ $(document).ready(()=>{'use strict';const e=objectDeepMerge(aaFleetFinderSettings,aaFleetFinderSettingsOverride),t={tableFleetMembers:$('#table-fleet-members'),tableFleetComposition:$('#table-fleet-composition'),kickFleetMemberModal:$('#kick-fleet-member'),kickFleetMemberCharacterName:$('#kick-fleet-member-character-name'),modalButtonConfirmKickFleetMember:$('#modal-button-confirm-kick-fleet-member'),warning:$('#fleetfinder-fleet-details-warning')},a={language:{url:e.dataTables.languageUrl},paging:!1,destroy:!0},r=()=>{fetchGet({url:e.dataTables.url.fleetDetails}).then(r=>{r.error?t.warning.removeClass('d-none').text(r.error):(t.warning.addClass('d-none'),t.tableFleetMembers.DataTable({...a,data:r.fleet_member,columns:[{render:(t,a,r)=>{const l='<i class="fa-solid fa-star"></i>';return r.is_fleet_boss?`${r.character_name} <sup data-bs-tooltip="aa-fleetfinder" title="${e.l10n.fleetBoss}"><small>${l}</small></sup>`:r.character_name}},{data:'ship_type_name'},{data:'solar_system_name'},{render:(t,a,r)=>{const l='<i class="fa-solid fa-user-minus"></i>',m=Object.entries({'data-character-id':r.character_id,'data-character-name':r.character_name,'data-bs-toggle':'modal','data-bs-target':'#kick-fleet-member','data-bs-tooltip':'aa-fleetfinder'}).map(([e,t])=>`${e}="${t}"`).join(' ');return r.is_fleet_boss?'':`<button type="button" class="btn btn-sm btn-danger" ${m} title="${e.l10n.kickMemberFromFleet}">${l}</button>`},orderable:!1,searchable:!1,width:'50px',className:'text-end'}],createdRow:(e,t,a)=>{$(e).attr('data-row-id',a),$(e).attr('data-character-id',t.character_id)},initComplete:()=>{fleetfinderBootstrapTooltip({selector:'#table-fleet-members'})}}),t.tableFleetComposition.DataTable({...a,data:r.fleet_composition,columns:[{data:'ship_type_name'},{data:'number',className:'text-right',width:'100px'}],order:[[1,'desc']]}))}).catch(e=>{console.error('Error fetching fleet details:',e)})};r(),setInterval(r,3e4),t.kickFleetMemberModal.on('show.bs.modal',t=>{const a=$(t.relatedTarget),l=a.data('character-id'),m=a.data('character-name'),o=e.dataTables.url.kickFleetMember;$('#kick-fleet-member-character-name').text(m),$('#modal-button-confirm-kick-fleet-member').off('click.kickMember').on('click.kickMember',()=>{fetchPost({url:o,csrfToken:e.csrfToken,payload:{memberId:l},responseIsJson:!0}).then(()=>{r(),$('#kick-fleet-member').modal('hide')}).catch(t=>{console.error('Error kicking fleet member:',t),$('#kick-fleet-member .modal-kick-fleet-member-error').removeClass('d-none').find('.modal-kick-fleet-member-error-message').text(t||e.l10n.unknownError)})})}).on('hide.bs.modal',()=>{$('#kick-fleet-member-character-name').empty(),$('#kick-fleet-member .modal-kick-fleet-member-error').addClass('d-none').find('.modal-kick-fleet-member-error-message').empty(),$('#modal-button-confirm-kick-fleet-member').off('click.kickMember')})});
2
+ //# sourceMappingURL=fleetfinder-fleet-details.min.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["$","document","ready","fleetFinderSettings","objectDeepMerge","aaFleetFinderSettings","aaFleetFinderSettingsOverride","elements","tableFleetMembers","tableFleetComposition","kickFleetMemberModal","kickFleetMemberCharacterName","modalButtonConfirmKickFleetMember","warning","dataTableConfig","language","url","dataTables","languageUrl","paging","destroy","populateDatatables","fetchGet","fleetDetails","then","data","error","removeClass","text","addClass","DataTable","fleet_member","columns","render","type","row","fwIcon","is_fleet_boss","character_name","l10n","fleetBoss","dataAttributes","Object","entries","character_id","map","key","value","join","kickMemberFromFleet","orderable","searchable","width","className","createdRow","rowIndex","attr","initComplete","fleetfinderBootstrapTooltip","selector","fleet_composition","order","catch","console","setInterval","on","event","button","relatedTarget","characterId","characterName","link","kickFleetMember","off","fetchPost","csrfToken","payload","memberId","responseIsJson","modal","find","unknownError","empty"],"sources":["fleetfinder-fleet-details.js"],"mappings":"AAEAA,EAAEC,UAAUC,MAAM,KACd,aAEA,MAAMC,EAAsBC,gBAAgBC,sBAAuBC,+BAI7DC,EAAW,CACbC,kBAAmBR,EAAE,wBACrBS,sBAAuBT,EAAE,4BACzBU,qBAAsBV,EAAE,sBACxBW,6BAA8BX,EAAE,qCAChCY,kCAAmCZ,EAAE,2CACrCa,QAASb,EAAE,uCAETc,EAAkB,CACpBC,SAAU,CACNC,IAAKb,EAAoBc,WAAWC,aAExCC,QAAQ,EACRC,SAAS,GAGPC,EAAqB,KACvBC,SAAS,CACLN,IAAKb,EAAoBc,WAAWD,IAAIO,eAEvCC,KAAMC,IACCA,EAAKC,MACLnB,EAASM,QAAQc,YAAY,UAAUC,KAAKH,EAAKC,QAKrDnB,EAASM,QAAQgB,SAAS,UAE1BtB,EAASC,kBAAkBsB,UAAU,IAC9BhB,EACHW,KAAMA,EAAKM,aACXC,QAAS,CACL,CACIC,OAAQ,CAACR,EAAMS,EAAMC,KACjB,MAAMC,EAAS,mCAEf,OAAOD,EAAIE,cAAgB,GAAGF,EAAIG,+DAA+DnC,EAAoBoC,KAAKC,qBAAqBJ,kBAAyBD,EAAIG,iBAGpL,CAACb,KAAM,kBACP,CAACA,KAAM,qBACP,CACIQ,OAAQ,CAACR,EAAMS,EAAMC,KACjB,MAAMC,EAAS,yCACTK,EAAiBC,OAAOC,QAAQ,CAClC,oBAAqBR,EAAIS,aACzB,sBAAuBT,EAAIG,eAC3B,iBAAkB,QAClB,iBAAkB,qBAClB,kBAAmB,mBACpBO,IAAI,EAAEC,EAAKC,KACH,GAAGD,MAAQC,MACnBC,KAAK,KAER,OAAOb,EAAIE,cAAgB,GAAK,uDAAuDI,YAAyBtC,EAAoBoC,KAAKU,wBAAwBb,cAErKc,WAAW,EACXC,YAAY,EACZC,MAAO,OACPC,UAAW,aAGnBC,WAAY,CAACnB,EAAKV,EAAM8B,KACpBvD,EAAEmC,GAAKqB,KAAK,cAAeD,GAC3BvD,EAAEmC,GAAKqB,KAAK,oBAAqB/B,EAAKmB,eAE1Ca,aAAc,KAEVC,4BAA4B,CAACC,SAAU,4BAI/CpD,EAASE,sBAAsBqB,UAAU,IAClChB,EACHW,KAAMA,EAAKmC,kBACX5B,QAAS,CACL,CAACP,KAAM,kBACP,CAACA,KAAM,SAAU4B,UAAW,aAAcD,MAAO,UAErDS,MAAO,CAAC,CAAC,EAAG,cAGnBC,MAAOpC,IACJqC,QAAQrC,MAAM,gCAAiCA,MAI3DL,IAEA2C,YAAY3C,EAAoB,KAKhCd,EAASG,qBACJuD,GAAG,gBAAkBC,IAClB,MAAMC,EAASnE,EAAEkE,EAAME,eACjBC,EAAcF,EAAO1C,KAAK,gBAC1B6C,EAAgBH,EAAO1C,KAAK,kBAC5B8C,EAAOpE,EAAoBc,WAAWD,IAAIwD,gBAGhDxE,EAAE,qCAAqC4B,KAAK0C,GAE5CtE,EAAE,2CAEGyE,IAAI,oBAEJR,GAAG,mBAAoB,KACpBS,UAAU,CACN1D,IAAKuD,EACLI,UAAWxE,EAAoBwE,UAC/BC,QAAS,CACLC,SAAUR,GAEdS,gBAAgB,IAEftD,KAAK,KACFH,IAEArB,EAAE,sBAAsB+E,MAAM,UAEjCjB,MAAOpC,IACJqC,QAAQrC,MAAM,8BAA+BA,GAE7C1B,EAAE,qDACG2B,YAAY,UACZqD,KAAK,0CACLpD,KAAKF,GAASvB,EAAoBoC,KAAK0C,oBAI/DhB,GAAG,gBAAiB,KAEjBjE,EAAE,qCAAqCkF,QACvClF,EAAE,qDACG6B,SAAS,UACTmD,KAAK,0CACLE,QAGLlF,EAAE,2CAA2CyE,IAAI","ignoreList":[]}
@@ -1,2 +1,2 @@
1
- const fleetfinderBootstrapTooltip=({selector:o="body",namespace:e="aa-fleetfinder"})=>{document.querySelectorAll(`${o} [data-bs-tooltip="${e}"]`).forEach(o=>new bootstrap.Tooltip(o))};
1
+ 'use strict';const fleetfinderBootstrapTooltip=({selector:t='body',namespace:e='aa-fleetfinder'})=>{document.querySelectorAll(`${t} [data-bs-tooltip="${e}"]`).forEach(t=>new bootstrap.Tooltip(t))};
2
2
  //# sourceMappingURL=fleetfinder.min.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["fleetfinder.js"],"names":["fleetfinderBootstrapTooltip","selector","namespace","document","querySelectorAll","forEach","bootstrap","Tooltip","tooltipTriggerEl"],"mappings":"AAiBA,MAAMA,4BAA8B,CAAA,CAAEC,SAAAA,EAAW,OAAQC,UAAAA,EAAY,gBAAiB,KAClFC,SAASC,oBAAoBH,uBAA8BC,KAAa,EACnEG,QAAQ,GACE,IAAIC,UAAUC,QAAQC,CAAgB,CAChD,CACT"}
1
+ {"version":3,"names":["fleetfinderBootstrapTooltip","selector","namespace","document","querySelectorAll","forEach","tooltipTriggerEl","bootstrap","Tooltip"],"sources":["fleetfinder.js"],"mappings":"AAGA,aAcA,MAAMA,4BAA8B,EAAEC,WAAW,OAAQC,YAAY,qBACjEC,SAASC,iBAAiB,GAAGH,uBAA8BC,OACtDG,QAASC,GACC,IAAIC,UAAUC,QAAQF","ignoreList":[]}
fleetfinder/tasks.py CHANGED
@@ -306,10 +306,10 @@ def get_fleet_composition( # pylint: disable=too-many-locals
306
306
 
307
307
  try:
308
308
  fleet = Fleet.objects.get(fleet_id=fleet_id)
309
- except Fleet.DoesNotExist:
309
+ except Fleet.DoesNotExist as exc:
310
310
  logger.error(f"Fleet with ID {fleet_id} not found")
311
311
 
312
- return None
312
+ raise Fleet.DoesNotExist(f"Fleet with ID {fleet_id} not found.") from exc
313
313
 
314
314
  logger.info(
315
315
  f'Getting fleet composition for fleet "{fleet.name}" '
@@ -342,8 +342,14 @@ def get_fleet_composition( # pylint: disable=too-many-locals
342
342
  f"Found {len(all_ids)} unique IDs to fetch names for in fleet {fleet_id}"
343
343
  )
344
344
 
345
- # Process IDs in chunks to avoid ESI limits
346
- chunk_size = 500
345
+ # Process IDs in chunks of 1000 to avoid ESI limits.
346
+ # ESI has a limit of 1000 IDs per request, so we will chunk the requests,
347
+ # even though there is a theoretical limit of 768 unique IDs per fleet,
348
+ # so we never should hit the ESI limit.
349
+ # But to be on the safe side, we will chunk the requests in case CCP decides
350
+ # to change the fleet limit in the future, we will use a chunk size of 1000,
351
+ # which is the maximum allowed by ESI for the `post_universe_names` endpoint.
352
+ chunk_size = 1000
347
353
  ids_to_name = []
348
354
  all_ids_list = list(all_ids)
349
355
 
@@ -376,4 +382,6 @@ def get_fleet_composition( # pylint: disable=too-many-locals
376
382
  except Exception as e: # pylint: disable=broad-exception-caught
377
383
  logger.error(f"Failed to get fleet composition for fleet {fleet_id}: {e}")
378
384
 
379
- return None
385
+ raise RuntimeError(
386
+ f"Failed to get fleet composition for fleet {fleet_id} : {str(e)}"
387
+ ) from e
@@ -1,6 +1,7 @@
1
1
  {% extends "allianceauth/base-bs5.html" %}
2
2
 
3
3
  {% load i18n %}
4
+ {% load aa_i18n %}
4
5
 
5
6
  {% block page_title %}
6
7
  {% translate "Fleet Finder" %}
@@ -22,6 +23,16 @@
22
23
  {% block content %}
23
24
  <div class="aa-fleetfinder">
24
25
  <div class="aa-fleetfinder-body">
26
+ {% get_datatables_language_static LANGUAGE_CODE as DT_LANG_PATH %}
27
+
28
+ <script>
29
+ const aaFleetFinderSettings = {
30
+ dataTables: {
31
+ languageUrl: "{{ DT_LANG_PATH }}",
32
+ datetimeFormat: 'YYYY-MM-DD, HH:mm',
33
+ }
34
+ }
35
+ </script>
25
36
  {% block aa_fleetfinder_body %}{% endblock %}
26
37
  </div>
27
38
 
@@ -1,3 +1,9 @@
1
1
  {% load sri %}
2
2
 
3
3
  {% sri_static "fleetfinder/js/fleetfinder.min.js" %}
4
+
5
+ {% if view %}
6
+ {% with "fleetfinder/js/fleetfinder-"|add:view|add:".min.js" as script_path %}
7
+ {% sri_static script_path %}
8
+ {% endwith %}
9
+ {% endif %}
@@ -38,91 +38,16 @@
38
38
  {% block extra_javascript %}
39
39
  {% include "bundles/datatables-js-bs5.html" %}
40
40
  {% include "bundles/moment-js.html" with locale=True %}
41
- {% include "fleetfinder/bundles/js/fleetfinder-js.html" %}
42
-
43
- {% get_datatables_language_static LANGUAGE_CODE as DT_LANG_PATH %}
44
41
 
45
42
  <script>
46
- /* global fetchGet, fleetfinderBootstrapTooltip, DataTable */
47
- 'use strict';
48
-
49
- $(document).ready(() => {
50
- const DATETIME_FORMAT = 'YYYY-MM-DD, HH:mm';
51
- const table_fleet_overview = $('#table_available-fleets');
52
- let dataTable = null;
53
-
54
- /**
55
- * Initialize or update the datatable.
56
- * If the table already exists, it will be updated with new data.
57
- * If it does not exist, a new DataTable will be created.
58
- *
59
- * @param {Object} data - The fleet data to populate the table.
60
- */
61
- const initializeOrUpdateTable = (data) => {
62
- if (dataTable) {
63
- // Update existing table
64
- dataTable.clear().rows.add(data).draw();
65
- } else {
66
- // Initialize new table
67
- dataTable = table_fleet_overview.DataTable({
68
- language: {
69
- url: '{{ DT_LANG_PATH }}'
70
- },
71
- data: data,
72
- columns: [
73
- {
74
- data: 'fleet_commander',
75
- render: {
76
- _: 'html',
77
- sort: 'sort'
78
- }
79
- },
80
- {
81
- data: 'fleet_name'
82
- },
83
- {
84
- data: 'created_at',
85
- },
86
- {
87
- data: 'actions',
88
- className: 'text-end',
89
- },
90
- ],
91
- columnDefs: [
92
- {
93
- targets: 2,
94
- render: DataTable.render.date(DATETIME_FORMAT)
95
- },
96
- {
97
- orderable: false,
98
- targets: [3]
99
- },
100
- ],
101
- order: [[0, 'asc']],
102
- paging: false
103
- });
43
+ const aaFleetFinderSettingsOverride = {
44
+ dataTables: {
45
+ url: {
46
+ dashboard: '{% url "fleetfinder:ajax_dashboard" %}'
104
47
  }
105
-
106
- // Initialize Bootstrap tooltips
107
- fleetfinderBootstrapTooltip({selector: '#table_available-fleets'});
108
- };
109
-
110
- /**
111
- * Fetch and update fleet data
112
- */
113
- const fetchFleetData = () => {
114
- fetchGet({url: '{% url "fleetfinder:ajax_dashboard" %}'})
115
- .then(initializeOrUpdateTable)
116
- .catch((error) => {
117
- console.error('Error fetching fleet data:', error);
118
- });
119
- };
120
-
121
- // Initial load
122
- fetchFleetData();
123
-
124
- // Refresh every 30 seconds
125
- setInterval(fetchFleetData, 30000);
126
- });
48
+ }
49
+ };
127
50
  </script>
51
+
52
+ {% include "fleetfinder/bundles/js/fleetfinder-js.html" with view="dashboard" %}
128
53
  {% endblock %}