From 4b02c15a27ed99c3d1690a080ac2304176bb8bbf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laura=20Kl=C3=BCnder?= Date: Mon, 10 Jul 2017 16:00:43 +0200 Subject: [PATCH] split groups field in EditorForm into location group categories --- src/c3nav/editor/forms.py | 28 ++++++++++++++++++++++++---- src/c3nav/editor/wrappers.py | 2 +- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/src/c3nav/editor/forms.py b/src/c3nav/editor/forms.py index a82ba552..bae1f9ee 100644 --- a/src/c3nav/editor/forms.py +++ b/src/c3nav/editor/forms.py @@ -1,8 +1,10 @@ import json +import operator from collections import OrderedDict +from functools import reduce 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.utils.translation import ugettext_lazy as _ from shapely.geometry.geo import mapping @@ -31,9 +33,20 @@ class MapitemFormMixin(ModelForm): self.initial['geometry'] = json.dumps(mapping(self.instance.geometry), separators=(',', ':')) if 'groups' in self.fields: - LocationGroup = self.request.changeset.wrap_model('LocationGroup') - self.fields['groups'].label_from_instance = lambda obj: obj.title_for_forms - self.fields['groups'].queryset = LocationGroup.objects.all() + LocationGroupCategory = self.request.changeset.wrap_model('LocationGroupCategory') + + 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: self.fields['category'].label_from_instance = lambda obj: obj.title @@ -101,6 +114,13 @@ class MapitemFormMixin(ModelForm): 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): possible_fields = ['slug', 'name', 'altitude', 'category', 'width', 'groups', 'color', 'public', diff --git a/src/c3nav/editor/wrappers.py b/src/c3nav/editor/wrappers.py index 4ea1b971..89bf1bff 100644 --- a/src/c3nav/editor/wrappers.py +++ b/src/c3nav/editor/wrappers.py @@ -745,7 +745,7 @@ class ManyRelatedManagerWrapper(RelatedManagerWrapper): def set(self, objs): if self._obj.reverse: 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) def add(self, *objs):