editor forms for new feature models
This commit is contained in:
parent
4b74eb0cf5
commit
ecc7c4f829
6 changed files with 86 additions and 58 deletions
|
@ -1,63 +1,87 @@
|
|||
import json
|
||||
from collections import OrderedDict
|
||||
|
||||
from django.conf import settings
|
||||
from django.forms import CharField, Form, ModelForm, ValidationError
|
||||
from django.forms import CharField, Form, ModelForm
|
||||
from django.forms.models import ModelChoiceField
|
||||
from django.forms.widgets import HiddenInput
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
from shapely.geometry.geo import mapping
|
||||
|
||||
from c3nav.mapdata.models import Feature, Package
|
||||
from c3nav.mapdata.models import Package
|
||||
from c3nav.mapdata.models.features import Inside, Room
|
||||
from c3nav.mapdata.permissions import get_unlocked_packages
|
||||
|
||||
|
||||
class FeatureForm(ModelForm):
|
||||
class FeatureFormMixin(ModelForm):
|
||||
def __init__(self, *args, feature_type, request=None, **kwargs):
|
||||
self.feature_type = feature_type
|
||||
self.request = request
|
||||
super().__init__(*args, **kwargs)
|
||||
self.fields['level'].widget = HiddenInput()
|
||||
self.fields['geometry'].widget = HiddenInput()
|
||||
creating = not self.instance.pk
|
||||
|
||||
titles = OrderedDict((lang_code, '') for lang_code, language in settings.LANGUAGES)
|
||||
if self.instance is not None and self.instance.pk:
|
||||
# disable name on non-direct editing
|
||||
if not creating and not settings.DIRECT_EDITING:
|
||||
self.fields['name'].disabled = True
|
||||
|
||||
# restrict package choices and field_name
|
||||
if not creating:
|
||||
if not settings.DIRECT_EDITING:
|
||||
self.fields['package'].widget = HiddenInput()
|
||||
self.fields['package'].disabled = True
|
||||
titles.update(self.instance.titles)
|
||||
self.initial['package'] = self.instance.package.name
|
||||
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))
|
||||
self.fields['package'].disabled = True
|
||||
else:
|
||||
self.fields['package'] = ModelChoiceField(
|
||||
queryset=Package.objects.filter(name__in=unlocked_packages)
|
||||
queryset=Package.objects.filter(name__in=unlocked_packages),
|
||||
)
|
||||
self.fields['package'].to_field_name = 'name'
|
||||
|
||||
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
|
||||
# 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
|
||||
|
||||
def clean(self):
|
||||
super().clean()
|
||||
if not any(self.titles.values()):
|
||||
raise ValidationError(
|
||||
_('You have to select a title in at least one language.')
|
||||
)
|
||||
# hide geometry widget
|
||||
self.fields['geometry'].widget = HiddenInput()
|
||||
if not creating:
|
||||
self.initial['geometry'] = json.dumps(mapping(self.instance.geometry), separators=(',', ':'))
|
||||
|
||||
def get_languages(self):
|
||||
pass
|
||||
# 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)
|
||||
|
||||
class Meta:
|
||||
# generate extra fields in the number specified via extra_fields
|
||||
model = Feature
|
||||
fields = ['name', 'package', 'level', 'geometry']
|
||||
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
|
||||
|
||||
|
||||
def create_editor_form(feature_model, add_fields=None):
|
||||
class EditorForm(FeatureFormMixin, ModelForm):
|
||||
class Meta:
|
||||
model = feature_model
|
||||
fields = ['name', 'package', 'level', 'geometry'] + (add_fields if add_fields is not None else [])
|
||||
|
||||
feature_model.EditorForm = EditorForm
|
||||
|
||||
|
||||
create_editor_form(Inside)
|
||||
create_editor_form(Room)
|
||||
|
||||
|
||||
class CommitForm(Form):
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue