maps: add possibility to define map layer slots (#48978)

This commit is contained in:
Frédéric Péters 2020-12-01 15:26:32 +01:00
parent 794beda7a1
commit 81d5bc026d
4 changed files with 73 additions and 0 deletions

View File

@ -35,6 +35,7 @@ from sorl.thumbnail.shortcuts import get_thumbnail
from combo.data.models import CellBase
from combo.apps.assets.utils import import_assets, export_assets
from combo.apps.maps.models import MapLayer
from .forms import AssetUploadForm, AssetsImportForm
from .models import Asset
@ -108,6 +109,8 @@ class SlotAsset(object):
'data_linkcell': ['link_page']})
for cell in cells:
uniq_slots.update(cell.get_asset_slots())
for map_layer in MapLayer.objects.filter(kind='geojson'):
uniq_slots.update(map_layer.get_asset_slots())
for key, value in uniq_slots.items():
yield cls(key,
name=value.get('label'),

View File

@ -282,6 +282,51 @@ class MapLayer(models.Model):
return {'type': 'FeatureCollection', 'features': features}
def can_have_assets(self):
return self.get_asset_slot_templates()
def get_label_for_asset(self):
return _('"%s" map layer') % self.label
def get_asset_slot_key(self, key):
return 'maplayer:%s:%s' % (key, self.slug)
def get_asset_slot_templates(self):
return settings.COMBO_MAP_LAYER_ASSET_SLOTS or {}
def get_asset_slot_keys(self):
if not self.can_have_assets():
return {}
slot_templates = self.get_asset_slot_templates()
return {self.get_asset_slot_key(key): key for key in slot_templates.keys()}
def get_asset_slots(self):
if not self.can_have_assets():
return {}
slot_templates = self.get_asset_slot_templates()
slots = {}
for slot_template_key, slot_template_data in slot_templates.items():
suffix = ''
if slot_template_data.get('suffix'):
suffix = ' (%s)' % slot_template_data['suffix']
slot_key = self.get_asset_slot_key(slot_template_key)
label = '%(prefix)s%(label)s%(suffix)s' % {
'prefix': slot_template_data['prefix'],
'label': self.get_label_for_asset(),
'suffix': suffix
}
short_label = '%(prefix)s%(suffix)s' % {
'prefix': slot_template_data['prefix'],
'suffix': suffix
}
slots[slot_key] = {
'label': label,
'short_label': short_label,
}
slots[slot_key].update(slot_template_data)
return slots
@register_cell_class
class Map(CellBase):

View File

@ -345,6 +345,8 @@ COMBO_CELL_ASSET_SLOTS = {
}
}
COMBO_MAP_LAYER_ASSET_SLOTS = {}
# known services
KNOWN_SERVICES = {}

View File

@ -33,6 +33,7 @@ from combo.data.models import (
from combo.manager.forms import PageAddForm
from combo.manager.forms import PageSelectTemplateForm
from combo.apps.assets.models import Asset
from combo.apps.maps.models import MapLayer
from combo.apps.family.models import FamilyInfosCell
from combo.apps.search.models import SearchCell
@ -1659,6 +1660,28 @@ def test_asset_slots_for_cells_management(settings, app, admin_user):
assert app.get('/assets/%s' % cell.get_asset_slot_key('picture'), status=404)
def test_asset_slots_for_map_layers_management(app, admin_user):
app = login(app)
assert Asset.objects.count() == 0
with override_settings(COMBO_MAP_LAYER_ASSET_SLOTS={'marker': {'prefix': 'Marker'}}):
resp = app.get('/manage/assets/')
assert 'Marker — &quot;bicycles&quot; map layer <span class="not-defined">' not in resp
layer = MapLayer()
layer.label = 'bicycles'
layer.geojson_url = 'http://example.org/geojson'
layer.marker_colour = 'FF0000'
layer.icon = 'fa-bicycle'
layer.icon_colour = '0000FF'
layer.save()
resp = app.get('/manage/assets/')
assert 'Marker — &quot;bicycles&quot; map layer <span class="not-defined">' in resp
resp = resp.click('Overwrite')
assert resp.request.url.endswith('/maplayer:marker:bicycles/')
def test_asset_slots_export(app, admin_user):
app = login(app)