Projet

Général

Profil

0001-maps-MapLayer-slug-unicity-39539.patch

Lauréline Guérin, 13 février 2020 16:09

Télécharger (3,72 ko)

Voir les différences:

Subject: [PATCH] maps: MapLayer slug unicity (#39539)

 .../migrations/0008_map_layer_set_slug.py     | 38 +++++++++++++++++++
 .../migrations/0009_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/0008_map_layer_set_slug.py
 create mode 100644 combo/apps/maps/migrations/0009_map_layer_slug_unicity.py
combo/apps/maps/migrations/0008_map_layer_set_slug.py
1
# -*- coding: utf-8 -*-
2
from __future__ import unicode_literals
3

  
4
from django.db import migrations
5
from django.utils.text import slugify
6

  
7

  
8
def generate_slug(instance):
9
    base_slug = slugify(instance.label)[:45]
10
    slug = base_slug
11
    i = 1
12
    while True:
13
        queryset = instance._meta.model.objects.filter(slug=slug).exclude(pk=instance.pk)
14
        if not queryset.exists():
15
            break
16
        slug = '%s-%s' % (base_slug, i)
17
        i += 1
18
    return slug
19

  
20

  
21
def set_slug(apps, schema_editor):
22
    MapLayer = apps.get_model('maps', 'MapLayer')
23
    for layer in MapLayer.objects.all().order_by('-pk'):
24
        if not MapLayer.objects.filter(slug=layer.slug).exclude(pk=layer.pk).exists():
25
            continue
26
        layer.slug = generate_slug(layer)
27
        layer.save(update_fields=['slug'])
28

  
29

  
30
class Migration(migrations.Migration):
31

  
32
    dependencies = [
33
        ('maps', '0007_auto_20180706_1345'),
34
    ]
35

  
36
    operations = [
37
        migrations.RunPython(set_slug, lambda x, y: None),
38
    ]
combo/apps/maps/migrations/0009_map_layer_slug_unicity.py
1
# -*- coding: utf-8 -*-
2
from __future__ import unicode_literals
3

  
4
from django.db import migrations, models
5

  
6

  
7
class Migration(migrations.Migration):
8

  
9
    dependencies = [
10
        ('maps', '0008_map_layer_set_slug'),
11
    ]
12

  
13
    operations = [
14
        migrations.AlterField(
15
            model_name='maplayer',
16
            name='slug',
17
            field=models.SlugField(unique=True, verbose_name='Identifier'),
18
        ),
19
    ]
combo/apps/maps/models.py
95 95
    objects = MapLayerManager()
96 96

  
97 97
    label = models.CharField(_('Label'), max_length=128)
98
    slug = models.SlugField(_('Identifier'))
98
    slug = models.SlugField(_('Identifier'), unique=True)
99 99
    geojson_url = models.CharField(_('Geojson URL'), max_length=1024)
100 100
    marker_colour = models.CharField(_('Marker colour'), max_length=7, default='#0000FF')
101 101
    icon = models.CharField(_('Marker icon'), max_length=32, blank=True, null=True,
......
116 116
            base_slug = slugify(self.label)[:45]
117 117
            slug = base_slug
118 118
            i = 1
119
            while True:
120
                try:
121
                    MapLayer.objects.get(slug=slug)
122
                except self.DoesNotExist:
123
                    break
119
            while MapLayer.objects.filter(slug=slug).exists():
124 120
                slug = '%s-%s' % (base_slug, i)
125 121
                i += 1
126 122
            self.slug = slug
127
-