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

90 lines
3.5 KiB
Python
Raw Normal View History

2016-10-13 15:55:15 +02:00
import json
2016-10-16 15:56:24 +02:00
import uuid
2016-09-23 17:02:17 +02:00
from collections import OrderedDict
from django.conf import settings
2016-10-15 11:23:27 +02:00
from django.forms import CharField, ModelForm
from django.forms.models import ModelChoiceField
2016-09-23 15:23:02 +02:00
from django.forms.widgets import HiddenInput
2016-10-13 15:55:15 +02:00
from shapely.geometry.geo import mapping
2016-09-23 15:23:02 +02:00
2016-10-13 15:55:15 +02:00
from c3nav.mapdata.models import Package
from c3nav.mapdata.models.geometry import Area, Building, Door, Obstacle
from c3nav.mapdata.permissions import get_unlocked_packages
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-27 14:03:39 +01:00
if creating and self._meta.model in (Door, Obstacle, ):
2016-10-16 15:56:24 +02:00
self.fields['name'].initial = uuid.uuid4()
2016-10-13 15:55:15 +02:00
# restrict package choices and field_name
if not creating:
if not settings.DIRECT_EDITING:
self.fields['package'].widget = HiddenInput()
self.fields['package'].disabled = True
2016-10-13 15:55:15 +02:00
self.initial['package'] = self.instance.package.name
2016-09-29 16:33:45 +02:00
elif not settings.DIRECT_EDITING:
unlocked_packages = get_unlocked_packages(request)
if len(unlocked_packages) == 1:
self.fields['package'].widget = HiddenInput()
self.fields['package'].initial = next(iter(unlocked_packages))
2016-10-13 15:55:15 +02:00
self.fields['package'].disabled = True
else:
self.fields['package'] = ModelChoiceField(
2016-10-13 15:55:15 +02:00
queryset=Package.objects.filter(name__in=unlocked_packages),
)
2016-10-13 15:55:15 +02:00
self.fields['package'].to_field_name = 'name'
# 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
# hide geometry widget
self.fields['geometry'].widget = HiddenInput()
if not creating:
self.initial['geometry'] = json.dumps(mapping(self.instance.geometry), separators=(',', ':'))
# 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-11-27 23:51:44 +01:00
def create_editor_form(mapdata_model, add_fields=None):
class EditorForm(MapitemFormMixin, ModelForm):
2016-10-13 15:55:15 +02:00
class Meta:
2016-11-27 23:51:44 +01:00
model = mapdata_model
2016-10-13 15:55:15 +02:00
fields = ['name', 'package', 'level', 'geometry'] + (add_fields if add_fields is not None else [])
2016-11-27 23:51:44 +01:00
mapdata_model.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():
create_editor_form(Building)
create_editor_form(Area)
2016-10-16 13:20:34 +02:00
create_editor_form(Obstacle, ['height'])
create_editor_form(Door)