From b8fd909fe33bb0c7382adfcd77a449bf65785607 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Fri, 1 Oct 2021 14:12:03 -0700 Subject: [PATCH] Adds thread id to status model --- .../migrations/0104_auto_20211001_2012.py | 53 +++++++++++++++++++ bookwyrm/models/status.py | 8 +++ 2 files changed, 61 insertions(+) create mode 100644 bookwyrm/migrations/0104_auto_20211001_2012.py diff --git a/bookwyrm/migrations/0104_auto_20211001_2012.py b/bookwyrm/migrations/0104_auto_20211001_2012.py new file mode 100644 index 000000000..8d429040f --- /dev/null +++ b/bookwyrm/migrations/0104_auto_20211001_2012.py @@ -0,0 +1,53 @@ +# Generated by Django 3.2.5 on 2021-10-01 20:12 + +from django.db import migrations, models + + +def set_thread_id(app_registry, schema_editor): + """set thread ids""" + db_alias = schema_editor.connection.alias + # set the thread id on parent nodes + model = app_registry.get_model("bookwyrm", "Status") + model.objects.using(db_alias).filter(reply_parent__isnull=True).update( + thread_id=models.F("id") + ) + + queryset = model.objects.using(db_alias).filter( + reply_parent__isnull=False, + reply_parent__thread_id__isnull=False, + thread_id__isnull=True, + ) + iters = 0 + while queryset.exists(): + queryset.update( + thread_id=models.Subquery( + model.objects.filter(id=models.OuterRef("reply_parent")).values_list( + "thread_id" + )[:1] + ) + ) + print(iters) + iters += 1 + if iters > 50: + print("exceeded query depth") + break + + +def reverse(*_): + """do nothing""" + + +class Migration(migrations.Migration): + + dependencies = [ + ("bookwyrm", "0103_remove_connector_local"), + ] + + operations = [ + migrations.AddField( + model_name="status", + name="thread_id", + field=models.IntegerField(blank=True, null=True), + ), + migrations.RunPython(set_thread_id, reverse), + ] diff --git a/bookwyrm/models/status.py b/bookwyrm/models/status.py index b62036788..0aca87255 100644 --- a/bookwyrm/models/status.py +++ b/bookwyrm/models/status.py @@ -57,6 +57,7 @@ class Status(OrderedCollectionPageMixin, BookWyrmModel): on_delete=models.PROTECT, activitypub_field="inReplyTo", ) + thread_id = models.IntegerField(blank=True, null=True) objects = InheritanceManager() activity_serializer = activitypub.Note @@ -68,6 +69,13 @@ class Status(OrderedCollectionPageMixin, BookWyrmModel): ordering = ("-published_date",) + def save(self, *args, **kwargs): + """save and notify""" + if self.reply_parent: + self.thread_id = self.reply_parent.thread_id or self.reply_parent.id + + super().save(*args, **kwargs) + def delete(self, *args, **kwargs): # pylint: disable=unused-argument """ "delete" a status""" if hasattr(self, "boosted_status"):