-
Notifications
You must be signed in to change notification settings - Fork 10
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
1766 Wprowadzenie stałego filtra na przedmioty
Aby osiągnąć ten cel i w widokach przedmiotów (m.in. zakładki Przedmioty, Prototyp planu ale również Oferta) były zapamiętywane ostatnio użyte filtry dokonałem następujących zmian: 1. Informacje o wybranych filtrach usunąłem z URL.searchParams i przeniosłem do sessionStorage z kluczem "last_searched_params". Dzięki temu przy przechodzeniu między podstronami nie musimy pamiętać o doklejaniu końcówki poprzedniego URL-a do nowego tylko możemy zostawić puste searchParams a ostatnio użyty filtr wygodnie wyciągnać z sessionStorage. Ciastko to jest tworzone i aktualizowane, gdy użytkownik wybierze niepuste filtry, a usuwane, gdy użytkownik wyczyści filtry. Jeśli nie ma ciastka (nie wybraliśmy jeszcze żadnych filtrów lub je wyczyściliśmy) to używane są domyślne filtry. Takie rozwiązanie sprawia, że nawet niezalogowany użytkownik ma na czas danej sesji włączony ten feature. Ciastka te są usuwane po zakończeniu sesji, więc informacje o filtrze niezalogowanych użytkowników nie są zapamiętywane między sesjami. 2. Na początku, przy pierwszym ładowaniu strony, jeśli użytkownik był od razu zalogowany ciastko to będzie uzupełnianie informacją z bazy danych. Jeśli użytkownik nie był zalogowany to początkowo używamy domyślnych filtrów. 3. Jeśli użytkownik zaloguje się później to wszelkie preferencje, które nie miały stworzonego klucza w sesji (co oznacza że miały wartość domyślną) zostają nadpisane przez preferencje z bazy danych. Jeśli użytkownik zmienił filtry przed zalogowaniem się to zostaną one zachowane po zalogowaniu kosztem tych użytych w poprzedniej sesji. 4. Przy wylogowaniu się użytkownika jego preferencje są zapisywane do bazy danych o ile użytkownik jest studentem/wykładowcą (czyli nie działa dla kont typu "asm"). 5. Przy wyłączaniu strony preferencje z sessionStorage są zapisywane do bazy danych o ile użytkownik jest zalogowanym studentem/wykładowcą. Rozwiązania z bazą danych opisane w punktach 2, 3, 4 i 5 jeszcze nie działają, gdyż nie potrafiłem dokonać migracji bazy danych tak, aby dodać do modeli Student i Employee pola "last_searched_params", w którym będziemy trzymać ostatni wyszukany filtr. Prawdopodobnie nie jest to trudne i wystarczy wykonać 1 nieznane mi polecenie w terminalu, ale mi makemigrations nie działało, bo miałem problem z połączeniem z bazą danych. Aby dokonać migracji należy w pliku zapisy/apps/users/models.py odkomentować oba TODOsy i jeśli migracja się uda to potem odkomentować middleware InitUserPreferences w zapisy/zapisy/settings.py co pozwoli na pobieranie preferencji użytkownika zalogowanego już podczas pierwszego załadowania strony. Jeśli podczas migracji wystąpią jakieś błędy to niewykluczone, że ich rozwiązaniem jest odkomentowanie/zamiana pozostałych 3 TODOsów w tym pliku. Jeśli migracja się uda, ale wystąpią jakieś błędy po niej, to proszę dać mi znać na Slacku w prywatnej wiadomości wraz ze zrzutem bazy danych po udanej migracji.
- Loading branch information
Mateusz Mazur
committed
Jan 6, 2025
1 parent
fa71671
commit 237fdfd
Showing
14 changed files
with
170 additions
and
31 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -2,4 +2,4 @@ | |
|
||
|
||
class EffectsConfig(AppConfig): | ||
name = 'effects' | ||
name = 'apps.effects' |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,58 @@ | ||
from django.utils.deprecation import MiddlewareMixin | ||
|
||
# list of database keys which are user preferences | ||
PREFERENCE_KEYS = ["last_searched_params"] | ||
|
||
# Extra session key so that we dont attempt to load database | ||
# preferences each time page is reloaded | ||
ALREADY_LOADED_KEY = "preferences_loaded" | ||
|
||
# returns database model or None if user is not Student/Employee | ||
def get_user_db_object(user): | ||
if user.is_authenticated: | ||
if hasattr(user, "student"): | ||
return user.student | ||
elif hasattr(user, "employee"): | ||
return user.employee | ||
return None | ||
|
||
# loads user preferences from database either when page loads | ||
# for the first time with logged user or when user logs in later | ||
def load_user_preferences_from_database(request): | ||
user_object = get_user_db_object(request.user) | ||
if user_object is None: | ||
request.session[ALREADY_LOADED_KEY] = True | ||
return | ||
|
||
# Set non-default user preferences in the session | ||
for key in PREFERENCE_KEYS: | ||
if key not in request.session: | ||
if hasattr(user_object, key): | ||
request.session[key] = getattr(user_object, key) | ||
request.session[ALREADY_LOADED_KEY] = True | ||
|
||
# when user closes website we save his preferences | ||
# from sessionStorage to database if he was logged | ||
def save_user_preferences_to_database(request): | ||
user_object = get_user_db_object(request.user) | ||
if user_object is None: | ||
return | ||
|
||
# Save non-default user preferences to database | ||
for key in PREFERENCE_KEYS: | ||
if key in request.session: | ||
if hasattr(user_object, key): | ||
setattr(user_object, key, request.session[key]) | ||
user_object.save() | ||
|
||
# TODO: this feature is now disabled in zapisy/zapisy/settings.py | ||
# MIDDLEWARE variable because of migration problems | ||
|
||
# once per session, when website is loaded for the first time, | ||
# we should load user preferences from database to session storage | ||
class InitUserPreferences(MiddlewareMixin): | ||
def process_request(self, request): | ||
# Save up time by not checking user preferences each time page is reloaded | ||
if request.session.get(ALREADY_LOADED_KEY, False): | ||
return | ||
load_user_preferences_from_database(request) |
Oops, something went wrong.