Merge siteroot application

This commit is contained in:
Sascha Ißbrücker
2025-03-09 05:50:05 +01:00
parent b037de14c9
commit 2d3bd13a12
84 changed files with 864 additions and 822 deletions

View File

@@ -1,4 +1,5 @@
from .assets import *
from .auth import *
from .bookmarks import *
from .settings import *
from .toasts import *

37
bookmarks/views/auth.py Normal file
View File

@@ -0,0 +1,37 @@
from django.conf import settings
from django.contrib.auth import views as auth_views
class LinkdingLoginView(auth_views.LoginView):
"""
Custom login view to lazily add additional context data
Allows to override settings in tests
"""
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["allow_registration"] = settings.ALLOW_REGISTRATION
context["enable_oidc"] = settings.LD_ENABLE_OIDC
return context
def form_invalid(self, form):
"""
Return 401 status code on failed login. Should allow integrating with
tools like Fail2Ban. Also, Hotwired Turbo requires a non 2xx status
code to handle failed form submissions.
"""
response = super().form_invalid(form)
response.status_code = 401
return response
class LinkdingPasswordChangeView(auth_views.PasswordChangeView):
def form_invalid(self, form):
"""
Hotwired Turbo requires a non 2xx status code to handle failed form
submissions.
"""
response = super().form_invalid(form)
response.status_code = 422
return response

View File

@@ -105,7 +105,7 @@ def shared(request):
"tag_cloud": tag_cloud,
"details": bookmark_details,
"users": users,
"rss_feed_url": reverse("bookmarks:feeds.public_shared"),
"rss_feed_url": reverse("linkding:feeds.public_shared"),
},
)
@@ -167,9 +167,9 @@ def new(request):
tag_string = convert_tag_string(form.data["tag_string"])
create_bookmark(form.save(commit=False), tag_string, current_user)
if auto_close:
return HttpResponseRedirect(reverse("bookmarks:close"))
return HttpResponseRedirect(reverse("linkding:bookmarks.close"))
else:
return HttpResponseRedirect(reverse("bookmarks:index"))
return HttpResponseRedirect(reverse("linkding:bookmarks.index"))
else:
form = BookmarkForm()
if initial_url:
@@ -189,7 +189,7 @@ def new(request):
context = {
"form": form,
"auto_close": initial_auto_close,
"return_url": reverse("bookmarks:index"),
"return_url": reverse("linkding:bookmarks.index"),
}
return render(request, "bookmarks/new.html", context, status=status)
@@ -202,7 +202,7 @@ def edit(request, bookmark_id: int):
except Bookmark.DoesNotExist:
raise Http404("Bookmark does not exist")
return_url = get_safe_return_url(
request.GET.get("return_url"), reverse("bookmarks:index")
request.GET.get("return_url"), reverse("linkding:bookmarks.index")
)
if request.method == "POST":
@@ -327,7 +327,7 @@ def index_action(request):
if turbo.accept(request):
return partials.active_bookmark_update(request)
return utils.redirect_with_query(request, reverse("bookmarks:index"))
return utils.redirect_with_query(request, reverse("linkding:bookmarks.index"))
@login_required
@@ -342,7 +342,7 @@ def archived_action(request):
if turbo.accept(request):
return partials.archived_bookmark_update(request)
return utils.redirect_with_query(request, reverse("bookmarks:archived"))
return utils.redirect_with_query(request, reverse("linkding:bookmarks.archived"))
@login_required
@@ -357,7 +357,7 @@ def shared_action(request):
if turbo.accept(request):
return partials.shared_bookmark_update(request)
return utils.redirect_with_query(request, reverse("bookmarks:shared"))
return utils.redirect_with_query(request, reverse("linkding:bookmarks.shared"))
def handle_action(request, query: QuerySet[Bookmark] = None):

View File

