Skip to content

Commit cb6d3a5

Browse files
committed
(feat) add theme choser + twilight theme
1 parent 99123cf commit cb6d3a5

File tree

130 files changed

+955
-118
lines changed

Some content is hidden

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

130 files changed

+955
-118
lines changed

celerybeat-schedule-shm

32 KB
Binary file not shown.

celerybeat-schedule-wal

153 KB
Binary file not shown.

intranet/apps/context_processors.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,13 @@ def enable_dark_mode(request):
184184
"""
185185
return {"dark_mode_enabled": dark_mode_enabled(request)}
186186

187+
def user_theme_choice(request):
188+
if request.user.is_authenticated:
189+
choice = request.user.theme_properties.theme_choice
190+
else:
191+
choice = request.COOKIES.get("theme_choice", "light")
192+
return {"theme_choice": choice}
193+
187194

188195
def oauth_toolkit(request):
189196
"""

intranet/apps/preferences/forms.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,22 @@ def __init__(self, user, *args, **kwargs):
101101
initial=user.dark_mode_properties.dark_mode_enabled, label="Enable dark mode?", required=False
102102
)
103103

104+
class ThemeForm(forms.Form):
105+
THEME_CHOICES = [
106+
("light", "Light Theme"),
107+
("dark", "Dark Theme"),
108+
("twilight", "Twilight Theme"),
109+
]
110+
111+
def __init__(self, user, *args, **kwargs):
112+
super().__init__(*args, **kwargs)
113+
self.fields["theme_choice"] = forms.ChoiceField(
114+
choices=self.THEME_CHOICES,
115+
initial=user.theme_properties.theme_choice,
116+
label="Select your preferred theme:",
117+
required=True
118+
)
119+
104120

105121
class PhoneForm(forms.ModelForm):
106122
"""Represents a phone number (number + purpose)"""

intranet/apps/preferences/views.py

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from ..auth.decorators import eighth_admin_required
1111
from ..bus.models import Route
1212
from ..users.models import Email
13-
from .forms import BusRouteForm, DarkModeForm, EmailFormset, NotificationOptionsForm, PreferredPictureForm, PrivacyOptionsForm
13+
from .forms import BusRouteForm, DarkModeForm, ThemeForm, EmailFormset, NotificationOptionsForm, PreferredPictureForm, PrivacyOptionsForm
1414

1515
# from .forms import (BusRouteForm, DarkModeForm, EmailFormset, NotificationOptionsForm, PhoneFormset, PreferredPictureForm, PrivacyOptionsForm,
1616
# WebsiteFormset)
@@ -289,6 +289,17 @@ def save_dark_mode_settings(request, user):
289289

290290
return dark_mode_form
291291

292+
def save_theme_settings(request, user):
293+
theme_form = ThemeForm(user, data=request.POST, initial={"theme_choice": user.theme_properties.theme_choice})
294+
if theme_form.is_valid():
295+
if theme_form.has_changed():
296+
user.theme_properties.theme_choice = theme_form.cleaned_data["theme_choice"]
297+
user.theme_properties.save()
298+
invalidate_obj(request.user.theme_properties)
299+
messages.success(request, f"Theme set to {user.theme_properties.theme_choice}")
300+
301+
return theme_form
302+
292303

293304
@login_required
294305
def preferences_view(request):
@@ -314,7 +325,7 @@ def preferences_view(request):
314325
privacy_options_form = None
315326
notification_options_form = save_notification_options(request, user)
316327

317-
dark_mode_form = save_dark_mode_settings(request, user)
328+
theme_form = save_theme_settings(request, user)
318329

319330
for error in errors:
320331
messages.error(request, error)
@@ -355,7 +366,7 @@ def preferences_view(request):
355366
notification_options = get_notification_options(user)
356367
notification_options_form = NotificationOptionsForm(user, initial=notification_options)
357368

358-
dark_mode_form = DarkModeForm(user, initial={"dark_mode_enabled": user.dark_mode_properties.dark_mode_enabled})
369+
theme_form = ThemeForm(user, initial={"theme_choice": user.theme_properties.theme_choice})
359370

