diff --git a/boards/admin.py b/boards/admin.py --- a/boards/admin.py +++ b/boards/admin.py @@ -34,6 +34,11 @@ class TagAdmin(admin.ModelAdmin): def display_children(self, obj: Tag): return ', '.join([str(child) for child in obj.get_children().all()]) + def save_model(self, request, obj, form, change): + super().save_model(request, obj, form, change) + for thread in obj.get_threads().all(): + thread.refresh_tags() + list_display = ('name', 'thread_count', 'display_children') search_fields = ('name',) @@ -59,11 +64,7 @@ class ThreadAdmin(admin.ModelAdmin): # Save parent tags when editing tags def save_related(self, request, form, formsets, change): super().save_related(request, form, formsets, change) - obj = form.instance - for tag in obj.get_tags().all(): - parents = tag.get_all_parents() - if len(parents) > 0: - obj.tags.add(*parents) + form.instance.refresh_tags() list_display = ('id', 'op', 'title', 'reply_count', 'status', 'ip', 'display_tags') diff --git a/boards/models/thread.py b/boards/models/thread.py --- a/boards/models/thread.py +++ b/boards/models/thread.py @@ -3,7 +3,7 @@ from adjacent import Client from django.db.models import Count, Sum, QuerySet, Q from django.utils import timezone -from django.db import models +from django.db import models, transaction from boards.models import STATUS_BUMPLIMIT, STATUS_ACTIVE, STATUS_ARCHIVE @@ -270,3 +270,12 @@ class Thread(models.Model): def is_monochrome(self): return self.monochrome + + # If tags have parent, add them to the tag list + @transaction.atomic + def refresh_tags(self): + for tag in self.get_tags().all(): + parents = tag.get_all_parents() + if len(parents) > 0: + self.tags.add(*parents) +