add LevelConnector

This commit is contained in:
Laura Klünder 2016-12-01 12:25:02 +01:00
parent 8164cc1a40
commit b309b6f6cd
10 changed files with 164 additions and 28 deletions

View file

@ -6,6 +6,7 @@ from django.conf import settings
from django.forms import CharField, ModelForm, ValidationError
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 Package
@ -50,6 +51,10 @@ class MapitemFormMixin(ModelForm):
if not creating:
self.initial['level'] = self.instance.level.name
if 'levels' in self.fields:
# set field_name
self.fields['levels'].to_field_name = 'name'
if 'geometry' in self.fields:
# hide geometry widget
self.fields['geometry'].widget = HiddenInput()
@ -73,6 +78,12 @@ class MapitemFormMixin(ModelForm):
initial=titles[language].strip(), max_length=50)
self.titles = titles
def clean_levels(self):
levels = self.cleaned_data.get('levels')
if len(levels) < 2:
raise ValidationError(_('Please select at least two levels.'))
return levels
def clean(self):
if 'geometry' in self.fields:
if not self.cleaned_data.get('geometry'):
@ -80,7 +91,7 @@ class MapitemFormMixin(ModelForm):
def create_editor_form(mapitemtype):
possible_fields = ['name', 'package', 'level', 'geometry', 'height', 'elevator', 'button']
possible_fields = ['name', 'package', 'level', 'levels', 'geometry', 'height', 'elevator', 'button']
existing_fields = [field for field in possible_fields if hasattr(mapitemtype, field)]
class EditorForm(MapitemFormMixin, ModelForm):

View file

@ -160,6 +160,7 @@ editor = {
'door': '#FF00FF',
'hole': '#66CC66',
'elevatorlevel': '#9EF8FB',
'levelconnector': '#FFFF00'
},
_get_geometry_style: function (feature) {
// style callback for GeoJSON loader
@ -281,6 +282,7 @@ editor = {
}
editor._creating = true;
$('#id_level').val(editor._level);
$('#id_levels').find('option[value='+editor._level+']').prop('selected', true);
}
} else if (editor._get_geometries_next_time) {
editor.get_geometries();

View file

@ -15,9 +15,13 @@ from c3nav.mapdata.permissions import can_access_package, filter_queryset_by_pac
def list_mapitemtypes(request, level):
def get_item_count(mapitemtype):
if not hasattr(mapitemtype, 'level'):
return 0
return filter_queryset_by_package_access(request, mapitemtype.objects.filter(level__name=level)).count()
if hasattr(mapitemtype, 'level'):
return filter_queryset_by_package_access(request, mapitemtype.objects.filter(level__name=level)).count()
if hasattr(mapitemtype, 'levels'):
return filter_queryset_by_package_access(request, mapitemtype.objects.filter(levels__name=level)).count()
return 0
return render(request, 'editor/mapitemtypes.html', {
'level': level,
@ -25,7 +29,7 @@ def list_mapitemtypes(request, level):
{
'name': name,
'title': mapitemtype._meta.verbose_name_plural,
'has_level': hasattr(mapitemtype, 'level'),
'has_level': hasattr(mapitemtype, 'level') or hasattr(mapitemtype, 'levels'),
'count': get_item_count(mapitemtype),
} for name, mapitemtype in MAPITEM_TYPES.items()
],
@ -37,14 +41,18 @@ def list_mapitems(request, mapitem_type, level=None):
if mapitemtype is None:
raise Http404('Unknown mapitemtype.')
if hasattr(mapitemtype, 'level') and level is None:
has_level = hasattr(mapitemtype, 'level') or hasattr(mapitemtype, 'levels')
if has_level and level is None:
raise Http404('Missing level.')
elif not hasattr(mapitemtype, 'level') and level is not None:
elif not has_level and level is not None:
return redirect('editor.mapitems', mapitem_type=mapitem_type)
queryset = mapitemtype.objects.all()
if level is not None:
queryset = queryset.filter(level__name=level)
if hasattr(mapitemtype, 'level'):
queryset = queryset.filter(level__name=level)
elif hasattr(mapitemtype, 'levels'):
queryset = queryset.filter(levels__name=level)
return render(request, 'editor/mapitems.html', {
'mapitem_type': mapitem_type,
@ -105,7 +113,7 @@ def edit_mapitem(request, mapitem_type, name=None):
# Update/create mapitem
commit_type = 'Created' if mapitem is None else 'Updated'
action = 'create' if mapitem is None else 'edit'
mapitem = form.instance
mapitem = form.save(commit=False)
if form.titles is not None:
mapitem.titles = {}
@ -130,6 +138,7 @@ def edit_mapitem(request, mapitem_type, name=None):
})
mapitem.save()
form.save_m2m()
return render(request, 'editor/mapitem_success.html', {
'mapitem_type': mapitem_type