misc: allow importing objects with non existent fields (#39768)
This commit is contained in:
parent
7222ec141a
commit
eda9d548a0
|
@ -51,5 +51,5 @@ class Asset(models.Model):
|
|||
json_asset['model'] = 'assets.asset'
|
||||
asset, created = Asset.objects.get_or_create(key=json_asset['fields']['key'])
|
||||
json_asset['pk'] = asset.id
|
||||
asset = [x for x in serializers.deserialize('json', json.dumps([json_asset]))][0]
|
||||
asset = next(serializers.deserialize('json', json.dumps([json_asset]), ignorenonexistent=True))
|
||||
asset.save()
|
||||
|
|
|
@ -43,9 +43,10 @@ class GalleryCell(CellBase):
|
|||
return {'images': [x.get_as_serialized_object() for x in self.image_set.all()]}
|
||||
|
||||
def import_subobjects(self, cell_json):
|
||||
for image in cell_json['images']:
|
||||
image['fields']['gallery_id'] = self.id
|
||||
for image in serializers.deserialize('json', json.dumps(cell_json['images'])):
|
||||
images = serializers.deserialize('json', json.dumps(cell_json['images']),
|
||||
ignorenonexistent=True)
|
||||
for image in images:
|
||||
image.object.gallery_id = self.id
|
||||
image.save()
|
||||
|
||||
|
||||
|
|
|
@ -152,7 +152,7 @@ class MapLayer(models.Model):
|
|||
json_layer['model'] = 'maps.maplayer'
|
||||
layer, created = MapLayer.objects.get_or_create(slug=json_layer['fields']['slug'])
|
||||
json_layer['pk'] = layer.id
|
||||
layer = [x for x in serializers.deserialize('json', json.dumps([json_layer]))][0]
|
||||
layer = next(serializers.deserialize('json', json.dumps([json_layer]), ignorenonexistent=True))
|
||||
layer.save()
|
||||
|
||||
def get_geojson(self, request=None, multiple_layers=False):
|
||||
|
|
|
@ -159,14 +159,15 @@ class PwaNavigationEntry(models.Model):
|
|||
def load_serialized_object(cls, json_entry):
|
||||
json_entry['model'] = 'pwa.pwanavigationentry'
|
||||
# deserialize once to get link_page by natural key
|
||||
fake_entry = [x for x in serializers.deserialize('json', json.dumps([json_entry]))][0]
|
||||
fake_entry = next(serializers.deserialize('json', json.dumps([json_entry]),
|
||||
ignorenonexistent=True))
|
||||
entry, created = cls.objects.get_or_create(
|
||||
label=json_entry['fields']['label'],
|
||||
url=json_entry['fields']['url'],
|
||||
link_page=fake_entry.object.link_page,
|
||||
defaults={'order': 0})
|
||||
json_entry['pk'] = entry.id
|
||||
entry = [x for x in serializers.deserialize('json', json.dumps([json_entry]))][0]
|
||||
entry = next(serializers.deserialize('json', json.dumps([json_entry]), ignorenonexistent=True))
|
||||
entry.save()
|
||||
if json_entry.get('icon:base64'):
|
||||
decode = base64.decodestring if six.PY2 else base64.decodebytes
|
||||
|
|
|
@ -393,7 +393,7 @@ class Page(models.Model):
|
|||
json_page['fields']['groups'] = [[x] for x in json_page['fields']['groups'] if isinstance(x, six.string_types)]
|
||||
page, created = Page.objects.get_or_create(slug=json_page['fields']['slug'], snapshot=snapshot)
|
||||
json_page['pk'] = page.id
|
||||
page = [x for x in serializers.deserialize('json', json.dumps([json_page]))][0]
|
||||
page = next(serializers.deserialize('json', json.dumps([json_page]), ignorenonexistent=True))
|
||||
page.object.snapshot = snapshot
|
||||
page.save()
|
||||
for cell in json_page.get('cells'):
|
||||
|
@ -412,7 +412,9 @@ class Page(models.Model):
|
|||
@classmethod
|
||||
def load_serialized_cells(cls, cells):
|
||||
# load new cells
|
||||
for index, cell in enumerate(serializers.deserialize('json', json.dumps(cells))):
|
||||
deserialized_cells = serializers.deserialize('json', json.dumps(cells),
|
||||
ignorenonexistent=True)
|
||||
for index, cell in enumerate(deserialized_cells):
|
||||
cell.save()
|
||||
# will populate cached_* attributes
|
||||
cell.object.save()
|
||||
|
@ -1042,7 +1044,8 @@ class LinkListCell(CellBase):
|
|||
def import_subobjects(self, cell_json):
|
||||
for link in cell_json['links']:
|
||||
link['fields']['placeholder'] = self.link_placeholder
|
||||
for link in serializers.deserialize('json', json.dumps(cell_json['links'])):
|
||||
links = serializers.deserialize('json', json.dumps(cell_json['links']), ignorenonexistent=True)
|
||||
for link in links:
|
||||
link.save()
|
||||
|
||||
def duplicate_m2m(self, new_cell):
|
||||
|
|
|
@ -274,5 +274,18 @@ def test_import_export_gallery_images(app, some_data):
|
|||
|
||||
import_site(data=json.loads(output))
|
||||
assert Image.objects.all().count() == 2
|
||||
assert image1.title == 'foo'
|
||||
image1 = Image.objects.get(title='foo')
|
||||
assert image1.image == 'path/foo.jpg'
|
||||
assert image1.gallery.placeholder == 'images'
|
||||
|
||||
def test_import_export_extra_fields(app, some_data):
|
||||
site_export = export_site()
|
||||
for page in site_export['pages']:
|
||||
if page['fields']['slug'] == 'one':
|
||||
page['fields']['extra_field_not_in_model'] = True
|
||||
elif page['fields']['slug'] == 'three':
|
||||
page['cells'][0]['fields']['extra_field_not_in_model'] = True
|
||||
|
||||
import_site(site_export)
|
||||
assert Page.objects.count() == 3
|
||||
assert TextCell.objects.count() == 1
|
||||
|
|
Loading…
Reference in New Issue