mirror of
https://github.com/paperless-ngx/paperless-ngx.git
synced 2025-10-02 01:42:50 -05:00
Compare commits
1 Commits
chore/test
...
feature-tr
Author | SHA1 | Date | |
---|---|---|---|
![]() |
afdb5d8a4b |
2
.github/workflows/ci.yml
vendored
2
.github/workflows/ci.yml
vendored
@@ -127,7 +127,7 @@ jobs:
|
|||||||
- pre-commit
|
- pre-commit
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
python-version: ['3.10', '3.11', '3.12', '3.13']
|
python-version: ['3.10', '3.11', '3.12']
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
|
@@ -49,7 +49,7 @@ repos:
|
|||||||
- 'prettier-plugin-organize-imports@4.1.0'
|
- 'prettier-plugin-organize-imports@4.1.0'
|
||||||
# Python hooks
|
# Python hooks
|
||||||
- repo: https://github.com/astral-sh/ruff-pre-commit
|
- repo: https://github.com/astral-sh/ruff-pre-commit
|
||||||
rev: v0.13.2
|
rev: v0.13.0
|
||||||
hooks:
|
hooks:
|
||||||
- id: ruff-check
|
- id: ruff-check
|
||||||
- id: ruff-format
|
- id: ruff-format
|
||||||
@@ -59,7 +59,7 @@ repos:
|
|||||||
- id: pyproject-fmt
|
- id: pyproject-fmt
|
||||||
# Dockerfile hooks
|
# Dockerfile hooks
|
||||||
- repo: https://github.com/AleksaC/hadolint-py
|
- repo: https://github.com/AleksaC/hadolint-py
|
||||||
rev: v2.14.0
|
rev: v2.12.1b3
|
||||||
hooks:
|
hooks:
|
||||||
- id: hadolint
|
- id: hadolint
|
||||||
# Shell script hooks
|
# Shell script hooks
|
||||||
|
18
Dockerfile
18
Dockerfile
@@ -5,7 +5,7 @@
|
|||||||
# Purpose: Compiles the frontend
|
# Purpose: Compiles the frontend
|
||||||
# Notes:
|
# Notes:
|
||||||
# - Does PNPM stuff with Typescript and such
|
# - Does PNPM stuff with Typescript and such
|
||||||
FROM --platform=$BUILDPLATFORM docker.io/node:20-bookworm-slim AS compile-frontend
|
FROM --platform=$BUILDPLATFORM docker.io/node:20-trixie-slim AS compile-frontend
|
||||||
|
|
||||||
COPY ./src-ui /src/src-ui
|
COPY ./src-ui /src/src-ui
|
||||||
|
|
||||||
@@ -170,20 +170,8 @@ RUN set -eux \
|
|||||||
&& apt-get update \
|
&& apt-get update \
|
||||||
&& apt-get install --yes --quiet --no-install-recommends ${RUNTIME_PACKAGES} \
|
&& apt-get install --yes --quiet --no-install-recommends ${RUNTIME_PACKAGES} \
|
||||||
&& echo "Installing pre-built updates" \
|
&& echo "Installing pre-built updates" \
|
||||||
&& curl --fail --silent --no-progress-meter --show-error --location --remote-name-all --parallel --parallel-max 4 \
|
&& curl --fail --silent --no-progress-meter --show-error --location --remote-name-all \
|
||||||
https://github.com/paperless-ngx/builder/releases/download/qpdf-${QPDF_VERSION}/libqpdf29_${QPDF_VERSION}-1_${TARGETARCH}.deb \
|
https://github.com/paperless-ngx/builder/releases/download/jbig2enc-v${JBIG2ENC_VERSION}/jbig2enc_${JBIG2ENC_VERSION}-1_${TARGETARCH}.deb \
|
||||||
https://github.com/paperless-ngx/builder/releases/download/qpdf-${QPDF_VERSION}/qpdf_${QPDF_VERSION}-1_${TARGETARCH}.deb \
|
|
||||||
https://github.com/paperless-ngx/builder/releases/download/ghostscript-${GS_VERSION}/libgs10_${GS_VERSION}.dfsg-1_${TARGETARCH}.deb \
|
|
||||||
https://github.com/paperless-ngx/builder/releases/download/ghostscript-${GS_VERSION}/ghostscript_${GS_VERSION}.dfsg-1_${TARGETARCH}.deb \
|
|
||||||
https://github.com/paperless-ngx/builder/releases/download/ghostscript-${GS_VERSION}/libgs10-common_${GS_VERSION}.dfsg-1_all.deb \
|
|
||||||
https://github.com/paperless-ngx/builder/releases/download/jbig2enc-${JBIG2ENC_VERSION}/jbig2enc_${JBIG2ENC_VERSION}-1_${TARGETARCH}.deb \
|
|
||||||
&& echo "Installing qpdf ${QPDF_VERSION}" \
|
|
||||||
&& dpkg --install ./libqpdf29_${QPDF_VERSION}-1_${TARGETARCH}.deb \
|
|
||||||
&& dpkg --install ./qpdf_${QPDF_VERSION}-1_${TARGETARCH}.deb \
|
|
||||||
&& echo "Installing Ghostscript ${GS_VERSION}" \
|
|
||||||
&& dpkg --install ./libgs10-common_${GS_VERSION}.dfsg-1_all.deb \
|
|
||||||
&& dpkg --install ./libgs10_${GS_VERSION}.dfsg-1_${TARGETARCH}.deb \
|
|
||||||
&& dpkg --install ./ghostscript_${GS_VERSION}.dfsg-1_${TARGETARCH}.deb \
|
|
||||||
&& echo "Installing jbig2enc" \
|
&& echo "Installing jbig2enc" \
|
||||||
&& dpkg --install ./jbig2enc_${JBIG2ENC_VERSION}-1_${TARGETARCH}.deb \
|
&& dpkg --install ./jbig2enc_${JBIG2ENC_VERSION}-1_${TARGETARCH}.deb \
|
||||||
&& echo "Configuring imagemagick" \
|
&& echo "Configuring imagemagick" \
|
||||||
|
319
dev.txt
Normal file
319
dev.txt
Normal file
@@ -0,0 +1,319 @@
|
|||||||
|
adduser 3.134
|
||||||
|
apt 2.6.1
|
||||||
|
base-files 12.4+deb12u11
|
||||||
|
base-passwd 3.6.1
|
||||||
|
bash 5.2.15-2+b8
|
||||||
|
bsdutils 1:2.38.1-5+deb12u3
|
||||||
|
ca-certificates 20230311+deb12u1
|
||||||
|
coreutils 9.1-1
|
||||||
|
curl 7.88.1-10+deb12u12
|
||||||
|
dash 0.5.12-2
|
||||||
|
debconf 1.5.82
|
||||||
|
debian-archive-keyring 2023.3+deb12u2
|
||||||
|
debianutils 5.7-0.5~deb12u1
|
||||||
|
diffutils 1:3.8-4
|
||||||
|
dirmngr 2.2.40-1.1
|
||||||
|
dpkg 1.21.22
|
||||||
|
e2fsprogs 1.47.0-2
|
||||||
|
file 1:5.44-3
|
||||||
|
findutils 4.9.0-4
|
||||||
|
fontconfig 2.14.1-4
|
||||||
|
fontconfig-config 2.14.1-4
|
||||||
|
fonts-liberation 1:1.07.4-11
|
||||||
|
fonts-urw-base35 20200910-7
|
||||||
|
gcc-12-base 12.2.0-14+deb12u1
|
||||||
|
gettext 0.21-12
|
||||||
|
gettext-base 0.21-12
|
||||||
|
ghostscript 10.03.1~dfsg-1
|
||||||
|
gnupg 2.2.40-1.1
|
||||||
|
gnupg-l10n 2.2.40-1.1
|
||||||
|
gnupg-utils 2.2.40-1.1
|
||||||
|
gosu 1.14-1+b10
|
||||||
|
gpg 2.2.40-1.1
|
||||||
|
gpg-agent 2.2.40-1.1
|
||||||
|
gpg-wks-client 2.2.40-1.1
|
||||||
|
gpg-wks-server 2.2.40-1.1
|
||||||
|
gpgconf 2.2.40-1.1
|
||||||
|
gpgsm 2.2.40-1.1
|
||||||
|
gpgv 2.2.40-1.1
|
||||||
|
grep 3.8-5
|
||||||
|
gzip 1.12-1
|
||||||
|
hicolor-icon-theme 0.17-2
|
||||||
|
hostname 3.23+nmu1
|
||||||
|
icc-profiles-free 2.0.1+dfsg-1.1
|
||||||
|
imagemagick 8:6.9.11.60+dfsg-1.6+deb12u3
|
||||||
|
imagemagick-6-common 8:6.9.11.60+dfsg-1.6+deb12u3
|
||||||
|
imagemagick-6.q16 8:6.9.11.60+dfsg-1.6+deb12u3
|
||||||
|
init-system-helpers 1.65.2
|
||||||
|
jbig2dec 0.19-3
|
||||||
|
jbig2enc 0.30-1
|
||||||
|
libacl1 2.3.1-3
|
||||||
|
libaom3 3.6.0-1+deb12u1
|
||||||
|
libapt-pkg6.0 2.6.1
|
||||||
|
libarchive13 3.6.2-1+deb12u2
|
||||||
|
libassuan0 2.5.5-5
|
||||||
|
libattr1 1:2.5.1-4
|
||||||
|
libaudit-common 1:3.0.9-1
|
||||||
|
libaudit1 1:3.0.9-1
|
||||||
|
libavahi-client3 0.8-10+deb12u1
|
||||||
|
libavahi-common-data 0.8-10+deb12u1
|
||||||
|
libavahi-common3 0.8-10+deb12u1
|
||||||
|
libavcodec59 7:5.1.6-0+deb12u1
|
||||||
|
libavformat59 7:5.1.6-0+deb12u1
|
||||||
|
libavutil57 7:5.1.6-0+deb12u1
|
||||||
|
libblkid1 2.38.1-5+deb12u3
|
||||||
|
libbluray2 1:1.3.4-1
|
||||||
|
libbrotli1 1.0.9-2+b6
|
||||||
|
libbsd0 0.11.7-2
|
||||||
|
libbz2-1.0 1.0.8-5+b1
|
||||||
|
libc-bin 2.36-9+deb12u10
|
||||||
|
libc6 2.36-9+deb12u10
|
||||||
|
libcairo-gobject2 1.16.0-7
|
||||||
|
libcairo2 1.16.0-7
|
||||||
|
libcap-ng0 0.8.3-1+b3
|
||||||
|
libcap2 1:2.66-4+deb12u1
|
||||||
|
libchromaprint1 1.5.1-2+b1
|
||||||
|
libcjson1 1.7.15-1+deb12u2
|
||||||
|
libcodec2-1.0 1.0.5-1
|
||||||
|
libcom-err2 1.47.0-2
|
||||||
|
libconfig-inifiles-perl 3.000003-2
|
||||||
|
libcrypt1 1:4.4.33-2
|
||||||
|
libcups2 2.4.2-3+deb12u8
|
||||||
|
libcurl4 7.88.1-10+deb12u12
|
||||||
|
libdatrie1 0.2.13-2+b1
|
||||||
|
libdav1d6 1.0.0-2+deb12u1
|
||||||
|
libdb5.3 5.3.28+dfsg2-1
|
||||||
|
libdbus-1-3 1.14.10-1~deb12u1
|
||||||
|
libde265-0 1.0.11-1+deb12u2
|
||||||
|
libdebconfclient0 0.270
|
||||||
|
libdeflate0 1.14-1
|
||||||
|
libdrm-common 2.4.114-1
|
||||||
|
libdrm2 2.4.114-1+b1
|
||||||
|
libedit2 3.1-20221030-2
|
||||||
|
libexpat1 2.5.0-1+deb12u1
|
||||||
|
libext2fs2 1.47.0-2
|
||||||
|
libffi8 3.4.4-1
|
||||||
|
libfftw3-double3 3.3.10-1
|
||||||
|
libfontconfig1 2.14.1-4
|
||||||
|
libfontenc1 1:1.1.4-1
|
||||||
|
libfreetype6 2.12.1+dfsg-5+deb12u4
|
||||||
|
libfribidi0 1.0.8-2.1
|
||||||
|
libgcc-s1 12.2.0-14+deb12u1
|
||||||
|
libgcrypt20 1.10.1-3
|
||||||
|
libgdbm-compat4 1.23-3
|
||||||
|
libgdbm6 1.23-3
|
||||||
|
libgdk-pixbuf-2.0-0 2.42.10+dfsg-1+deb12u2
|
||||||
|
libgdk-pixbuf2.0-common 2.42.10+dfsg-1+deb12u2
|
||||||
|
libgif7 5.2.1-2.5
|
||||||
|
libglib2.0-0 2.74.6-2+deb12u6
|
||||||
|
libgme0 0.6.3-6
|
||||||
|
libgmp10 2:6.2.1+dfsg1-1.1
|
||||||
|
libgnutls30 3.7.9-2+deb12u5
|
||||||
|
libgomp1 12.2.0-14+deb12u1
|
||||||
|
libgpg-error0 1.46-1
|
||||||
|
libgraphite2-3 1.3.14-1
|
||||||
|
libgs-common 10.0.0~dfsg-11+deb12u7
|
||||||
|
libgs10 10.03.1~dfsg-1
|
||||||
|
libgs10-common 10.03.1~dfsg-1
|
||||||
|
libgsm1 1.0.22-1
|
||||||
|
libgssapi-krb5-2 1.20.1-2+deb12u3
|
||||||
|
libharfbuzz0b 6.0.0+dfsg-3
|
||||||
|
libheif1 1.15.1-1+deb12u1
|
||||||
|
libhogweed6 3.8.1-2
|
||||||
|
libhwy1 1.0.3-3+deb12u1
|
||||||
|
libice6 2:1.0.10-1
|
||||||
|
libicu72 72.1-3+deb12u1
|
||||||
|
libidn12 1.41-1
|
||||||
|
libidn2-0 2.3.3-1+b1
|
||||||
|
libijs-0.35 0.35-15
|
||||||
|
libimagequant0 2.17.0-1
|
||||||
|
libjbig0 2.1-6.1
|
||||||
|
libjbig2dec0 0.19-3
|
||||||
|
libjpeg62-turbo 1:2.1.5-2
|
||||||
|
libjxl0.7 0.7.0-10+deb12u1
|
||||||
|
libk5crypto3 1.20.1-2+deb12u3
|
||||||
|
libkeyutils1 1.6.3-2
|
||||||
|
libkrb5-3 1.20.1-2+deb12u3
|
||||||
|
libkrb5support0 1.20.1-2+deb12u3
|
||||||
|
libksba8 1.6.3-2
|
||||||
|
liblcms2-2 2.14-2
|
||||||
|
libldap-2.5-0 2.5.13+dfsg-5
|
||||||
|
liblept5 1.82.0-3+b3
|
||||||
|
liblerc4 4.0.0+ds-2
|
||||||
|
liblqr-1-0 0.4.2-2.1
|
||||||
|
libltdl7 2.4.7-7~deb12u1
|
||||||
|
liblz4-1 1.9.4-1
|
||||||
|
liblzma5 5.4.1-1
|
||||||
|
libmagic-mgc 1:5.44-3
|
||||||
|
libmagic1 1:5.44-3
|
||||||
|
libmagickcore-6.q16-6 8:6.9.11.60+dfsg-1.6+deb12u3
|
||||||
|
libmagickwand-6.q16-6 8:6.9.11.60+dfsg-1.6+deb12u3
|
||||||
|
libmariadb3 1:10.11.11-0+deb12u1
|
||||||
|
libmbedcrypto7 2.28.3-1
|
||||||
|
libmd0 1.0.4-2
|
||||||
|
libmfx1 22.5.4-1
|
||||||
|
libmount1 2.38.1-5+deb12u3
|
||||||
|
libmp3lame0 3.100-6
|
||||||
|
libmpg123-0 1.31.2-1+deb12u1
|
||||||
|
libncurses6 6.4-4
|
||||||
|
libncursesw6 6.4-4
|
||||||
|
libnettle8 3.8.1-2
|
||||||
|
libnghttp2-14 1.52.0-1+deb12u2
|
||||||
|
libnorm1 1.5.9+dfsg-2
|
||||||
|
libnpth0 1.6-3
|
||||||
|
libnsl2 1.3.0-2
|
||||||
|
libnspr4 2:4.35-1
|
||||||
|
libnss3 2:3.87.1-1+deb12u1
|
||||||
|
libnuma1 2.0.16-1
|
||||||
|
libogg0 1.3.5-3
|
||||||
|
libopenjp2-7 2.5.0-2+deb12u1
|
||||||
|
libopenmpt0 0.6.9-1
|
||||||
|
libopus0 1.3.1-3
|
||||||
|
libp11-kit0 0.24.1-2
|
||||||
|
libpam-modules 1.5.2-6+deb12u1
|
||||||
|
libpam-modules-bin 1.5.2-6+deb12u1
|
||||||
|
libpam-runtime 1.5.2-6+deb12u1
|
||||||
|
libpam0g 1.5.2-6+deb12u1
|
||||||
|
libpango-1.0-0 1.50.12+ds-1
|
||||||
|
libpangocairo-1.0-0 1.50.12+ds-1
|
||||||
|
libpangoft2-1.0-0 1.50.12+ds-1
|
||||||
|
libpaper1 1.1.29
|
||||||
|
libpcre2-8-0 10.42-1
|
||||||
|
libperl5.36 5.36.0-7+deb12u2
|
||||||
|
libpgm-5.3-0 5.3.128~dfsg-2
|
||||||
|
libpixman-1-0 0.42.2-1
|
||||||
|
libpng16-16 1.6.39-2
|
||||||
|
libpoppler126 22.12.0-2+deb12u1
|
||||||
|
libpq5 15.13-0+deb12u1
|
||||||
|
libpsl5 0.21.2-1
|
||||||
|
libqpdf29 11.9.0-1
|
||||||
|
librabbitmq4 0.11.0-1+deb12u1
|
||||||
|
librav1e0 0.5.1-6
|
||||||
|
libreadline8 8.2-1.3
|
||||||
|
librist4 0.2.7+dfsg-1
|
||||||
|
librsvg2-2 2.54.7+dfsg-1~deb12u1
|
||||||
|
librtmp1 2.4+20151223.gitfa8646d.1-2+b2
|
||||||
|
libsasl2-2 2.1.28+dfsg-10
|
||||||
|
libsasl2-modules-db 2.1.28+dfsg-10
|
||||||
|
libseccomp2 2.5.4-1+deb12u1
|
||||||
|
libselinux1 3.4-1+b6
|
||||||
|
libsemanage-common 3.4-1
|
||||||
|
libsemanage2 3.4-1+b5
|
||||||
|
libsepol2 3.4-2.1
|
||||||
|
libshine3 3.1.1-2
|
||||||
|
libsm6 2:1.2.3-1
|
||||||
|
libsmartcols1 2.38.1-5+deb12u3
|
||||||
|
libsnappy1v5 1.1.9-3
|
||||||
|
libsodium23 1.0.18-1
|
||||||
|
libsoxr0 0.1.3-4
|
||||||
|
libspeex1 1.2.1-2
|
||||||
|
libsqlite3-0 3.40.1-2+deb12u1
|
||||||
|
libsrt1.5-gnutls 1.5.1-1+deb12u1
|
||||||
|
libss2 1.47.0-2
|
||||||
|
libssh-gcrypt-4 0.10.6-0+deb12u1
|
||||||
|
libssh2-1 1.10.0-3+b1
|
||||||
|
libssl3 3.0.17-1~deb12u1
|
||||||
|
libstdc++6 12.2.0-14+deb12u1
|
||||||
|
libsvtav1enc1 1.4.1+dfsg-1
|
||||||
|
libswresample4 7:5.1.6-0+deb12u1
|
||||||
|
libsystemd0 252.38-1~deb12u1
|
||||||
|
libtasn1-6 4.19.0-2+deb12u1
|
||||||
|
libtesseract5 5.3.0-2
|
||||||
|
libthai-data 0.1.29-1
|
||||||
|
libthai0 0.1.29-1
|
||||||
|
libtheora0 1.1.1+dfsg.1-16.1+b1
|
||||||
|
libtiff6 4.5.0-6+deb12u2
|
||||||
|
libtinfo6 6.4-4
|
||||||
|
libtirpc-common 1.3.3+ds-1
|
||||||
|
libtirpc3 1.3.3+ds-1
|
||||||
|
libtwolame0 0.4.0-2
|
||||||
|
libudev1 252.38-1~deb12u1
|
||||||
|
libudfread0 1.1.2-1
|
||||||
|
libunistring2 1.0-2
|
||||||
|
libuuid1 2.38.1-5+deb12u3
|
||||||
|
libv4l-0 1.22.1-5+b2
|
||||||
|
libv4lconvert0 1.22.1-5+b2
|
||||||
|
libva-drm2 2.17.0-1
|
||||||
|
libva-x11-2 2.17.0-1
|
||||||
|
libva2 2.17.0-1
|
||||||
|
libvdpau1 1.5-2
|
||||||
|
libvorbis0a 1.3.7-1
|
||||||
|
libvorbisenc2 1.3.7-1
|
||||||
|
libvorbisfile3 1.3.7-1
|
||||||
|
libvpx7 1.12.0-1+deb12u4
|
||||||
|
libwebp7 1.2.4-0.2+deb12u1
|
||||||
|
libwebpdemux2 1.2.4-0.2+deb12u1
|
||||||
|
libwebpmux3 1.2.4-0.2+deb12u1
|
||||||
|
libx11-6 2:1.8.4-2+deb12u2
|
||||||
|
libx11-data 2:1.8.4-2+deb12u2
|
||||||
|
libx11-xcb1 2:1.8.4-2+deb12u2
|
||||||
|
libx264-164 2:0.164.3095+gitbaee400-3
|
||||||
|
libx265-199 3.5-2+b1
|
||||||
|
libxau6 1:1.0.9-1
|
||||||
|
libxcb-dri3-0 1.15-1
|
||||||
|
libxcb-render0 1.15-1
|
||||||
|
libxcb-shm0 1.15-1
|
||||||
|
libxcb1 1.15-1
|
||||||
|
libxdmcp6 1:1.1.2-3
|
||||||
|
libxext6 2:1.3.4-1+b1
|
||||||
|
libxfixes3 1:6.0.0-2
|
||||||
|
libxml2 2.9.14+dfsg-1.3~deb12u2
|
||||||
|
libxrender1 1:0.9.10-1.1
|
||||||
|
libxslt1.1 1.1.35-1+deb12u1
|
||||||
|
libxt6 1:1.2.1-1.1
|
||||||
|
libxvidcore4 2:1.3.7-1
|
||||||
|
libxxhash0 0.8.1-1
|
||||||
|
libzbar0 0.23.92-7+deb12u1
|
||||||
|
libzmq5 4.3.4-6
|
||||||
|
libzstd1 1.5.4+dfsg2-5
|
||||||
|
libzvbi-common 0.2.41-1
|
||||||
|
libzvbi0 0.2.41-1
|
||||||
|
login 1:4.13+dfsg1-1+deb12u1
|
||||||
|
logsave 1.47.0-2
|
||||||
|
mariadb-client 1:10.11.11-0+deb12u1
|
||||||
|
mariadb-client-core 1:10.11.11-0+deb12u1
|
||||||
|
mariadb-common 1:10.11.11-0+deb12u1
|
||||||
|
mawk 1.3.4.20200120-3.1
|
||||||
|
media-types 10.0.0
|
||||||
|
mount 2.38.1-5+deb12u3
|
||||||
|
mysql-common 5.8+1.1.0
|
||||||
|
ncurses-base 6.4-4
|
||||||
|
ncurses-bin 6.4-4
|
||||||
|
netbase 6.4
|
||||||
|
ocl-icd-libopencl1 2.3.1-1
|
||||||
|
openssl 3.0.17-1~deb12u1
|
||||||
|
passwd 1:4.13+dfsg1-1+deb12u1
|
||||||
|
perl 5.36.0-7+deb12u2
|
||||||
|
perl-base 5.36.0-7+deb12u2
|
||||||
|
perl-modules-5.36 5.36.0-7+deb12u2
|
||||||
|
pinentry-curses 1.2.1-1
|
||||||
|
pngquant 2.17.0-1
|
||||||
|
poppler-data 0.4.12-1
|
||||||
|
poppler-utils 22.12.0-2+deb12u1
|
||||||
|
postgresql-client 15+248
|
||||||
|
postgresql-client-15 15.13-0+deb12u1
|
||||||
|
postgresql-client-common 248
|
||||||
|
qpdf 11.9.0-1
|
||||||
|
readline-common 8.2-1.3
|
||||||
|
sed 4.9-1
|
||||||
|
sensible-utils 0.0.17+nmu1
|
||||||
|
shared-mime-info 2.2-1
|
||||||
|
sysvinit-utils 3.06-4
|
||||||
|
tar 1.34+dfsg-1.2+deb12u1
|
||||||
|
tesseract-ocr 5.3.0-2
|
||||||
|
tesseract-ocr-deu 1:4.1.0-2
|
||||||
|
tesseract-ocr-eng 1:4.1.0-2
|
||||||
|
tesseract-ocr-fra 1:4.1.0-2
|
||||||
|
tesseract-ocr-ita 1:4.1.0-2
|
||||||
|
tesseract-ocr-osd 1:4.1.0-2
|
||||||
|
tesseract-ocr-spa 1:4.1.0-2
|
||||||
|
tzdata 2025b-0+deb12u1
|
||||||
|
ucf 3.0043+nmu1+deb12u1
|
||||||
|
unpaper 7.0.0-0.1
|
||||||
|
usr-is-merged 37~deb12u1
|
||||||
|
util-linux 2.38.1-5+deb12u3
|
||||||
|
util-linux-extra 2.38.1-5+deb12u3
|
||||||
|
x11-common 1:7.7+23
|
||||||
|
xfonts-encodings 1:1.0.4-2.2
|
||||||
|
xfonts-utils 1:7.7+6
|
||||||
|
zlib1g 1:1.2.13.dfsg-1
|
@@ -32,7 +32,7 @@ services:
|
|||||||
volumes:
|
volumes:
|
||||||
- redisdata:/data
|
- redisdata:/data
|
||||||
db:
|
db:
|
||||||
image: docker.io/library/postgres:18
|
image: docker.io/library/postgres:17
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
volumes:
|
volumes:
|
||||||
- pgdata:/var/lib/postgresql/data
|
- pgdata:/var/lib/postgresql/data
|
||||||
|
@@ -35,7 +35,7 @@ services:
|
|||||||
volumes:
|
volumes:
|
||||||
- redisdata:/data
|
- redisdata:/data
|
||||||
db:
|
db:
|
||||||
image: docker.io/library/postgres:18
|
image: docker.io/library/postgres:17
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
volumes:
|
volumes:
|
||||||
- pgdata:/var/lib/postgresql/data
|
- pgdata:/var/lib/postgresql/data
|
||||||
|
@@ -31,7 +31,7 @@ services:
|
|||||||
volumes:
|
volumes:
|
||||||
- redisdata:/data
|
- redisdata:/data
|
||||||
db:
|
db:
|
||||||
image: docker.io/library/postgres:18
|
image: docker.io/library/postgres:17
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
volumes:
|
volumes:
|
||||||
- pgdata:/var/lib/postgresql/data
|
- pgdata:/var/lib/postgresql/data
|
||||||
|
@@ -637,7 +637,7 @@ When you first delete a document it is moved to the 'trash' until either it is e
|
|||||||
You can set how long documents remain in the trash before being automatically deleted with [`PAPERLESS_EMPTY_TRASH_DELAY`](configuration.md#PAPERLESS_EMPTY_TRASH_DELAY), which defaults
|
You can set how long documents remain in the trash before being automatically deleted with [`PAPERLESS_EMPTY_TRASH_DELAY`](configuration.md#PAPERLESS_EMPTY_TRASH_DELAY), which defaults
|
||||||
to 30 days. Until the file is actually deleted (e.g. the trash is emptied), all files and database content remains intact and can be restored at any point up until that time.
|
to 30 days. Until the file is actually deleted (e.g. the trash is emptied), all files and database content remains intact and can be restored at any point up until that time.
|
||||||
|
|
||||||
Additionally you may configure a directory where deleted files are moved to when the trash is emptied with [`PAPERLESS_EMPTY_TRASH_DIR`](configuration.md#PAPERLESS_EMPTY_TRASH_DIR).
|
Additionally you may configure a directory where deleted files are moved to when they the trash is emptied with [`PAPERLESS_EMPTY_TRASH_DIR`](configuration.md#PAPERLESS_EMPTY_TRASH_DIR).
|
||||||
Note that the empty trash directory only stores the original file, the archive file and all database information is permanently removed once a document is fully deleted.
|
Note that the empty trash directory only stores the original file, the archive file and all database information is permanently removed once a document is fully deleted.
|
||||||
|
|
||||||
## Best practices {#basic-searching}
|
## Best practices {#basic-searching}
|
||||||
|
@@ -33,7 +33,7 @@ dependencies = [
|
|||||||
"django-cors-headers~=4.9.0",
|
"django-cors-headers~=4.9.0",
|
||||||
"django-extensions~=4.1",
|
"django-extensions~=4.1",
|
||||||
"django-filter~=25.1",
|
"django-filter~=25.1",
|
||||||
"django-guardian~=3.2.0",
|
"django-guardian~=3.1.2",
|
||||||
"django-multiselectfield~=1.0.1",
|
"django-multiselectfield~=1.0.1",
|
||||||
"django-soft-delete~=1.0.18",
|
"django-soft-delete~=1.0.18",
|
||||||
"django-treenode>=0.23.2",
|
"django-treenode>=0.23.2",
|
||||||
@@ -54,6 +54,7 @@ dependencies = [
|
|||||||
"ocrmypdf~=16.11.0",
|
"ocrmypdf~=16.11.0",
|
||||||
"pathvalidate~=3.3.1",
|
"pathvalidate~=3.3.1",
|
||||||
"pdf2image~=1.17.0",
|
"pdf2image~=1.17.0",
|
||||||
|
"psycopg-pool",
|
||||||
"python-dateutil~=2.9.0",
|
"python-dateutil~=2.9.0",
|
||||||
"python-dotenv~=1.1.0",
|
"python-dotenv~=1.1.0",
|
||||||
"python-gnupg~=0.5.4",
|
"python-gnupg~=0.5.4",
|
||||||
|
@@ -174,7 +174,7 @@ test('bulk edit', async ({ page }) => {
|
|||||||
await expect(page.locator('pngx-document-list')).toHaveText(
|
await expect(page.locator('pngx-document-list')).toHaveText(
|
||||||
/Selected 61 of 61 documents/i
|
/Selected 61 of 61 documents/i
|
||||||
)
|
)
|
||||||
await page.getByRole('button', { name: 'None' }).click()
|
await page.getByRole('button', { name: 'Cancel' }).click()
|
||||||
|
|
||||||
await page.locator('pngx-document-card-small').nth(1).click()
|
await page.locator('pngx-document-card-small').nth(1).click()
|
||||||
await page.locator('pngx-document-card-small').nth(2).click()
|
await page.locator('pngx-document-card-small').nth(2).click()
|
||||||
|
@@ -324,7 +324,7 @@
|
|||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
|
||||||
<context context-type="linenumber">192</context>
|
<context context-type="linenumber">190</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/custom-fields/custom-fields.component.html</context>
|
<context context-type="sourcefile">src/app/components/manage/custom-fields/custom-fields.component.html</context>
|
||||||
@@ -743,7 +743,7 @@
|
|||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
||||||
<context context-type="linenumber">134</context>
|
<context context-type="linenumber">114</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/custom-fields/custom-fields.component.html</context>
|
<context context-type="sourcefile">src/app/components/manage/custom-fields/custom-fields.component.html</context>
|
||||||
@@ -1167,7 +1167,7 @@
|
|||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
||||||
<context context-type="linenumber">242</context>
|
<context context-type="linenumber">217</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/data/document.ts</context>
|
<context context-type="sourcefile">src/app/data/document.ts</context>
|
||||||
@@ -1209,7 +1209,7 @@
|
|||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.html</context>
|
||||||
<context context-type="linenumber">78</context>
|
<context context-type="linenumber">97</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
|
||||||
@@ -1494,6 +1494,10 @@
|
|||||||
<context context-type="sourcefile">src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html</context>
|
<context context-type="sourcefile">src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html</context>
|
||||||
<context context-type="linenumber">182</context>
|
<context context-type="linenumber">182</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.html</context>
|
||||||
|
<context context-type="linenumber">4</context>
|
||||||
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.html</context>
|
||||||
<context context-type="linenumber">81</context>
|
<context context-type="linenumber">81</context>
|
||||||
@@ -1600,10 +1604,6 @@
|
|||||||
<context context-type="sourcefile">src/app/components/admin/trash/trash.component.html</context>
|
<context context-type="sourcefile">src/app/components/admin/trash/trash.component.html</context>
|
||||||
<context context-type="linenumber">8</context>
|
<context context-type="linenumber">8</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
|
||||||
<context context-type="linenumber">153</context>
|
|
||||||
</context-group>
|
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/management-list/management-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/manage/management-list/management-list.component.html</context>
|
||||||
<context context-type="linenumber">4</context>
|
<context context-type="linenumber">4</context>
|
||||||
@@ -1755,7 +1755,7 @@
|
|||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
||||||
<context context-type="linenumber">269</context>
|
<context context-type="linenumber">244</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/data/document.ts</context>
|
<context context-type="sourcefile">src/app/data/document.ts</context>
|
||||||
@@ -1808,7 +1808,7 @@
|
|||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.html</context>
|
||||||
<context context-type="linenumber">87</context>
|
<context context-type="linenumber">103</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/custom-fields/custom-fields.component.html</context>
|
<context context-type="sourcefile">src/app/components/manage/custom-fields/custom-fields.component.html</context>
|
||||||
@@ -2109,7 +2109,7 @@
|
|||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.html</context>
|
||||||
<context context-type="linenumber">140</context>
|
<context context-type="linenumber">157</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/custom-fields/custom-fields.component.html</context>
|
<context context-type="sourcefile">src/app/components/manage/custom-fields/custom-fields.component.html</context>
|
||||||
@@ -2769,11 +2769,11 @@
|
|||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.html</context>
|
||||||
<context context-type="linenumber">5</context>
|
<context context-type="linenumber">21</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
||||||
<context context-type="linenumber">224</context>
|
<context context-type="linenumber">199</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
|
||||||
@@ -3001,7 +3001,7 @@
|
|||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.html</context>
|
||||||
<context context-type="linenumber">112</context>
|
<context context-type="linenumber">129</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-card-large/document-card-large.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-card-large/document-card-large.component.html</context>
|
||||||
@@ -3448,8 +3448,8 @@
|
|||||||
<context context-type="linenumber">27</context>
|
<context context-type="linenumber">27</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.html</context>
|
||||||
<context context-type="linenumber">30</context>
|
<context context-type="linenumber">14</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="1496549861742963591" datatype="html">
|
<trans-unit id="1496549861742963591" datatype="html">
|
||||||
@@ -3529,7 +3529,7 @@
|
|||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
||||||
<context context-type="linenumber">278</context>
|
<context context-type="linenumber">253</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/data/document.ts</context>
|
<context context-type="sourcefile">src/app/data/document.ts</context>
|
||||||
@@ -6356,7 +6356,7 @@
|
|||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
||||||
<context context-type="linenumber">323</context>
|
<context context-type="linenumber">298</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="78870852467682010" datatype="html">
|
<trans-unit id="78870852467682010" datatype="html">
|
||||||
@@ -6371,7 +6371,7 @@
|
|||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
||||||
<context context-type="linenumber">363</context>
|
<context context-type="linenumber">338</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="157572966557284263" datatype="html">
|
<trans-unit id="157572966557284263" datatype="html">
|
||||||
@@ -6386,7 +6386,7 @@
|
|||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
||||||
<context context-type="linenumber">370</context>
|
<context context-type="linenumber">345</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="883965278435032344" datatype="html">
|
<trans-unit id="883965278435032344" datatype="html">
|
||||||
@@ -6404,7 +6404,7 @@
|
|||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
||||||
<context context-type="linenumber">391</context>
|
<context context-type="linenumber">366</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="3542042671420335679" datatype="html">
|
<trans-unit id="3542042671420335679" datatype="html">
|
||||||
@@ -6415,7 +6415,7 @@
|
|||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
||||||
<context context-type="linenumber">391</context>
|
<context context-type="linenumber">366</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="872092479747931526" datatype="html">
|
<trans-unit id="872092479747931526" datatype="html">
|
||||||
@@ -6585,8 +6585,8 @@
|
|||||||
<context context-type="linenumber">5</context>
|
<context context-type="linenumber">5</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.html</context>
|
||||||
<context context-type="linenumber">27</context>
|
<context context-type="linenumber">11</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="2266163016683537825" datatype="html">
|
<trans-unit id="2266163016683537825" datatype="html">
|
||||||
@@ -6625,7 +6625,7 @@
|
|||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.html</context>
|
||||||
<context context-type="linenumber">91</context>
|
<context context-type="linenumber">107</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="7049887240439736400" datatype="html">
|
<trans-unit id="7049887240439736400" datatype="html">
|
||||||
@@ -6686,7 +6686,7 @@
|
|||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
||||||
<context context-type="linenumber">221</context>
|
<context context-type="linenumber">196</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
|
||||||
@@ -6723,11 +6723,11 @@
|
|||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.html</context>
|
||||||
<context context-type="linenumber">19</context>
|
<context context-type="linenumber">35</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
||||||
<context context-type="linenumber">211</context>
|
<context context-type="linenumber">186</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
|
||||||
@@ -6750,11 +6750,11 @@
|
|||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.html</context>
|
||||||
<context context-type="linenumber">33</context>
|
<context context-type="linenumber">49</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
||||||
<context context-type="linenumber">251</context>
|
<context context-type="linenumber">226</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
|
||||||
@@ -6777,11 +6777,11 @@
|
|||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.html</context>
|
||||||
<context context-type="linenumber">47</context>
|
<context context-type="linenumber">63</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
||||||
<context context-type="linenumber">260</context>
|
<context context-type="linenumber">235</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
|
||||||
@@ -7188,18 +7188,25 @@
|
|||||||
<context context-type="linenumber">10</context>
|
<context context-type="linenumber">10</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="6857598786757174736" datatype="html">
|
||||||
|
<source>Select:</source>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.html</context>
|
||||||
|
<context context-type="linenumber">8</context>
|
||||||
|
</context-group>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="6299008920007331381" datatype="html">
|
<trans-unit id="6299008920007331381" datatype="html">
|
||||||
<source>Edit:</source>
|
<source>Edit:</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.html</context>
|
||||||
<context context-type="linenumber">3</context>
|
<context context-type="linenumber">19</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="7001227209911602786" datatype="html">
|
<trans-unit id="7001227209911602786" datatype="html">
|
||||||
<source>Filter tags</source>
|
<source>Filter tags</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.html</context>
|
||||||
<context context-type="linenumber">6</context>
|
<context context-type="linenumber">22</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
|
||||||
@@ -7210,7 +7217,7 @@
|
|||||||
<source>Filter correspondents</source>
|
<source>Filter correspondents</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.html</context>
|
||||||
<context context-type="linenumber">20</context>
|
<context context-type="linenumber">36</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
|
||||||
@@ -7221,7 +7228,7 @@
|
|||||||
<source>Filter document types</source>
|
<source>Filter document types</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.html</context>
|
||||||
<context context-type="linenumber">34</context>
|
<context context-type="linenumber">50</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
|
||||||
@@ -7232,7 +7239,7 @@
|
|||||||
<source>Filter storage paths</source>
|
<source>Filter storage paths</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.html</context>
|
||||||
<context context-type="linenumber">48</context>
|
<context context-type="linenumber">64</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
|
||||||
@@ -7243,7 +7250,7 @@
|
|||||||
<source>Custom fields</source>
|
<source>Custom fields</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.html</context>
|
||||||
<context context-type="linenumber">61</context>
|
<context context-type="linenumber">77</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
|
||||||
@@ -7258,56 +7265,56 @@
|
|||||||
<source>Filter custom fields</source>
|
<source>Filter custom fields</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.html</context>
|
||||||
<context context-type="linenumber">62</context>
|
<context context-type="linenumber">78</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="5139192806922838657" datatype="html">
|
<trans-unit id="5139192806922838657" datatype="html">
|
||||||
<source>Set values</source>
|
<source>Set values</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.html</context>
|
||||||
<context context-type="linenumber">70</context>
|
<context context-type="linenumber">86</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="1050269006235116171" datatype="html">
|
<trans-unit id="1050269006235116171" datatype="html">
|
||||||
<source>Rotate</source>
|
<source>Rotate</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.html</context>
|
||||||
<context context-type="linenumber">94</context>
|
<context context-type="linenumber">110</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="3206542606001340679" datatype="html">
|
<trans-unit id="3206542606001340679" datatype="html">
|
||||||
<source>Merge</source>
|
<source>Merge</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.html</context>
|
||||||
<context context-type="linenumber">97</context>
|
<context context-type="linenumber">113</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="1015374532025907183" datatype="html">
|
<trans-unit id="1015374532025907183" datatype="html">
|
||||||
<source>Include:</source>
|
<source>Include:</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.html</context>
|
||||||
<context context-type="linenumber">118</context>
|
<context context-type="linenumber">135</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="1537670659786159738" datatype="html">
|
<trans-unit id="1537670659786159738" datatype="html">
|
||||||
<source>Archived files</source>
|
<source>Archived files</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.html</context>
|
||||||
<context context-type="linenumber">122</context>
|
<context context-type="linenumber">139</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="2520291319362448498" datatype="html">
|
<trans-unit id="2520291319362448498" datatype="html">
|
||||||
<source>Original files</source>
|
<source>Original files</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.html</context>
|
||||||
<context context-type="linenumber">126</context>
|
<context context-type="linenumber">143</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="8009862506882713059" datatype="html">
|
<trans-unit id="8009862506882713059" datatype="html">
|
||||||
<source>Use formatted filename</source>
|
<source>Use formatted filename</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.html</context>
|
||||||
<context context-type="linenumber">131</context>
|
<context context-type="linenumber">148</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="1215215387232313677" datatype="html">
|
<trans-unit id="1215215387232313677" datatype="html">
|
||||||
@@ -7607,7 +7614,7 @@
|
|||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
||||||
<context context-type="linenumber">339</context>
|
<context context-type="linenumber">314</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="106713086593101376" datatype="html">
|
<trans-unit id="106713086593101376" datatype="html">
|
||||||
@@ -7731,7 +7738,7 @@
|
|||||||
<source>Select</source>
|
<source>Select</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
||||||
<context context-type="linenumber">5</context>
|
<context context-type="linenumber">6</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/data/custom-field.ts</context>
|
<context context-type="sourcefile">src/app/data/custom-field.ts</context>
|
||||||
@@ -7742,51 +7749,36 @@
|
|||||||
<source>Select none</source>
|
<source>Select none</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
||||||
<context context-type="linenumber">11</context>
|
<context context-type="linenumber">9</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="1512866475468373520" datatype="html">
|
<trans-unit id="1512866475468373520" datatype="html">
|
||||||
<source>Select page</source>
|
<source>Select page</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
||||||
<context context-type="linenumber">12</context>
|
<context context-type="linenumber">10</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
|
||||||
<context context-type="linenumber">315</context>
|
<context context-type="linenumber">313</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="1494518490116523821" datatype="html">
|
<trans-unit id="1494518490116523821" datatype="html">
|
||||||
<source>Select all</source>
|
<source>Select all</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
||||||
<context context-type="linenumber">13</context>
|
<context context-type="linenumber">11</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
|
||||||
<context context-type="linenumber">308</context>
|
<context context-type="linenumber">306</context>
|
||||||
</context-group>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="6252070156626006029" datatype="html">
|
|
||||||
<source>None</source>
|
|
||||||
<context-group purpose="location">
|
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
|
||||||
<context context-type="linenumber">23</context>
|
|
||||||
</context-group>
|
|
||||||
<context-group purpose="location">
|
|
||||||
<context context-type="sourcefile">src/app/components/manage/management-list/management-list.component.ts</context>
|
|
||||||
<context context-type="linenumber">120</context>
|
|
||||||
</context-group>
|
|
||||||
<context-group purpose="location">
|
|
||||||
<context context-type="sourcefile">src/app/data/matching-model.ts</context>
|
|
||||||
<context context-type="linenumber">45</context>
|
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="8461842260159597706" datatype="html">
|
<trans-unit id="8461842260159597706" datatype="html">
|
||||||
<source>Show</source>
|
<source>Show</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
||||||
<context context-type="linenumber">37</context>
|
<context context-type="linenumber">17</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/saved-views/saved-views.component.html</context>
|
<context context-type="sourcefile">src/app/components/manage/saved-views/saved-views.component.html</context>
|
||||||
@@ -7797,63 +7789,63 @@
|
|||||||
<source>Sort</source>
|
<source>Sort</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
||||||
<context context-type="linenumber">68</context>
|
<context context-type="linenumber">48</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="2123659921722214537" datatype="html">
|
<trans-unit id="2123659921722214537" datatype="html">
|
||||||
<source>Views</source>
|
<source>Views</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
||||||
<context context-type="linenumber">94</context>
|
<context context-type="linenumber">74</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="1233494216161906927" datatype="html">
|
<trans-unit id="1233494216161906927" datatype="html">
|
||||||
<source>Save "<x id="INTERPOLATION" equiv-text="{{list.activeSavedViewTitle}}"/>"</source>
|
<source>Save "<x id="INTERPOLATION" equiv-text="{{list.activeSavedViewTitle}}"/>"</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
||||||
<context context-type="linenumber">113</context>
|
<context context-type="linenumber">93</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="2276119452079372898" datatype="html">
|
<trans-unit id="2276119452079372898" datatype="html">
|
||||||
<source>Save as...</source>
|
<source>Save as...</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
||||||
<context context-type="linenumber">116</context>
|
<context context-type="linenumber">96</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="1450797155766668235" datatype="html">
|
<trans-unit id="1450797155766668235" datatype="html">
|
||||||
<source>All saved views</source>
|
<source>All saved views</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
||||||
<context context-type="linenumber">117</context>
|
<context context-type="linenumber">97</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="8786996283897742947" datatype="html">
|
<trans-unit id="8786996283897742947" datatype="html">
|
||||||
<source>{VAR_PLURAL, plural, =1 {Selected <x id="INTERPOLATION"/> of one document} other {Selected <x id="INTERPOLATION"/> of <x id="INTERPOLATION_1"/> documents}}</source>
|
<source>{VAR_PLURAL, plural, =1 {Selected <x id="INTERPOLATION"/> of one document} other {Selected <x id="INTERPOLATION"/> of <x id="INTERPOLATION_1"/> documents}}</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
||||||
<context context-type="linenumber">137</context>
|
<context context-type="linenumber">117</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="6600548268163632449" datatype="html">
|
<trans-unit id="6600548268163632449" datatype="html">
|
||||||
<source>{VAR_PLURAL, plural, =1 {One document} other {<x id="INTERPOLATION"/> documents}}</source>
|
<source>{VAR_PLURAL, plural, =1 {One document} other {<x id="INTERPOLATION"/> documents}}</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
||||||
<context context-type="linenumber">141</context>
|
<context context-type="linenumber">121</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="2243770355958919528" datatype="html">
|
<trans-unit id="2243770355958919528" datatype="html">
|
||||||
<source>(filtered)</source>
|
<source>(filtered)</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
||||||
<context context-type="linenumber">143</context>
|
<context context-type="linenumber">123</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="6849725902312323996" datatype="html">
|
<trans-unit id="6849725902312323996" datatype="html">
|
||||||
<source>Reset filters</source>
|
<source>Reset filters</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
||||||
<context context-type="linenumber">148</context>
|
<context context-type="linenumber">128</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
|
||||||
@@ -7864,21 +7856,21 @@
|
|||||||
<source>Error while loading documents</source>
|
<source>Error while loading documents</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
||||||
<context context-type="linenumber">169</context>
|
<context context-type="linenumber">144</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="494022736054110363" datatype="html">
|
<trans-unit id="494022736054110363" datatype="html">
|
||||||
<source>Sort by ASN</source>
|
<source>Sort by ASN</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
||||||
<context context-type="linenumber">198</context>
|
<context context-type="linenumber">173</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="7517688192215738656" datatype="html">
|
<trans-unit id="7517688192215738656" datatype="html">
|
||||||
<source>ASN</source>
|
<source>ASN</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
||||||
<context context-type="linenumber">202</context>
|
<context context-type="linenumber">177</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
|
||||||
@@ -7897,28 +7889,28 @@
|
|||||||
<source>Sort by correspondent</source>
|
<source>Sort by correspondent</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
||||||
<context context-type="linenumber">207</context>
|
<context context-type="linenumber">182</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="2066713941761361709" datatype="html">
|
<trans-unit id="2066713941761361709" datatype="html">
|
||||||
<source>Sort by title</source>
|
<source>Sort by title</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
||||||
<context context-type="linenumber">216</context>
|
<context context-type="linenumber">191</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="6232673011753681091" datatype="html">
|
<trans-unit id="6232673011753681091" datatype="html">
|
||||||
<source>Sort by owner</source>
|
<source>Sort by owner</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
||||||
<context context-type="linenumber">229</context>
|
<context context-type="linenumber">204</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="3715596725146409911" datatype="html">
|
<trans-unit id="3715596725146409911" datatype="html">
|
||||||
<source>Owner</source>
|
<source>Owner</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
||||||
<context context-type="linenumber">233</context>
|
<context context-type="linenumber">208</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/data/document.ts</context>
|
<context context-type="sourcefile">src/app/data/document.ts</context>
|
||||||
@@ -7933,49 +7925,49 @@
|
|||||||
<source>Sort by notes</source>
|
<source>Sort by notes</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
||||||
<context context-type="linenumber">238</context>
|
<context context-type="linenumber">213</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="5499001829734502606" datatype="html">
|
<trans-unit id="5499001829734502606" datatype="html">
|
||||||
<source>Sort by document type</source>
|
<source>Sort by document type</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
||||||
<context context-type="linenumber">247</context>
|
<context context-type="linenumber">222</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="6213829731736042759" datatype="html">
|
<trans-unit id="6213829731736042759" datatype="html">
|
||||||
<source>Sort by storage path</source>
|
<source>Sort by storage path</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
||||||
<context context-type="linenumber">256</context>
|
<context context-type="linenumber">231</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="3406167410329973166" datatype="html">
|
<trans-unit id="3406167410329973166" datatype="html">
|
||||||
<source>Sort by created date</source>
|
<source>Sort by created date</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
||||||
<context context-type="linenumber">265</context>
|
<context context-type="linenumber">240</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="3769035778779263084" datatype="html">
|
<trans-unit id="3769035778779263084" datatype="html">
|
||||||
<source>Sort by added date</source>
|
<source>Sort by added date</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
||||||
<context context-type="linenumber">274</context>
|
<context context-type="linenumber">249</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="4874754501044009042" datatype="html">
|
<trans-unit id="4874754501044009042" datatype="html">
|
||||||
<source>Sort by number of pages</source>
|
<source>Sort by number of pages</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
||||||
<context context-type="linenumber">283</context>
|
<context context-type="linenumber">258</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="3817498941817715969" datatype="html">
|
<trans-unit id="3817498941817715969" datatype="html">
|
||||||
<source>Pages</source>
|
<source>Pages</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
||||||
<context context-type="linenumber">287</context>
|
<context context-type="linenumber">262</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/data/document.ts</context>
|
<context context-type="sourcefile">src/app/data/document.ts</context>
|
||||||
@@ -7994,77 +7986,77 @@
|
|||||||
<source> Shared </source>
|
<source> Shared </source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
||||||
<context context-type="linenumber">290,292</context>
|
<context context-type="linenumber">265,267</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="5083658411133224968" datatype="html">
|
<trans-unit id="5083658411133224968" datatype="html">
|
||||||
<source>Sort by <x id="INTERPOLATION" equiv-text="{{getDisplayCustomFieldTitle(field_id)}}"/></source>
|
<source>Sort by <x id="INTERPOLATION" equiv-text="{{getDisplayCustomFieldTitle(field_id)}}"/></source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
||||||
<context context-type="linenumber">297,298</context>
|
<context context-type="linenumber">272,273</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="2179847500064178686" datatype="html">
|
<trans-unit id="2179847500064178686" datatype="html">
|
||||||
<source>Edit document</source>
|
<source>Edit document</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
||||||
<context context-type="linenumber">331</context>
|
<context context-type="linenumber">306</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="3420321797707163677" datatype="html">
|
<trans-unit id="3420321797707163677" datatype="html">
|
||||||
<source>Preview document</source>
|
<source>Preview document</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
||||||
<context context-type="linenumber">332</context>
|
<context context-type="linenumber">307</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="4512084577073831437" datatype="html">
|
<trans-unit id="4512084577073831437" datatype="html">
|
||||||
<source>Reset filters / selection</source>
|
<source>Reset filters / selection</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
|
||||||
<context context-type="linenumber">296</context>
|
<context context-type="linenumber">294</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="4135055128446167640" datatype="html">
|
<trans-unit id="4135055128446167640" datatype="html">
|
||||||
<source>Open first [selected] document</source>
|
<source>Open first [selected] document</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
|
||||||
<context context-type="linenumber">324</context>
|
<context context-type="linenumber">322</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="3629960544875360046" datatype="html">
|
<trans-unit id="3629960544875360046" datatype="html">
|
||||||
<source>Previous page</source>
|
<source>Previous page</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
|
||||||
<context context-type="linenumber">340</context>
|
<context context-type="linenumber">338</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="3337301694210287595" datatype="html">
|
<trans-unit id="3337301694210287595" datatype="html">
|
||||||
<source>Next page</source>
|
<source>Next page</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
|
||||||
<context context-type="linenumber">352</context>
|
<context context-type="linenumber">350</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="2155249406916744630" datatype="html">
|
<trans-unit id="2155249406916744630" datatype="html">
|
||||||
<source>View "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" saved successfully.</source>
|
<source>View "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" saved successfully.</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
|
||||||
<context context-type="linenumber">385</context>
|
<context context-type="linenumber">383</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="4646273665293421938" datatype="html">
|
<trans-unit id="4646273665293421938" datatype="html">
|
||||||
<source>Failed to save view "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</source>
|
<source>Failed to save view "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
|
||||||
<context context-type="linenumber">391</context>
|
<context context-type="linenumber">389</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="6837554170707123455" datatype="html">
|
<trans-unit id="6837554170707123455" datatype="html">
|
||||||
<source>View "<x id="PH" equiv-text="savedView.name"/>" created successfully.</source>
|
<source>View "<x id="PH" equiv-text="savedView.name"/>" created successfully.</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
|
||||||
<context context-type="linenumber">437</context>
|
<context context-type="linenumber">435</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="739880801667335279" datatype="html">
|
<trans-unit id="739880801667335279" datatype="html">
|
||||||
@@ -8869,6 +8861,17 @@
|
|||||||
<context context-type="linenumber">15</context>
|
<context context-type="linenumber">15</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="6252070156626006029" datatype="html">
|
||||||
|
<source>None</source>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/manage/management-list/management-list.component.ts</context>
|
||||||
|
<context context-type="linenumber">120</context>
|
||||||
|
</context-group>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/data/matching-model.ts</context>
|
||||||
|
<context context-type="linenumber">45</context>
|
||||||
|
</context-group>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="211408744872436427" datatype="html">
|
<trans-unit id="211408744872436427" datatype="html">
|
||||||
<source>Successfully created <x id="PH" equiv-text="this.typeName"/>.</source>
|
<source>Successfully created <x id="PH" equiv-text="this.typeName"/>.</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
|
@@ -1,5 +1,21 @@
|
|||||||
<div class="d-flex flex-wrap gap-4">
|
<div class="d-flex flex-wrap gap-4">
|
||||||
<div class="d-flex flex-wrap align-items-center gap-2" *pngxIfPermissions="{ action: PermissionAction.Change, type: PermissionType.Document }">
|
<div class="d-flex align-items-center" role="group" aria-label="Select">
|
||||||
|
<button class="btn btn-sm btn-outline-secondary" (click)="list.selectNone()">
|
||||||
|
<i-bs name="slash-circle"></i-bs> <ng-container i18n>Cancel</ng-container>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div class="d-flex align-items-center gap-2" role="group" aria-label="Select">
|
||||||
|
<label class="me-2" i18n>Select:</label>
|
||||||
|
<div class="btn-group">
|
||||||
|
<button class="btn btn-sm btn-outline-primary" (click)="list.selectPage()">
|
||||||
|
<i-bs name="file-earmark-check"></i-bs> <ng-container i18n>Page</ng-container>
|
||||||
|
</button>
|
||||||
|
<button class="btn btn-sm btn-outline-primary" (click)="list.selectAll()">
|
||||||
|
<i-bs name="check-all"></i-bs> <ng-container i18n>All</ng-container>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="d-flex align-items-center gap-2" *pngxIfPermissions="{ action: PermissionAction.Change, type: PermissionType.Document }">
|
||||||
<label class="me-2" i18n>Edit:</label>
|
<label class="me-2" i18n>Edit:</label>
|
||||||
@if (permissionService.currentUserCan(PermissionAction.View, PermissionType.Tag)) {
|
@if (permissionService.currentUserCan(PermissionAction.View, PermissionType.Tag)) {
|
||||||
<pngx-filterable-dropdown title="Tags" icon="tag-fill" i18n-title
|
<pngx-filterable-dropdown title="Tags" icon="tag-fill" i18n-title
|
||||||
@@ -73,14 +89,14 @@
|
|||||||
(apply)="setCustomFields($event)">
|
(apply)="setCustomFields($event)">
|
||||||
</pngx-filterable-dropdown>
|
</pngx-filterable-dropdown>
|
||||||
}
|
}
|
||||||
<div class="btn-group">
|
|
||||||
<button type="button" class="btn btn-sm btn-outline-primary me-2" (click)="setPermissions()" [disabled]="!userOwnsAll || !userCanEditAll">
|
|
||||||
<i-bs name="person-fill-lock"></i-bs><div class="d-none d-sm-inline"> <ng-container i18n>Permissions</ng-container></div>
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="d-flex align-items-center gap-2 ms-auto">
|
<div class="d-flex align-items-center gap-2 ms-auto">
|
||||||
<div class="btn-toolbar">
|
<div class="btn-toolbar">
|
||||||
|
|
||||||
|
<button type="button" class="btn btn-sm btn-outline-primary me-2" (click)="setPermissions()" [disabled]="!userOwnsAll || !userCanEditAll">
|
||||||
|
<i-bs name="person-fill-lock"></i-bs><div class="d-none d-sm-inline"> <ng-container i18n>Permissions</ng-container></div>
|
||||||
|
</button>
|
||||||
|
|
||||||
<div ngbDropdown>
|
<div ngbDropdown>
|
||||||
<button class="btn btn-sm btn-outline-primary" id="dropdownSelect" [disabled]="!userCanEdit && !userCanAdd" ngbDropdownToggle>
|
<button class="btn btn-sm btn-outline-primary" id="dropdownSelect" [disabled]="!userCanEdit && !userCanAdd" ngbDropdownToggle>
|
||||||
<i-bs name="three-dots"></i-bs>
|
<i-bs name="three-dots"></i-bs>
|
||||||
@@ -99,6 +115,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="btn-group btn-group-sm">
|
<div class="btn-group btn-group-sm">
|
||||||
<button class="btn btn-sm btn-outline-primary" [disabled]="awaitingDownload" (click)="downloadSelected()">
|
<button class="btn btn-sm btn-outline-primary" [disabled]="awaitingDownload" (click)="downloadSelected()">
|
||||||
@if (!awaitingDownload) {
|
@if (!awaitingDownload) {
|
||||||
|
@@ -5,7 +5,3 @@
|
|||||||
.dropdown-menu{
|
.dropdown-menu{
|
||||||
--bs-dropdown-min-width: 12rem;
|
--bs-dropdown-min-width: 12rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.btn-group .btn {
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
|
@@ -1,36 +1,16 @@
|
|||||||
<pngx-page-header [title]="getTitle()">
|
<pngx-page-header [title]="getTitle()">
|
||||||
<div ngbDropdown class="btn-group flex-fill d-sm-none">
|
|
||||||
<button class="btn btn-sm btn-outline-primary" id="dropdownSelectMobile" ngbDropdownToggle>
|
<div ngbDropdown class="btn-group flex-fill">
|
||||||
|
<button class="btn btn-sm btn-outline-primary" id="dropdownSelect" ngbDropdownToggle>
|
||||||
<i-bs name="text-indent-left"></i-bs>
|
<i-bs name="text-indent-left"></i-bs>
|
||||||
<div class="d-none d-sm-inline"> <ng-container i18n>Select</ng-container></div>
|
<div class="d-none d-sm-inline"> <ng-container i18n>Select</ng-container></div>
|
||||||
@if (list.selected.size > 0) {
|
|
||||||
<pngx-clearable-badge [selected]="list.selected.size > 0" [number]="list.selected.size" (cleared)="list.selectNone()"></pngx-clearable-badge><span class="visually-hidden">selected</span>
|
|
||||||
}
|
|
||||||
</button>
|
</button>
|
||||||
<div ngbDropdownMenu aria-labelledby="dropdownSelectMobile" class="shadow">
|
<div ngbDropdownMenu aria-labelledby="dropdownSelect" class="shadow">
|
||||||
<button ngbDropdownItem (click)="list.selectNone()" i18n>Select none</button>
|
<button ngbDropdownItem (click)="list.selectNone()" i18n>Select none</button>
|
||||||
<button ngbDropdownItem (click)="list.selectPage()" i18n>Select page</button>
|
<button ngbDropdownItem (click)="list.selectPage()" i18n>Select page</button>
|
||||||
<button ngbDropdownItem (click)="list.selectAll()" i18n>Select all</button>
|
<button ngbDropdownItem (click)="list.selectAll()" i18n>Select all</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="d-none d-sm-flex flex-fill me-3">
|
|
||||||
<div class="input-group input-group-sm">
|
|
||||||
<span class="input-group-text border-0">Select:</span>
|
|
||||||
</div>
|
|
||||||
<div class="btn-group btn-group-sm flex-nowrap">
|
|
||||||
@if (list.selected.size > 0) {
|
|
||||||
<button class="btn btn-sm btn-outline-secondary" (click)="list.selectNone()">
|
|
||||||
<i-bs name="slash-circle"></i-bs> <ng-container i18n>None</ng-container>
|
|
||||||
</button>
|
|
||||||
}
|
|
||||||
<button class="btn btn-sm btn-outline-primary" (click)="list.selectPage()">
|
|
||||||
<i-bs name="file-earmark-check"></i-bs> <ng-container i18n>Page</ng-container>
|
|
||||||
</button>
|
|
||||||
<button class="btn btn-sm btn-outline-primary" (click)="list.selectAll()">
|
|
||||||
<i-bs name="check-all"></i-bs> <ng-container i18n>All</ng-container>
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div ngbDropdown class="btn-group flex-fill">
|
<div ngbDropdown class="btn-group flex-fill">
|
||||||
<button class="btn btn-sm btn-outline-primary" id="dropdownDisplayFields" ngbDropdownToggle>
|
<button class="btn btn-sm btn-outline-primary" id="dropdownDisplayFields" ngbDropdownToggle>
|
||||||
<i-bs name="card-heading"></i-bs>
|
<i-bs name="card-heading"></i-bs>
|
||||||
@@ -148,11 +128,6 @@
|
|||||||
<i-bs width="1em" height="1em" name="x"></i-bs><small i18n>Reset filters</small>
|
<i-bs width="1em" height="1em" name="x"></i-bs><small i18n>Reset filters</small>
|
||||||
</button>
|
</button>
|
||||||
}
|
}
|
||||||
@if (!list.isReloading && list.selected.size > 0) {
|
|
||||||
<button class="btn btn-link py-0" (click)="list.selectNone()">
|
|
||||||
<i-bs width="1em" height="1em" name="slash-circle" class="me-1"></i-bs><small i18n>Clear selection</small>
|
|
||||||
</button>
|
|
||||||
}
|
|
||||||
</div>
|
</div>
|
||||||
@if (list.collectionSize) {
|
@if (list.collectionSize) {
|
||||||
<ngb-pagination [pageSize]="list.pageSize" [collectionSize]="list.collectionSize" [(page)]="list.currentPage" [maxSize]="5"
|
<ngb-pagination [pageSize]="list.pageSize" [collectionSize]="list.collectionSize" [(page)]="list.currentPage" [maxSize]="5"
|
||||||
|
@@ -56,7 +56,6 @@ import {
|
|||||||
filterRulesDiffer,
|
filterRulesDiffer,
|
||||||
isFullTextFilterRule,
|
isFullTextFilterRule,
|
||||||
} from 'src/app/utils/filter-rules'
|
} from 'src/app/utils/filter-rules'
|
||||||
import { ClearableBadgeComponent } from '../common/clearable-badge/clearable-badge.component'
|
|
||||||
import { CustomFieldDisplayComponent } from '../common/custom-field-display/custom-field-display.component'
|
import { CustomFieldDisplayComponent } from '../common/custom-field-display/custom-field-display.component'
|
||||||
import { PageHeaderComponent } from '../common/page-header/page-header.component'
|
import { PageHeaderComponent } from '../common/page-header/page-header.component'
|
||||||
import { PreviewPopupComponent } from '../common/preview-popup/preview-popup.component'
|
import { PreviewPopupComponent } from '../common/preview-popup/preview-popup.component'
|
||||||
@@ -73,7 +72,6 @@ import { SaveViewConfigDialogComponent } from './save-view-config-dialog/save-vi
|
|||||||
templateUrl: './document-list.component.html',
|
templateUrl: './document-list.component.html',
|
||||||
styleUrls: ['./document-list.component.scss'],
|
styleUrls: ['./document-list.component.scss'],
|
||||||
imports: [
|
imports: [
|
||||||
ClearableBadgeComponent,
|
|
||||||
CustomFieldDisplayComponent,
|
CustomFieldDisplayComponent,
|
||||||
PageHeaderComponent,
|
PageHeaderComponent,
|
||||||
BulkEditorComponent,
|
BulkEditorComponent,
|
||||||
|
@@ -6,7 +6,6 @@ import re
|
|||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from decimal import Decimal
|
from decimal import Decimal
|
||||||
from typing import TYPE_CHECKING
|
from typing import TYPE_CHECKING
|
||||||
from typing import Literal
|
|
||||||
|
|
||||||
import magic
|
import magic
|
||||||
from celery import states
|
from celery import states
|
||||||
@@ -253,35 +252,6 @@ class OwnedObjectSerializer(
|
|||||||
except KeyError:
|
except KeyError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def _get_perms(self, obj, codename: str, target: Literal["users", "groups"]):
|
|
||||||
"""
|
|
||||||
Get the given permissions from context or from django-guardian.
|
|
||||||
|
|
||||||
:param codename: The permission codename, e.g. 'view' or 'change'
|
|
||||||
:param target: 'users' or 'groups'
|
|
||||||
"""
|
|
||||||
key = f"{target}_{codename}_perms"
|
|
||||||
cached = self.context.get(key, {}).get(obj.pk)
|
|
||||||
if cached is not None:
|
|
||||||
return list(cached)
|
|
||||||
|
|
||||||
# Permission not found in the context, get it from guardian
|
|
||||||
if target == "users":
|
|
||||||
return list(
|
|
||||||
get_users_with_perms(
|
|
||||||
obj,
|
|
||||||
only_with_perms_in=[f"{codename}_{obj.__class__.__name__.lower()}"],
|
|
||||||
with_group_users=False,
|
|
||||||
).values_list("id", flat=True),
|
|
||||||
)
|
|
||||||
else: # groups
|
|
||||||
return list(
|
|
||||||
get_groups_with_only_permission(
|
|
||||||
obj,
|
|
||||||
codename=f"{codename}_{obj.__class__.__name__.lower()}",
|
|
||||||
).values_list("id", flat=True),
|
|
||||||
)
|
|
||||||
|
|
||||||
@extend_schema_field(
|
@extend_schema_field(
|
||||||
field={
|
field={
|
||||||
"type": "object",
|
"type": "object",
|
||||||
@@ -316,14 +286,31 @@ class OwnedObjectSerializer(
|
|||||||
},
|
},
|
||||||
)
|
)
|
||||||
def get_permissions(self, obj) -> dict:
|
def get_permissions(self, obj) -> dict:
|
||||||
|
view_codename = f"view_{obj.__class__.__name__.lower()}"
|
||||||
|
change_codename = f"change_{obj.__class__.__name__.lower()}"
|
||||||
|
|
||||||
return {
|
return {
|
||||||
"view": {
|
"view": {
|
||||||
"users": self._get_perms(obj, "view", "users"),
|
"users": get_users_with_perms(
|
||||||
"groups": self._get_perms(obj, "view", "groups"),
|
obj,
|
||||||
|
only_with_perms_in=[view_codename],
|
||||||
|
with_group_users=False,
|
||||||
|
).values_list("id", flat=True),
|
||||||
|
"groups": get_groups_with_only_permission(
|
||||||
|
obj,
|
||||||
|
codename=view_codename,
|
||||||
|
).values_list("id", flat=True),
|
||||||
},
|
},
|
||||||
"change": {
|
"change": {
|
||||||
"users": self._get_perms(obj, "change", "users"),
|
"users": get_users_with_perms(
|
||||||
"groups": self._get_perms(obj, "change", "groups"),
|
obj,
|
||||||
|
only_with_perms_in=[change_codename],
|
||||||
|
with_group_users=False,
|
||||||
|
).values_list("id", flat=True),
|
||||||
|
"groups": get_groups_with_only_permission(
|
||||||
|
obj,
|
||||||
|
codename=change_codename,
|
||||||
|
).values_list("id", flat=True),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,23 +1,17 @@
|
|||||||
import json
|
|
||||||
import tempfile
|
import tempfile
|
||||||
from datetime import timedelta
|
from datetime import timedelta
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.contrib.auth.models import Group
|
|
||||||
from django.contrib.auth.models import Permission
|
from django.contrib.auth.models import Permission
|
||||||
from django.contrib.auth.models import User
|
from django.contrib.auth.models import User
|
||||||
from django.db import connection
|
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
from django.test import override_settings
|
from django.test import override_settings
|
||||||
from django.test.utils import CaptureQueriesContext
|
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
from guardian.shortcuts import assign_perm
|
|
||||||
from rest_framework import status
|
from rest_framework import status
|
||||||
|
|
||||||
from documents.models import Document
|
from documents.models import Document
|
||||||
from documents.models import ShareLink
|
from documents.models import ShareLink
|
||||||
from documents.models import Tag
|
|
||||||
from documents.tests.utils import DirectoriesMixin
|
from documents.tests.utils import DirectoriesMixin
|
||||||
from paperless.models import ApplicationConfiguration
|
from paperless.models import ApplicationConfiguration
|
||||||
|
|
||||||
@@ -160,113 +154,3 @@ class TestViews(DirectoriesMixin, TestCase):
|
|||||||
response.render()
|
response.render()
|
||||||
self.assertEqual(response.request["PATH_INFO"], "/accounts/login/")
|
self.assertEqual(response.request["PATH_INFO"], "/accounts/login/")
|
||||||
self.assertContains(response, b"Share link has expired")
|
self.assertContains(response, b"Share link has expired")
|
||||||
|
|
||||||
def test_list_with_full_permissions(self):
|
|
||||||
"""
|
|
||||||
GIVEN:
|
|
||||||
- Tags with different permissions
|
|
||||||
WHEN:
|
|
||||||
- Request to get tag list with full permissions is made
|
|
||||||
THEN:
|
|
||||||
- Tag list is returned with the right permission information
|
|
||||||
"""
|
|
||||||
user2 = User.objects.create(username="user2")
|
|
||||||
user3 = User.objects.create(username="user3")
|
|
||||||
group1 = Group.objects.create(name="group1")
|
|
||||||
group2 = Group.objects.create(name="group2")
|
|
||||||
group3 = Group.objects.create(name="group3")
|
|
||||||
t1 = Tag.objects.create(name="invoice", pk=1)
|
|
||||||
assign_perm("view_tag", self.user, t1)
|
|
||||||
assign_perm("view_tag", user2, t1)
|
|
||||||
assign_perm("view_tag", user3, t1)
|
|
||||||
assign_perm("view_tag", group1, t1)
|
|
||||||
assign_perm("view_tag", group2, t1)
|
|
||||||
assign_perm("view_tag", group3, t1)
|
|
||||||
assign_perm("change_tag", self.user, t1)
|
|
||||||
assign_perm("change_tag", user2, t1)
|
|
||||||
assign_perm("change_tag", group1, t1)
|
|
||||||
assign_perm("change_tag", group2, t1)
|
|
||||||
|
|
||||||
Tag.objects.create(name="bank statement", pk=2)
|
|
||||||
d1 = Document.objects.create(
|
|
||||||
title="Invoice 1",
|
|
||||||
content="This is the invoice of a very expensive item",
|
|
||||||
checksum="A",
|
|
||||||
)
|
|
||||||
d1.tags.add(t1)
|
|
||||||
d2 = Document.objects.create(
|
|
||||||
title="Invoice 2",
|
|
||||||
content="Internet invoice, I should pay it to continue contributing",
|
|
||||||
checksum="B",
|
|
||||||
)
|
|
||||||
d2.tags.add(t1)
|
|
||||||
|
|
||||||
view_permissions = Permission.objects.filter(
|
|
||||||
codename__contains="view_tag",
|
|
||||||
)
|
|
||||||
self.user.user_permissions.add(*view_permissions)
|
|
||||||
self.user.save()
|
|
||||||
|
|
||||||
self.client.force_login(self.user)
|
|
||||||
response = self.client.get("/api/tags/?page=1&full_perms=true")
|
|
||||||
results = json.loads(response.content)["results"]
|
|
||||||
for tag in results:
|
|
||||||
if tag["name"] == "invoice":
|
|
||||||
assert tag["permissions"] == {
|
|
||||||
"view": {
|
|
||||||
"users": [self.user.pk, user2.pk, user3.pk],
|
|
||||||
"groups": [group1.pk, group2.pk, group3.pk],
|
|
||||||
},
|
|
||||||
"change": {
|
|
||||||
"users": [self.user.pk, user2.pk],
|
|
||||||
"groups": [group1.pk, group2.pk],
|
|
||||||
},
|
|
||||||
}
|
|
||||||
elif tag["name"] == "bank statement":
|
|
||||||
assert tag["permissions"] == {
|
|
||||||
"view": {"users": [], "groups": []},
|
|
||||||
"change": {"users": [], "groups": []},
|
|
||||||
}
|
|
||||||
else:
|
|
||||||
assert False, f"Unexpected tag found: {tag['name']}"
|
|
||||||
|
|
||||||
def test_list_no_n_plus_1_queries(self):
|
|
||||||
"""
|
|
||||||
GIVEN:
|
|
||||||
- Tags with different permissions
|
|
||||||
WHEN:
|
|
||||||
- Request to get tag list with full permissions is made
|
|
||||||
THEN:
|
|
||||||
- Permissions are not queried in database tag by tag,
|
|
||||||
i.e. there are no N+1 queries
|
|
||||||
"""
|
|
||||||
view_permissions = Permission.objects.filter(
|
|
||||||
codename__contains="view_tag",
|
|
||||||
)
|
|
||||||
self.user.user_permissions.add(*view_permissions)
|
|
||||||
self.user.save()
|
|
||||||
self.client.force_login(self.user)
|
|
||||||
|
|
||||||
# Start by a small list, and count the number of SQL queries
|
|
||||||
for i in range(2):
|
|
||||||
Tag.objects.create(name=f"tag_{i}")
|
|
||||||
|
|
||||||
with CaptureQueriesContext(connection) as ctx_small:
|
|
||||||
response_small = self.client.get("/api/tags/?full_perms=true")
|
|
||||||
assert response_small.status_code == 200
|
|
||||||
num_queries_small = len(ctx_small.captured_queries)
|
|
||||||
|
|
||||||
# Complete the list, and count the number of SQL queries again
|
|
||||||
for i in range(2, 50):
|
|
||||||
Tag.objects.create(name=f"tag_{i}")
|
|
||||||
|
|
||||||
with CaptureQueriesContext(connection) as ctx_large:
|
|
||||||
response_large = self.client.get("/api/tags/?full_perms=true")
|
|
||||||
assert response_large.status_code == 200
|
|
||||||
num_queries_large = len(ctx_large.captured_queries)
|
|
||||||
|
|
||||||
# A few additional queries are allowed, but not a linear explosion
|
|
||||||
assert num_queries_large <= num_queries_small + 5, (
|
|
||||||
f"Possible N+1 queries detected: {num_queries_small} queries for 2 tags, "
|
|
||||||
f"but {num_queries_large} queries for 50 tags"
|
|
||||||
)
|
|
||||||
|
@@ -5,11 +5,9 @@ import platform
|
|||||||
import re
|
import re
|
||||||
import tempfile
|
import tempfile
|
||||||
import zipfile
|
import zipfile
|
||||||
from collections import defaultdict
|
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from time import mktime
|
from time import mktime
|
||||||
from typing import Literal
|
|
||||||
from unicodedata import normalize
|
from unicodedata import normalize
|
||||||
from urllib.parse import quote
|
from urllib.parse import quote
|
||||||
from urllib.parse import urlparse
|
from urllib.parse import urlparse
|
||||||
@@ -21,7 +19,6 @@ from celery import states
|
|||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.contrib.auth.models import Group
|
from django.contrib.auth.models import Group
|
||||||
from django.contrib.auth.models import User
|
from django.contrib.auth.models import User
|
||||||
from django.contrib.contenttypes.models import ContentType
|
|
||||||
from django.db import connections
|
from django.db import connections
|
||||||
from django.db.migrations.loader import MigrationLoader
|
from django.db.migrations.loader import MigrationLoader
|
||||||
from django.db.migrations.recorder import MigrationRecorder
|
from django.db.migrations.recorder import MigrationRecorder
|
||||||
@@ -59,8 +56,6 @@ from drf_spectacular.utils import OpenApiParameter
|
|||||||
from drf_spectacular.utils import extend_schema
|
from drf_spectacular.utils import extend_schema
|
||||||
from drf_spectacular.utils import extend_schema_view
|
from drf_spectacular.utils import extend_schema_view
|
||||||
from drf_spectacular.utils import inline_serializer
|
from drf_spectacular.utils import inline_serializer
|
||||||
from guardian.utils import get_group_obj_perms_model
|
|
||||||
from guardian.utils import get_user_obj_perms_model
|
|
||||||
from langdetect import detect
|
from langdetect import detect
|
||||||
from packaging import version as packaging_version
|
from packaging import version as packaging_version
|
||||||
from redis import Redis
|
from redis import Redis
|
||||||
@@ -259,104 +254,7 @@ class PassUserMixin(GenericAPIView):
|
|||||||
return super().get_serializer(*args, **kwargs)
|
return super().get_serializer(*args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
class BulkPermissionMixin:
|
class PermissionsAwareDocumentCountMixin(PassUserMixin):
|
||||||
"""
|
|
||||||
Prefetch Django-Guardian permissions for a list before serialization, to avoid N+1 queries.
|
|
||||||
"""
|
|
||||||
|
|
||||||
def _get_object_perms(
|
|
||||||
self,
|
|
||||||
objects: list,
|
|
||||||
perm_codenames: list[str],
|
|
||||||
actor: Literal["users", "groups"],
|
|
||||||
) -> dict[int, dict[str, list[int]]]:
|
|
||||||
"""
|
|
||||||
Collect object-level permissions for either users or groups.
|
|
||||||
"""
|
|
||||||
model = self.queryset.model
|
|
||||||
obj_perm_model = (
|
|
||||||
get_user_obj_perms_model(model)
|
|
||||||
if actor == "users"
|
|
||||||
else get_group_obj_perms_model(model)
|
|
||||||
)
|
|
||||||
id_field = "user_id" if actor == "users" else "group_id"
|
|
||||||
ctype = ContentType.objects.get_for_model(model)
|
|
||||||
object_pks = [obj.pk for obj in objects]
|
|
||||||
|
|
||||||
perms_qs = obj_perm_model.objects.filter(
|
|
||||||
content_type=ctype,
|
|
||||||
object_pk__in=object_pks,
|
|
||||||
permission__codename__in=perm_codenames,
|
|
||||||
).values_list("object_pk", id_field, "permission__codename")
|
|
||||||
|
|
||||||
perms: dict[int, dict[str, list[int]]] = defaultdict(lambda: defaultdict(list))
|
|
||||||
for object_pk, actor_id, codename in perms_qs:
|
|
||||||
perms[int(object_pk)][codename].append(actor_id)
|
|
||||||
|
|
||||||
# Ensure that all objects have all codenames, even if empty
|
|
||||||
for pk in object_pks:
|
|
||||||
for codename in perm_codenames:
|
|
||||||
perms[pk][codename]
|
|
||||||
|
|
||||||
return perms
|
|
||||||
|
|
||||||
def get_serializer_context(self):
|
|
||||||
"""
|
|
||||||
Get all permissions of the current list of objects at once and pass them to the serializer.
|
|
||||||
This avoid fetching permissions object by object in database.
|
|
||||||
"""
|
|
||||||
context = super().get_serializer_context()
|
|
||||||
try:
|
|
||||||
full_perms = get_boolean(
|
|
||||||
str(self.request.query_params.get("full_perms", "false")),
|
|
||||||
)
|
|
||||||
except ValueError:
|
|
||||||
full_perms = False
|
|
||||||
|
|
||||||
if not full_perms:
|
|
||||||
return context
|
|
||||||
|
|
||||||
# Check which objects are being paginated
|
|
||||||
page = getattr(self, "paginator", None)
|
|
||||||
if page and hasattr(page, "page"):
|
|
||||||
queryset = page.page.object_list
|
|
||||||
elif hasattr(self, "page"):
|
|
||||||
queryset = self.page
|
|
||||||
else:
|
|
||||||
queryset = self.filter_queryset(self.get_queryset())
|
|
||||||
|
|
||||||
model_name = self.queryset.model.__name__.lower()
|
|
||||||
permission_name_view = f"view_{model_name}"
|
|
||||||
permission_name_change = f"change_{model_name}"
|
|
||||||
|
|
||||||
user_perms = self._get_object_perms(
|
|
||||||
objects=queryset,
|
|
||||||
perm_codenames=[permission_name_view, permission_name_change],
|
|
||||||
actor="users",
|
|
||||||
)
|
|
||||||
group_perms = self._get_object_perms(
|
|
||||||
objects=queryset,
|
|
||||||
perm_codenames=[permission_name_view, permission_name_change],
|
|
||||||
actor="groups",
|
|
||||||
)
|
|
||||||
|
|
||||||
context["users_view_perms"] = {
|
|
||||||
pk: user_perms[pk][permission_name_view] for pk in user_perms
|
|
||||||
}
|
|
||||||
context["users_change_perms"] = {
|
|
||||||
pk: user_perms[pk][permission_name_change] for pk in user_perms
|
|
||||||
}
|
|
||||||
context["groups_view_perms"] = {
|
|
||||||
pk: group_perms[pk][permission_name_view] for pk in group_perms
|
|
||||||
}
|
|
||||||
context["groups_change_perms"] = {
|
|
||||||
pk: group_perms[pk][permission_name_change] for pk in group_perms
|
|
||||||
}
|
|
||||||
|
|
||||||
return context
|
|
||||||
|
|
||||||
|
|
||||||
class PermissionsAwareDocumentCountMixin(BulkPermissionMixin, PassUserMixin):
|
|
||||||
"""
|
"""
|
||||||
Mixin to add document count to queryset, permissions-aware if needed
|
Mixin to add document count to queryset, permissions-aware if needed
|
||||||
"""
|
"""
|
||||||
|
@@ -2,7 +2,7 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: paperless-ngx\n"
|
"Project-Id-Version: paperless-ngx\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2025-09-30 16:50+0000\n"
|
"POT-Creation-Date: 2025-09-22 18:20+0000\n"
|
||||||
"PO-Revision-Date: 2022-02-17 04:17\n"
|
"PO-Revision-Date: 2022-02-17 04:17\n"
|
||||||
"Last-Translator: \n"
|
"Last-Translator: \n"
|
||||||
"Language-Team: English\n"
|
"Language-Team: English\n"
|
||||||
@@ -1191,44 +1191,44 @@ msgstr ""
|
|||||||
msgid "workflow runs"
|
msgid "workflow runs"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/serialisers.py:141
|
#: documents/serialisers.py:140
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Invalid regular expression: %(error)s"
|
msgid "Invalid regular expression: %(error)s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/serialisers.py:607
|
#: documents/serialisers.py:594
|
||||||
msgid "Invalid color."
|
msgid "Invalid color."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/serialisers.py:636
|
#: documents/serialisers.py:623
|
||||||
msgid "Invalid parent tag."
|
msgid "Invalid parent tag."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/serialisers.py:1793
|
#: documents/serialisers.py:1780
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "File type %(type)s not supported"
|
msgid "File type %(type)s not supported"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/serialisers.py:1837
|
#: documents/serialisers.py:1824
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Custom field id must be an integer: %(id)s"
|
msgid "Custom field id must be an integer: %(id)s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/serialisers.py:1844
|
#: documents/serialisers.py:1831
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Custom field with id %(id)s does not exist"
|
msgid "Custom field with id %(id)s does not exist"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/serialisers.py:1861 documents/serialisers.py:1871
|
#: documents/serialisers.py:1848 documents/serialisers.py:1858
|
||||||
msgid ""
|
msgid ""
|
||||||
"Custom fields must be a list of integers or an object mapping ids to values."
|
"Custom fields must be a list of integers or an object mapping ids to values."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/serialisers.py:1866
|
#: documents/serialisers.py:1853
|
||||||
msgid "Some custom fields don't exist or were specified twice."
|
msgid "Some custom fields don't exist or were specified twice."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/serialisers.py:1936
|
#: documents/serialisers.py:1923
|
||||||
msgid "Invalid variable detected."
|
msgid "Invalid variable detected."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user