Skip to content

Commit 06d44b7

Browse files
committed
Database query improvements
1 parent 4d0c2ed commit 06d44b7

File tree

7 files changed

+74
-55
lines changed

7 files changed

+74
-55
lines changed

portal/models.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ def is_active(self):
145145
def get_admins(self):
146146
return self.enrollments.filter(
147147
Q(is_coordinator=True) | Q(is_faculty_advisor=True)
148-
).order_by("is_faculty_advisor")
148+
).order_by("is_faculty_advisor").select_related("user")
149149

150150
def __str__(self) -> str:
151151
return self.name

portal/templates/portal/meetings/index.html

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<meta property="og:title" content="Meetings | RCOS IO" />
77
<meta property="og:type" content="website" />
88
<meta property="og:url" content="{{ request.build_absolute_uri }}" />
9-
<meta property="og:description" content="Meetings {% if ongoing_meetings|length > 0 %}{% with curr_meeting=ongoing_meetings|first %}| Ongoing meeting: {{ curr_meeting.display_name }} @ {{ curr_meeting.starts_at }} {% endwith %}{% elif upcoming_meetings|length > 0 %}{% with next_meeting=upcoming_meetings|first %}| Next meeting: {{ next_meeting.display_name }} @ {{ next_meeting.starts_at }} {% endwith %}{% endif %}| Rensselaer Center for Open Source" />
9+
<meta property="og:description" content="Meetings {% if ongoing_meeting %}| Ongoing meeting: {{ ongoing_meeting.display_name }} @ {{ ongoing_meeting.starts_at }}{% elif upcoming_meeting %}| Next meeting: {{ upcoming_meeting.display_name }} @ {{ upcoming_meeting.starts_at }}{% endif %}| Rensselaer Center for Open Source" />
1010
<meta property="og:image" content="https://raw.githubusercontent.com/rcos/rcos-branding/master/img/lockup-red.png" />
1111
{% endblock %}
1212

portal/views/__init__.py

+2-6
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,9 @@
1212

1313

1414
def load_semesters(request):
15-
semesters = cache.get_or_set("semesters", Semester.objects.all(), 60 * 60 * 24)
15+
semesters = Semester.objects.all()
1616
active_semester = (
17-
cache.get_or_set(
18-
"active_semester",
19-
next((semester for semester in semesters if semester.is_active), None),
20-
60 * 60 * 24,
21-
)
17+
next((semester for semester in semesters if semester.is_active), None)
2218
if semesters
2319
else None
2420
)

portal/views/index.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ def get_context_data(self, **kwargs):
6666
Enrollment.objects.filter(
6767
Q(is_faculty_advisor=True) | Q(is_coordinator=True),
6868
semester=active_semester,
69-
),
69+
).select_related("user"),
7070
60 * 60 * 24,
7171
)
7272

portal/views/meetings.py

+33-14
Original file line numberDiff line numberDiff line change
@@ -70,16 +70,32 @@ def meetings_index(request: HttpRequest) -> HttpResponse:
7070
now = timezone.now()
7171
active_semester = Semester.get_active()
7272

73+
ongoing_meetings = Meeting.get_user_queryset(request.user) \
74+
.filter(starts_at__lte=now) \
75+
.filter(ends_at__gte=now) \
76+
.order_by("starts_at") \
77+
.select_related("room", "host")[:3]
78+
79+
ongoing_meeting = None
80+
if len(ongoing_meetings) > 0:
81+
ongoing_meeting = ongoing_meetings[0]
82+
83+
upcoming_meetings = Meeting.get_user_queryset(request.user) \
84+
.filter(starts_at__gte=now) \
85+
.order_by("starts_at") \
86+
.prefetch_related() \
87+
.select_related("room", "host")[:3]
88+
89+
next_meeting = None
90+
if len(upcoming_meetings) > 0:
91+
next_meeting = upcoming_meetings[0]
92+
93+
7394
return TemplateResponse(request, "portal/meetings/index.html", {
74-
"ongoing_meetings": Meeting.get_user_queryset(request.user)
75-
.filter(starts_at__lte=now)
76-
.filter(ends_at__gte=now)
77-
.order_by("starts_at")
78-
.select_related()[:3],
79-
"upcoming_meetings": Meeting.get_user_queryset(request.user)
80-
.filter(starts_at__gte=now)
81-
.order_by("starts_at")
82-
.select_related()[:3],
95+
"ongoing_meetings": ongoing_meetings,
96+
"ongoing_meeting": ongoing_meeting,
97+
"upcoming_meetings": upcoming_meetings,
98+
"next_meeting": next_meeting,
8399
"is_enrolled": bool(request.user.enrollments.filter(semester=active_semester).first()) if request.user.is_authenticated else False,
84100
"can_schedule_workshops_check": CheckUserCanScheduleWorkshop().check(request.user, active_semester)
85101
})
@@ -134,11 +150,14 @@ def get_context_data(self, **kwargs):
134150

