diff --git a/src/c3nav/editor/forms.py b/src/c3nav/editor/forms.py index 1c7257aa..f20b8f7a 100644 --- a/src/c3nav/editor/forms.py +++ b/src/c3nav/editor/forms.py @@ -2,11 +2,13 @@ import json from collections import OrderedDict from django.conf import settings -from django.forms import CharField, ModelForm, ValidationError +from django.forms import CharField, ModelForm, Textarea, ValidationError from django.forms.widgets import HiddenInput from django.utils.translation import ugettext_lazy as _ from shapely.geometry.geo import mapping +from c3nav.mapdata.models.locations import LocationRedirect, LocationSlug + class MapitemFormMixin(ModelForm): def __init__(self, *args, request=None, **kwargs): @@ -49,6 +51,30 @@ class MapitemFormMixin(ModelForm): self.fields.move_to_end('title_' + language, last=False) self.titles = titles + 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) + if LocationSlug.objects.filter(slug=slug).exists(): + raise ValidationError( + _('Can not add redirecting slug “%s”: it is already used elsewhere.') % slug + ) + def clean(self): if 'geometry' in self.fields: if not self.cleaned_data.get('geometry'): @@ -58,11 +84,12 @@ class MapitemFormMixin(ModelForm): raise ValidationError( _('You have to select a title in at least one language.') ) + super().clean() def create_editor_form(editor_model): - possible_fields = ['name', 'altitude', 'level', 'category', 'width', 'groups', 'color', 'public', + possible_fields = ['slug', 'name', 'altitude', 'level', 'category', 'width', 'groups', 'color', 'public', 'can_search', 'can_describe', 'outside', 'stuffed', 'geometry', 'left', 'top', 'right', 'bottom'] field_names = [field.name for field in editor_model._meta.get_fields()] diff --git a/src/c3nav/editor/views.py b/src/c3nav/editor/views.py index c8b9c386..842be836 100644 --- a/src/c3nav/editor/views.py +++ b/src/c3nav/editor/views.py @@ -185,6 +185,14 @@ def edit(request, pk=None, model=None, section=None, space=None, explicit_edit=F if title: obj.titles[language] = title + if form.redirect_slugs is not None: + for slug in form.add_redirect_slugs: + obj.redirects.create(slug=slug) + + for slug in form.remove_redirect_slugs: + obj.redirects.filter(slug=slug).delete() + + if not settings.DIRECT_EDITING: # todo: suggest changes raise NotImplementedError diff --git a/src/c3nav/mapdata/migrations/0005_auto_20170527_1556.py b/src/c3nav/mapdata/migrations/0005_auto_20170527_1556.py new file mode 100644 index 00000000..e3dd3698 --- /dev/null +++ b/src/c3nav/mapdata/migrations/0005_auto_20170527_1556.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.7 on 2017-05-27 15:56 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('mapdata', '0004_space_level_category_name'), + ] + + operations = [ + migrations.AlterModelOptions( + name='locationslug', + options={'verbose_name': 'Location with Slug', 'verbose_name_plural': 'Lucation with Slug'}, + ), + migrations.AlterField( + model_name='locationslug', + name='slug', + field=models.SlugField(null=True, unique=True, verbose_name='slug'), + ), + ] diff --git a/src/c3nav/mapdata/models/locations.py b/src/c3nav/mapdata/models/locations.py index 6db44f53..f27345f0 100644 --- a/src/c3nav/mapdata/models/locations.py +++ b/src/c3nav/mapdata/models/locations.py @@ -18,7 +18,7 @@ class LocationSlug(SerializableMixin, models.Model): 'LocationGroup': 'g' } LOCATION_TYPE_BY_CODE = {code: model_name for model_name, code in LOCATION_TYPE_CODES.items()} - slug = models.SlugField(_('name'), unique=True, null=True, max_length=50) + slug = models.SlugField(_('slug'), unique=True, null=True, max_length=50) def get_child(self): # todo: cache this @@ -38,8 +38,8 @@ class LocationSlug(SerializableMixin, models.Model): return result class Meta: - verbose_name = _('Slug for Location') - verbose_name_plural = _('Slugs für Locations') + verbose_name = _('Location with Slug') + verbose_name_plural = _('Lucation with Slug') default_related_name = 'locationslugs'