split groups field in EditorForm into location group categories

This commit is contained in:
Laura Klünder 2017-07-10 16:00:43 +02:00
parent 6a6af47528
commit 4b02c15a27
2 changed files with 25 additions and 5 deletions

View file

@ -1,8 +1,10 @@
import json import json
import operator
from collections import OrderedDict from collections import OrderedDict
from functools import reduce
from django.conf import settings from django.conf import settings
from django.forms import BooleanField, CharField, ModelForm, ValidationError from django.forms import BooleanField, CharField, ModelForm, MultipleChoiceField, ValidationError
from django.forms.widgets import HiddenInput from django.forms.widgets import HiddenInput
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from shapely.geometry.geo import mapping from shapely.geometry.geo import mapping
@ -31,9 +33,20 @@ class MapitemFormMixin(ModelForm):
self.initial['geometry'] = json.dumps(mapping(self.instance.geometry), separators=(',', ':')) self.initial['geometry'] = json.dumps(mapping(self.instance.geometry), separators=(',', ':'))
if 'groups' in self.fields: if 'groups' in self.fields:
LocationGroup = self.request.changeset.wrap_model('LocationGroup') LocationGroupCategory = self.request.changeset.wrap_model('LocationGroupCategory')
self.fields['groups'].label_from_instance = lambda obj: obj.title_for_forms
self.fields['groups'].queryset = LocationGroup.objects.all() categories = LocationGroupCategory.objects.all().prefetch_related('groups')
instance_groups = set(self.instance.groups.values_list('pk', flat=True))
self.fields.pop('groups')
for category in categories:
choices = tuple((str(group.pk), group.title) for group in category.groups.all())
initial = instance_groups & set(group.pk for group in category.groups.all())
initial = tuple(str(s) for s in initial)
field = MultipleChoiceField(label=category.title, required=False, initial=initial, choices=choices)
self.fields['groups_'+category.name] = field
self.fields.move_to_end('groups_'+category.name, last=False)
if 'category' in self.fields: if 'category' in self.fields:
self.fields['category'].label_from_instance = lambda obj: obj.title self.fields['category'].label_from_instance = lambda obj: obj.title
@ -101,6 +114,13 @@ class MapitemFormMixin(ModelForm):
super().clean() super().clean()
def _save_m2m(self):
super()._save_m2m()
groups = reduce(operator.or_, (set(value) for name, value in self.cleaned_data.items()
if name.startswith('groups_')), set())
groups = tuple((int(val) if val.isdigit() else val) for val in groups)
self.instance.groups.set(groups)
def create_editor_form(editor_model): def create_editor_form(editor_model):
possible_fields = ['slug', 'name', 'altitude', 'category', 'width', 'groups', 'color', 'public', possible_fields = ['slug', 'name', 'altitude', 'category', 'width', 'groups', 'color', 'public',

View file

@ -745,7 +745,7 @@ class ManyRelatedManagerWrapper(RelatedManagerWrapper):
def set(self, objs): def set(self, objs):
if self._obj.reverse: if self._obj.reverse:
raise NotImplementedError raise NotImplementedError
pks = set(obj.pk for obj in objs) pks = set((obj.pk if isinstance(obj, models.Model) else obj) for obj in objs)
self._changeset.get_changed_object(self._obj.instance).m2m_set(self._get_cache_name(), pks) self._changeset.get_changed_object(self._obj.instance).m2m_set(self._get_cache_name(), pks)
def add(self, *objs): def add(self, *objs):