Skip to content

Commit

Permalink
further reduce database queries to preferences
Browse files Browse the repository at this point in the history
  • Loading branch information
elfjes committed Dec 11, 2024
1 parent 706ca2b commit 3ad58a0
Show file tree
Hide file tree
Showing 7 changed files with 18 additions and 32 deletions.
6 changes: 1 addition & 5 deletions src/argus/auth/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -94,18 +94,14 @@ def is_used(self):
# user is not considered in use
return False

def get_or_create_preferences(self) -> List[Preferences]:
return Preferences.ensure_for_user(self)

def get_preferences_context(self):
pref_sets = self.get_or_create_preferences()
pref_sets = Preferences.ensure_for_user(self)
prefdict = {}
for pref_set in pref_sets:
prefdict[pref_set.namespace] = pref_set.get_context()
return prefdict

def get_namespaced_preferences(self, namespace):
print("here", namespace)
obj, _ = Preferences.objects.get_or_create(user=self, namespace=namespace)
if not obj.preferences and (defaults := obj.get_defaults()):
obj.preferences = defaults
Expand Down
14 changes: 8 additions & 6 deletions src/argus/auth/utils.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from copy import deepcopy
import logging
from typing import Any, Tuple

from django.conf import settings
from django.contrib.auth.backends import ModelBackend, RemoteUserBackend
Expand Down Expand Up @@ -57,32 +58,33 @@ def get_preference(request, namespace, preference):
return prefs.get_preference(preference)


def save_preference(request, data, namespace, preference):
def get_or_update_preference(request, data, namespace, preference) -> Tuple[Any, bool]:
"""Save the single preference given in data to the given namespace
Returns True on success, otherwise False
Returns a tuple (value, success) with value the value of the preference and succces a boolean
indicating wether the preference was succesfully updated
"""
prefs = get_preference_obj(request, namespace)
value = prefs.get_preference(preference)
LOG.debug("Changing %s: currently %s", preference, value)

if not data.get(preference, None):
LOG.debug("Failed to change %s, not in input: %s", preference, data)
return False
return value, False

form = prefs.FORMS[preference](data)
if not form.is_valid():
messages.warning(request, f"Failed to change {preference}, invalid input")
LOG.warning("Failed to change %s, invalid input: %s", preference, data)
return False
return value, False

old_value = deepcopy(value) # Just in case value is mutable..
value = form.cleaned_data[preference]
if value == old_value:
LOG.debug("Did not change %s: no change", preference)
return False
return value, False

prefs.save_preference(preference, value)
messages.success(request, f"Changed {preference}: {old_value}{value}")
LOG.info("Changed %s: %s → %s", preference, old_value, value)
return True
return value, True
4 changes: 2 additions & 2 deletions src/argus/htmx/dateformat/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
from django.http import HttpResponse
from django_htmx.http import HttpResponseClientRefresh

from argus.auth.utils import save_preference
from argus.auth.utils import get_or_update_preference

from argus.htmx.incidents.views import HtmxHttpRequest
from .constants import DATETIME_FORMATS
Expand All @@ -22,5 +22,5 @@ def dateformat_names(request: HtmxHttpRequest) -> HttpResponse:

@require_POST
def change_dateformat(request: HtmxHttpRequest) -> HttpResponse:
save_preference(request, request.POST, "argus_htmx", "datetime_format_name")
get_or_update_preference(request, request.POST, "argus_htmx", "datetime_format_name")
return HttpResponseClientRefresh()
8 changes: 3 additions & 5 deletions src/argus/htmx/incidents/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
from django_htmx.middleware import HtmxDetails
from django_htmx.http import HttpResponseClientRefresh

from argus.auth.utils import get_preference, save_preference
from argus.auth.utils import get_or_update_preference
from argus.incident.models import Incident
from argus.util.datetime_utils import make_aware

Expand Down Expand Up @@ -117,10 +117,8 @@ def incident_list(request: HtmxHttpRequest) -> HttpResponse:

# Standard Django pagination

page_size = get_preference(request, "argus_htmx", "page_size")
success = save_preference(request, request.GET, "argus_htmx", "page_size")
if success:
page_size = get_preference(request, "argus_htmx", "page_size")
page_size, _ = get_or_update_preference(request, request.GET, "argus_htmx", "page_size")

paginator = Paginator(object_list=qs, per_page=page_size)
page_num = params.pop("page", "1")
page = paginator.get_page(page_num)
Expand Down
4 changes: 2 additions & 2 deletions src/argus/htmx/themes/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
from django.http import HttpResponse
from django_htmx.http import HttpResponseClientRefresh

from argus.auth.utils import save_preference
from argus.auth.utils import get_or_update_preference

from argus.htmx.constants import THEME_NAMES
from argus.htmx.incidents.views import HtmxHttpRequest
Expand All @@ -23,7 +23,7 @@ def theme_names(request: HtmxHttpRequest) -> HttpResponse:

@require_POST
def change_theme(request: HtmxHttpRequest) -> HttpResponse:
success = save_preference(request, request.POST, "argus_htmx", "theme")
success = get_or_update_preference(request, request.POST, "argus_htmx", "theme")
if success:
return render(request, "htmx/themes/_current_theme.html")
return HttpResponseClientRefresh()
4 changes: 2 additions & 2 deletions src/argus/htmx/user/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
from django.views.decorators.http import require_GET, require_POST
from django_htmx.http import HttpResponseClientRefresh

from argus.auth.utils import save_preference
from argus.auth.utils import get_or_update_preference

from argus.htmx.constants import ALLOWED_PAGE_SIZES
from argus.htmx.incidents.views import HtmxHttpRequest
Expand All @@ -17,7 +17,7 @@ def page_size_names(request: HtmxHttpRequest) -> HttpResponse:

@require_POST
def change_page_size(request: HtmxHttpRequest) -> HttpResponse:
save_preference(request, request.POST, "argus_htmx", "page_size")
get_or_update_preference(request, request.POST, "argus_htmx", "page_size")
return HttpResponseClientRefresh()


Expand Down
10 changes: 0 additions & 10 deletions tests/auth/test_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -244,16 +244,6 @@ def test_get_by_natural_key_fetches_preference_of_correct_namespace(self):
result = Preferences.objects.get_by_natural_key(user, MyPreferences._namespace)
self.assertEqual(prefs, result)

def test_get_or_create_preferences_creates_all_namespaces_for_user(self):
user1 = PersonUserFactory()

# no preferences yet
self.assertFalse(Preferences.objects.filter(user=user1).exists())

user1.get_or_create_preferences()
# three each (two from tests, one from app)
self.assertEqual(Preferences.objects.filter(user=user1).count(), 3)

def test_get_all_defaults_returns_all_prefs_defaults(self):
defaults = Preferences.objects.get_all_defaults()
self.assertIsInstance(defaults, dict)
Expand Down

0 comments on commit 3ad58a0

Please sign in to comment.