135151
data["can_manage_attendance"] = False
136152

137-
can_manage_attendance = cache.get_or_set(
138-
f"can_manage_attendance:{self.object.pk}:{self.request.user.pk}",
139-
default=self.can_manage_attendance,
140-
timeout=60 * 60 * 24,
141-
)
153+
if self.request.user.is_authenticated:
154+
can_manage_attendance = cache.get_or_set(
155+
f"can_manage_attendance:{self.object.pk}:{self.request.user.pk}",
156+
default=self.can_manage_attendance(),
157+
timeout=60 * 60 * 24,
158+
)
159+
else:
160+
can_manage_attendance = False
142161

143162
if can_manage_attendance:
144163
data["can_manage_attendance"] = True

portal/views/projects.py

+6-2
Original file line numberDiff line numberDiff line change
@@ -109,10 +109,14 @@ def get_context_data(self, **kwargs):
109109
data = super().get_context_data(**kwargs)
110110
data["organizations"] = Organization.objects.all()
111111
data["is_seeking_members"] = self.is_seeking_members
112-
data["total_count"] = self.get_queryset().count()
113-
paginator = Paginator(self.get_queryset(), self.paginate_by)
112+
113+
queryset = self.get_queryset()
114+
data["total_count"] = queryset.count()
115+
paginator = Paginator(queryset, self.paginate_by)
114116

115117
page = self.request.GET.get("page")
118+
if page is None:
119+
page = 1
116120

117121
try:
118122
projects = paginator.page(page)

rcos_io/settings.py

+30-30
Original file line numberDiff line numberDiff line change
@@ -132,24 +132,24 @@
132132
# Database
133133
# https://docs.djangoproject.com/en/4.1/ref/settings/#databases
134134

135-
if os.environ["ENV"] == "development":
136-
DATABASES = {
137-
"default": {
138-
"ENGINE": "django.db.backends.sqlite3",
139-
"NAME": os.path.join(BASE_DIR, "db.sqlite3"),
140-
}
141-
}
142-
else:
143-
DATABASES = {
144-
"default": {
145-
"ENGINE": "django.db.backends.postgresql",
146-
"NAME": os.environ["PGDATABASE"],
147-
"USER": os.environ["PGUSER"],
148-
"PASSWORD": os.environ["PGPASSWORD"],
149-
"HOST": os.environ["PGHOST"],
150-
"PORT": os.environ["PGPORT"],
151-
}
135+
# if os.environ["ENV"] == "development":
136+
# DATABASES = {
137+
# "default": {
138+
# "ENGINE": "django.db.backends.sqlite3",
139+
# "NAME": os.path.join(BASE_DIR, "db.sqlite3"),
140+
# }
141+
# }
142+
# else:
143+
DATABASES = {
144+
"default": {
145+
"ENGINE": "django.db.backends.postgresql",
146+
"NAME": os.environ["PGDATABASE"],
147+
"USER": os.environ["PGUSER"],
148+
"PASSWORD": os.environ["PGPASSWORD"],
149+
"HOST": os.environ["PGHOST"],
150+
"PORT": os.environ["PGPORT"],
152151
}
152+
}
153153

154154
AUTH_USER_MODEL = "portal.User"
155155

@@ -315,20 +315,20 @@
315315
messages.WARNING: "is-warning",
316316
}
317317

318-
if os.environ["ENV"] == "development":
319-
CACHES = {
320-
"default": {
321-
"BACKEND": "django.core.cache.backends.db.DatabaseCache",
322-
"LOCATION": "cache",
323-
}
324-
}
325-
else:
326-
CACHES = {
327-
"default": {
328-
"BACKEND": "django.core.cache.backends.redis.RedisCache",
329-
"LOCATION": os.environ["REDIS_URL"],
330-
}
318+
# if os.environ["ENV"] == "development":
319+
# CACHES = {
320+
# "default": {
321+
# "BACKEND": "django.core.cache.backends.db.DatabaseCache",
322+
# "LOCATION": "cache",
323+
# }
324+
# }
325+
# else:
326+
CACHES = {
327+
"default": {
328+
"BACKEND": "django.core.cache.backends.redis.RedisCache",
329+
"LOCATION": os.environ["REDIS_URL"],
331330
}
331+
}
332332

333333
LOGGING = {
334334
"version": 1,

0 commit comments

Comments
 (0)