From 9c2d52a7f700d74f63e90cfec6d377c0f3a6bf5f Mon Sep 17 00:00:00 2001 From: Cayo Puigdefabregas Date: Tue, 2 Aug 2022 12:41:31 +0200 Subject: [PATCH] fix cascade delete in placeholder --- ereuse_devicehub/inventory/views.py | 19 ++++++++++++------- ereuse_devicehub/resources/device/models.py | 3 ++- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/ereuse_devicehub/inventory/views.py b/ereuse_devicehub/inventory/views.py index a26df083..09253c4f 100644 --- a/ereuse_devicehub/inventory/views.py +++ b/ereuse_devicehub/inventory/views.py @@ -1,5 +1,5 @@ -import csv import copy +import csv import logging import os from distutils.util import strtobool @@ -193,12 +193,14 @@ class BindingView(GenericMixin): if request.method == 'POST': old_placeholder = device.binding + old_device_placeholder = old_placeholder.device if old_placeholder.is_abstract: for plog in PlaceholdersLog.query.filter_by( placeholder_id=old_placeholder.id ): db.session.delete(plog) - db.session.delete(old_placeholder) + db.session.delete(old_device_placeholder) + device.binding = placeholder db.session.commit() next_url = url_for('inventory.device_details', id=dhid) @@ -230,7 +232,9 @@ class UnBindingView(GenericMixin): .one() ) if not placeholder.binding: - next_url = url_for('inventory.device_details', id=placeholder.device.devicehub_id) + next_url = url_for( + 'inventory.device_details', id=placeholder.device.devicehub_id + ) return flask.redirect(next_url) device = placeholder.binding @@ -239,10 +243,10 @@ class UnBindingView(GenericMixin): if request.method == 'POST': self.clone_device(device) - next_url = url_for('inventory.device_details', id=placeholder.device.devicehub_id) - messages.success( - 'Device "{}" unbind successfully!'.format(phid) + next_url = url_for( + 'inventory.device_details', id=placeholder.device.devicehub_id ) + messages.success('Device "{}" unbind successfully!'.format(phid)) return flask.redirect(next_url) self.context.update( @@ -258,7 +262,6 @@ class UnBindingView(GenericMixin): def clone_device(self, device): if device.binding.is_abstract: return - # import pdb; pdb.set_trace() dict_device = copy.copy(device.__dict__) dict_device.pop('_sa_instance_state') @@ -269,6 +272,8 @@ class UnBindingView(GenericMixin): dict_device.pop('components', None) dict_device.pop('tags', None) dict_device.pop('system_uuid', None) + dict_device.pop('binding', None) + dict_device.pop('placeholder', None) new_device = device.__class__(**dict_device) db.session.add(new_device) diff --git a/ereuse_devicehub/resources/device/models.py b/ereuse_devicehub/resources/device/models.py index ae65b0a3..5707fe8b 100644 --- a/ereuse_devicehub/resources/device/models.py +++ b/ereuse_devicehub/resources/device/models.py @@ -33,6 +33,7 @@ from sqlalchemy_utils import ColorType from stdnum import imei, meid from teal.db import ( CASCADE_DEL, + CASCADE_OWN, POLYMORPHIC_ID, POLYMORPHIC_ON, URL, @@ -883,7 +884,7 @@ class Placeholder(Thing): ) device = db.relationship( Device, - backref=backref('placeholder', lazy=True, uselist=False), + backref=backref('placeholder', lazy=True, cascade="all, delete-orphan", uselist=False), primaryjoin=device_id == Device.id, ) device_id.comment = "datas of the placeholder"