| """ |
| Data Store management views for the control panel. |
| """ |
|
|
| from django.contrib import messages |
| from django.contrib.auth.decorators import login_required |
| from django.http import HttpRequest, HttpResponse |
| from django.shortcuts import get_object_or_404, redirect, render |
| from django.views.decorators.http import require_POST |
|
|
| from core.forms import DataStoreForm, DataStoreEntryForm |
| from core.models import DataStore, DataStoreEntry |
| from core.services import DatastoreService |
|
|
|
|
| @login_required |
| def datastore_list_view(request: HttpRequest) -> HttpResponse: |
| """List all data stores.""" |
| datastores = DatastoreService.get_datastores_with_stats() |
|
|
| |
| for ds in datastores: |
| ds.size_display = DatastoreService.format_size(ds.size_bytes) |
|
|
| total_size = DatastoreService.get_total_size() |
| total_size_display = DatastoreService.format_size(total_size) |
|
|
| return render( |
| request, |
| "cpanel/datastores/list.html", |
| { |
| "datastores": datastores, |
| "total_size_display": total_size_display, |
| "datastore_count": len(datastores), |
| }, |
| ) |
|
|
|
|
| @login_required |
| def datastore_create_view(request: HttpRequest) -> HttpResponse: |
| """Create a new data store.""" |
| if request.method == "POST": |
| form = DataStoreForm(request.POST) |
| if form.is_valid(): |
| datastore = form.save(commit=False) |
| datastore.created_by = request.user |
| datastore.save() |
|
|
| messages.success(request, f'Data store "{datastore.name}" created successfully.') |
| return redirect("cpanel:datastore_detail", pk=datastore.pk) |
| else: |
| form = DataStoreForm() |
|
|
| return render( |
| request, |
| "cpanel/datastores/create.html", |
| { |
| "form": form, |
| }, |
| ) |
|
|
|
|
| @login_required |
| def datastore_detail_view(request: HttpRequest, pk) -> HttpResponse: |
| """View a data store with all its entries.""" |
| datastore = get_object_or_404(DataStore, pk=pk) |
| entries = datastore.entries.all().order_by("key") |
|
|
| return render( |
| request, |
| "cpanel/datastores/detail.html", |
| { |
| "datastore": datastore, |
| "entries": entries, |
| }, |
| ) |
|
|
|
|
| @login_required |
| def datastore_edit_view(request: HttpRequest, pk) -> HttpResponse: |
| """Edit a data store's metadata.""" |
| datastore = get_object_or_404(DataStore, pk=pk) |
|
|
| if request.method == "POST": |
| form = DataStoreForm(request.POST, instance=datastore) |
| if form.is_valid(): |
| form.save() |
| messages.success(request, f'Data store "{datastore.name}" updated successfully.') |
| return redirect("cpanel:datastore_detail", pk=datastore.pk) |
| else: |
| form = DataStoreForm(instance=datastore) |
|
|
| return render( |
| request, |
| "cpanel/datastores/edit.html", |
| { |
| "form": form, |
| "datastore": datastore, |
| }, |
| ) |
|
|
|
|
| @login_required |
| @require_POST |
| def datastore_delete_view(request: HttpRequest, pk) -> HttpResponse: |
| """Delete a data store and all its entries.""" |
| datastore = get_object_or_404(DataStore, pk=pk) |
| name = datastore.name |
| datastore.delete() |
|
|
| messages.success(request, f'Data store "{name}" deleted successfully.') |
| return redirect("cpanel:datastore_list") |
|
|
|
|
| @login_required |
| @require_POST |
| def datastore_clear_view(request: HttpRequest, pk) -> HttpResponse: |
| """Clear all entries from a data store.""" |
| datastore = get_object_or_404(DataStore, pk=pk) |
| count = datastore.entries.count() |
| datastore.entries.all().delete() |
|
|
| messages.success(request, f'Cleared {count} entries from "{datastore.name}".') |
| return redirect("cpanel:datastore_detail", pk=datastore.pk) |
|
|
|
|
| |
| |
| |
|
|
|
|
| @login_required |
| def datastore_entry_create_view(request: HttpRequest, pk) -> HttpResponse: |
| """Add a new entry to a data store.""" |
| datastore = get_object_or_404(DataStore, pk=pk) |
|
|
| if request.method == "POST": |
| form = DataStoreEntryForm(request.POST, datastore=datastore) |
| if form.is_valid(): |
| entry = DataStoreEntry( |
| datastore=datastore, |
| key=form.cleaned_data["key"], |
| value_json=form.cleaned_data["value"], |
| ) |
| entry.save() |
|
|
| messages.success(request, f'Entry "{entry.key}" added successfully.') |
| return redirect("cpanel:datastore_detail", pk=datastore.pk) |
| else: |
| form = DataStoreEntryForm(datastore=datastore) |
|
|
| return render( |
| request, |
| "cpanel/datastores/entry_create.html", |
| { |
| "form": form, |
| "datastore": datastore, |
| }, |
| ) |
|
|
|
|
| @login_required |
| def datastore_entry_edit_view(request: HttpRequest, pk, entry_pk) -> HttpResponse: |
| """Edit an existing entry.""" |
| datastore = get_object_or_404(DataStore, pk=pk) |
| entry = get_object_or_404(DataStoreEntry, pk=entry_pk, datastore=datastore) |
|
|
| if request.method == "POST": |
| form = DataStoreEntryForm(request.POST, datastore=datastore, instance=entry) |
| if form.is_valid(): |
| entry.key = form.cleaned_data["key"] |
| entry.value_json = form.cleaned_data["value"] |
| entry.save() |
|
|
| messages.success(request, f'Entry "{entry.key}" updated successfully.') |
| return redirect("cpanel:datastore_detail", pk=datastore.pk) |
| else: |
| form = DataStoreEntryForm(datastore=datastore, instance=entry) |
|
|
| return render( |
| request, |
| "cpanel/datastores/entry_edit.html", |
| { |
| "form": form, |
| "datastore": datastore, |
| "entry": entry, |
| }, |
| ) |
|
|
|
|
| @login_required |
| @require_POST |
| def datastore_entry_delete_view(request: HttpRequest, pk, entry_pk) -> HttpResponse: |
| """Delete an entry from a data store.""" |
| datastore = get_object_or_404(DataStore, pk=pk) |
| entry = get_object_or_404(DataStoreEntry, pk=entry_pk, datastore=datastore) |
| key = entry.key |
| entry.delete() |
|
|
| messages.success(request, f'Entry "{key}" deleted successfully.') |
| return redirect("cpanel:datastore_detail", pk=datastore.pk) |
|
|