EditorForm for non-geometry MapItems
This commit is contained in:
parent
8ac8dd912a
commit
9a707469c2
2 changed files with 31 additions and 23 deletions
|
@ -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)
|
|
||||||
|
|
|
@ -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:
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue