)
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
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
("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, [])