Gebruikers: massa-actie actief/inactief maken of verwijderen (jezelf wordt overgeslagen) en een knop Verwijderen op het gebruikersformulier; contacten, taken en activiteiten blijven zonder eigenaar, agenda, meldingen en mailboxkoppelingen gaan mee

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Machiel
2026-10-16 20:14:40 +02:00
co-authored by Claude Opus 5.5
parent 0368b7c1da
commit 5a97f992da
4 changed files with 50 additions and 3 deletions
+42 -1
View File
@@ -101,7 +101,7 @@ API_SKIP = {'api_key', 'redirect', '_gotcha', 'website_hp', 'g-recaptcha-respons
PUBLIC = {'static', 'login', 'setup', 'api_leads', 'api_products', 'dav', 'dav_wellknown', 'unsubscribe',
'api_tectum_woningen', 'api_tectum_woning', 'api_tectum_versie'}
PORTAL_PUBLIC = {'portal_login', 'portal_invite'}
ADMIN_ONLY = {'settings', 'users', 'user_edit', 'mailbox_edit', 'routines', 'routine_edit', 'routine_run',
ADMIN_ONLY = {'settings', 'users', 'user_edit', 'users_bulk', 'user_delete', 'mailbox_edit', 'routines', 'routine_edit', 'routine_run',
'routine_delete'}
@@ -918,6 +918,47 @@ def user_edit(uid):
return render_template('user_form.html', u=u or {'role': 'user', 'active': 1})
def delete_users(ids):
"""Verwijdert gebruikers: hun contacten, taken en activiteiten blijven (zonder eigenaar), hun agenda,
meldingen en mailboxkoppelingen gaan mee (foreign keys)."""
db().execute(f'DELETE FROM users WHERE id IN {id_list(ids)}', ids)
@app.post('/users/<int:uid>/delete')
def user_delete(uid):
u = get_or_404('users', uid)
if u['id'] == g.user['id']:
flash('Je kunt jezelf niet verwijderen.', 'error')
return redirect(url_for('user_edit', uid=uid))
delete_users([uid])
db().commit()
flash(f"Gebruiker {u['name']} verwijderd.")
return redirect(url_for('users'))
@app.post('/users/bulk')
def users_bulk():
ids, action = bulk_ids(), request.form.get('action')
skipped = g.user['id'] in ids
ids = [i for i in ids if i != g.user['id']] # jezelf niet buitensluiten
if not ids:
flash('Je kunt jezelf niet inactief maken of verwijderen.' if skipped else
'Vink eerst een of meer gebruikers aan.', 'error')
return bulk_back(url_for('users'))
if action in ('activate', 'deactivate'):
db().execute(f'UPDATE users SET active=? WHERE id IN {id_list(ids)}', [int(action == 'activate'), *ids])
msg = f"{len(ids)} gebruiker(s) op {'actief' if action == 'activate' else 'inactief'} gezet."
elif action == 'delete':
delete_users(ids)
msg = f'{len(ids)} gebruiker(s) verwijderd.'
else:
flash('Kies een actie.', 'error')
return bulk_back(url_for('users'))
db().commit()
flash(msg + (' Jezelf heb ik overgeslagen.' if skipped else ''))
return bulk_back(url_for('users'))
# ---------------------------------------------------------------- dashboard
@app.route('/')