maps: MapLayer slug unicity (#39539)
This commit is contained in:
parent
9a08778110
commit
a11801ba25
|
@ -0,0 +1,38 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations
|
||||
from django.utils.text import slugify
|
||||
|
||||
|
||||
def generate_slug(instance):
|
||||
base_slug = slugify(instance.label)[:45]
|
||||
slug = base_slug
|
||||
i = 1
|
||||
while True:
|
||||
queryset = instance._meta.model.objects.filter(slug=slug).exclude(pk=instance.pk)
|
||||
if not queryset.exists():
|
||||
break
|
||||
slug = '%s-%s' % (base_slug, i)
|
||||
i += 1
|
||||
return slug
|
||||
|
||||
|
||||
def set_slug(apps, schema_editor):
|
||||
MapLayer = apps.get_model('maps', 'MapLayer')
|
||||
for layer in MapLayer.objects.all().order_by('-pk'):
|
||||
if not MapLayer.objects.filter(slug=layer.slug).exclude(pk=layer.pk).exists():
|
||||
continue
|
||||
layer.slug = generate_slug(layer)
|
||||
layer.save(update_fields=['slug'])
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('maps', '0010_map_layer_opacity'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RunPython(set_slug, lambda x, y: None),
|
||||
]
|
|
@ -0,0 +1,19 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('maps', '0011_map_layer_set_slug'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='maplayer',
|
||||
name='slug',
|
||||
field=models.SlugField(unique=True, verbose_name='Identifier'),
|
||||
),
|
||||
]
|
|
@ -102,7 +102,7 @@ class MapLayer(models.Model):
|
|||
objects = MapLayerManager()
|
||||
|
||||
label = models.CharField(_('Label'), max_length=128)
|
||||
slug = models.SlugField(_('Identifier'))
|
||||
slug = models.SlugField(_('Identifier'), unique=True)
|
||||
|
||||
kind = models.CharField(max_length=10, choices=KIND, default='geojson')
|
||||
|
||||
|
@ -138,11 +138,7 @@ class MapLayer(models.Model):
|
|||
base_slug = slugify(self.label)[:45]
|
||||
slug = base_slug
|
||||
i = 1
|
||||
while True:
|
||||
try:
|
||||
MapLayer.objects.get(slug=slug)
|
||||
except self.DoesNotExist:
|
||||
break
|
||||
while MapLayer.objects.filter(slug=slug).exists():
|
||||
slug = '%s-%s' % (base_slug, i)
|
||||
i += 1
|
||||
self.slug = slug
|
||||
|
|
Loading…
Reference in New Issue