From 059a9ddd3c7942a453657072d28571ec9053026a Mon Sep 17 00:00:00 2001 From: = <=> Date: Thu, 27 Mar 2025 15:22:28 +0000 Subject: [PATCH] db optimizations --- auctions/admin.py | 20 ++++- ..._use_seller_dash_lot_numbering_and_more.py | 84 +++++++++++++++++++ auctions/models.py | 19 +++-- 3 files changed, 111 insertions(+), 12 deletions(-) create mode 100644 auctions/migrations/0180_alter_auction_use_seller_dash_lot_numbering_and_more.py diff --git a/auctions/admin.py b/auctions/admin.py index 35c8029..0658233 100755 --- a/auctions/admin.py +++ b/auctions/admin.py @@ -237,17 +237,31 @@ class UserAdmin(BaseUserAdmin): inlines = [ UserdataInline, UserLabelPrefsInline, - AuctionTOSInline, # too much noise, but important to have - InterestInline, # too much noise + # AuctionTOSInline, # too much noise, but important to have + # InterestInline, # too much noise ] search_fields = ( "first_name", "last_name", - "userdata__club__abbreviation", + # "userdata__club__abbreviation", "email", "username", ) + readonly_fields = [ + "last_activity", + "date_joined", + "last_login", + ] + + def get_queryset(self, request): + return ( + super() + .get_queryset(request) + .select_related("userdata__club", "userdata__last_auction_used", "userdata__location") + .prefetch_related("userlabelprefs") + ) + def last_activity(self, obj): return obj.userdata.last_activity diff --git a/auctions/migrations/0180_alter_auction_use_seller_dash_lot_numbering_and_more.py b/auctions/migrations/0180_alter_auction_use_seller_dash_lot_numbering_and_more.py new file mode 100644 index 0000000..7428616 --- /dev/null +++ b/auctions/migrations/0180_alter_auction_use_seller_dash_lot_numbering_and_more.py @@ -0,0 +1,84 @@ +# Generated by Django 5.1.6 on 2025-03-27 15:20 + +import django.utils.timezone +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("auctions", "0179_auctiontos_possible_duplicate"), + ] + + operations = [ + migrations.AlterField( + model_name="auction", + name="use_seller_dash_lot_numbering", + field=models.BooleanField( + blank=True, + default=False, + help_text="Include the seller's bidder number with the lot number. This option is not recommended as users find it confusing.", + ), + ), + migrations.AlterField( + model_name="auctiontos", + name="is_admin", + field=models.BooleanField( + blank=True, + db_index=True, + default=False, + verbose_name="Grant admin permissions to help run this auction", + ), + ), + migrations.AlterField( + model_name="lot", + name="active", + field=models.BooleanField(db_index=True, default=True), + ), + migrations.AlterField( + model_name="lot", + name="custom_lot_number", + field=models.CharField( + blank=True, + db_index=True, + help_text="You can override the default lot number with this", + max_length=9, + null=True, + verbose_name="Lot number", + ), + ), + migrations.AlterField( + model_name="lot", + name="latitude", + field=models.FloatField(blank=True, db_index=True, null=True), + ), + migrations.AlterField( + model_name="lot", + name="longitude", + field=models.FloatField(blank=True, db_index=True, null=True), + ), + migrations.AlterField( + model_name="lot", + name="lot_number_int", + field=models.IntegerField(blank=True, db_index=True, null=True, verbose_name="Lot number"), + ), + migrations.AlterField( + model_name="lot", + name="winning_price", + field=models.PositiveIntegerField(blank=True, db_index=True, null=True), + ), + migrations.AlterField( + model_name="pageview", + name="date_end", + field=models.DateTimeField(blank=True, db_index=True, default=django.utils.timezone.now, null=True), + ), + migrations.AlterField( + model_name="pageview", + name="latitude", + field=models.FloatField(db_index=True, default=0), + ), + migrations.AlterField( + model_name="pageview", + name="longitude", + field=models.FloatField(db_index=True, default=0), + ), + ] diff --git a/auctions/models.py b/auctions/models.py index 69698a7..e45a89e 100755 --- a/auctions/models.py +++ b/auctions/models.py @@ -1600,6 +1600,7 @@ class AuctionTOS(models.Model): default=False, verbose_name="Grant admin permissions to help run this auction", blank=True, + db_index=True, ) # yes we are using a string to store a number # this is actually important because some day, someone will ask to make the bidder numbers have characters like "1-234" or people's names @@ -2109,10 +2110,10 @@ class Lot(models.Model): # below is the database pk lot_number = models.AutoField(primary_key=True) # below is an automatically assigned int for use in auctions - lot_number_int = models.IntegerField(null=True, blank=True, verbose_name="Lot number") + lot_number_int = models.IntegerField(null=True, blank=True, verbose_name="Lot number", db_index=True) # below is an override of the other lot numbers, it was the default for use in auctions until 2025, but now lot_number_int is used instead # see https://github.com/iragm/fishauctions/issues/269 - custom_lot_number = models.CharField(max_length=9, blank=True, null=True, verbose_name="Lot number") + custom_lot_number = models.CharField(max_length=9, blank=True, null=True, verbose_name="Lot number", db_index=True) custom_lot_number.help_text = "You can override the default lot number with this" lot_name = models.CharField(max_length=40) slug = AutoSlugField(populate_from="lot_name", unique=False) @@ -2188,8 +2189,8 @@ class Lot(models.Model): on_delete=models.SET_NULL, related_name="auctiontos_winner", ) - active = models.BooleanField(default=True) - winning_price = models.PositiveIntegerField(null=True, blank=True) + active = models.BooleanField(default=True, db_index=True) + winning_price = models.PositiveIntegerField(null=True, blank=True, db_index=True) refunded = models.BooleanField(default=False) refunded.help_text = "Don't charge the winner or pay the seller for this lot." banned = models.BooleanField(default=False, verbose_name="Removed", blank=True) @@ -2243,8 +2244,8 @@ class Lot(models.Model): buy_now_used = models.BooleanField(default=False) # Location, populated from userdata. This is needed to prevent users from changing their address after posting a lot - latitude = models.FloatField(blank=True, null=True) - longitude = models.FloatField(blank=True, null=True) + latitude = models.FloatField(blank=True, null=True, db_index=True) + longitude = models.FloatField(blank=True, null=True, db_index=True) address = models.CharField(max_length=500, blank=True, null=True) # Payment and shipping options, populated from last submitted lot @@ -3701,7 +3702,7 @@ class PageView(models.Model): lot_number = models.ForeignKey(Lot, null=True, blank=True, on_delete=models.CASCADE) lot_number.help_text = "Only filled out when a user views a specific lot's page" date_start = models.DateTimeField(auto_now_add=True, db_index=True) - date_end = models.DateTimeField(null=True, blank=True, default=timezone.now) + date_end = models.DateTimeField(null=True, blank=True, default=timezone.now, db_index=True) total_time = models.PositiveIntegerField(default=0) total_time.help_text = "The total time in seconds the user has spent on the lot page" source = models.CharField(max_length=200, blank=True, null=True, default="") @@ -3712,8 +3713,8 @@ class PageView(models.Model): session_id = models.CharField(max_length=600, blank=True, null=True, db_index=True) notification_sent = models.BooleanField(default=False) duplicate_check_completed = models.BooleanField(default=False) - latitude = models.FloatField(default=0) - longitude = models.FloatField(default=0) + latitude = models.FloatField(default=0, db_index=True) + longitude = models.FloatField(default=0, db_index=True) ip_address = models.CharField(max_length=100, blank=True, null=True) user_agent = models.CharField(max_length=200, blank=True, null=True) platform = models.CharField(max_length=200, default="", blank=True, null=True)