multi-language feature titles

This commit is contained in:
Laura Klünder 2016-09-23 17:02:17 +02:00
parent 9f79e26671
commit 3c96a98344
11 changed files with 101 additions and 44 deletions

View file

@ -1,4 +1,5 @@
from django.conf.urls import include, url
from rest_framework.routers import DefaultRouter
from ..editor import api as editor_api

View file

@ -1,4 +1,5 @@
from django.http import Http404
from rest_framework.response import Response
from rest_framework.viewsets import ViewSet

View file

@ -1,5 +1,9 @@
from django.forms import ModelForm
from collections import OrderedDict
from django.conf import settings
from django.forms import CharField, ModelForm, ValidationError
from django.forms.widgets import HiddenInput
from django.utils.translation import ugettext_lazy as _
from ..mapdata.models import Feature
@ -11,6 +15,30 @@ class FeatureForm(ModelForm):
self.fields['level'].widget = HiddenInput()
self.fields['geometry'].widget = HiddenInput()
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
def clean(self):
super().clean()
if not any(self.titles.values()):
raise ValidationError(
_('You have to select a title in at least one language.')
)
def get_languages(self):
pass
class Meta:
# generate extra fields in the number specified via extra_fields
model = Feature
fields = ['name', 'package', 'level', 'geometry']

View file

@ -182,7 +182,7 @@ editor = {
$('.leaflet-drawbar').hide();
var path = '/editor/features/' + editor._drawing + '/add';
$('#mapeditcontrols').removeClass('list');
$('#mapeditdetail').html('<img src="/static/img/loader.gif">').load(path, function() {
$('#mapeditdetail').load(path, function () {
$('#mapeditcontrols').addClass('detail');
$('#id_level').val(editor._level);
$('#id_geometry').val(JSON.stringify(editor._adding.toGeoJSON().geometry));

View file

@ -1,10 +1,10 @@
from django.conf import settings
from django.db import transaction
from django.http.response import Http404
from django.shortcuts import render
from c3nav.editor.forms import FeatureForm
from c3nav.mapdata.models.feature import FEATURE_TYPES
from c3nav.settings import DIRECT_EDITING
def add_feature(request, feature_type):
@ -15,13 +15,20 @@ def add_feature(request, feature_type):
if request.method == 'POST':
form = FeatureForm(request.POST, feature_type=feature_type)
if form.is_valid():
if not DIRECT_EDITING:
if not settings.DIRECT_EDITING:
return render(request, 'editor/feature_success.html', {})
with transaction.atomic():
feature = form.instance
feature.feature_type = feature_type.name
feature.save()
for language, title in form.titles.items():
if title:
feature.featuretitles.update_or_create(language=language, defaults={'title': title})
else:
feature.featuretitles.filter(language=language).delete()
return render(request, 'editor/feature_success.html', {})
else:
form = FeatureForm(feature_type=feature_type)

View file

@ -4,9 +4,10 @@ import os
from django.conf import settings
from django.core.files import File
from django.http import Http404, HttpResponse
from rest_framework.decorators import detail_route
from rest_framework.response import Response
from rest_framework.viewsets import ModelViewSet, ReadOnlyModelViewSet, ViewSet
from rest_framework.viewsets import ReadOnlyModelViewSet, ViewSet
from .cache import AccessCachedViewSetMixin, CachedViewSetMixin
from .models import FEATURE_TYPES, Feature, Level, Package, Source
@ -70,6 +71,7 @@ class FeatureTypeViewSet(ViewSet):
"""
Get Feature types
"""
def list(self, request, version=None):
serializer = FeatureTypeSerializer(FEATURE_TYPES.values(), many=True, context={'request': request})
return Response(serializer.data)
@ -81,13 +83,10 @@ class FeatureTypeViewSet(ViewSet):
return Response(serializer.data)
ParentModelViewSet = ModelViewSet if settings.DIRECT_EDITING else ReadOnlyModelViewSet
class FeatureViewSet(ParentModelViewSet):
class FeatureViewSet(ReadOnlyModelViewSet):
"""
Get all Map Features including ones that are only part of the current session
"""
queryset = Feature.objects.all()
queryset = Feature.objects.all().prefetch_related('featuretitles')
serializer_class = FeatureSerializer
lookup_value_regex = '[^/]+'

View file

@ -2,9 +2,11 @@ from collections import OrderedDict, namedtuple
from django.db import models
from django.utils.translation import ugettext_lazy as _
from django.utils.translation import get_language
from c3nav.mapdata.models.level import Level
from c3nav.mapdata.models.package import Package
from ..fields import GeometryField
@ -12,11 +14,14 @@ class FeatureType(namedtuple('FeatureType', ('name', 'title', 'title_plural', 'g
def __init__(self, *args, **kwargs):
FEATURE_TYPES[self.name] = self
FEATURE_TYPES = OrderedDict()
FeatureType('building', _('Building'), _('Buildings'), 'polygon', '#333333')
FeatureType('room', _('Room'), _('Rooms'), 'polygon', '#CCCCCC')
FeatureType('outside', _('Outside Area'), _('Outside Areas'), 'polygon', '#EEEEEE')
FeatureType('obstacle', _('Obstacle'), _('Obstacles'), 'polygon', '#999999')
# FeatureType('door', _('Door'), 'polygon', '#FF00FF')
# FeatureType('step', _('Step'), 'polyline', '#FF0000')
# FeatureType('elevator', _('Elevator'), 'polygon', '#99CC00')
@ -36,9 +41,21 @@ class Feature(models.Model):
verbose_name=_('level'))
geometry = GeometryField()
@property
def titles(self):
return {title.language: title.title for title in self.featuretitles.all()}
@property
def title(self):
titles = self.titles
lang = get_language()
if lang in titles:
return titles[lang]
return next(iter(titles.values())) if titles else self.name
class FeatureTitle(models.Model):
feature = models.ForeignKey('Feature', on_delete=models.CASCADE, related_name='titles',
feature = models.ForeignKey('Feature', on_delete=models.CASCADE, related_name='featuretitles',
verbose_name=_('map package'))
language = models.CharField(max_length=50)
title = models.CharField(max_length=50)

View file

@ -1,5 +1,6 @@
from django.conf import settings
from django.utils.translation import ugettext_lazy as _
from rest_framework.exceptions import PermissionDenied
from rest_framework.permissions import BasePermission

View file

@ -59,4 +59,4 @@ class FeatureSerializer(serializers.ModelSerializer):
class Meta:
model = Feature
fields = ('name', 'package', 'level', 'feature_type', 'geometry')
fields = ('name', 'title', 'feature_type', 'level', 'titles', 'package', 'geometry')

View file

@ -112,7 +112,6 @@ LANGUAGE_COOKIE_NAME = 'c3nav_language'
CSRF_COOKIE_NAME = 'c3nav_csrftoken'
SESSION_COOKIE_HTTPONLY = True
# Application definition
INSTALLED_APPS = [
@ -222,6 +221,10 @@ STATICFILES_FINDERS = (
'compressor.finders.CompressorFinder',
)
BOOTSTRAP3 = {
'success_css_class': '',
}
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'static'),
)