From 5b5b8f4d1237f0792da73246389b8759929d9ce1 Mon Sep 17 00:00:00 2001 From: Oliver Date: Sun, 15 Apr 2018 11:25:57 +1000 Subject: [PATCH] Fix parent error when deleting category - Any child categories have their parent set to the parent of the deleted category --- InvenTree/InvenTree/models.py | 16 +++++++++++++- .../migrations/0014_auto_20180415_0107.py | 21 +++++++++++++++++++ InvenTree/part/models.py | 8 +++++++ .../migrations/0005_auto_20180415_0107.py | 21 +++++++++++++++++++ 4 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 InvenTree/part/migrations/0014_auto_20180415_0107.py create mode 100644 InvenTree/stock/migrations/0005_auto_20180415_0107.py diff --git a/InvenTree/InvenTree/models.py b/InvenTree/InvenTree/models.py index 8be2db7c52..64742c5366 100644 --- a/InvenTree/InvenTree/models.py +++ b/InvenTree/InvenTree/models.py @@ -4,6 +4,8 @@ from django.db import models from django.contrib.contenttypes.models import ContentType from rest_framework.exceptions import ValidationError +from django.db.models.signals import pre_delete +from django.dispatch import receiver class Company(models.Model): """ Abstract model representing an external company @@ -40,9 +42,12 @@ class InvenTreeTree(models.Model): unique_together = ('name', 'parent') name = models.CharField(max_length=100, unique=True) + description = models.CharField(max_length=250, blank=True) + + # When a category is deleted, graft the children onto its parent parent = models.ForeignKey('self', - on_delete=models.CASCADE, + on_delete=models.DO_NOTHING, blank=True, null=True, related_name='children') @@ -179,6 +184,15 @@ class InvenTreeTree(models.Model): return self.pathstring +@receiver(pre_delete, sender=InvenTreeTree, dispatch_uid='tree_pre_delete_log') +def before_delete_tree_item(sender, intance, using, **kwargs): + + # Update each tree item below this one + for child in instance.children.all(): + child.parent = instance.parent + child.save() + + def FilterChildren(queryset, parent): """ Filter a queryset, limit to only objects that are a child of the given parent Filter is passed in the URL string, e.g. '/?parent=123' diff --git a/InvenTree/part/migrations/0014_auto_20180415_0107.py b/InvenTree/part/migrations/0014_auto_20180415_0107.py new file mode 100644 index 0000000000..e1f62a4d28 --- /dev/null +++ b/InvenTree/part/migrations/0014_auto_20180415_0107.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11 on 2018-04-15 01:07 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('part', '0013_auto_20180414_2238'), + ] + + operations = [ + migrations.AlterField( + model_name='partcategory', + name='parent', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='children', to='part.PartCategory'), + ), + ] diff --git a/InvenTree/part/models.py b/InvenTree/part/models.py index 481859512a..a8256f0fb8 100644 --- a/InvenTree/part/models.py +++ b/InvenTree/part/models.py @@ -16,6 +16,9 @@ class PartCategory(InvenTreeTree): """ PartCategory provides hierarchical organization of Part objects. """ + def get_absolute_url(self): + return '/part/category/{id}/'.format(id=self.id) + class Meta: verbose_name = "Part Category" verbose_name_plural = "Part Categories" @@ -48,6 +51,11 @@ def before_delete_part_category(sender, instance, using, **kwargs): part.category = instance.parent part.save() + # Update each child category + for child in instance.children.all(): + child.parent = instance.parent + child.save() + # Function to automatically rename a part image on upload # Format: part_pk. diff --git a/InvenTree/stock/migrations/0005_auto_20180415_0107.py b/InvenTree/stock/migrations/0005_auto_20180415_0107.py new file mode 100644 index 0000000000..1ff0d4eaa2 --- /dev/null +++ b/InvenTree/stock/migrations/0005_auto_20180415_0107.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11 on 2018-04-15 01:07 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('stock', '0004_auto_20180414_1032'), + ] + + operations = [ + migrations.AlterField( + model_name='stocklocation', + name='parent', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='children', to='stock.StockLocation'), + ), + ]