Skip to content
Snippets Groups Projects
Commit 123c9f28 authored by Todd Dembrey's avatar Todd Dembrey
Browse files

Make the widgets lazy

parent 5c8340e2
No related branches found
No related tags found
No related merge requests found
import json import json
from django import forms from django import forms
from django.utils.functional import LazyObject
from opentech.apply.categories.models import Category from opentech.apply.categories.models import Category
class LazyChoices:
def __init__(self, queryset, display):
self.queryset = queryset
self.display = display
def __iter__(self):
for choice in self.queryset.values_list(*self.display):
yield choice
class LazyWidgets:
def __init__(self, widget, model):
self.model = model
self.widget = widget
def __iter__(self):
for obj in self.model.objects.all():
yield self.widget(
attrs={'id': obj.id, 'label_tag': obj.name},
choices=LazyChoices(obj.options, ['id', 'value']),
)
class OptionsWidget(forms.CheckboxSelectMultiple): class OptionsWidget(forms.CheckboxSelectMultiple):
template_name = 'projects/widgets/options_widget.html' template_name = 'projects/widgets/options_widget.html'
option_template_name = 'projects/widgets/options_option.html' option_template_name = 'projects/widgets/options_option.html'
def __init__(self, *args, **kwargs):
choices = kwargs['choices']
super().__init__(*args, **kwargs)
self.choices = choices
class CategoriesWidget(forms.MultiWidget): class CategoriesWidget(forms.MultiWidget):
template_name = 'projects/widgets/categories_widget.html' template_name = 'projects/widgets/categories_widget.html'
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
widgets = [ kwargs['widgets'] = list()
OptionsWidget(
attrs={'id': cat.id, 'label_tag': cat.name},
choices=cat.options.all().values_list('id', 'value'),
)
for cat in Category.objects.all()
]
kwargs['widgets'] = widgets
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
self.widgets = LazyWidgets(OptionsWidget, Category)
def decompress(self, value): def decompress(self, value):
data = json.loads(value) data = json.loads(value)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment