0001-maps-MapLayer-slug-unicity-39539.patch
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 |
- |