From a11801ba25b4d1cd64400b14876d2f63ea8b05c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laur=C3=A9line=20Gu=C3=A9rin?= Date: Thu, 13 Feb 2020 16:09:21 +0100 Subject: [PATCH] maps: MapLayer slug unicity (#39539) --- .../migrations/0011_map_layer_set_slug.py | 38 +++++++++++++++++++ .../migrations/0012_map_layer_slug_unicity.py | 19 ++++++++++ combo/apps/maps/models.py | 8 +--- 3 files changed, 59 insertions(+), 6 deletions(-) create mode 100644 combo/apps/maps/migrations/0011_map_layer_set_slug.py create mode 100644 combo/apps/maps/migrations/0012_map_layer_slug_unicity.py diff --git a/combo/apps/maps/migrations/0011_map_layer_set_slug.py b/combo/apps/maps/migrations/0011_map_layer_set_slug.py new file mode 100644 index 00000000..fe900a83 --- /dev/null +++ b/combo/apps/maps/migrations/0011_map_layer_set_slug.py @@ -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), + ] diff --git a/combo/apps/maps/migrations/0012_map_layer_slug_unicity.py b/combo/apps/maps/migrations/0012_map_layer_slug_unicity.py new file mode 100644 index 00000000..036422ca --- /dev/null +++ b/combo/apps/maps/migrations/0012_map_layer_slug_unicity.py @@ -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'), + ), + ] diff --git a/combo/apps/maps/models.py b/combo/apps/maps/models.py index 718a9d9b..600ada55 100644 --- a/combo/apps/maps/models.py +++ b/combo/apps/maps/models.py @@ -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