Donut Ding weg + Toggle mit Aktiv
Dieser Commit ist enthalten in:
@@ -2162,5 +2162,153 @@ def clear_attempts():
|
||||
|
||||
return redirect(url_for('blocked_ips'))
|
||||
|
||||
# API Endpoints for License Management
|
||||
@app.route("/api/license/<int:license_id>/toggle", methods=["POST"])
|
||||
@login_required
|
||||
def toggle_license_api(license_id):
|
||||
"""Toggle license active status via API"""
|
||||
try:
|
||||
data = request.get_json()
|
||||
is_active = data.get('is_active', False)
|
||||
|
||||
conn = get_connection()
|
||||
cur = conn.cursor()
|
||||
|
||||
# Update license status
|
||||
cur.execute("""
|
||||
UPDATE licenses
|
||||
SET is_active = %s
|
||||
WHERE id = %s
|
||||
""", (is_active, license_id))
|
||||
|
||||
conn.commit()
|
||||
|
||||
# Log the action
|
||||
log_audit('UPDATE', 'license', license_id,
|
||||
new_values={'is_active': is_active},
|
||||
additional_info=f"Lizenz {'aktiviert' if is_active else 'deaktiviert'} via Toggle")
|
||||
|
||||
cur.close()
|
||||
conn.close()
|
||||
|
||||
return jsonify({'success': True, 'message': 'Status erfolgreich geändert'})
|
||||
except Exception as e:
|
||||
return jsonify({'success': False, 'message': str(e)}), 500
|
||||
|
||||
@app.route("/api/licenses/bulk-activate", methods=["POST"])
|
||||
@login_required
|
||||
def bulk_activate_licenses():
|
||||
"""Activate multiple licenses at once"""
|
||||
try:
|
||||
data = request.get_json()
|
||||
license_ids = data.get('ids', [])
|
||||
|
||||
if not license_ids:
|
||||
return jsonify({'success': False, 'message': 'Keine Lizenzen ausgewählt'}), 400
|
||||
|
||||
conn = get_connection()
|
||||
cur = conn.cursor()
|
||||
|
||||
# Update all selected licenses
|
||||
cur.execute("""
|
||||
UPDATE licenses
|
||||
SET is_active = TRUE
|
||||
WHERE id = ANY(%s)
|
||||
""", (license_ids,))
|
||||
|
||||
affected_rows = cur.rowcount
|
||||
conn.commit()
|
||||
|
||||
# Log the bulk action
|
||||
log_audit('BULK_UPDATE', 'licenses', None,
|
||||
new_values={'is_active': True, 'count': affected_rows},
|
||||
additional_info=f"{affected_rows} Lizenzen aktiviert")
|
||||
|
||||
cur.close()
|
||||
conn.close()
|
||||
|
||||
return jsonify({'success': True, 'message': f'{affected_rows} Lizenzen aktiviert'})
|
||||
except Exception as e:
|
||||
return jsonify({'success': False, 'message': str(e)}), 500
|
||||
|
||||
@app.route("/api/licenses/bulk-deactivate", methods=["POST"])
|
||||
@login_required
|
||||
def bulk_deactivate_licenses():
|
||||
"""Deactivate multiple licenses at once"""
|
||||
try:
|
||||
data = request.get_json()
|
||||
license_ids = data.get('ids', [])
|
||||
|
||||
if not license_ids:
|
||||
return jsonify({'success': False, 'message': 'Keine Lizenzen ausgewählt'}), 400
|
||||
|
||||
conn = get_connection()
|
||||
cur = conn.cursor()
|
||||
|
||||
# Update all selected licenses
|
||||
cur.execute("""
|
||||
UPDATE licenses
|
||||
SET is_active = FALSE
|
||||
WHERE id = ANY(%s)
|
||||
""", (license_ids,))
|
||||
|
||||
affected_rows = cur.rowcount
|
||||
conn.commit()
|
||||
|
||||
# Log the bulk action
|
||||
log_audit('BULK_UPDATE', 'licenses', None,
|
||||
new_values={'is_active': False, 'count': affected_rows},
|
||||
additional_info=f"{affected_rows} Lizenzen deaktiviert")
|
||||
|
||||
cur.close()
|
||||
conn.close()
|
||||
|
||||
return jsonify({'success': True, 'message': f'{affected_rows} Lizenzen deaktiviert'})
|
||||
except Exception as e:
|
||||
return jsonify({'success': False, 'message': str(e)}), 500
|
||||
|
||||
@app.route("/api/licenses/bulk-delete", methods=["POST"])
|
||||
@login_required
|
||||
def bulk_delete_licenses():
|
||||
"""Delete multiple licenses at once"""
|
||||
try:
|
||||
data = request.get_json()
|
||||
license_ids = data.get('ids', [])
|
||||
|
||||
if not license_ids:
|
||||
return jsonify({'success': False, 'message': 'Keine Lizenzen ausgewählt'}), 400
|
||||
|
||||
conn = get_connection()
|
||||
cur = conn.cursor()
|
||||
|
||||
# Get license info for audit log
|
||||
cur.execute("""
|
||||
SELECT license_key
|
||||
FROM licenses
|
||||
WHERE id = ANY(%s)
|
||||
""", (license_ids,))
|
||||
license_keys = [row[0] for row in cur.fetchall()]
|
||||
|
||||
# Delete all selected licenses
|
||||
cur.execute("""
|
||||
DELETE FROM licenses
|
||||
WHERE id = ANY(%s)
|
||||
""", (license_ids,))
|
||||
|
||||
affected_rows = cur.rowcount
|
||||
conn.commit()
|
||||
|
||||
# Log the bulk action
|
||||
log_audit('BULK_DELETE', 'licenses', None,
|
||||
old_values={'license_keys': license_keys, 'count': affected_rows},
|
||||
additional_info=f"{affected_rows} Lizenzen gelöscht")
|
||||
|
||||
cur.close()
|
||||
conn.close()
|
||||
|
||||
return jsonify({'success': True, 'message': f'{affected_rows} Lizenzen gelöscht'})
|
||||
except Exception as e:
|
||||
return jsonify({'success': False, 'message': str(e)}), 500
|
||||
|
||||
if __name__ == "__main__":
|
||||
app.run(host="0.0.0.0", port=5000)
|
||||
|
||||
In neuem Issue referenzieren
Einen Benutzer sperren