commands: add an only-assets parameter to export command (#50399) #144

Merged
nroche merged 1 commits from wip/50399-cmd-to-import-assets into main 2023-08-25 14:39:38 +02:00
2 changed files with 48 additions and 3 deletions

View File

@ -33,20 +33,32 @@ class Command(BaseCommand):
parser.add_argument(
'--format-json', action='store_true', default=False, help='use JSON format with no asset files'
)
parser.add_argument('--only-assets', action='store_true', default=False, help='only export assets')
def handle(self, *args, **options):
export_kwargs = {}
if options.get('only_assets'):
export_kwargs = {
'pages': False,
'cartography': False,
'pwa': False,
'assets': True,
'payment': False,
'site_settings': False,
}
if options['format_json']:
if options['output'] and options['output'] != '-':
with open(options['output'], 'w') as output:
json.dump(export_site(), output, indent=2)
json.dump(export_site(**export_kwargs), output, indent=2)
else:
json.dump(export_site(), sys.stdout, indent=2)
json.dump(export_site(**export_kwargs), sys.stdout, indent=2)
return
if options['output'] and options['output'] != '-':
try:
with open(options['output'], 'wb') as output:
export_site_tar(output)
export_site_tar(output, export_kwargs=export_kwargs)
except OSError as e:
raise CommandError(e)
return

View File

@ -45,6 +45,7 @@ def some_map_layers():
@pytest.fixture
def some_assets():
shutil.rmtree(default_storage.path(''))
Asset(key='banner', asset=File(BytesIO(b'test'), 'test.png')).save()
Asset(key='favicon', asset=File(BytesIO(b'test2'), 'test2.png')).save()
@ -386,6 +387,21 @@ def test_import_export_extra_fields(app, some_data):
assert TextCell.objects.count() == 1
def test_import_export_only_assets(app, some_data, some_map_layers, some_assets):
output = get_output_of_command('export_site', '--only-assets')
payload = json.loads(output)
assert list(payload.keys()) == ['assets']
Page.objects.all().delete()
MapLayer.objects.all().delete()
Asset.objects.all().delete()
import_site(data=payload)
assert Page.objects.count() == 0
assert Map.objects.count() == 0
assert Asset.objects.count() == 2
def test_import_export_tar(tmpdir, some_assets):
filename = os.path.join(str(tmpdir), 'file.tar')
@ -453,6 +469,23 @@ def test_import_export_tar(tmpdir, some_assets):
call_command('import_site', filename)
def test_import_export_tar_only_assets(tmpdir, some_data, some_map_layers, some_assets):
filename = os.path.join(str(tmpdir), 'file.tar')
call_command('export_site', '--only-assets', '--output', filename)
Page.objects.all().delete()
MapLayer.objects.all().delete()
Asset.objects.all().delete()
call_command('import_site', filename)
assert Page.objects.count() == 0
assert Map.objects.count() == 0
assert Asset.objects.count() == 2
assert Asset.objects.get(key='banner').asset.name == 'assets/test.png'
with open('%s/assets/test.png' % default_storage.path('')) as fd:
assert fd.read() == 'test'
def test_import_export_payment(app):
backend = PaymentBackend.objects.create(label='Test', slug='test', service_options={'test': True})
Regie.objects.create(label='Test regie', slug='test-regie', payment_backend=backend)