misc: add slugs to visualizations (#30855)

This commit is contained in:
Frédéric Péters 2019-03-28 08:36:51 +01:00
parent ad0e1065f0
commit c196221f4b
7 changed files with 952 additions and 431 deletions

View File

@ -43,7 +43,7 @@ from . import models
class VisualizationForm(ModelForm):
class Meta:
model = models.Visualization
exclude = ('parameters',)
exclude = ('slug', 'parameters',)
widgets = {
'name': TextInput,
}

View File

@ -0,0 +1,42 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.12 on 2019-03-28 07:17
from __future__ import unicode_literals
from django.db import migrations, models
from django.utils.text import slugify
class Migration(migrations.Migration):
dependencies = [
('visualization', '0002_rename_parameters'),
]
def forward_func(apps, schema_editor):
Visualization = apps.get_model('visualization', 'Visualization')
new_slugs = {}
for instance in Visualization.objects.all():
if not instance.slug:
new_slug = slugify(instance.name[:60]).strip('-')
if new_slug in new_slugs:
i = 2
while True:
suffixed_slug = new_slug + '-%s' % i
if not suffixed_slug in new_slugs:
new_slug = suffixed_slug
break
i += 1
new_slugs[new_slug] = True
instance.slug = new_slug
instance.save()
def reverse_func(apps, schema_editor):
pass
operations = [
migrations.AddField(
model_name='visualization',
name='slug',
field=models.SlugField(null=True, unique=True, verbose_name='Identifier'),
),
migrations.RunPython(forward_func, reverse_func)
]

View File

@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.12 on 2019-03-28 07:25
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('visualization', '0003_visualization_slug'),
]
operations = [
migrations.AlterField(
model_name='visualization',
name='slug',
field=models.SlugField(unique=True, verbose_name='Identifier'),
),
]

View File

@ -18,6 +18,7 @@ import json
import datetime
from django.db import models
from django.utils.text import slugify
from django.utils.translation import ugettext_lazy as _
from jsonfield import JSONField
@ -33,6 +34,7 @@ class JSONEncoder(json.JSONEncoder):
class Visualization(models.Model):
slug = models.SlugField(verbose_name=_('Identifier'), unique=True)
name = models.TextField(verbose_name=_('name'))
parameters = JSONField(verbose_name=_('parameters'), encoder_class=JSONEncoder)
@ -43,3 +45,20 @@ class Visualization(models.Model):
def __unicode__(self):
return self.name
def natural_key(self):
return (self.slug,)
def save(self, *args, **kwargs):
if not self.slug:
slug = base_slug = slugify(self.name)[:60].strip('-')
i = 1
while True:
try:
Visualization.objects.get(slug=slug)
except Visualization.DoesNotExist:
break
i += 1
slug = '%s-%s' % (base_slug, i)
self.slug = slug
return super(Visualization, self).save(*args, **kwargs)

View File

@ -216,6 +216,7 @@ class VisualizationsJSONView(MultipleObjectMixin, View):
data_uri = reverse('visualization-json', kwargs={'pk': visualization.pk})
data.append({
'name': visualization.name,
'slug': visualization.slug,
'path': request.build_absolute_uri(path),
'data-url': request.build_absolute_uri(data_uri),
})

File diff suppressed because it is too large Load Diff

View File

@ -35,6 +35,15 @@ def test_superuser(app, admin):
app.get('/', status=200)
def test_visualizations_json_api(schema1, app, admin):
Visualization(name='test', parameters={}).save()
Visualization(name='test', parameters={}).save()
Visualization(name='test', parameters={}).save()
login(app, admin)
resp = app.get(reverse('visualizations-json'))
assert set([x['slug'] for x in resp.json]) == set(['test', 'test-2', 'test-3'])
def test_visualization_json_api(schema1, app, admin):
visualization = Visualization(
name='test',