EditorForm for non-geometry MapItems

This commit is contained in:
Laura Klünder 2016-11-28 15:46:58 +01:00
parent 8ac8dd912a
commit 9a707469c2
2 changed files with 31 additions and 23 deletions

View file

@ -1,15 +1,14 @@
import json import json
import uuid import time
from collections import OrderedDict from collections import OrderedDict
from django.conf import settings from django.conf import settings
from django.forms import CharField, ModelForm from django.forms import CharField, ModelForm, ValidationError
from django.forms.models import ModelChoiceField from django.forms.models import ModelChoiceField
from django.forms.widgets import HiddenInput from django.forms.widgets import HiddenInput
from shapely.geometry.geo import mapping from shapely.geometry.geo import mapping
from c3nav.mapdata.models import Package from c3nav.mapdata.models import Package
from c3nav.mapdata.models.geometry import Area, Building, Door, Obstacle
from c3nav.mapdata.permissions import get_unlocked_packages from c3nav.mapdata.permissions import get_unlocked_packages
@ -23,8 +22,8 @@ class MapitemFormMixin(ModelForm):
if not creating and not settings.DIRECT_EDITING: if not creating and not settings.DIRECT_EDITING:
self.fields['name'].disabled = True self.fields['name'].disabled = True
if creating and self._meta.model in (Door, Obstacle, ): if creating:
self.fields['name'].initial = uuid.uuid4() self.fields['name'].initial = hex(int(time.time()*1000000))[2:]
# restrict package choices and field_name # restrict package choices and field_name
if not creating: if not creating:
@ -44,16 +43,18 @@ class MapitemFormMixin(ModelForm):
) )
self.fields['package'].to_field_name = 'name' self.fields['package'].to_field_name = 'name'
# hide level widget and set field_name if 'level' in self.fields:
self.fields['level'].widget = HiddenInput() # hide level widget and set field_name
self.fields['level'].to_field_name = 'name' self.fields['level'].widget = HiddenInput()
if not creating: self.fields['level'].to_field_name = 'name'
self.initial['level'] = self.instance.level.name if not creating:
self.initial['level'] = self.instance.level.name
# hide geometry widget if 'geometry' in self.fields:
self.fields['geometry'].widget = HiddenInput() # hide geometry widget
if not creating: self.fields['geometry'].widget = HiddenInput()
self.initial['geometry'] = json.dumps(mapping(self.instance.geometry), separators=(',', ':')) if not creating:
self.initial['geometry'] = json.dumps(mapping(self.instance.geometry), separators=(',', ':'))
# parse titles # parse titles
self.titles = None self.titles = None
@ -72,18 +73,25 @@ class MapitemFormMixin(ModelForm):
initial=titles[language].strip(), max_length=50) initial=titles[language].strip(), max_length=50)
self.titles = titles self.titles = titles
def clean(self):
if 'geometry' in self.fields:
if not self.cleaned_data.get('geometry'):
raise ValidationError('Missing geometry.')
def create_editor_form(mapitemtype):
possible_fields = ['name', 'package', 'level', 'geometry', 'height']
existing_fields = [field for field in possible_fields if hasattr(mapitemtype, field)]
def create_editor_form(mapdata_model, add_fields=None):
class EditorForm(MapitemFormMixin, ModelForm): class EditorForm(MapitemFormMixin, ModelForm):
class Meta: class Meta:
model = mapdata_model model = mapitemtype
fields = ['name', 'package', 'level', 'geometry'] + (add_fields if add_fields is not None else []) fields = existing_fields
mapdata_model.EditorForm = EditorForm mapitemtype.EditorForm = EditorForm
def create_editor_forms(): def create_editor_forms():
create_editor_form(Building) from c3nav.mapdata.models.base import MAPITEM_TYPES
create_editor_form(Area) for mapitemtype in MAPITEM_TYPES.values():
create_editor_form(Obstacle, ['height']) create_editor_form(mapitemtype)
create_editor_form(Door)

View file

@ -40,7 +40,7 @@ def list_mapitems(request, mapitem_type, level=None):
if hasattr(mapitemtype, 'level') and level is None: if hasattr(mapitemtype, 'level') and level is None:
raise Http404('Missing level.') raise Http404('Missing level.')
elif not hasattr(mapitemtype, 'level') and level is not None: elif not hasattr(mapitemtype, 'level') and level is not None:
raise redirect('editor.mapitems', mapitem_type=mapitem_type) return redirect('editor.mapitems', mapitem_type=mapitem_type)
queryset = mapitemtype.objects.all() queryset = mapitemtype.objects.all()
if level is not None: if level is not None: