From bcc68c598b555f29ae10e4b6b6af4f6437c11fd9 Mon Sep 17 00:00:00 2001 From: Alexander Dusenbery Date: Thu, 26 Sep 2024 15:26:23 -0400 Subject: [PATCH] checkpoint: field/property swaperoo, overwrite data from related restricted copy on read --- enterprise_catalog/apps/catalog/models.py | 35 +++++++++++++++++------ 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/enterprise_catalog/apps/catalog/models.py b/enterprise_catalog/apps/catalog/models.py index 8e4b2b12..82ef405d 100644 --- a/enterprise_catalog/apps/catalog/models.py +++ b/enterprise_catalog/apps/catalog/models.py @@ -1211,6 +1211,15 @@ class Meta: unique=True, ) + @property + def books(self): + prefetch_qs = models.Prefetch( + 'restricted_books', + queryset=RestrictedBook.objects.filter(library=self), + to_attr='overwritten_copy', + ) + return self.book_set.prefetch_related(prefetch_qs) + def __str__(self): return self.name @@ -1226,7 +1235,8 @@ class Meta: unique=True, ) libraries = models.ManyToManyField(Library) - data = JSONField( + _data = JSONField( + db_column='data', default={}, blank=True, null=True, @@ -1234,6 +1244,12 @@ class Meta: dump_kwargs={'indent': 4, 'cls': JSONEncoder, 'separators': (',', ':')}, ) + @property + def data(self): + if overwritten_copy := getattr(self, 'overwritten_copy', None): + return overwritten_copy[0]._data + return self._data + class Book(AbstractBook): class Meta: @@ -1280,11 +1296,14 @@ def __str__(self): boston_pl, _= Library.objects.get_or_create(name='Boston Public Library') quincy_pl, _ = Library.objects.get_or_create(name='Quincy Public Library') -book, _ = Book.objects.get_or_create(title='Moby Dick', data={'ahab': 'dead'}) -restricted_book, _ = RestrictedBook.objects.get_or_create(library=boston_pl, parent_book=book, data={'ahab': 'alive', 'note': 'restricted copy owned only by BPL'}) - -restricted_titles = RestrictedBook.objects.filter(library=boston_pl).values_list('title', flat=True) -book_qs = Book.objects.filter(libraries__in=[boston_pl]).exclude(title__in=restricted_titles).only('title', 'data') -restricted_qs = RestrictedBook.objects.filter(library=boston_pl).only('title', 'data') -print(book_qs.union(restricted_qs)) +moby_dick, _ = Book.objects.get_or_create(title='Moby Dick', _data={'ahab': 'dead'}) +boston_pl.book_set.add(moby_dick) +quincy_pl.book_set.add(moby_dick) +ulysses, _ = Book.objects.get_or_create(title='Ulysses', _data={'bloom': 'walking'}) +boston_pl.book_set.add(ulysses) +quincy_pl.book_set.add(ulysses) +restricted_book, _ = RestrictedBook.objects.get_or_create(library=boston_pl, parent_book=moby_dic, _data={'ahab': 'alive', 'note': 'restricted copy owned only by BPL'}) + +boston_pl.books.filter(title='Moby Dick') +quincy_pl.books.filter(title='Moby Dick') """