Files
linkding/bookmarks/views/bundles.py
2025-07-01 07:09:02 +02:00

98 lines
3.4 KiB
Python

from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.http import HttpRequest, HttpResponseRedirect
from django.shortcuts import render
from django.urls import reverse
from bookmarks.models import BookmarkBundle, BookmarkBundleForm, BookmarkSearch
from bookmarks.services import bundles
from bookmarks.views import access
from bookmarks.views.contexts import ActiveBookmarkListContext
@login_required
def index(request: HttpRequest):
bundles = BookmarkBundle.objects.filter(owner=request.user).order_by("order")
context = {"bundles": bundles}
return render(request, "bundles/index.html", context)
@login_required
def action(request: HttpRequest):
if "remove_bundle" in request.POST:
remove_bundle_id = request.POST.get("remove_bundle")
bundle = access.bundle_write(request, remove_bundle_id)
bundle_name = bundle.name
bundles.delete_bundle(bundle)
messages.success(request, f"Bundle '{bundle_name}' removed successfully.")
elif "move_bundle" in request.POST:
bundle_id = request.POST.get("move_bundle")
bundle_to_move = access.bundle_write(request, bundle_id)
move_position = int(request.POST.get("move_position"))
bundles.move_bundle(bundle_to_move, move_position)
return HttpResponseRedirect(reverse("linkding:bundles.index"))
def _handle_edit(request: HttpRequest, template: str, bundle: BookmarkBundle = None):
form_data = request.POST if request.method == "POST" else None
form = BookmarkBundleForm(form_data, instance=bundle)
if request.method == "POST":
if form.is_valid():
instance = form.save(commit=False)
if bundle is None:
instance.order = None
bundles.create_bundle(instance, request.user)
else:
instance.save()
messages.success(request, "Bundle saved successfully.")
return HttpResponseRedirect(reverse("linkding:bundles.index"))
status = 422 if request.method == "POST" and not form.is_valid() else 200
bookmark_list = _get_bookmark_list_preview(request, bundle)
context = {"form": form, "bundle": bundle, "bookmark_list": bookmark_list}
return render(request, template, context, status=status)
@login_required
def new(request: HttpRequest):
return _handle_edit(request, "bundles/new.html")
@login_required
def edit(request: HttpRequest, bundle_id: int):
bundle = access.bundle_write(request, bundle_id)
return _handle_edit(request, "bundles/edit.html", bundle)
@login_required
def preview(request: HttpRequest):
bookmark_list = _get_bookmark_list_preview(request)
context = {"bookmark_list": bookmark_list}
return render(request, "bundles/preview.html", context)
def _get_bookmark_list_preview(
request: HttpRequest, bundle: BookmarkBundle | None = None
):
if request.method == "GET" and bundle:
preview_bundle = bundle
else:
form_data = (
request.POST.copy() if request.method == "POST" else request.GET.copy()
)
form_data["name"] = "Preview Bundle" # Set dummy name for form validation
form = BookmarkBundleForm(form_data)
preview_bundle = form.save(commit=False)
search = BookmarkSearch(bundle=preview_bundle)
bookmark_list = ActiveBookmarkListContext(request, search)
bookmark_list.is_preview = True
return bookmark_list