@@ -25,8 +25,8 @@ CJK_RE = re.compile(r"[\u4e00-\u9fff]+")
class RequestContext:
index_view = "bookmarks:index"
action_view = "bookmarks:index.action"
index_view = "linkding:bookmarks.index"
action_view = "linkding:bookmarks.index.action"
def __init__(self, request: WSGIRequest):
self.request = request
@@ -62,8 +62,8 @@ class RequestContext:
class ActiveBookmarksContext(RequestContext):
index_view = "bookmarks:index"
action_view = "bookmarks:index.action"
index_view = "linkding:bookmarks.index"
action_view = "linkding:bookmarks.index.action"
def get_bookmark_query_set(self, search: BookmarkSearch):
return queries.query_bookmarks(
@@ -77,8 +77,8 @@ class ActiveBookmarksContext(RequestContext):
class ArchivedBookmarksContext(RequestContext):
index_view = "bookmarks:archived"
action_view = "bookmarks:archived.action"
index_view = "linkding:bookmarks.archived"
action_view = "linkding:bookmarks.archived.action"
def get_bookmark_query_set(self, search: BookmarkSearch):
return queries.query_archived_bookmarks(
@@ -92,8 +92,8 @@ class ArchivedBookmarksContext(RequestContext):
class SharedBookmarksContext(RequestContext):
index_view = "bookmarks:shared"
action_view = "bookmarks:shared.action"
index_view = "linkding:bookmarks.shared"
action_view = "linkding:bookmarks.shared.action"
def get_bookmark_query_set(self, search: BookmarkSearch):
user = User.objects.filter(username=search.user).first()

View File

@@ -10,9 +10,9 @@ def root(request):
settings = request.global_settings
if settings.landing_page == GlobalSettings.LANDING_PAGE_SHARED_BOOKMARKS:
return HttpResponseRedirect(reverse("bookmarks:shared"))
return HttpResponseRedirect(reverse("linkding:bookmarks.shared"))
else:
return HttpResponseRedirect(reverse("login"))
# Redirect authenticated users to the bookmarks page
return HttpResponseRedirect(reverse("bookmarks:index"))
return HttpResponseRedirect(reverse("linkding:bookmarks.index"))

View File

@@ -94,7 +94,7 @@ def update(request):
request, "No missing snapshots found.", "settings_success_message"
)
return HttpResponseRedirect(reverse("bookmarks:settings.general"))
return HttpResponseRedirect(reverse("linkding:settings.general"))
def update_profile(request):
@@ -113,7 +113,7 @@ def update_profile(request):
if profile.enable_preview_images and not previews_were_enabled:
tasks.schedule_bookmarks_without_previews(request.user)
return HttpResponseRedirect(reverse("bookmarks:settings.general"))
return HttpResponseRedirect(reverse("linkding:settings.general"))
messages.error(
request,
@@ -165,20 +165,20 @@ def get_ttl_hash(seconds=3600):
@login_required
def integrations(request):
application_url = request.build_absolute_uri(reverse("bookmarks:new"))
application_url = request.build_absolute_uri(reverse("linkding:bookmarks.new"))
api_token = Token.objects.get_or_create(user=request.user)[0]
feed_token = FeedToken.objects.get_or_create(user=request.user)[0]
all_feed_url = request.build_absolute_uri(
reverse("bookmarks:feeds.all", args=[feed_token.key])
reverse("linkding:feeds.all", args=[feed_token.key])
)
unread_feed_url = request.build_absolute_uri(
reverse("bookmarks:feeds.unread", args=[feed_token.key])
reverse("linkding:feeds.unread", args=[feed_token.key])
)
shared_feed_url = request.build_absolute_uri(
reverse("bookmarks:feeds.shared", args=[feed_token.key])
reverse("linkding:feeds.shared", args=[feed_token.key])
)
public_shared_feed_url = request.build_absolute_uri(
reverse("bookmarks:feeds.public_shared")
reverse("linkding:feeds.public_shared")
)
return render(
request,
@@ -205,7 +205,7 @@ def bookmark_import(request):
messages.error(
request, "Please select a file to import.", "settings_error_message"
)
return HttpResponseRedirect(reverse("bookmarks:settings.general"))
return HttpResponseRedirect(reverse("linkding:settings.general"))
try:
content = import_file.read().decode()
@@ -226,7 +226,7 @@ def bookmark_import(request):
"settings_error_message",
)
return HttpResponseRedirect(reverse("bookmarks:settings.general"))
return HttpResponseRedirect(reverse("linkding:settings.general"))
@login_required

View File

@@ -17,6 +17,6 @@ def acknowledge(request):
toast.save()
return_url = get_safe_return_url(
request.GET.get("return_url"), reverse("bookmarks:index")
request.GET.get("return_url"), reverse("linkding:bookmarks.index")
)
return HttpResponseRedirect(return_url)