idek just need to send off my code dont remember what i did for this
This commit is contained in:
1 parent
d9881bde01
commit
977603ffab
9 files changed
+116
-6
No files matched your search
+4
-1
@@ -9,7 +9,10 @@ ENV PYTHONUNBUFFERED=1 \
|
||||
PIP_DISABLE_PIP_VERSION_CHECK=on
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
RUN sed -i \
|
||||
-e 's|http://deb\.debian\.org/debian-security|http://security.debian.org/debian-security|g' \
|
||||
-e 's|http://deb\.debian\.org/debian|http://ftp.uk.debian.org/debian|g' \
|
||||
/etc/apt/sources.list.d/debian.sources
|
||||
# System deps for psycopg2, node (for Tailwind), etc.
|
||||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||
build-essential \
|
||||
|
||||
@@ -87,7 +87,10 @@ class ServerAdmin(GuardedModelAdmin):
|
||||
if not request.user.is_superuser:
|
||||
return super().get_deleted_objects(objs, request)
|
||||
|
||||
if hasattr(objs, "values_list"):
|
||||
server_ids = list(objs.values_list("id", flat=True))
|
||||
else:
|
||||
server_ids = [obj.id for obj in objs if getattr(obj, "id", None) is not None]
|
||||
if not server_ids:
|
||||
return super().get_deleted_objects(objs, request)
|
||||
|
||||
|
||||
@@ -76,6 +76,43 @@ class ServerAdminDeleteTests(TestCase):
|
||||
self.assertEqual(model_count[ServerLogSource._meta.verbose_name_plural], 1)
|
||||
self.assertEqual(model_count[AccessRequest._meta.verbose_name_plural], 1)
|
||||
|
||||
@override_settings(KEYWARDEN_ADMIN_DELETE_PREVIEW_MAX_ITEMS=2)
|
||||
def test_get_deleted_objects_accepts_plain_object_list(self) -> None:
|
||||
server = Server.objects.create(display_name="srv-admin-delete-list")
|
||||
ServerAuditLog.objects.bulk_create(
|
||||
[
|
||||
ServerAuditLog(
|
||||
server=server,
|
||||
event_at=timezone.now(),
|
||||
category="auth",
|
||||
event_type="login",
|
||||
),
|
||||
ServerAuditLog(
|
||||
server=server,
|
||||
event_at=timezone.now(),
|
||||
category="auth",
|
||||
event_type="logout",
|
||||
),
|
||||
ServerAuditLog(
|
||||
server=server,
|
||||
event_at=timezone.now(),
|
||||
category="auth",
|
||||
event_type="sudo",
|
||||
),
|
||||
]
|
||||
)
|
||||
|
||||
deleted_objects, model_count, perms_needed, protected = self.model_admin.get_deleted_objects(
|
||||
[server],
|
||||
self._request(),
|
||||
)
|
||||
|
||||
self.assertEqual(perms_needed, set())
|
||||
self.assertEqual(protected, [])
|
||||
self.assertIn("Large cascade detected", " ".join(str(item) for item in deleted_objects))
|
||||
self.assertEqual(model_count[Server._meta.verbose_name_plural], 1)
|
||||
self.assertEqual(model_count[ServerAuditLog._meta.verbose_name_plural], 3)
|
||||
|
||||
def test_delete_queryset_prepurges_audit_logs(self) -> None:
|
||||
server = Server.objects.create(display_name="srv-admin-delete-purge")
|
||||
ServerAuditLog.objects.bulk_create(
|
||||
|
||||
@@ -291,7 +291,8 @@ UNFOLD = {
|
||||
# Force a consistent admin theme; disables theme switching.
|
||||
"THEME": "dark", # Force theme: "dark" or "light". Will disable theme switcher
|
||||
"SIDEBAR": {
|
||||
"show_search": True,
|
||||
"show_search": False,
|
||||
"command_search": False,
|
||||
"show_all_applications": True,
|
||||
"navigation": [
|
||||
{
|
||||
@@ -310,7 +311,7 @@ UNFOLD = {
|
||||
"STYLES": [
|
||||
"/static/unfold/css/styles.css",
|
||||
"/static/unfold/css/simplebar.css",
|
||||
#(lambda request: "/static/unfold/css/keywarden.css"),
|
||||
"/static/unfold/css/keywarden.css",
|
||||
],
|
||||
# "TABS": [
|
||||
# {
|
||||
|
||||
@@ -97,3 +97,16 @@ html:not(.dark) .kw-pill {
|
||||
min-width: 0;
|
||||
}
|
||||
|
||||
/* Emergency presentation fix: hide Unfold search UI everywhere in admin. */
|
||||
form[action$="/admin/search/"],
|
||||
form[action*="/admin/search/?"],
|
||||
a[href$="/admin/search/"],
|
||||
a[href*="/admin/search/?"] {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
/* Keep Unfold command modal from blocking admin login if Alpine state desyncs. */
|
||||
body.login #modal-overlay,
|
||||
body.login [x-show="openModal"] {
|
||||
display: none !important;
|
||||
}
|
||||
@@ -1,2 +1,2 @@
|
||||
/*! tailwindcss v4.2.0 | MIT License | https://tailwindcss.com */
|
||||
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-text-shadow-color:initial;--tw-text-shadow-alpha:100%;--tw-content:""}}}@layer theme{:root,:host{--font-sans:"Inter", sans-serif;--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-50:oklch(97.1% .013 17.38);--color-red-100:oklch(93.6% .032 17.717);--color-red-200:oklch(88.5% .062 18.334);--color-red-300:oklch(80.8% .114 19.571);--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-red-700:oklch(50.5% .213 27.518);--color-red-800:oklch(44.4% .177 26.899);--color-red-900:oklch(39.6% .141 25.723);--color-red-950:oklch(25.8% .092 26.042);--color-orange-50:oklch(98% .016 73.684);--color-orange-100:oklch(95.4% .038 75.164);--color-orange-200:oklch(90.1% .076 70.697);--color-orange-300:oklch(83.7% .128 66.29);--color-orange-400:oklch(75% .183 55.934);--color-orange-500:oklch(70.5% .213 47.604);--color-orange-600:oklch(64.6% .222 41.116);--color-orange-700:oklch(55.3% .195 38.402);--color-orange-800:oklch(47% .157 37.304);--color-orange-900:oklch(40.8% .123 38.172);--color-orange-950:oklch(26.6% .079 36.259);--color-yellow-200:oklch(94.5% .129 101.54);--color-yellow-500:oklch(79.5% .184 86.047);--color-green-50:oklch(98.2% .018 155.826);--color-green-100:oklch(96.2% .044 156.743);--color-green-200:oklch(92.5% .084 155.995);--color-green-300:oklch(87.1% .15 154.449);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-green-600:oklch(62.7% .194 149.214);--color-green-700:oklch(52.7% .154 150.069);--color-green-800:oklch(44.8% .119 151.328);--color-green-900:oklch(39.3% .095 152.535);--color-green-950:oklch(26.6% .065 152.934);--color-blue-50:oklch(97% .014 254.604);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-200:oklch(88.2% .059 254.128);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--color-blue-800:oklch(42.4% .199 265.638);--color-blue-900:oklch(37.9% .146 265.522);--color-blue-950:oklch(28.2% .091 267.935);--color-white:#fff;--spacing:.25rem;--container-sm:24rem;--container-xl:36rem;--container-2xl:42rem;--container-3xl:48rem;--container-4xl:56rem;--container-5xl:64rem;--container-6xl:72rem;--container-7xl:80rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--text-5xl:3rem;--text-5xl--line-height:1;--text-6xl:3.75rem;--text-6xl--line-height:1;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--leading-normal:1.5;--leading-relaxed:1.625;--radius-xs:.125rem;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--radius-3xl:1.5rem;--animate-spin:Line truncated
|
||||
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-text-shadow-color:initial;--tw-text-shadow-alpha:100%;--tw-content:""}}}@layer theme{:root,:host{--font-sans:"Inter", sans-serif;--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-50:oklch(97.1% .013 17.38);--color-red-100:oklch(93.6% .032 17.717);--color-red-200:oklch(88.5% .062 18.334);--color-red-300:oklch(80.8% .114 19.571);--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-red-700:oklch(50.5% .213 27.518);--color-red-800:oklch(44.4% .177 26.899);--color-red-900:oklch(39.6% .141 25.723);--color-red-950:oklch(25.8% .092 26.042);--color-orange-50:oklch(98% .016 73.684);--color-orange-100:oklch(95.4% .038 75.164);--color-orange-200:oklch(90.1% .076 70.697);--color-orange-300:oklch(83.7% .128 66.29);--color-orange-400:oklch(75% .183 55.934);--color-orange-500:oklch(70.5% .213 47.604);--color-orange-600:oklch(64.6% .222 41.116);--color-orange-700:oklch(55.3% .195 38.402);--color-orange-800:oklch(47% .157 37.304);--color-orange-900:oklch(40.8% .123 38.172);--color-orange-950:oklch(26.6% .079 36.259);--color-yellow-200:oklch(94.5% .129 101.54);--color-yellow-500:oklch(79.5% .184 86.047);--color-green-50:oklch(98.2% .018 155.826);--color-green-100:oklch(96.2% .044 156.743);--color-green-200:oklch(92.5% .084 155.995);--color-green-300:oklch(87.1% .15 154.449);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-green-600:oklch(62.7% .194 149.214);--color-green-700:oklch(52.7% .154 150.069);--color-green-800:oklch(44.8% .119 151.328);--color-green-900:oklch(39.3% .095 152.535);--color-green-950:oklch(26.6% .065 152.934);--color-blue-50:oklch(97% .014 254.604);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-200:oklch(88.2% .059 254.128);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--color-blue-800:oklch(42.4% .199 265.638);--color-blue-900:oklch(37.9% .146 265.522);--color-blue-950:oklch(28.2% .091 267.935);--color-white:#fff;--spacing:.25rem;--container-sm:24rem;--container-md:28rem;--container-xl:36rem;--container-2xl:42rem;--container-3xl:48rem;--container-4xl:56rem;--container-5xl:64rem;--container-6xl:72rem;--container-7xl:80rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--text-5xl:3rem;--text-5xl--line-height:1;--text-6xl:3.75rem;--text-6xl--line-height:1;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--leading-normal:1.5;--leading-relaxed:1.625;--radius-xs:.125rem;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--radius-3xl:1Line truncated
|
||||
@@ -21,7 +21,35 @@ window.addEventListener("load", (e) => {
|
||||
*************************************************************/
|
||||
function theme(defaultTheme = "auto") {
|
||||
return {
|
||||
openModal: false,
|
||||
filterOpen: false,
|
||||
openAllApplications: false,
|
||||
adminTheme: Alpine.$persist(defaultTheme).as('adminTheme'),
|
||||
init() {
|
||||
this.$watch('openModal', (value) => {
|
||||
if (value) {
|
||||
document.getElementsByTagName("body")[0].classList.add("overflow-hidden");
|
||||
} else {
|
||||
document.getElementsByTagName("body")[0].classList.remove("overflow-hidden");
|
||||
}
|
||||
});
|
||||
|
||||
this.$watch('filterOpen', (value) => {
|
||||
if (value) {
|
||||
document.getElementsByTagName("body")[0].classList.add("overflow-hidden");
|
||||
} else {
|
||||
document.getElementsByTagName("body")[0].classList.remove("overflow-hidden");
|
||||
}
|
||||
});
|
||||
|
||||
this.$watch('openAllApplications', (value) => {
|
||||
if (value) {
|
||||
document.getElementsByTagName("body")[0].classList.add("overflow-hidden");
|
||||
} else {
|
||||
document.getElementsByTagName("body")[0].classList.remove("overflow-hidden");
|
||||
}
|
||||
});
|
||||
},
|
||||
switchTheme(theme) {
|
||||
this.adminTheme = theme;
|
||||
},
|
||||
@@ -351,7 +379,7 @@ function searchCommand() {
|
||||
this.scrollToActiveItem();
|
||||
}
|
||||
},
|
||||
selectItem(addHistory) {
|
||||
selectItem(addHistory, openInNewTab=false) {
|
||||
const link = this.items[this.currentIndex - 1].querySelector("a");
|
||||
const data = {
|
||||
title: link.dataset.title,
|
||||
@@ -364,7 +392,11 @@ function searchCommand() {
|
||||
this.addToHistory(data);
|
||||
}
|
||||
|
||||
if (openInNewTab) {
|
||||
window.open(link.href, "_blank");
|
||||
} else {
|
||||
window.location = link.href;
|
||||
}
|
||||
},
|
||||
addToHistory(data) {
|
||||
let commandHistory = JSON.parse(
|
||||
@@ -495,6 +527,15 @@ function dateTimeShortcutsOverlay() {
|
||||
for (const mutationRecord of mutations) {
|
||||
const display = mutationRecord.target.style.display;
|
||||
const overlay = document.getElementById("modal-overlay");
|
||||
if (!overlay) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Unfold uses this overlay for command modal via Alpine state.
|
||||
// Don't force inline display changes when Alpine is in control.
|
||||
if (overlay.getAttribute("x-show") === "openModal") {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (display === "block") {
|
||||
overlay.style.display = "block";
|
||||
|
||||
@@ -1 +1,13 @@
|
||||
{% extends "admin/base.html" %}
|
||||
|
||||
{% block extrahead %}
|
||||
{{ block.super }}
|
||||
{% if is_login %}
|
||||
<style>
|
||||
#modal-overlay,
|
||||
[x-show="openModal"] {
|
||||
display: none !important;
|
||||
}
|
||||
</style>
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
@@ -1,6 +1,6 @@
|
||||
proxy_hide_header X-Powered-By;
|
||||
|
||||
add_header Content-Security-Policy "default-src 'self'; base-uri 'self'; frame-ancestors 'self'; object-src 'none'; form-action 'self'; connect-src 'self' https: wss:; img-src 'self' data: https:; font-src 'self' data:; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'" always;
|
||||
add_header Content-Security-Policy "default-src 'self'; base-uri 'self'; frame-ancestors 'self'; object-src 'none'; form-action 'self'; connect-src 'self' https: wss:; img-src 'self' data: https:; font-src 'self' data:; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'" always;
|
||||
add_header X-Frame-Options "SAMEORIGIN" always;
|
||||
add_header X-Content-Type-Options "nosniff" always;
|
||||
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
|
||||
|
||||
Reference in new issue
Block a user