feat: student scan filters — skip GPS images and min CPR threshold
New profile options to reduce noise when scanning student accounts: - skip_gps_images: images flagged solely by GPS coordinates are suppressed. GPS data is still extracted and shown in the detail card when the item is flagged by another signal (faces, EXIF author/comment). - min_cpr_count (default 1): only flag a file if it contains at least N distinct CPR numbers. Deduplication is by value. Faces and EXIF PII still trigger flags regardless of CPR count. Both options apply to M365, Google, and file scan paths. Saved in profiles and editable in the Profile Manager editor. Docs, manuals, i18n (DA/EN/DE), CHANGELOG, and VERSION (1.6.14 → 1.6.15) updated. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
1 parent
dfdc46c812
commit
28c9effd17
13 files changed
+104
-14
No files matched your search
@@ -122,6 +122,16 @@ function _applyProfile(profile) {
|
||||
if (el) el.checked = opts.scan_photos;
|
||||
}
|
||||
|
||||
if (opts.skip_gps_images !== undefined) {
|
||||
const el = document.getElementById('optSkipGps');
|
||||
if (el) el.checked = opts.skip_gps_images;
|
||||
}
|
||||
|
||||
if (opts.min_cpr_count !== undefined) {
|
||||
const el = document.getElementById('optMinCpr');
|
||||
if (el) el.value = opts.min_cpr_count;
|
||||
}
|
||||
|
||||
// ── Date filter ───────────────────────────────────────────────────────────
|
||||
const days = opts.older_than_days;
|
||||
if (days !== undefined) {
|
||||
@@ -395,6 +405,8 @@ function _openEditorForProfile(profile) {
|
||||
<div class="pmgmt-opt-row"><span>${t('m365_opt_max_emails','Maks. e-mails pr. bruger')}</span><input type="number" id="peOptMaxEmails" value="${opts.max_emails || 2000}" min="10" max="50000" style="width:56px;padding:3px 6px;font-size:11px;text-align:right"></div>
|
||||
<div class="pmgmt-opt-row"><span>${t('m365_opt_delta','Delta-scanning')}</span><label class="toggle"><input type="checkbox" id="peOptDelta" ${opts.delta ? 'checked' : ''}><span class="toggle-slider"></span></label></div>
|
||||
<div class="pmgmt-opt-row"><span>${t('m365_opt_scan_photos','Søg efter ansigter i billeder')}</span><label class="toggle"><input type="checkbox" id="peOptPhotos" ${opts.scan_photos ? 'checked' : ''}><span class="toggle-slider"></span></label></div>
|
||||
<div class="pmgmt-opt-row"><span>${t('m365_opt_skip_gps','Ignorer GPS i billeder')}</span><label class="toggle"><input type="checkbox" id="peOptSkipGps" ${opts.skip_gps_images ? 'checked' : ''}><span class="toggle-slider"></span></label></div>
|
||||
<div class="pmgmt-opt-row"><span style="color:var(--muted)">${t('m365_opt_min_cpr','Min. CPR-antal pr. fil')}</span><input type="number" id="peOptMinCpr" value="${opts.min_cpr_count || 1}" min="1" max="50" style="width:46px;padding:3px 6px;font-size:11px;text-align:right"></div>
|
||||
<hr style="border:none;border-top:1px solid var(--pmgmt-divider);margin:2px 0">
|
||||
<div class="pmgmt-opt-row"><span>${t('m365_opt_retention','Opbevaringspolitik')}</span><label class="toggle"><input type="checkbox" id="peOptRetention" ${profile.retention_years ? 'checked' : ''}><span class="toggle-slider"></span></label></div>
|
||||
<div style="padding:7px 8px;background:var(--bg);border-radius:6px">
|
||||
@@ -609,6 +621,8 @@ async function _pmgmtSaveFullEdit() {
|
||||
max_emails: parseInt(document.getElementById('peOptMaxEmails')?.value) || 2000,
|
||||
delta: document.getElementById('peOptDelta')?.checked ?? false,
|
||||
scan_photos: document.getElementById('peOptPhotos')?.checked ?? false,
|
||||
skip_gps_images: document.getElementById('peOptSkipGps')?.checked ?? false,
|
||||
min_cpr_count: parseInt(document.getElementById('peOptMinCpr')?.value) || 1,
|
||||
},
|
||||
retention_years: document.getElementById('peOptRetention')?.checked ? (parseInt(document.getElementById('peOptRetYears')?.value) || 5) : null,
|
||||
fiscal_year_end: document.getElementById('peOptRetention')?.checked ? (document.getElementById('peOptFiscalYearEnd')?.value || '') : '',
|
||||
|
||||
+7
-1
@@ -125,6 +125,8 @@ function buildScanPayload() {
|
||||
max_emails: parseInt(document.getElementById('optMaxEmails').value) || 200,
|
||||
delta: document.getElementById('optDelta') ? document.getElementById('optDelta').checked : false,
|
||||
scan_photos: document.getElementById('optScanPhotos') ? document.getElementById('optScanPhotos').checked : false,
|
||||
skip_gps_images: document.getElementById('optSkipGps') ? document.getElementById('optSkipGps').checked : false,
|
||||
min_cpr_count: document.getElementById('optMinCpr') ? (parseInt(document.getElementById('optMinCpr').value) || 1) : 1,
|
||||
retention_enabled: document.getElementById('optRetention') ? document.getElementById('optRetention').checked : false,
|
||||
retention_years: parseInt(document.getElementById('optRetentionYears')?.value) || 5,
|
||||
fiscal_year_end: document.getElementById('optFiscalYearEnd')?.value || '',
|
||||
@@ -570,7 +572,11 @@ function startScan(resume) {
|
||||
if (!source) return;
|
||||
fetch('/api/file_scan/start', {
|
||||
method: 'POST', headers: {'Content-Type':'application/json'},
|
||||
body: JSON.stringify(Object.assign({}, source, {scan_photos: options.scan_photos || false}))
|
||||
body: JSON.stringify(Object.assign({}, source, {
|
||||
scan_photos: options.scan_photos || false,
|
||||
skip_gps_images: options.skip_gps_images || false,
|
||||
min_cpr_count: options.min_cpr_count || 1,
|
||||
}))
|
||||
}).catch(e => { log('File scan error: ' + e, 'err'); });
|
||||
});
|
||||
|
||||
|
||||
Reference in new issue
Block a user