diff --git a/README.md b/README.md
index eea41ce05..5c5fa4a76 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-[](https://travis-ci.org/jonaswinkler/paperless-ng)
+[](https://travis-ci.com/jonaswinkler/paperless-ng)
[](https://paperless-ng.readthedocs.io/en/latest/?badge=latest)
[](https://gitter.im/paperless-ng/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
[](https://hub.docker.com/r/jonaswinkler/paperless-ng)
diff --git a/docker/gunicorn.conf.py b/docker/gunicorn.conf.py
index 5c9c0eb37..edfb362d9 100644
--- a/docker/gunicorn.conf.py
+++ b/docker/gunicorn.conf.py
@@ -1,4 +1,4 @@
-bind = ['[::]:8000', 'localhost:8000']
+bind = '0.0.0.0:8000'
backlog = 2048
workers = 3
worker_class = 'sync'
diff --git a/docker/hub/docker-compose.postgres.yml b/docker/hub/docker-compose.postgres.yml
index c2b599e52..0779cea22 100644
--- a/docker/hub/docker-compose.postgres.yml
+++ b/docker/hub/docker-compose.postgres.yml
@@ -15,7 +15,7 @@ services:
POSTGRES_PASSWORD: paperless
webserver:
- image: jonaswinkler/paperless-ng:0.9.10
+ image: jonaswinkler/paperless-ng:0.9.11
restart: always
depends_on:
- db
diff --git a/docker/hub/docker-compose.sqlite.yml b/docker/hub/docker-compose.sqlite.yml
index 429d42c06..3eed96cc3 100644
--- a/docker/hub/docker-compose.sqlite.yml
+++ b/docker/hub/docker-compose.sqlite.yml
@@ -5,7 +5,7 @@ services:
restart: always
webserver:
- image: jonaswinkler/paperless-ng:0.9.10
+ image: jonaswinkler/paperless-ng:0.9.11
restart: always
depends_on:
- broker
diff --git a/docs/changelog.rst b/docs/changelog.rst
index 4357a981b..70f5cf683 100644
--- a/docs/changelog.rst
+++ b/docs/changelog.rst
@@ -5,6 +5,13 @@
Changelog
*********
+
+paperless-ng 0.9.11
+###################
+
+* Fixed an issue with the docker image not starting at all due to a configuration change of the web server.
+
+
paperless-ng 0.9.10
###################
@@ -15,6 +22,7 @@ paperless-ng 0.9.10
* Other changes and additions
+ * Thanks to `zjean`_, paperless now publishes a webmanifest, which is useful for adding the application to home screens on mobile devices.
* The Paperless-ng logo now navigates to the dashboard.
* Filter for documents that don't have any correspondents, types or tags assigned.
* Tags, types and correspondents are now sorted case insensitive.
@@ -25,6 +33,8 @@ paperless-ng 0.9.10
* Added missing dependencies for Raspberry Pi builds.
* Fixed an issue with plain text file consumption: Thumbnail generation failed due to missing fonts.
* An issue with the search index reporting missing documents after bulk deletes was fixed.
+ * Issue with the tag selector not clearing input correctly.
+ * The consumer used to stop working when encountering an incomplete classifier model file.
.. note::
@@ -956,6 +966,7 @@ bulk of the work on this big change.
* Initial release
+.. _zjean: https://github.com/zjean
.. _rYR79435: https://github.com/rYR79435
.. _Michael Shamoon: https://github.com/shamoon
.. _jayme-github: http://github.com/jayme-github
diff --git a/paperless.conf.example b/paperless.conf.example
index 139453cf3..d9d0f5b06 100644
--- a/paperless.conf.example
+++ b/paperless.conf.example
@@ -39,7 +39,7 @@
#PAPERLESS_OCR_OUTPUT_TYPE=pdfa
#PAPERLESS_OCR_PAGES=1
#PAPERLESS_OCR_IMAGE_DPI=300
-#PAPERLESS_OCR_USER_ARG={}
+#PAPERLESS_OCR_USER_ARGS={}
#PAPERLESS_CONVERT_MEMORY_LIMIT=0
#PAPERLESS_CONVERT_TMPDIR=/var/tmp/paperless
diff --git a/src-ui/angular.json b/src-ui/angular.json
index 514b351fc..66bd81779 100644
--- a/src-ui/angular.json
+++ b/src-ui/angular.json
@@ -33,7 +33,8 @@
"aot": true,
"assets": [
"src/favicon.ico",
- "src/assets"
+ "src/assets",
+ "src/manifest.webmanifest"
],
"styles": [
"src/styles.scss"
@@ -100,7 +101,8 @@
"karmaConfig": "karma.conf.js",
"assets": [
"src/favicon.ico",
- "src/assets"
+ "src/assets",
+ "src/manifest.webmanifest"
],
"styles": [
"src/styles.scss"
diff --git a/src-ui/src/app/components/common/filterable-dropdown/filterable-dropdown.component.html b/src-ui/src/app/components/common/filterable-dropdown/filterable-dropdown.component.html
index 015269c17..a0e833c98 100644
--- a/src-ui/src/app/components/common/filterable-dropdown/filterable-dropdown.component.html
+++ b/src-ui/src/app/components/common/filterable-dropdown/filterable-dropdown.component.html
@@ -20,7 +20,7 @@
diff --git a/src-ui/src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts b/src-ui/src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts
index e1aa6a06a..b51923c27 100644
--- a/src-ui/src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts
+++ b/src-ui/src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts
@@ -18,6 +18,18 @@ export class FilterableDropdownSelectionModel {
items: MatchingModel[] = []
+ get itemsSorted(): MatchingModel[] {
+ return this.items.sort((a,b) => {
+ if (this.getNonTemporary(a.id) == ToggleableItemState.NotSelected && this.getNonTemporary(b.id) != ToggleableItemState.NotSelected) {
+ return 1
+ } else if (this.getNonTemporary(a.id) != ToggleableItemState.NotSelected && this.getNonTemporary(b.id) == ToggleableItemState.NotSelected) {
+ return -1
+ } else {
+ return a.name.localeCompare(b.name)
+ }
+ })
+ }
+
private selectionStates = new Map()
private temporarySelectionStates = new Map()
@@ -69,6 +81,10 @@ export class FilterableDropdownSelectionModel {
}
+ private getNonTemporary(id: number) {
+ return this.selectionStates.get(id) || ToggleableItemState.NotSelected
+ }
+
get(id: number) {
return this.temporarySelectionStates.get(id) || ToggleableItemState.NotSelected
}
diff --git a/src-ui/src/app/components/common/input/tags/tags.component.html b/src-ui/src/app/components/common/input/tags/tags.component.html
index 8a5dbc4f2..01b3fe755 100644
--- a/src-ui/src/app/components/common/input/tags/tags.component.html
+++ b/src-ui/src/app/components/common/input/tags/tags.component.html
@@ -5,7 +5,9 @@
diff --git a/src-ui/src/app/components/document-list/document-card-small/document-card-small.component.html b/src-ui/src/app/components/document-list/document-card-small/document-card-small.component.html
index e0d8d28e1..f6128e077 100644
--- a/src-ui/src/app/components/document-list/document-card-small/document-card-small.component.html
+++ b/src-ui/src/app/components/document-list/document-card-small/document-card-small.component.html
@@ -1,5 +1,5 @@
-
+
![]()
diff --git a/src-ui/src/app/components/document-list/document-list.component.html b/src-ui/src/app/components/document-list/document-list.component.html
index bc1047ba9..e627c428d 100644
--- a/src-ui/src/app/components/document-list/document-list.component.html
+++ b/src-ui/src/app/components/document-list/document-list.component.html
@@ -78,8 +78,8 @@
diff --git a/src-ui/src/app/components/manage/correspondent-list/correspondent-list.component.ts b/src-ui/src/app/components/manage/correspondent-list/correspondent-list.component.ts
index d3b71b4ab..37b6fa66e 100644
--- a/src-ui/src/app/components/manage/correspondent-list/correspondent-list.component.ts
+++ b/src-ui/src/app/components/manage/correspondent-list/correspondent-list.component.ts
@@ -1,5 +1,4 @@
-import { Component, OnInit } from '@angular/core';
-import { Router } from '@angular/router';
+import { Component } from '@angular/core';
import { NgbModal } from '@ng-bootstrap/ng-bootstrap';
import { FILTER_CORRESPONDENT } from 'src/app/data/filter-rule-type';
import { PaperlessCorrespondent } from 'src/app/data/paperless-correspondent';
@@ -16,7 +15,6 @@ import { CorrespondentEditDialogComponent } from './correspondent-edit-dialog/co
export class CorrespondentListComponent extends GenericListComponent
{
constructor(correspondentsService: CorrespondentService, modalService: NgbModal,
- private router: Router,
private list: DocumentListViewService
) {
super(correspondentsService,modalService,CorrespondentEditDialogComponent)
@@ -27,9 +25,6 @@ export class CorrespondentListComponent extends GenericListComponent {
constructor(service: DocumentTypeService, modalService: NgbModal,
- private router: Router,
private list: DocumentListViewService
) {
super(service, modalService, DocumentTypeEditDialogComponent)
@@ -28,9 +26,6 @@ export class DocumentTypeListComponent extends GenericListComponent {
constructor(tagService: TagService, modalService: NgbModal,
- private router: Router,
private list: DocumentListViewService
) {
super(tagService, modalService, TagEditDialogComponent)
@@ -27,14 +25,11 @@ export class TagListComponent extends GenericListComponent {
}
getDeleteMessage(object: PaperlessTag) {
-
return $localize`Do you really want to delete the tag "${object.name}"?`
}
filterDocuments(object: PaperlessTag) {
- this.list.documentListView.filter_rules = [
- {rule_type: FILTER_HAS_TAG, value: object.id.toString()}
- ]
- this.router.navigate(["documents"])
+ this.list.quickFilter([{rule_type: FILTER_HAS_TAG, value: object.id.toString()}])
+
}
}
diff --git a/src-ui/src/app/services/document-list-view.service.ts b/src-ui/src/app/services/document-list-view.service.ts
index dfcf9c0c5..eb69439ec 100644
--- a/src-ui/src/app/services/document-list-view.service.ts
+++ b/src-ui/src/app/services/document-list-view.service.ts
@@ -1,4 +1,5 @@
import { Injectable } from '@angular/core';
+import { Router } from '@angular/router';
import { Observable } from 'rxjs';
import { cloneFilterRules, FilterRule } from '../data/filter-rule';
import { PaperlessDocument } from '../data/paperless-document';
@@ -155,6 +156,14 @@ export class DocumentListViewService {
sessionStorage.setItem(DOCUMENT_LIST_SERVICE.CURRENT_VIEW_CONFIG, JSON.stringify(this.documentListView))
}
+ quickFilter(filterRules: FilterRule[]) {
+ this.savedView = null
+ this.view.filter_rules = filterRules
+ this.reduceSelectionToFilter()
+ this.saveDocumentListView()
+ this.router.navigate(["documents"])
+ }
+
getLastPage(): number {
return Math.ceil(this.collectionSize / this.currentPageSize)
}
@@ -240,7 +249,7 @@ export class DocumentListViewService {
}
}
- constructor(private documentService: DocumentService, private settings: SettingsService) {
+ constructor(private documentService: DocumentService, private settings: SettingsService, private router: Router) {
let documentListViewConfigJson = sessionStorage.getItem(DOCUMENT_LIST_SERVICE.CURRENT_VIEW_CONFIG)
if (documentListViewConfigJson) {
try {
diff --git a/src-ui/src/environments/environment.prod.ts b/src-ui/src/environments/environment.prod.ts
index 7b707f014..1ac69bc39 100644
--- a/src-ui/src/environments/environment.prod.ts
+++ b/src-ui/src/environments/environment.prod.ts
@@ -2,5 +2,5 @@ export const environment = {
production: true,
apiBaseUrl: "/api/",
appTitle: "Paperless-ng",
- version: "0.9.10"
+ version: "0.9.11"
};
diff --git a/src-ui/src/index.html b/src-ui/src/index.html
index f82399ce6..08ab3d931 100644
--- a/src-ui/src/index.html
+++ b/src-ui/src/index.html
@@ -5,6 +5,8 @@
Paperless-ng
+
+
diff --git a/src-ui/src/manifest.webmanifest b/src-ui/src/manifest.webmanifest
new file mode 100644
index 000000000..60151bb5c
--- /dev/null
+++ b/src-ui/src/manifest.webmanifest
@@ -0,0 +1,14 @@
+{
+ "background_color": "white",
+ "description": "A supercharged version of paperless: scan, index and archive all your physical documents",
+ "display": "fullscreen",
+ "icons": [
+ {
+ "src": "favicon.ico",
+ "sizes": "128x128"
+ }
+ ],
+ "name": "Paperless NG",
+ "short_name": "Paperless NG",
+ "start_url": "/"
+}
diff --git a/src/documents/consumer.py b/src/documents/consumer.py
index 4bcb6d1d9..5a06194b7 100755
--- a/src/documents/consumer.py
+++ b/src/documents/consumer.py
@@ -158,7 +158,7 @@ class Consumer(LoggingMixin):
try:
classifier = DocumentClassifier()
classifier.reload()
- except (FileNotFoundError, IncompatibleClassifierVersionError) as e:
+ except (OSError, EOFError, IncompatibleClassifierVersionError) as e:
self.log(
"warning",
f"Cannot classify documents: {e}.")
diff --git a/src/documents/management/commands/document_retagger.py b/src/documents/management/commands/document_retagger.py
index cf014dc6f..0fb9782c1 100755
--- a/src/documents/management/commands/document_retagger.py
+++ b/src/documents/management/commands/document_retagger.py
@@ -73,7 +73,7 @@ class Command(Renderable, BaseCommand):
classifier = DocumentClassifier()
try:
classifier.reload()
- except (FileNotFoundError, IncompatibleClassifierVersionError) as e:
+ except (OSError, EOFError, IncompatibleClassifierVersionError) as e:
logging.getLogger(__name__).warning(
f"Cannot classify documents: {e}.")
classifier = None
diff --git a/src/documents/tasks.py b/src/documents/tasks.py
index ba7010ea9..38ff532b5 100644
--- a/src/documents/tasks.py
+++ b/src/documents/tasks.py
@@ -35,9 +35,9 @@ def train_classifier():
try:
# load the classifier, since we might not have to train it again.
classifier.reload()
- except (FileNotFoundError, IncompatibleClassifierVersionError):
+ except (OSError, EOFError, IncompatibleClassifierVersionError):
# This is what we're going to fix here.
- pass
+ classifier = DocumentClassifier()
try:
if classifier.train():
diff --git a/src/documents/templates/index.html b/src/documents/templates/index.html
index c95e4b15f..753aa766c 100644
--- a/src/documents/templates/index.html
+++ b/src/documents/templates/index.html
@@ -12,7 +12,9 @@
-
+
+
+
Loading...
diff --git a/src/paperless/version.py b/src/paperless/version.py
index facb097fc..e1ba14cb4 100644
--- a/src/paperless/version.py
+++ b/src/paperless/version.py
@@ -1 +1 @@
-__version__ = (0, 9, 10)
+__version__ = (0, 9, 11)