mirror of
https://github.com/paperless-ngx/paperless-ngx.git
synced 2025-11-12 09:36:41 -05:00
Merge branch 'dev' into feature-remote-ocr-2
This commit is contained in:
commit
56b26185fa
@ -35,7 +35,7 @@ services:
|
|||||||
image: docker.io/library/postgres:18
|
image: docker.io/library/postgres:18
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
volumes:
|
volumes:
|
||||||
- pgdata:/var/lib/postgresql/data
|
- pgdata:/var/lib/postgresql
|
||||||
environment:
|
environment:
|
||||||
POSTGRES_DB: paperless
|
POSTGRES_DB: paperless
|
||||||
POSTGRES_USER: paperless
|
POSTGRES_USER: paperless
|
||||||
|
|||||||
@ -38,7 +38,7 @@ services:
|
|||||||
image: docker.io/library/postgres:18
|
image: docker.io/library/postgres:18
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
volumes:
|
volumes:
|
||||||
- pgdata:/var/lib/postgresql/data
|
- pgdata:/var/lib/postgresql
|
||||||
environment:
|
environment:
|
||||||
POSTGRES_DB: paperless
|
POSTGRES_DB: paperless
|
||||||
POSTGRES_USER: paperless
|
POSTGRES_USER: paperless
|
||||||
|
|||||||
@ -34,7 +34,7 @@ services:
|
|||||||
image: docker.io/library/postgres:18
|
image: docker.io/library/postgres:18
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
volumes:
|
volumes:
|
||||||
- pgdata:/var/lib/postgresql/data
|
- pgdata:/var/lib/postgresql
|
||||||
environment:
|
environment:
|
||||||
POSTGRES_DB: paperless
|
POSTGRES_DB: paperless
|
||||||
POSTGRES_USER: paperless
|
POSTGRES_USER: paperless
|
||||||
|
|||||||
@ -980,21 +980,10 @@ paperless will process in parallel on a single document.
|
|||||||
process very large documents faster, use a higher thread per worker
|
process very large documents faster, use a higher thread per worker
|
||||||
count.
|
count.
|
||||||
|
|
||||||
The default is a balance between the two, according to your CPU core
|
If unset, paperless uses `max(floor(cpu_count / PAPERLESS_TASK_WORKERS), 1)`
|
||||||
count, with a slight favor towards threads per worker:
|
threads per worker. The idea behind this is that as long as there are enough cores,
|
||||||
|
the total number of threads should less than or equal to the total number of (logical)
|
||||||
| CPU core count | Workers | Threads |
|
CPU cores.
|
||||||
| -------------- | ------- | ------- |
|
|
||||||
| > 1 | > 1 | > 1 |
|
|
||||||
| > 2 | > 2 | > 1 |
|
|
||||||
| > 4 | > 2 | > 2 |
|
|
||||||
| > 6 | > 2 | > 3 |
|
|
||||||
| > 8 | > 2 | > 4 |
|
|
||||||
| > 12 | > 3 | > 4 |
|
|
||||||
| > 16 | > 4 | > 4 |
|
|
||||||
|
|
||||||
If you only specify PAPERLESS_TASK_WORKERS, paperless will adjust
|
|
||||||
PAPERLESS_THREADS_PER_WORKER automatically.
|
|
||||||
|
|
||||||
#### [`PAPERLESS_WORKER_TIMEOUT=<num>`](#PAPERLESS_WORKER_TIMEOUT) {#PAPERLESS_WORKER_TIMEOUT}
|
#### [`PAPERLESS_WORKER_TIMEOUT=<num>`](#PAPERLESS_WORKER_TIMEOUT) {#PAPERLESS_WORKER_TIMEOUT}
|
||||||
|
|
||||||
|
|||||||
@ -553,7 +553,7 @@
|
|||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/common/edit-dialog/custom-field-edit-dialog/custom-field-edit-dialog.component.html</context>
|
<context context-type="sourcefile">src/app/components/common/edit-dialog/custom-field-edit-dialog/custom-field-edit-dialog.component.html</context>
|
||||||
<context context-type="linenumber">55</context>
|
<context context-type="linenumber">52</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/common/edit-dialog/document-type-edit-dialog/document-type-edit-dialog.component.html</context>
|
<context context-type="sourcefile">src/app/components/common/edit-dialog/document-type-edit-dialog/document-type-edit-dialog.component.html</context>
|
||||||
@ -1452,7 +1452,7 @@
|
|||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/common/edit-dialog/custom-field-edit-dialog/custom-field-edit-dialog.component.html</context>
|
<context context-type="sourcefile">src/app/components/common/edit-dialog/custom-field-edit-dialog/custom-field-edit-dialog.component.html</context>
|
||||||
<context context-type="linenumber">54</context>
|
<context context-type="linenumber">51</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/common/edit-dialog/document-type-edit-dialog/document-type-edit-dialog.component.html</context>
|
<context context-type="sourcefile">src/app/components/common/edit-dialog/document-type-edit-dialog/document-type-edit-dialog.component.html</context>
|
||||||
@ -3707,32 +3707,25 @@
|
|||||||
<context context-type="linenumber">20</context>
|
<context context-type="linenumber">20</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="5077457124599302010" datatype="html">
|
|
||||||
<source>Warning: existing instances of this field will retain their current value index (e.g. option #1, #2, #3) after editing the options here</source>
|
|
||||||
<context-group purpose="location">
|
|
||||||
<context context-type="sourcefile">src/app/components/common/edit-dialog/custom-field-edit-dialog/custom-field-edit-dialog.component.html</context>
|
|
||||||
<context context-type="linenumber">42</context>
|
|
||||||
</context-group>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="2739003406164860877" datatype="html">
|
<trans-unit id="2739003406164860877" datatype="html">
|
||||||
<source>Default Currency</source>
|
<source>Default Currency</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/common/edit-dialog/custom-field-edit-dialog/custom-field-edit-dialog.component.html</context>
|
<context context-type="sourcefile">src/app/components/common/edit-dialog/custom-field-edit-dialog/custom-field-edit-dialog.component.html</context>
|
||||||
<context context-type="linenumber">47</context>
|
<context context-type="linenumber">44</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="7615210738790237590" datatype="html">
|
<trans-unit id="7615210738790237590" datatype="html">
|
||||||
<source>3-character currency code</source>
|
<source>3-character currency code</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/common/edit-dialog/custom-field-edit-dialog/custom-field-edit-dialog.component.html</context>
|
<context context-type="sourcefile">src/app/components/common/edit-dialog/custom-field-edit-dialog/custom-field-edit-dialog.component.html</context>
|
||||||
<context context-type="linenumber">47</context>
|
<context context-type="linenumber">44</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="607636736207886379" datatype="html">
|
<trans-unit id="607636736207886379" datatype="html">
|
||||||
<source>Use locale</source>
|
<source>Use locale</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/common/edit-dialog/custom-field-edit-dialog/custom-field-edit-dialog.component.html</context>
|
<context context-type="sourcefile">src/app/components/common/edit-dialog/custom-field-edit-dialog/custom-field-edit-dialog.component.html</context>
|
||||||
<context context-type="linenumber">47</context>
|
<context context-type="linenumber">44</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="528950215505228201" datatype="html">
|
<trans-unit id="528950215505228201" datatype="html">
|
||||||
|
|||||||
@ -38,9 +38,6 @@
|
|||||||
size="sm"
|
size="sm"
|
||||||
></ngb-pagination>
|
></ngb-pagination>
|
||||||
}
|
}
|
||||||
@if (object?.id) {
|
|
||||||
<small class="d-block mt-2" i18n>Warning: existing instances of this field will retain their current value index (e.g. option #1, #2, #3) after editing the options here</small>
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@case (CustomFieldDataType.Monetary) {
|
@case (CustomFieldDataType.Monetary) {
|
||||||
<div class="my-3">
|
<div class="my-3">
|
||||||
|
|||||||
@ -3,7 +3,7 @@
|
|||||||
i18n-title
|
i18n-title
|
||||||
info="Manage e-mail accounts and rules for automatically importing documents."
|
info="Manage e-mail accounts and rules for automatically importing documents."
|
||||||
i18n-info
|
i18n-info
|
||||||
infoLink="usage/#usage-email"
|
infoLink="usage/#incoming-mail"
|
||||||
>
|
>
|
||||||
</pngx-page-header>
|
</pngx-page-header>
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -132,7 +132,7 @@ class Tag(MatchingModel, TreeNodeModel):
|
|||||||
height = 0 if self.pk is None else self.get_depth()
|
height = 0 if self.pk is None else self.get_depth()
|
||||||
deepest_new_depth = (new_parent_depth + 1) + height
|
deepest_new_depth = (new_parent_depth + 1) + height
|
||||||
if deepest_new_depth > self.MAX_NESTING_DEPTH:
|
if deepest_new_depth > self.MAX_NESTING_DEPTH:
|
||||||
raise ValidationError(_("Maximum nesting depth exceeded."))
|
raise ValidationError({"parent": _("Maximum nesting depth exceeded.")})
|
||||||
|
|
||||||
return super().clean()
|
return super().clean()
|
||||||
|
|
||||||
|
|||||||
@ -635,7 +635,7 @@ class TagSerializer(MatchingModelSerializer, OwnedObjectSerializer):
|
|||||||
temp.clean()
|
temp.clean()
|
||||||
except ValidationError as e:
|
except ValidationError as e:
|
||||||
logger.debug("Tag parent validation failed: %s", e)
|
logger.debug("Tag parent validation failed: %s", e)
|
||||||
raise serializers.ValidationError({"parent": _("Invalid parent tag.")})
|
raise e
|
||||||
|
|
||||||
return super().validate(attrs)
|
return super().validate(attrs)
|
||||||
|
|
||||||
|
|||||||
@ -171,7 +171,7 @@ class TestTagHierarchy(APITestCase):
|
|||||||
)
|
)
|
||||||
assert resp_fail.status_code == 400
|
assert resp_fail.status_code == 400
|
||||||
assert "parent" in resp_fail.data
|
assert "parent" in resp_fail.data
|
||||||
assert "Invalid" in str(resp_fail.data["parent"])
|
assert "Maximum nesting depth exceeded" in str(resp_fail.data["parent"])
|
||||||
|
|
||||||
def test_max_depth_on_move_subtree(self):
|
def test_max_depth_on_move_subtree(self):
|
||||||
a = Tag.objects.create(name="A2")
|
a = Tag.objects.create(name="A2")
|
||||||
@ -191,7 +191,7 @@ class TestTagHierarchy(APITestCase):
|
|||||||
)
|
)
|
||||||
assert resp_fail.status_code == 400
|
assert resp_fail.status_code == 400
|
||||||
assert "Maximum nesting depth exceeded" in str(
|
assert "Maximum nesting depth exceeded" in str(
|
||||||
resp_fail.data["non_field_errors"],
|
resp_fail.data["parent"],
|
||||||
)
|
)
|
||||||
|
|
||||||
# Moving X under C (depth 3) should be allowed (deepest becomes 5)
|
# Moving X under C (depth 3) should be allowed (deepest becomes 5)
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -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-10-13 22:25+0000\n"
|
"POT-Creation-Date: 2025-10-21 05:44+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"
|
||||||
@ -1228,10 +1228,6 @@ msgstr ""
|
|||||||
msgid "Invalid color."
|
msgid "Invalid color."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/serialisers.py:638
|
|
||||||
msgid "Invalid parent tag."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: documents/serialisers.py:1795
|
#: documents/serialisers.py:1795
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "File type %(type)s not supported"
|
msgid "File type %(type)s not supported"
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user