Skip to content

Commit

Permalink
[#9] Retrieve Open Forms choices lazily
Browse files Browse the repository at this point in the history
  • Loading branch information
pi-sigma committed May 28, 2024
1 parent 6c79b55 commit d4aec32
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 24 deletions.
45 changes: 23 additions & 22 deletions openformsclient/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from django.db.models.fields import BLANK_CHOICE_DASH
from django.forms.fields import TypedChoiceField
from django.forms.widgets import Select
from django.utils.functional import cached_property
from django.utils.functional import cached_property, lazy
from django.utils.text import capfirst
from django.utils.translation import gettext_lazy as _

Expand Down Expand Up @@ -107,8 +107,7 @@ def formfield(self, **kwargs):
"widget": Select,
}

if self.choices is None:
defaults["choices"] = self.get_choices(include_blank=self.blank)
defaults["choices"] = self.get_choices(include_blank=self.blank)
defaults["coerce"] = self.to_python

return TypedChoiceField(**defaults)
Expand All @@ -120,25 +119,27 @@ def get_choices(
limit_choices_to=None,
ordering=(),
):
cache_key = f"openformsclient.models.OpenFormsFieldMixin.get_choices__use_uuids_{self.use_uuids}"

choices = cache.get(cache_key)
if choices is None:
try:
choices = get_form_choices(use_uuids=self.use_uuids)
except Exception as e:
logger.exception(e)
choices = []
else:
cache.set(cache_key, choices, timeout=60)

if choices:
if include_blank:
blank_defined = any(choice in ("", None) for choice, _ in choices)
if not blank_defined:
choices = blank_choice + choices

return choices
def _fetch():
cache_key = f"openformsclient.models.OpenFormsBaseField.get_choices__use_uuids_{self.use_uuids}"

choices = cache.get(cache_key)
if choices is None:
try:
choices = get_form_choices(use_uuids=self.use_uuids)
except Exception as exc:
logger.exception(exc)
choices = []
else:
cache.set(cache_key, choices, timeout=60)

if choices:
if include_blank:
blank_defined = any(choice in ("", None) for choice, _ in choices)
if not blank_defined:
choices = blank_choice + choices
return choices

return lazy(_fetch, list)


class OpenFormsUUIDField(OpenFormsBaseField, models.UUIDField):
Expand Down
4 changes: 2 additions & 2 deletions tests/test_integration.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ def test_values_in_slug_form_field(self, m):
page_form = PageForm()

self.assertListEqual(
page_form.fields["form_slug"].choices,
list(page_form.fields["form_slug"].choices),
[
("", "---------"),
("test-1", "Test 1"),
Expand All @@ -56,7 +56,7 @@ def test_values_in_uuid_form_field(self, m):
page_form = PageForm()

self.assertListEqual(
page_form.fields["form_uuid"].choices,
list(page_form.fields["form_uuid"].choices),
[
("", "---------"),
("f4423c99-6341-442e-aedc-b47779579f4d", "Test 1"),
Expand Down

0 comments on commit d4aec32

Please sign in to comment.