Private
Public Access
1
0

courses grouped by country in form

This commit is contained in:
Sander Roosendaal
2020-11-11 06:43:37 +01:00
parent 636d6d24e1
commit 25a95dafd5
2 changed files with 36 additions and 2 deletions

31
rowers/formfields.py Normal file
View File

@@ -0,0 +1,31 @@
from functools import partial
from itertools import groupby
from operator import attrgetter
from django.forms.models import ModelChoiceIterator, ModelChoiceField
class GroupedModelChoiceIterator(ModelChoiceIterator):
def __init__(self, field, groupby):
self.groupby = groupby
super().__init__(field)
def __iter__(self):
if self.field.empty_label is not None:
yield ("", self.field.empty_label)
queryset = self.queryset
# Can't use iterator() when queryset uses prefetch_related()
if not queryset._prefetch_related_lookups:
queryset = queryset.iterator()
for group, objs in groupby(queryset, self.groupby):
yield (group, [self.choice(obj) for obj in objs])
class GroupedModelChoiceField(ModelChoiceField):
def __init__(self, *args, choices_groupby, **kwargs):
if isinstance(choices_groupby, str):
choices_groupby = attrgetter(choices_groupby)
elif not callable(choices_groupby):
raise TypeError('choices_groupby must either be a str or a callable accepting a single argument')
self.iterator = partial(GroupedModelChoiceIterator, groupby=choices_groupby)
super().__init__(*args, **kwargs)

View File

@@ -69,6 +69,7 @@ tweetapi = twitter.Api(consumer_key=TWEET_CONSUMER_KEY,
access_token_secret=TWEET_ACCESS_TOKEN_SECRET)
from rowers.database import *
from rowers.formfields import *
timezones = (
(x,x) for x in pytz.common_timezones
@@ -2689,11 +2690,13 @@ class IndoorVirtualRaceForm(ModelForm):
class VirtualRaceForm(ModelForm):
course = forms.ModelChoiceField(queryset = GeoCourse.objects, empty_label=None)
course = GroupedModelChoiceField(
queryset = GeoCourse.objects, empty_label=None,
choices_groupby='country'
)
registration_closure = forms.SplitDateTimeField(widget=AdminSplitDateTime(),required=False)
evaluation_closure = forms.SplitDateTimeField(widget=AdminSplitDateTime(),required=True)
class Meta:
model = VirtualRace
fields = [