split groups field in EditorForm into location group categories
This commit is contained in:
parent
6a6af47528
commit
4b02c15a27
2 changed files with 25 additions and 5 deletions
|
@ -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',
|
||||
|
|
|
@ -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):
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue