Skip to content

Commit 8496a98

Browse files
committed
Small update_visibility optimization
Small update_visibility optimization, does not affect worst case
1 parent 1d05852 commit 8496a98

File tree

3 files changed

+24
-5
lines changed

3 files changed

+24
-5
lines changed

django/thunderstore/community/models/package_listing.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -404,6 +404,8 @@ def update_visibility(self):
404404
By default, listings are visible to everyone (for now). Rejected listings aren't publicly visible,
405405
and listings with inactive packages aren't visible at all.
406406
"""
407+
original_visibility_bitstring = self.visibility.bitstring()
408+
407409
self.visibility.public_detail = True
408410
self.visibility.public_list = True
409411
self.visibility.owner_detail = True
@@ -444,7 +446,8 @@ def update_visibility(self):
444446
if versions.exclude(visibility__moderator_list=False).count() == 0:
445447
self.visibility.moderator_list = False
446448

447-
self.visibility.save()
449+
if self.visibility.bitstring != original_visibility_bitstring:
450+
self.visibility.save()
448451

449452

450453
signals.post_save.connect(PackageListing.post_save, sender=PackageListing)

django/thunderstore/permissions/models/visibility.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,3 +35,16 @@ def __str__(self) -> str:
3535
if isinstance(field, models.BooleanField) and getattr(self, field.name)
3636
)
3737
return ", ".join(flag_fields) or "None"
38+
39+
def bitstring(self) -> str:
40+
fields = [
41+
self.public_list,
42+
self.public_detail,
43+
self.owner_list,
44+
self.owner_detail,
45+
self.moderator_list,
46+
self.moderator_detail,
47+
self.admin_list,
48+
self.admin_detail,
49+
]
50+
return "".join("1" if field else "0" for field in fields)

django/thunderstore/repository/models/package_version.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -438,6 +438,8 @@ def update_visibility(self):
438438
By default, versions are visible to everyone (for now). Rejected versions aren't publicly visible,
439439
and inactive versions or versions with inactive packages aren't visible at all.
440440
"""
441+
original_visibility_bitstring = self.visibility.bitstring()
442+
441443
self.visibility.public_detail = True
442444
self.visibility.public_list = True
443445
self.visibility.owner_detail = True
@@ -460,10 +462,11 @@ def update_visibility(self):
460462
self.visibility.public_detail = False
461463
self.visibility.public_list = False
462464

463-
self.visibility.save()
464-
for listing in self.package.community_listings.all():
465-
listing.update_visibility()
466-
self.package.recache_latest()
465+
if self.visibility.bitstring != original_visibility_bitstring:
466+
self.visibility.save()
467+
for listing in self.package.community_listings.all():
468+
listing.update_visibility()
469+
self.package.recache_latest()
467470

468471

469472
signals.post_save.connect(PackageVersion.post_save, sender=PackageVersion)

0 commit comments

Comments
 (0)