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 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',

View file

@ -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):