From e89ac9cec5dbde327c408b6e0f35e5c17f358e3d Mon Sep 17 00:00:00 2001 From: Florian Fischer Date: Sat, 17 Oct 2026 10:25:53 +0200 Subject: admin-tools: add method to delete duplicates --- admin-tools.html | 1 + src/admin-tools.js | 31 +++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/admin-tools.html b/admin-tools.html index 7f3b3bc..fc118e0 100644 --- a/admin-tools.html +++ b/admin-tools.html @@ -27,6 +27,7 @@ + diff --git a/src/admin-tools.js b/src/admin-tools.js index b3135b1..858ec6d 100644 --- a/src/admin-tools.js +++ b/src/admin-tools.js @@ -111,6 +111,36 @@ async function findAllDuplicates() { } } +async function deleteAllDuplicates() { + output("loading courses ..."); + const courses = await fetchCourses("SOL Graduierung"); + output(`searching in ${courses.length} courses ... `); + const promises = []; + for (const course of courses) { + promises.push(findDuplicates(course)); + } + + const allDuplicates = await Promise.all(promises); + + const deletePromises = []; + for (const [course, courseDuplicates] of allDuplicates) { + const toDelete = []; + for (const duplicates of courseDuplicates) { + for (let i = duplicates.length - 1; i > 0; i--) { + toDelete.push(duplicates[i].changeId); + } + } + output(`${course.title}: Deleting ${toDelete}`); + deletePromises.push( + (async function () { + const dbActivity = await course.getActivity("Graduation"); + const db = new DB(dbActivity.id); + await db.deleteEntries(toDelete); + })(), + ); + } +} + async function exportGraduations(course) { const dbActivity = await course.getActivity("Graduation"); const db = new DB(dbActivity.id); @@ -151,6 +181,7 @@ async function init() { output(JSON.stringify(students.map((s) => s.id))); }); document.getElementById("find-duplicates").addEventListener("click", findAllDuplicates); + document.getElementById("delete-duplicates").addEventListener("click", deleteAllDuplicates); document.getElementById("export-graduation-dbs").addEventListener("click", exportAllGraduations); } -- cgit v1.2.3