maps: add possibility to define map layer slots (#48978)
This commit is contained in:
parent
794beda7a1
commit
81d5bc026d
|
@ -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'),
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -345,6 +345,8 @@ COMBO_CELL_ASSET_SLOTS = {
|
|||
}
|
||||
}
|
||||
|
||||
COMBO_MAP_LAYER_ASSET_SLOTS = {}
|
||||
|
||||
# known services
|
||||
KNOWN_SERVICES = {}
|
||||
|
||||
|
|
|
@ -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 — "bicycles" 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 — "bicycles" 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)
|
||||
|
||||
|
|
Loading…
Reference in New Issue