Skip to content

Commit 5515b43

Browse files
committed
Attempt to cut down on queries
1 parent baf32c0 commit 5515b43

File tree

99 files changed

+29831
-5185
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

99 files changed

+29831
-5185
lines changed

poetry.lock

+44-42
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

portal/admin.py

+17
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
import csv
22
import logging
33
from time import sleep
4+
from typing import Any
45

56
from django.contrib import admin
67
from django.contrib.auth.admin import UserAdmin
8+
from django.db.models.query import QuerySet
79
from django.http import HttpResponse
10+
from django.http.request import HttpRequest
811

912
from portal.models import (
1013
Enrollment,
@@ -117,6 +120,10 @@ class MeetingAttendanceInline(admin.TabularInline):
117120
classes = ["collapse"]
118121
model = MeetingAttendance
119122
extra = 1
123+
124+
# def get_queryset(self, request: HttpRequest) -> QuerySet[Any]:
125+
# print(super().get_queryset(request).explain())
126+
# return super().get_queryset(request).select_related()
120127

121128

122129
class MeetingAttendanceCodeInline(admin.TabularInline):
@@ -210,6 +217,7 @@ class SemesterAdmin(admin.ModelAdmin):
210217
ProjectPresentationInline,
211218
SmallGroupInline,
212219
)
220+
list_select_related = True
213221

214222

215223
@admin.register(Organization)
@@ -219,6 +227,7 @@ class OrganizationAdmin(admin.ModelAdmin):
219227
("Emails", {"fields": (("email_domain", "email_domain_secondary"),)}),
220228
("Discord", {"classes": ("collapse",), "fields": ("discord_role_id",)}),
221229
)
230+
list_select_related = True
222231

223232

224233
@admin.register(User)
@@ -270,6 +279,7 @@ class UserAdmin(UserAdmin):
270279
ordering = ("first_name",)
271280
inlines = (EnrollmentInline,)
272281
actions = (make_approved,)
282+
list_select_related = True
273283

274284

275285
@admin.register(Project)
@@ -294,6 +304,7 @@ class ProjectAdmin(admin.ModelAdmin):
294304
make_approved,
295305
sync_discord,
296306
)
307+
list_select_related = True
297308

298309
fieldsets = (
299310
(
@@ -399,6 +410,7 @@ class EnrollmentAdmin(admin.ModelAdmin):
399410
)
400411

401412
actions = [export_enrollments_to_csv]
413+
list_select_related = True
402414

403415

404416
@admin.register(Meeting)
@@ -408,6 +420,7 @@ class MeetingAdmin(admin.ModelAdmin):
408420
list_filter = ("starts_at", "type", "is_published")
409421
inlines = (MeetingAttendanceCodeInline, MeetingAttendanceInline)
410422
actions = (make_published,)
423+
list_select_related = True
411424

412425
fieldsets = (
413426
(
@@ -439,6 +452,9 @@ class MeetingAdmin(admin.ModelAdmin):
439452
),
440453
)
441454

455+
def get_queryset(self, request: HttpRequest) -> QuerySet[Any]:
456+
return super().get_queryset(request).prefetch_related("attendances")
457+
442458

443459
@admin.register(SmallGroup)
444460
class SmallGroupAdmin(admin.ModelAdmin):
@@ -469,6 +485,7 @@ class SmallGroupAdmin(admin.ModelAdmin):
469485
},
470486
),
471487
)
488+
list_select_related = True
472489

473490

474491
# @admin.register(StatusUpdate)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# Generated by Django 5.0.2 on 2024-02-21 22:29
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('portal', '0045_user_is_name_public'),
10+
]
11+
12+
operations = [
13+
migrations.AddIndex(
14+
model_name='meetingattendance',
15+
index=models.Index(fields=['meeting'], name='portal_meet_meeting_88d7ac_idx'),
16+
),
17+
migrations.AddIndex(
18+
model_name='meetingattendance',
19+
index=models.Index(fields=['user'], name='portal_meet_user_id_40102c_idx'),
20+
),
21+
]

portal/models.py

+10
Original file line numberDiff line numberDiff line change
@@ -1352,19 +1352,29 @@ class Meta:
13521352
# post_save.connect(sync_discord, sender=Meeting)
13531353
# post_delete.connect(sync_discord_on_delete, sender=Meeting)
13541354

1355+
class MeetingAttendanceManager(models.Manager):
1356+
def get_queryset(self) -> models.QuerySet:
1357+
return super().get_queryset().select_related("user")
13551358

13561359
class MeetingAttendance(TimestampedModel):
13571360
meeting = models.ForeignKey(Meeting, on_delete=models.CASCADE)
13581361
user = models.ForeignKey(User, on_delete=models.CASCADE)
13591362
is_verified = models.BooleanField(default=True)
13601363
submitted_by = models.ForeignKey(User, blank=True, null=True, on_delete=models.SET_NULL, help_text="The user that submitted the attendance for user (either them or an administrator).", related_name="submitted_attendances")
13611364

1365+
13621366
class Meta:
13631367
constraints = [
13641368
models.UniqueConstraint(
13651369
fields=["meeting", "user"], name="unique_meeting_attendance"
13661370
)
13671371
]
1372+
indexes = [
1373+
models.Index(fields=["meeting"]),
1374+
models.Index(fields=["user"]),
1375+
]
1376+
1377+
objects = MeetingAttendanceManager()
13681378

13691379

13701380
class MentorApplication(TimestampedModel):

pyproject.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ django-magiclink = "^1.2.0"
2121
django-anymail = "^10.0"
2222
django-crispy-forms = "^2.0"
2323
crispy-bulma = "^0.11.0"
24-
django-debug-toolbar = "^4.1.0"
24+
django-debug-toolbar = "^4.3.0"
2525
gql = "^3.4.1"
2626
requests-toolbelt = "^1.0.0"
2727
psycopg2-binary = "^2.9.6"

0 commit comments

Comments
 (0)