feat: add skip attachment files option for import
Allows importing only database records without restoring attachment files. Useful when migrating data between instances. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -150,6 +150,14 @@
|
||||
<span class="text-muted"> — {{translate 'skipDuplicatesHint' category='messages' scope='DataMigration'}}</span>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<div class="checkbox">
|
||||
<label>
|
||||
<input type="checkbox" name="importNoFiles">
|
||||
{{translate 'Skip attachment files' scope='DataMigration'}}
|
||||
<span class="text-muted"> — {{translate 'importNoFilesHint' category='messages' scope='DataMigration'}}</span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="btn-group">
|
||||
|
||||
@@ -301,6 +301,7 @@ define('modules/data-migration/views/admin/data-migration', ['view'], function (
|
||||
|
||||
const preserveIds = this.$el.find('input[name="preserveIds"]').is(':checked');
|
||||
const skipDuplicates = this.$el.find('input[name="skipDuplicates"]').is(':checked');
|
||||
const noFiles = this.$el.find('input[name="importNoFiles"]').is(':checked');
|
||||
|
||||
const confirmMsg = dryRun
|
||||
? this.translate('dryRunConfirmation', 'messages', 'DataMigration')
|
||||
@@ -315,6 +316,7 @@ define('modules/data-migration/views/admin/data-migration', ['view'], function (
|
||||
Espo.Ajax.postRequest('DataMigration/action/import', {
|
||||
backupName: this.selectedBackup,
|
||||
preserveIds: preserveIds,
|
||||
noFiles: noFiles,
|
||||
skipDuplicates: skipDuplicates,
|
||||
dryRun: dryRun,
|
||||
}, {timeout: 600000})
|
||||
|
||||
@@ -46,6 +46,7 @@ class Import implements Action
|
||||
$preserveIds = $body->preserveIds ?? true;
|
||||
$skipDuplicates = $body->skipDuplicates ?? true;
|
||||
$dryRun = $body->dryRun ?? false;
|
||||
$noFiles = $body->noFiles ?? false;
|
||||
|
||||
$io = new BufferedIO();
|
||||
|
||||
@@ -54,6 +55,7 @@ class Import implements Action
|
||||
'preserveIds' => $preserveIds,
|
||||
'skipDuplicates' => $skipDuplicates,
|
||||
'dryRun' => $dryRun,
|
||||
'noFiles' => $noFiles,
|
||||
'verbose' => true,
|
||||
], $io);
|
||||
|
||||
|
||||
@@ -42,6 +42,7 @@
|
||||
"deleteBackupConfirmation": "Are you sure you want to delete this backup? This action cannot be undone.",
|
||||
"noFilesHint": "faster export, without attachment files",
|
||||
"preserveIdsHint": "keep original record IDs (recommended for same-instance restore)",
|
||||
"importNoFilesHint": "import only database records, skip attachment files",
|
||||
"skipDuplicatesHint": "skip records that already exist in the database"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -42,6 +42,7 @@
|
||||
"deleteBackupConfirmation": "האם אתה בטוח שברצונך למחוק גיבוי זה? לא ניתן לבטל פעולה זו.",
|
||||
"noFilesHint": "ייצוא מהיר יותר, ללא קבצים מצורפים",
|
||||
"preserveIdsHint": "שמור מזהי רשומות מקוריים (מומלץ לשחזור באותה מערכת)",
|
||||
"importNoFilesHint": "ייבוא רשומות בלבד, ללא קבצים מצורפים",
|
||||
"skipDuplicatesHint": "דלג על רשומות שכבר קיימות במסד הנתונים"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -62,6 +62,7 @@ class ImportService
|
||||
$preserveIds = $options['preserveIds'] ?? true;
|
||||
$skipDuplicates = $options['skipDuplicates'] ?? false;
|
||||
$dryRun = $options['dryRun'] ?? false;
|
||||
$noFiles = $options['noFiles'] ?? false;
|
||||
$verbose = $options['verbose'] ?? false;
|
||||
|
||||
$dataDir = rtrim($inputDir, '/') . '/data';
|
||||
@@ -138,7 +139,10 @@ class ImportService
|
||||
}
|
||||
|
||||
// Restore attachment files
|
||||
if (is_dir($filesDir)) {
|
||||
if ($noFiles) {
|
||||
$io->writeLine('');
|
||||
$io->writeLine('Attachment files: SKIPPED (--no-files)');
|
||||
} else if (is_dir($filesDir)) {
|
||||
$io->writeLine('');
|
||||
$io->writeLine('Restoring attachment files...');
|
||||
|
||||
|
||||
Reference in New Issue
Block a user