mirror of
https://github.com/paperless-ngx/paperless-ngx.git
synced 2025-08-12 00:19:48 +00:00
Compare commits
2 Commits
feature-tr
...
feature-ch
Author | SHA1 | Date | |
---|---|---|---|
![]() |
58fc8a6011 | ||
![]() |
edb8c06e2a |
18
Dockerfile
18
Dockerfile
@@ -5,7 +5,7 @@
|
||||
# Purpose: Compiles the frontend
|
||||
# Notes:
|
||||
# - Does PNPM stuff with Typescript and such
|
||||
FROM --platform=$BUILDPLATFORM docker.io/node:20-trixie-slim AS compile-frontend
|
||||
FROM --platform=$BUILDPLATFORM docker.io/node:20-bookworm-slim AS compile-frontend
|
||||
|
||||
COPY ./src-ui /src/src-ui
|
||||
|
||||
@@ -32,7 +32,7 @@ RUN set -eux \
|
||||
# Purpose: Installs s6-overlay and rootfs
|
||||
# Comments:
|
||||
# - Don't leave anything extra in here either
|
||||
FROM ghcr.io/astral-sh/uv:0.8.4-python3.12-trixie-slim AS s6-overlay-base
|
||||
FROM ghcr.io/astral-sh/uv:0.8.4-python3.12-bookworm-slim AS s6-overlay-base
|
||||
|
||||
WORKDIR /usr/src/s6
|
||||
|
||||
@@ -170,8 +170,20 @@ RUN set -eux \
|
||||
&& apt-get update \
|
||||
&& apt-get install --yes --quiet --no-install-recommends ${RUNTIME_PACKAGES} \
|
||||
&& echo "Installing pre-built updates" \
|
||||
&& curl --fail --silent --no-progress-meter --show-error --location --remote-name-all \
|
||||
&& curl --fail --silent --no-progress-meter --show-error --location --remote-name-all --parallel --parallel-max 4 \
|
||||
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/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" \
|
||||
&& dpkg --install ./jbig2enc_${JBIG2ENC_VERSION}-1_${TARGETARCH}.deb \
|
||||
&& echo "Configuring imagemagick" \
|
||||
|
319
dev.txt
319
dev.txt
@@ -1,319 +0,0 @@
|
||||
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
|
@@ -179,10 +179,14 @@ following:
|
||||
|
||||
### Database Upgrades
|
||||
|
||||
In general, paperless does not require a specific version of PostgreSQL or MariaDB and it is
|
||||
Paperless-ngx is compatible with Django-supported versions of PostgreSQL and MariaDB and it is generally
|
||||
safe to update them to newer versions. However, you should always take a backup and follow
|
||||
the instructions from your database's documentation for how to upgrade between major versions.
|
||||
|
||||
!!! note
|
||||
|
||||
As of Paperless-ngx v2.18, the minimum supported version of PostgreSQL is 13.
|
||||
|
||||
For PostgreSQL, refer to [Upgrading a PostgreSQL Cluster](https://www.postgresql.org/docs/current/upgrading.html).
|
||||
|
||||
For MariaDB, refer to [Upgrading MariaDB](https://mariadb.com/kb/en/upgrading/)
|
||||
|
@@ -23,22 +23,22 @@ dependencies = [
|
||||
"dateparser~=1.2",
|
||||
# WARNING: django does not use semver.
|
||||
# Only patch versions are guaranteed to not introduce breaking changes.
|
||||
"django~=5.1.7",
|
||||
"django~=5.2.5",
|
||||
"django-allauth[socialaccount,mfa]~=65.4.0",
|
||||
"django-auditlog~=3.1.2",
|
||||
"django-auditlog~=3.2.1",
|
||||
"django-cachalot~=2.8.0",
|
||||
"django-celery-results~=2.6.0",
|
||||
"django-compression-middleware~=0.5.0",
|
||||
"django-cors-headers~=4.7.0",
|
||||
"django-extensions~=4.1",
|
||||
"django-filter~=25.1",
|
||||
"django-guardian~=2.4.0",
|
||||
"django-multiselectfield~=0.1.13",
|
||||
"django-guardian~=3.0.3",
|
||||
"django-multiselectfield~=1.0.1",
|
||||
"django-soft-delete~=1.0.18",
|
||||
"djangorestframework~=3.15",
|
||||
"djangorestframework-guardian~=0.3.0",
|
||||
"djangorestframework~=3.16",
|
||||
"djangorestframework-guardian~=0.4.0",
|
||||
"drf-spectacular~=0.28",
|
||||
"drf-spectacular-sidecar~=2025.4.1",
|
||||
"drf-spectacular-sidecar~=2025.8.1",
|
||||
"drf-writable-nested~=0.7.1",
|
||||
"filelock~=3.18.0",
|
||||
"flower~=2.0.1",
|
||||
@@ -103,7 +103,7 @@ testing = [
|
||||
"imagehash",
|
||||
"pytest~=8.4.1",
|
||||
"pytest-cov~=6.2.1",
|
||||
"pytest-django~=4.10.0",
|
||||
"pytest-django~=4.11.1",
|
||||
"pytest-env",
|
||||
"pytest-httpx",
|
||||
"pytest-mock",
|
||||
|
@@ -125,14 +125,14 @@ class Command(MultiProcessMixin, ProgressBarMixin, BaseCommand):
|
||||
messages.append(
|
||||
self.style.NOTICE(
|
||||
f"Document {result.doc_one_pk} fuzzy match"
|
||||
f" to {result.doc_two_pk} (confidence {result.ratio:.3f})",
|
||||
f" to {result.doc_two_pk} (confidence {result.ratio:.3f})\n",
|
||||
),
|
||||
)
|
||||
maybe_delete_ids.append(result.doc_two_pk)
|
||||
|
||||
if len(messages) == 0:
|
||||
messages.append(
|
||||
self.style.SUCCESS("No matches found"),
|
||||
self.style.SUCCESS("No matches found\n"),
|
||||
)
|
||||
self.stdout.writelines(
|
||||
messages,
|
||||
|
@@ -2089,6 +2089,24 @@ class WorkflowTriggerSerializer(serializers.ModelSerializer):
|
||||
|
||||
return attrs
|
||||
|
||||
@staticmethod
|
||||
def normalize_workflow_trigger_sources(trigger):
|
||||
"""
|
||||
Convert sources to strings to handle django-multiselectfield v1.0 changes
|
||||
"""
|
||||
if trigger and "sources" in trigger:
|
||||
trigger["sources"] = [
|
||||
str(s.value if hasattr(s, "value") else s) for s in trigger["sources"]
|
||||
]
|
||||
|
||||
def create(self, validated_data):
|
||||
WorkflowTriggerSerializer.normalize_workflow_trigger_sources(validated_data)
|
||||
return super().create(validated_data)
|
||||
|
||||
def update(self, instance, validated_data):
|
||||
WorkflowTriggerSerializer.normalize_workflow_trigger_sources(validated_data)
|
||||
return super().update(instance, validated_data)
|
||||
|
||||
|
||||
class WorkflowActionEmailSerializer(serializers.ModelSerializer):
|
||||
id = serializers.IntegerField(allow_null=True, required=False)
|
||||
@@ -2253,6 +2271,8 @@ class WorkflowSerializer(serializers.ModelSerializer):
|
||||
if triggers is not None and triggers is not serializers.empty:
|
||||
for trigger in triggers:
|
||||
filter_has_tags = trigger.pop("filter_has_tags", None)
|
||||
# Convert sources to strings to handle django-multiselectfield v1.0 changes
|
||||
WorkflowTriggerSerializer.normalize_workflow_trigger_sources(trigger)
|
||||
trigger_instance, _ = WorkflowTrigger.objects.update_or_create(
|
||||
id=trigger.get("id"),
|
||||
defaults=trigger,
|
||||
|
@@ -123,7 +123,7 @@ class TestExportImport(
|
||||
|
||||
self.trigger = WorkflowTrigger.objects.create(
|
||||
type=WorkflowTrigger.WorkflowTriggerType.CONSUMPTION,
|
||||
sources=[1],
|
||||
sources=[str(WorkflowTrigger.DocumentSourceChoices.CONSUME_FOLDER.value)],
|
||||
filter_filename="*",
|
||||
)
|
||||
self.action = WorkflowAction.objects.create(assign_title="new title")
|
||||
|
@@ -87,7 +87,7 @@ class TestFuzzyMatchCommand(TestCase):
|
||||
filename="other_test.pdf",
|
||||
)
|
||||
stdout, _ = self.call_command()
|
||||
self.assertEqual(stdout, "No matches found\n")
|
||||
self.assertIn("No matches found", stdout)
|
||||
|
||||
def test_with_matches(self):
|
||||
"""
|
||||
@@ -116,7 +116,7 @@ class TestFuzzyMatchCommand(TestCase):
|
||||
filename="other_test.pdf",
|
||||
)
|
||||
stdout, _ = self.call_command("--processes", "1")
|
||||
self.assertRegex(stdout, self.MSG_REGEX + "\n")
|
||||
self.assertRegex(stdout, self.MSG_REGEX)
|
||||
|
||||
def test_with_3_matches(self):
|
||||
"""
|
||||
@@ -152,11 +152,10 @@ class TestFuzzyMatchCommand(TestCase):
|
||||
filename="final_test.pdf",
|
||||
)
|
||||
stdout, _ = self.call_command()
|
||||
lines = [x.strip() for x in stdout.split("\n") if len(x.strip())]
|
||||
lines = [x.strip() for x in stdout.splitlines() if x.strip()]
|
||||
self.assertEqual(len(lines), 3)
|
||||
self.assertRegex(lines[0], self.MSG_REGEX)
|
||||
self.assertRegex(lines[1], self.MSG_REGEX)
|
||||
self.assertRegex(lines[2], self.MSG_REGEX)
|
||||
for line in lines:
|
||||
self.assertRegex(line, self.MSG_REGEX)
|
||||
|
||||
def test_document_deletion(self):
|
||||
"""
|
||||
@@ -197,14 +196,12 @@ class TestFuzzyMatchCommand(TestCase):
|
||||
|
||||
stdout, _ = self.call_command("--delete")
|
||||
|
||||
lines = [x.strip() for x in stdout.split("\n") if len(x.strip())]
|
||||
self.assertEqual(len(lines), 3)
|
||||
self.assertEqual(
|
||||
lines[0],
|
||||
self.assertIn(
|
||||
"The command is configured to delete documents. Use with caution",
|
||||
stdout,
|
||||
)
|
||||
self.assertRegex(lines[1], self.MSG_REGEX)
|
||||
self.assertEqual(lines[2], "Deleting 1 documents based on ratio matches")
|
||||
self.assertRegex(stdout, self.MSG_REGEX)
|
||||
self.assertIn("Deleting 1 documents based on ratio matches", stdout)
|
||||
|
||||
self.assertEqual(Document.objects.count(), 2)
|
||||
self.assertIsNotNone(Document.objects.get(pk=1))
|
||||
|
@@ -104,7 +104,7 @@ class TestReverseMigrateWorkflow(TestMigrations):
|
||||
|
||||
trigger = WorkflowTrigger.objects.create(
|
||||
type=0,
|
||||
sources=[DocumentSource.ConsumeFolder],
|
||||
sources=[str(DocumentSource.ConsumeFolder)],
|
||||
filter_path="*/path/*",
|
||||
filter_filename="*file*",
|
||||
)
|
||||
|
@@ -54,7 +54,7 @@ class HttpRemoteUserMiddleware(PersistentRemoteUserMiddleware):
|
||||
|
||||
header = settings.HTTP_REMOTE_USER_HEADER_NAME
|
||||
|
||||
def process_request(self, request: HttpRequest) -> None:
|
||||
def __call__(self, request: HttpRequest) -> None:
|
||||
# If remote user auth is enabled only for the frontend, not the API,
|
||||
# then we need dont want to authenticate the user for API requests.
|
||||
if (
|
||||
@@ -62,8 +62,8 @@ class HttpRemoteUserMiddleware(PersistentRemoteUserMiddleware):
|
||||
and "paperless.auth.PaperlessRemoteUserAuthentication"
|
||||
not in settings.REST_FRAMEWORK["DEFAULT_AUTHENTICATION_CLASSES"]
|
||||
):
|
||||
return
|
||||
return super().process_request(request)
|
||||
return self.get_response(request)
|
||||
return super().__call__(request)
|
||||
|
||||
|
||||
class PaperlessRemoteUserAuthentication(authentication.RemoteUserAuthentication):
|
||||
|
@@ -214,31 +214,3 @@ def audit_log_check(app_configs, **kwargs):
|
||||
)
|
||||
|
||||
return result
|
||||
|
||||
|
||||
@register()
|
||||
def check_postgres_version(app_configs, **kwargs):
|
||||
"""
|
||||
Django 5.2 removed PostgreSQL 13 support and thus it will be removed in
|
||||
a future Paperless-ngx version. This check can be removed eventually.
|
||||
See https://docs.djangoproject.com/en/5.2/releases/5.2/#dropped-support-for-postgresql-13
|
||||
"""
|
||||
db_conn = connections["default"]
|
||||
result = []
|
||||
if db_conn.vendor == "postgresql":
|
||||
try:
|
||||
with db_conn.cursor() as cursor:
|
||||
cursor.execute("SHOW server_version;")
|
||||
version = cursor.fetchone()[0]
|
||||
if version.startswith("13"):
|
||||
return [
|
||||
Warning(
|
||||
"PostgreSQL 13 is deprecated and will not be supported in a future Paperless-ngx release.",
|
||||
hint="Upgrade to PostgreSQL 14 or newer.",
|
||||
),
|
||||
]
|
||||
except Exception: # pragma: no cover
|
||||
# Don't block checks on version query failure
|
||||
pass
|
||||
|
||||
return result
|
||||
|
@@ -9,7 +9,6 @@ from documents.tests.utils import DirectoriesMixin
|
||||
from documents.tests.utils import FileSystemAssertsMixin
|
||||
from paperless.checks import audit_log_check
|
||||
from paperless.checks import binaries_check
|
||||
from paperless.checks import check_postgres_version
|
||||
from paperless.checks import debug_mode_check
|
||||
from paperless.checks import paths_check
|
||||
from paperless.checks import settings_values_check
|
||||
@@ -263,39 +262,3 @@ class TestAuditLogChecks(TestCase):
|
||||
("auditlog table was found but audit log is disabled."),
|
||||
msg.msg,
|
||||
)
|
||||
|
||||
|
||||
class TestPostgresVersionCheck(TestCase):
|
||||
@mock.patch("paperless.checks.connections")
|
||||
def test_postgres_13_warns(self, mock_connections):
|
||||
mock_connection = mock.MagicMock()
|
||||
mock_connection.vendor = "postgresql"
|
||||
mock_cursor = mock.MagicMock()
|
||||
mock_cursor.__enter__.return_value.fetchone.return_value = ["13.11"]
|
||||
mock_connection.cursor.return_value = mock_cursor
|
||||
mock_connections.__getitem__.return_value = mock_connection
|
||||
|
||||
warnings = check_postgres_version(None)
|
||||
self.assertEqual(len(warnings), 1)
|
||||
self.assertIn("PostgreSQL 13 is deprecated", warnings[0].msg)
|
||||
|
||||
@mock.patch("paperless.checks.connections")
|
||||
def test_postgres_14_passes(self, mock_connections):
|
||||
mock_connection = mock.MagicMock()
|
||||
mock_connection.vendor = "postgresql"
|
||||
mock_cursor = mock.MagicMock()
|
||||
mock_cursor.__enter__.return_value.fetchone.return_value = ["14.10"]
|
||||
mock_connection.cursor.return_value = mock_cursor
|
||||
mock_connections.__getitem__.return_value = mock_connection
|
||||
|
||||
warnings = check_postgres_version(None)
|
||||
self.assertEqual(warnings, [])
|
||||
|
||||
@mock.patch("paperless.checks.connections")
|
||||
def test_non_postgres_skipped(self, mock_connections):
|
||||
mock_connection = mock.MagicMock()
|
||||
mock_connection.vendor = "sqlite"
|
||||
mock_connections.__getitem__.return_value = mock_connection
|
||||
|
||||
warnings = check_postgres_version(None)
|
||||
self.assertEqual(warnings, [])
|
||||
|
@@ -1,6 +1,7 @@
|
||||
import os
|
||||
from unittest import mock
|
||||
|
||||
from django.conf import settings
|
||||
from django.contrib.auth.models import User
|
||||
from django.test import override_settings
|
||||
from rest_framework import status
|
||||
@@ -91,6 +92,7 @@ class TestRemoteUser(DirectoriesMixin, APITestCase):
|
||||
|
||||
@override_settings(
|
||||
REST_FRAMEWORK={
|
||||
**settings.REST_FRAMEWORK,
|
||||
"DEFAULT_AUTHENTICATION_CLASSES": [
|
||||
"rest_framework.authentication.BasicAuthentication",
|
||||
"rest_framework.authentication.TokenAuthentication",
|
||||
|
Reference in New Issue
Block a user