diff --git a/app/models.py b/app/models.py index 4eb7af5d54e60d8f4232cfbaaf1b7b86efa3ef2a..2de41f1a98ccca242731a7fc1ad72ca4bfe14bc5 100644 --- a/app/models.py +++ b/app/models.py @@ -487,7 +487,11 @@ class Interface(db.Model): mac_id = db.Column(db.Integer, db.ForeignKey('mac.id')) host_id = db.Column(db.Integer, db.ForeignKey('host.id')) - cnames = db.relationship('Cname', backref='interface') + # Add delete and delete-orphan options to automatically delete cnames when: + # - deleting an interface + # - de-associating a cname (removing it from the interface.cnames list) + cnames = db.relationship('Cname', backref='interface', + cascade='all, delete, delete-orphan') tags = db.relationship('Tag', secondary=interfacetags_table, lazy='subquery', backref=db.backref('interfaces', lazy=True)) diff --git a/app/network/views.py b/app/network/views.py index 0caaa91866c69182e7df93332553d0eb203cfe38..a14be57fc6e6641ce7c0644bc2d844ab63418eaa 100644 --- a/app/network/views.py +++ b/app/network/views.py @@ -160,8 +160,10 @@ def edit_interface(name): for (index, cname) in enumerate(interface.cnames): if cname.name not in new_cnames_string: current_app.logger.debug(f'Deleting cname: {cname}') - interface.cnames.pop(index) - db.session.delete(cname) + # Removing the cname from interface.cnames list will + # delete it from the database due to the cascade + # delete-orphan option defined on the model + del interface.cnames[index] # Add new cnames for name in new_cnames_string: if name not in cnames_string: @@ -189,6 +191,9 @@ def edit_interface(name): def delete_interface(): interface = models.Interface.query.get_or_404(request.form['interface_id']) hostname = interface.host.name + # Deleting the interface will also delete all + # associated cnames due to the cascade delete option + # defined on the model db.session.delete(interface) db.session.commit() flash(f'Interface {interface.name} has been deleted', 'success')