360371
context = {
361372
# "phone_formset": phone_formset,
@@ -365,7 +376,7 @@ def preferences_view(request):
365376
"privacy_options_form": privacy_options_form,
366377
"notification_options_form": notification_options_form,
367378
"bus_route_form": bus_route_form if settings.ENABLE_BUS_APP else None,
368-
"dark_mode_form": dark_mode_form,
379+
"theme_form": theme_form,
369380
}
370381
return render(request, "preferences/preferences.html", context)
371382

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# Generated by Django 5.2.4 on 2025-10-18 16:00
2+
3+
import django.db.models.deletion
4+
from django.conf import settings
5+
from django.db import migrations, models
6+
7+
8+
class Migration(migrations.Migration):
9+
10+
dependencies = [
11+
('users', '0042_user_seen_april_fools'),
12+
]
13+
14+
operations = [
15+
migrations.CreateModel(
16+
name='UserThemeProperties',
17+
fields=[
18+
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
19+
('theme_choice', models.CharField(default='light_theme', max_length=100)),
20+
('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='theme_properties', to=settings.AUTH_USER_MODEL)),
21+
],
22+
),
23+
]

intranet/apps/users/models.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1095,6 +1095,8 @@ def __getattr__(self, name):
10951095
return UserProperties.objects.get_or_create(user=self)[0]
10961096
elif name == "dark_mode_properties":
10971097
return UserDarkModeProperties.objects.get_or_create(user=self)[0]
1098+
elif name == "theme_properties":
1099+
return UserThemeProperties.objects.get_or_create(user=self)[0]
10981100
raise AttributeError(f"{type(self).__name__!r} object has no attribute {name!r}")
10991101

11001102
def __str__(self):
@@ -1287,6 +1289,17 @@ class UserDarkModeProperties(models.Model):
12871289

12881290
def __str__(self):
12891291
return str(self.user)
1292+
1293+
class UserThemeProperties(models.Model):
1294+
"""
1295+
Contains user properties relating to themes
1296+
"""
1297+
1298+
user = models.OneToOneField(settings.AUTH_USER_MODEL, related_name="theme_properties", on_delete=models.CASCADE)
1299+
theme_choice = models.CharField(max_length=100, default="light_theme")
1300+
1301+
def __str__(self):
1302+
return str(self.user)
12901303

12911304

12921305
class Email(models.Model):

intranet/settings/__init__.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -402,6 +402,22 @@
402402
"dark/oauth",
403403
"dark/sessionmgmt",
404404
"dark/logs",
405+
"twilight/base",
406+
"twilight/nav",
407+
"twilight/cke",
408+
"twilight/dashboard",
409+
"twilight/preferences",
410+
"twilight/eighth.signup",
411+
"twilight/about",
412+
"twilight/login",
413+
"twilight/events",
414+
"twilight/select",
415+
"twilight/enrichment",
416+
"twilight/files",
417+
"twilight/lostfound",
418+
"twilight/polls",
419+
"twilight/printing",
420+
"twilight/welcome"
405421
]
406422

407423
for name in LIST_OF_INDEPENDENT_CSS:
@@ -453,6 +469,7 @@
453469
"intranet.apps.context_processors.global_custom_theme", # Sitewide custom themes (special events, etc)
454470
"intranet.apps.context_processors.show_bus_button",
455471
"intranet.apps.context_processors.enable_dark_mode",
472+
"intranet.apps.context_processors.user_theme_choice",
456473
"intranet.apps.context_processors.oauth_toolkit", # Django OAuth Toolkit-related middleware
457474
"intranet.apps.context_processors.settings_export", # "Exports" django.conf.settings as DJANGO_SETTINGS
458475
"intranet.apps.features.context_processors.feature_announcements", # Feature announcements that need to be shown on the current page
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
$page_background: #171717;
2+
$widget_background: #202020;
3+
$announcement_background: #181818;
4+
$dark_border: #404040;
5+
$text_primary: #B7B7B7;
6+
$text_high_contrast: #FFFFFF;
7+
$accent_color: #2b7fff;
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
@use 'colors' as *;
2+
3+
.center {
4+
background-color: $page_background;
5+
}

0 commit comments

Comments
 (0)