team-3/src/c3nav/editor/forms.py

106 lines
4.1 KiB
Python
Raw Normal View History

2016-10-13 15:55:15 +02:00
import json
2016-11-28 15:46:58 +01:00
import time
2016-09-23 17:02:17 +02:00
from collections import OrderedDict
from django.conf import settings
2016-11-28 15:46:58 +01:00
from django.forms import CharField, ModelForm, ValidationError
2016-09-23 15:23:02 +02:00
from django.forms.widgets import HiddenInput
2016-12-01 12:25:02 +01:00
from django.utils.translation import ugettext_lazy as _
2016-10-13 15:55:15 +02:00
from shapely.geometry.geo import mapping
2016-09-23 15:23:02 +02:00
2016-11-27 23:51:44 +01:00
class MapitemFormMixin(ModelForm):
def __init__(self, *args, request=None, **kwargs):
self.request = request
2016-09-23 15:23:02 +02:00
super().__init__(*args, **kwargs)
2016-10-13 15:55:15 +02:00
creating = not self.instance.pk
2016-09-23 15:23:02 +02:00
2016-10-13 15:55:15 +02:00
# disable name on non-direct editing
if not creating and not settings.DIRECT_EDITING:
self.fields['name'].disabled = True
2016-10-13 15:55:15 +02:00
2016-11-28 15:46:58 +01:00
if creating:
self.fields['name'].initial = hex(int(time.time()*1000000))[2:]
2016-10-16 15:56:24 +02:00
2016-11-28 15:46:58 +01:00
if 'level' in self.fields:
# hide level widget and set field_name
self.fields['level'].widget = HiddenInput()
self.fields['level'].to_field_name = 'name'
if not creating:
self.initial['level'] = self.instance.level.name
2016-10-13 15:55:15 +02:00
if 'crop_to_level' in self.fields:
# set field_name
self.fields['crop_to_level'].to_field_name = 'name'
if not creating and self.instance.crop_to_level is not None:
self.initial['crop_to_level'] = self.instance.crop_to_level.name
2016-12-01 12:25:02 +01:00
if 'levels' in self.fields:
# set field_name
self.fields['levels'].to_field_name = 'name'
2016-12-12 13:21:09 +01:00
if 'groups' in self.fields:
# set field_name
self.fields['groups'].to_field_name = 'name'
2016-11-28 15:46:58 +01:00
if 'geometry' in self.fields:
# hide geometry widget
self.fields['geometry'].widget = HiddenInput()
if not creating:
self.initial['geometry'] = json.dumps(mapping(self.instance.geometry), separators=(',', ':'))
2016-10-13 15:55:15 +02:00
# parse titles
self.titles = None
if hasattr(self.instance, 'titles'):
titles = OrderedDict((lang_code, '') for lang_code, language in settings.LANGUAGES)
if self.instance is not None and self.instance.pk:
titles.update(self.instance.titles)
language_titles = dict(settings.LANGUAGES)
for language in titles.keys():
new_title = self.data.get('title_' + language)
if new_title is not None:
titles[language] = new_title
self.fields['title_' + language] = CharField(label=language_titles.get(language, language),
required=False,
initial=titles[language].strip(), max_length=50)
self.titles = titles
2016-12-01 12:25:02 +01:00
def clean_levels(self):
levels = self.cleaned_data.get('levels')
if len(levels) < 2:
raise ValidationError(_('Please select at least two levels.'))
return levels
2016-11-28 15:46:58 +01:00
def clean(self):
if 'geometry' in self.fields:
if not self.cleaned_data.get('geometry'):
raise ValidationError('Missing geometry.')
2016-12-12 13:21:09 +01:00
if hasattr(self.instance, 'titles') and not any(self.titles.values()):
raise ValidationError(
_('You have to select a title in at least one language.')
)
2016-12-04 14:16:05 +01:00
super().clean()
2016-11-28 15:46:58 +01:00
def create_editor_form(mapitemtype):
possible_fields = ['name', 'public', 'altitude', 'level', 'intermediate', 'levels', 'geometry', 'direction',
2016-12-24 22:36:03 +01:00
'elevator', 'button', 'crop_to_level', 'width', 'groups', 'override_altitude', 'color',
2017-05-04 12:10:54 +02:00
'location_type', 'can_search', 'can_describe', 'routing_inclusion', 'compiled_room', 'bssids',
'categories', 'layer']
2016-12-18 01:06:36 +01:00
existing_fields = [field.name for field in mapitemtype._meta.get_fields() if field.name in possible_fields]
2016-10-13 15:55:15 +02:00
2016-11-27 23:51:44 +01:00
class EditorForm(MapitemFormMixin, ModelForm):
2016-10-13 15:55:15 +02:00
class Meta:
2016-11-28 15:46:58 +01:00
model = mapitemtype
fields = existing_fields
2016-10-13 15:55:15 +02:00
2016-11-28 15:46:58 +01:00
mapitemtype.EditorForm = EditorForm
2016-10-13 15:55:15 +02:00
2016-09-23 17:02:17 +02:00
2016-10-15 11:23:27 +02:00
def create_editor_forms():
2017-05-05 12:32:35 +02:00
from c3nav.mapdata.models.base import FEATURE_TYPES
for mapitemtype in FEATURE_TYPES.values():
2016-11-28 15:46:58 +01:00
create_editor_form(mapitemtype)