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 Meta:
|
||||
model = models.Visualization
|
||||
exclude = ('parameters',)
|
||||
exclude = ('slug', 'parameters',)
|
||||
widgets = {
|
||||
'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
|
||||
|
||||
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)
|
||||
|
|
|
@ -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
|
@ -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',
|
||||
|
|
Loading…
Reference in New Issue