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.
- {aa_fleetfinder-2.7.0.dist-info → aa_fleetfinder-2.7.1.dist-info}/METADATA +1 -1
- {aa_fleetfinder-2.7.0.dist-info → aa_fleetfinder-2.7.1.dist-info}/RECORD +35 -29
- fleetfinder/__init__.py +1 -1
- fleetfinder/locale/cs_CZ/LC_MESSAGES/django.po +30 -20
- fleetfinder/locale/de/LC_MESSAGES/django.mo +0 -0
- fleetfinder/locale/de/LC_MESSAGES/django.po +35 -33
- fleetfinder/locale/django.pot +31 -21
- fleetfinder/locale/es/LC_MESSAGES/django.po +30 -20
- fleetfinder/locale/fr_FR/LC_MESSAGES/django.po +30 -20
- fleetfinder/locale/it_IT/LC_MESSAGES/django.po +30 -20
- fleetfinder/locale/ja/LC_MESSAGES/django.po +30 -20
- fleetfinder/locale/ko_KR/LC_MESSAGES/django.po +30 -20
- fleetfinder/locale/nl_NL/LC_MESSAGES/django.po +30 -20
- fleetfinder/locale/pl_PL/LC_MESSAGES/django.po +30 -20
- fleetfinder/locale/ru/LC_MESSAGES/django.po +30 -20
- fleetfinder/locale/sk/LC_MESSAGES/django.po +30 -20
- fleetfinder/locale/uk/LC_MESSAGES/django.po +30 -20
- fleetfinder/locale/zh_Hans/LC_MESSAGES/django.po +30 -20
- fleetfinder/static/fleetfinder/js/fleetfinder-dashboard.js +86 -0
- fleetfinder/static/fleetfinder/js/fleetfinder-dashboard.min.js +2 -0
- fleetfinder/static/fleetfinder/js/fleetfinder-dashboard.min.js.map +1 -0
- fleetfinder/static/fleetfinder/js/fleetfinder-fleet-details.js +154 -0
- fleetfinder/static/fleetfinder/js/fleetfinder-fleet-details.min.js +2 -0
- fleetfinder/static/fleetfinder/js/fleetfinder-fleet-details.min.js.map +1 -0
- fleetfinder/static/fleetfinder/js/fleetfinder.min.js +1 -1
- fleetfinder/static/fleetfinder/js/fleetfinder.min.js.map +1 -1
- fleetfinder/tasks.py +13 -5
- fleetfinder/templates/fleetfinder/base.html +11 -0
- fleetfinder/templates/fleetfinder/bundles/js/fleetfinder-js.html +6 -0
- fleetfinder/templates/fleetfinder/dashboard.html +8 -83
- fleetfinder/templates/fleetfinder/fleet-details.html +22 -150
- fleetfinder/tests/test_views.py +63 -0
- fleetfinder/views.py +32 -3
- {aa_fleetfinder-2.7.0.dist-info → aa_fleetfinder-2.7.1.dist-info}/WHEEL +0 -0
- {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-
|
|
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:
|
|
25
|
-
#: fleetfinder/templates/fleetfinder/base.html:
|
|
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:
|
|
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:
|
|
133
|
-
#: fleetfinder/templates/fleetfinder/fleet-details.html:
|
|
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:
|
|
137
|
+
#: fleetfinder/templates/fleetfinder/fleet-details.html:30
|
|
138
138
|
msgid "Count"
|
|
139
139
|
msgstr "计数"
|
|
140
140
|
|
|
141
|
-
#: fleetfinder/templates/fleetfinder/fleet-details.html:
|
|
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:
|
|
145
|
+
#: fleetfinder/templates/fleetfinder/fleet-details.html:54
|
|
146
146
|
msgid "Name"
|
|
147
147
|
msgstr "名字"
|
|
148
148
|
|
|
149
|
-
#: fleetfinder/templates/fleetfinder/fleet-details.html:
|
|
149
|
+
#: fleetfinder/templates/fleetfinder/fleet-details.html:56
|
|
150
150
|
msgid "System"
|
|
151
151
|
msgstr "星系"
|
|
152
152
|
|
|
153
|
-
#: fleetfinder/templates/fleetfinder/fleet-details.html:
|
|
153
|
+
#: fleetfinder/templates/fleetfinder/fleet-details.html:57
|
|
154
154
|
msgid "Action"
|
|
155
155
|
msgstr "行动"
|
|
156
156
|
|
|
157
|
-
#: fleetfinder/templates/fleetfinder/fleet-details.html:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
291
|
+
#: fleetfinder/views.py:556
|
|
282
292
|
msgid "Member ID required"
|
|
283
293
|
msgstr ""
|
|
284
294
|
|
|
285
|
-
#: fleetfinder/views.py:
|
|
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:
|
|
301
|
+
#: fleetfinder/views.py:579
|
|
292
302
|
msgid "Invalid request data"
|
|
293
303
|
msgstr ""
|
|
294
304
|
|
|
295
|
-
#: fleetfinder/views.py:
|
|
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:
|
|
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,"
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
|
@@ -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
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
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
|
-
|
|
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 %}
|