2016-10-13 15:55:15 +02:00
|
|
|
import json
|
2016-09-23 17:02:17 +02:00
|
|
|
from collections import OrderedDict
|
|
|
|
|
|
|
|
from django.conf import settings
|
2017-05-29 10:15:25 +02: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):
|
2016-10-16 15:17:30 +02:00
|
|
|
def __init__(self, *args, request=None, **kwargs):
|
2016-09-26 17:23:08 +02:00
|
|
|
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
|
|
|
|
2017-06-11 14:43:14 +02:00
|
|
|
if 'level' in self.fields:
|
|
|
|
# hide level widget
|
|
|
|
self.fields['level'].widget = HiddenInput()
|
2016-12-01 12:25:02 +01:00
|
|
|
|
2017-05-19 16:55:07 +02:00
|
|
|
if 'space' in self.fields:
|
|
|
|
# hide space widget
|
|
|
|
self.fields['space'].widget = HiddenInput()
|
|
|
|
|
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
|
|
|
|
2017-05-16 14:50:36 +02:00
|
|
|
if 'groups' in self.fields:
|
2017-06-12 22:56:39 +02:00
|
|
|
LocationGroup = self.request.changeset.wrap('LocationGroup')
|
2017-05-16 14:50:36 +02:00
|
|
|
self.fields['groups'].label_from_instance = lambda obj: obj.title_for_forms
|
2017-06-12 22:56:39 +02:00
|
|
|
self.fields['groups'].queryset = LocationGroup.objects.all()
|
2017-05-16 14:50:36 +02:00
|
|
|
|
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)
|
2017-05-26 20:40:20 +02:00
|
|
|
for language in reversed(titles.keys()):
|
2016-10-13 15:55:15 +02:00
|
|
|
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)
|
2017-05-26 20:40:20 +02:00
|
|
|
self.fields.move_to_end('title_' + language, last=False)
|
2016-10-13 15:55:15 +02:00
|
|
|
self.titles = titles
|
|
|
|
|
2017-05-27 18:29:36 +02:00
|
|
|
self.redirect_slugs = None
|
|
|
|
self.add_redirect_slugs = None
|
|
|
|
self.remove_redirect_slugs = None
|
|
|
|
if 'slug' in self.fields:
|
|
|
|
self.redirect_slugs = sorted(self.instance.redirects.values_list('slug', flat=True))
|
|
|
|
self.fields['redirect_slugs'] = CharField(label=_('Redirecting Slugs (comma seperated)'), required=False,
|
|
|
|
initial=','.join(self.redirect_slugs))
|
|
|
|
self.fields.move_to_end('redirect_slugs', last=False)
|
|
|
|
self.fields.move_to_end('slug', last=False)
|
|
|
|
|
|
|
|
def clean_redirect_slugs(self):
|
|
|
|
old_redirect_slugs = set(self.redirect_slugs)
|
|
|
|
new_redirect_slugs = set(s for s in (s.strip() for s in self.cleaned_data['redirect_slugs'].split(',')) if s)
|
|
|
|
|
|
|
|
self.add_redirect_slugs = new_redirect_slugs - old_redirect_slugs
|
|
|
|
self.remove_redirect_slugs = old_redirect_slugs - new_redirect_slugs
|
|
|
|
|
|
|
|
for slug in self.add_redirect_slugs:
|
|
|
|
self.fields['slug'].run_validators(slug)
|
2017-06-12 18:01:51 +02:00
|
|
|
|
2017-06-18 05:14:02 +02:00
|
|
|
LocationSlug = self.request.changeset.wrap('LocationSlug')
|
2017-06-12 18:01:51 +02:00
|
|
|
for slug in LocationSlug.objects.filter(slug__in=self.add_redirect_slugs).values_list('slug', flat=True)[:1]:
|
|
|
|
raise ValidationError(
|
|
|
|
_('Can not add redirecting slug “%s”: it is already used elsewhere.') % slug
|
|
|
|
)
|
2017-05-27 18:29:36 +02:00
|
|
|
|
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.')
|
|
|
|
)
|
2017-05-27 18:29:36 +02:00
|
|
|
|
2016-12-04 14:16:05 +01:00
|
|
|
super().clean()
|
2016-11-28 15:46:58 +01:00
|
|
|
|
|
|
|
|
2017-05-16 14:10:50 +02:00
|
|
|
def create_editor_form(editor_model):
|
2017-06-10 14:58:13 +02:00
|
|
|
possible_fields = ['slug', 'name', 'altitude', 'category', 'width', 'groups', 'color', 'public',
|
2017-05-26 21:37:53 +02:00
|
|
|
'can_search', 'can_describe', 'outside', 'stuffed', 'geometry',
|
|
|
|
'left', 'top', 'right', 'bottom']
|
2017-05-26 20:40:20 +02:00
|
|
|
field_names = [field.name for field in editor_model._meta.get_fields()]
|
|
|
|
existing_fields = [name for name in possible_fields if name in field_names]
|
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:
|
2017-05-16 14:10:50 +02:00
|
|
|
model = editor_model
|
2016-11-28 15:46:58 +01:00
|
|
|
fields = existing_fields
|
2016-10-13 15:55:15 +02:00
|
|
|
|
2017-05-16 14:10:50 +02:00
|
|
|
editor_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():
|
2017-05-09 09:36:08 +02:00
|
|
|
from c3nav.mapdata.models.base import EDITOR_FORM_MODELS
|
|
|
|
for mapitemtype in EDITOR_FORM_MODELS.values():
|
2016-11-28 15:46:58 +01:00
|
|
|
create_editor_form(mapitemtype)
|