sources editor: option to copy settings from other source

This commit is contained in:
Laura Klünder 2018-11-18 02:00:27 +01:00
parent c8172c9f30
commit 85838f2198
2 changed files with 31 additions and 1 deletions

View file

@ -7,6 +7,7 @@ from itertools import chain
from django.conf import settings from django.conf import settings
from django.core.cache import cache from django.core.cache import cache
from django.core.exceptions import FieldDoesNotExist from django.core.exceptions import FieldDoesNotExist
from django.core.serializers.json import DjangoJSONEncoder
from django.db.models import Q from django.db.models import Q
from django.forms import (BooleanField, CharField, ChoiceField, DecimalField, Form, ModelChoiceField, ModelForm, from django.forms import (BooleanField, CharField, ChoiceField, DecimalField, Form, ModelChoiceField, ModelForm,
MultipleChoiceField, Select, ValidationError) MultipleChoiceField, Select, ValidationError)
@ -48,10 +49,24 @@ class EditorFormBase(I18nModelFormMixin, ModelForm):
if self._meta.model.__name__ == 'Source' and self.request.user.is_superuser: if self._meta.model.__name__ == 'Source' and self.request.user.is_superuser:
Source = self.request.changeset.wrap_model('Source') Source = self.request.changeset.wrap_model('Source')
used_names = set(Source.objects.all().values_list('name', flat=True)) sources = {s['name']: s for s in Source.objects.all().values('name', 'access_restriction_id',
'left', 'bottom', 'right', 'top')}
used_names = set(sources.keys())
all_names = set(os.listdir(settings.SOURCES_ROOT)) all_names = set(os.listdir(settings.SOURCES_ROOT))
self.fields['name'].widget = Select(choices=tuple((s, s) for s in sorted(all_names-used_names))) self.fields['name'].widget = Select(choices=tuple((s, s) for s in sorted(all_names-used_names)))
if creating:
for s in sources.values():
s['access_restriction'] = s['access_restriction_id']
del s['access_restriction_id']
self.fields['copy_from'] = ChoiceField(
choices=tuple((('', '---------'), ))+tuple(
(json.dumps(sources[name], separators=(',', ':'), cls=DjangoJSONEncoder), name)
for name in sorted(used_names)
),
required=False
)
self.fields['fixed_x'] = DecimalField(label='fixed x', required=False, self.fields['fixed_x'] = DecimalField(label='fixed x', required=False,
max_digits=7, decimal_places=3, initial=0) max_digits=7, decimal_places=3, initial=0)
self.fields['fixed_y'] = DecimalField(label='fixed y', required=False, self.fields['fixed_y'] = DecimalField(label='fixed y', required=False,
@ -70,6 +85,8 @@ class EditorFormBase(I18nModelFormMixin, ModelForm):
self.fields.move_to_end('fixed_y', last=False) self.fields.move_to_end('fixed_y', last=False)
self.fields.move_to_end('fixed_x', last=False) self.fields.move_to_end('fixed_x', last=False)
self.fields.move_to_end('access_restriction', last=False) self.fields.move_to_end('access_restriction', last=False)
if creating:
self.fields.move_to_end('copy_from', last=False)
self.fields.move_to_end('name', last=False) self.fields.move_to_end('name', last=False)
if self._meta.model.__name__ == 'AccessRestriction': if self._meta.model.__name__ == 'AccessRestriction':

View file

@ -176,6 +176,7 @@ editor = {
group.append(content.find('[name=fixed_y]').closest('.form-group')); group.append(content.find('[name=fixed_y]').closest('.form-group'));
content.find('[name=fixed_x], [name=fixed_y]').change(editor._fixed_point_changed).change(); content.find('[name=fixed_x], [name=fixed_y]').change(editor._fixed_point_changed).change();
content.find('[name=copy_from]').change(editor._copy_from_changed);
group = $('<div class="form-group-group source-wizard">'); group = $('<div class="form-group-group source-wizard">');
group.insertBefore(content.find('[name=scale_x]').closest('.form-group')); group.insertBefore(content.find('[name=scale_x]').closest('.form-group'));
@ -509,6 +510,18 @@ editor = {
editor._fixed_point_layer.addTo(editor.map); editor._fixed_point_layer.addTo(editor.map);
} }
}, },
_copy_from_changed: function() {
var content = $('#sidebar'),
value = JSON.parse($(this).val());
$(this).val('');
if (!confirm('Are you sure you want to copy settings from '+value.name+'?')) return;
delete value.name;
for (key in value) {
content.find('[name='+key+']').val(value[key]);
}
editor._source_image_calculate_scale();
editor._source_image_repositioned();
},
// geometries // geometries
geometrystyles: {}, geometrystyles: {},