Includes a version.json file with the current version in export. On import, catch certain errors and check the version if possible

This commit is contained in:
Trenton Holmes 2022-05-03 11:15:31 -07:00
parent 3d7aa7a4b9
commit a823b8f70c
2 changed files with 31 additions and 2 deletions

View File

@ -22,6 +22,7 @@ from documents.settings import EXPORTER_ARCHIVE_NAME
from documents.settings import EXPORTER_FILE_NAME
from documents.settings import EXPORTER_THUMBNAIL_NAME
from filelock import FileLock
from paperless import version
from paperless.db import GnuPG
from paperless_mail.models import MailAccount
from paperless_mail.models import MailRule
@ -232,12 +233,18 @@ class Command(BaseCommand):
archive_target,
)
# 4. write manifest to target forlder
# 4.1 write manifest to target folder
manifest_path = os.path.abspath(os.path.join(self.target, "manifest.json"))
with open(manifest_path, "w") as f:
json.dump(manifest, f, indent=2)
# 4.2 write version information to target folder
version_path = os.path.abspath(os.path.join(self.target, "version.json"))
with open(version_path, "w") as f:
json.dump({"version": version.__full_version_str__}, f, indent=2)
if self.delete:
# 5. Remove files which we did not explicitly export in this run

View File

@ -6,9 +6,11 @@ from contextlib import contextmanager
import tqdm
from django.conf import settings
from django.core.exceptions import FieldDoesNotExist
from django.core.management import call_command
from django.core.management.base import BaseCommand
from django.core.management.base import CommandError
from django.core.serializers.base import DeserializationError
from django.db.models.signals import m2m_changed
from django.db.models.signals import post_save
from documents.models import Document
@ -16,6 +18,7 @@ from documents.settings import EXPORTER_ARCHIVE_NAME
from documents.settings import EXPORTER_FILE_NAME
from documents.settings import EXPORTER_THUMBNAIL_NAME
from filelock import FileLock
from paperless import version
from ...file_handling import create_source_path_directory
from ...signals.handlers import update_filename_and_move_files
@ -53,6 +56,7 @@ class Command(BaseCommand):
BaseCommand.__init__(self, *args, **kwargs)
self.source = None
self.manifest = None
self.version = None
def handle(self, *args, **options):
@ -72,6 +76,11 @@ class Command(BaseCommand):
with open(manifest_path) as f:
self.manifest = json.load(f)
version_path = os.path.join(self.source, "version.json")
if os.path.exists(version_path):
with open(version_path) as f:
self.version = json.load(f)["version"]
self._check_manifest()
with disable_signal(
post_save,
@ -84,7 +93,20 @@ class Command(BaseCommand):
sender=Document.tags.through,
):
# Fill up the database with whatever is in the manifest
call_command("loaddata", manifest_path)
try:
call_command("loaddata", manifest_path)
except (FieldDoesNotExist, DeserializationError) as e:
if (
self.version is not None
and self.version != version.__full_version_str__
):
raise CommandError(
"Error loading database, version mismatch. "
f"Currently {version.__full_version_str__},"
f" importing {self.version}",
) from e
else:
raise CommandError("Error loading database") from e
self._import_files_from_manifest(options["no_progress_bar"])