misc: add slugs to visualizations (#30855)
This commit is contained in:
parent
ad0e1065f0
commit
c196221f4b
|
@ -43,7 +43,7 @@ from . import models
|
||||||
class VisualizationForm(ModelForm):
|
class VisualizationForm(ModelForm):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = models.Visualization
|
model = models.Visualization
|
||||||
exclude = ('parameters',)
|
exclude = ('slug', 'parameters',)
|
||||||
widgets = {
|
widgets = {
|
||||||
'name': TextInput,
|
'name': TextInput,
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
|
]
|
|
@ -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'),
|
||||||
|
),
|
||||||
|
]
|
|
@ -18,6 +18,7 @@ import json
|
||||||
import datetime
|
import datetime
|
||||||
|
|
||||||
from django.db import models
|
from django.db import models
|
||||||
|
from django.utils.text import slugify
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
from jsonfield import JSONField
|
from jsonfield import JSONField
|
||||||
|
|
||||||
|
@ -33,6 +34,7 @@ class JSONEncoder(json.JSONEncoder):
|
||||||
|
|
||||||
|
|
||||||
class Visualization(models.Model):
|
class Visualization(models.Model):
|
||||||
|
slug = models.SlugField(verbose_name=_('Identifier'), unique=True)
|
||||||
name = models.TextField(verbose_name=_('name'))
|
name = models.TextField(verbose_name=_('name'))
|
||||||
parameters = JSONField(verbose_name=_('parameters'), encoder_class=JSONEncoder)
|
parameters = JSONField(verbose_name=_('parameters'), encoder_class=JSONEncoder)
|
||||||
|
|
||||||
|
@ -43,3 +45,20 @@ class Visualization(models.Model):
|
||||||
|
|
||||||
def __unicode__(self):
|
def __unicode__(self):
|
||||||
return self.name
|
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)
|
||||||
|
|
|
@ -216,6 +216,7 @@ class VisualizationsJSONView(MultipleObjectMixin, View):
|
||||||
data_uri = reverse('visualization-json', kwargs={'pk': visualization.pk})
|
data_uri = reverse('visualization-json', kwargs={'pk': visualization.pk})
|
||||||
data.append({
|
data.append({
|
||||||
'name': visualization.name,
|
'name': visualization.name,
|
||||||
|
'slug': visualization.slug,
|
||||||
'path': request.build_absolute_uri(path),
|
'path': request.build_absolute_uri(path),
|
||||||
'data-url': request.build_absolute_uri(data_uri),
|
'data-url': request.build_absolute_uri(data_uri),
|
||||||
})
|
})
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -35,6 +35,15 @@ def test_superuser(app, admin):
|
||||||
app.get('/', status=200)
|
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):
|
def test_visualization_json_api(schema1, app, admin):
|
||||||
visualization = Visualization(
|
visualization = Visualization(
|
||||||
name='test',
|
name='test',
|
||||||
|
|
Loading…
Reference in New Issue