Skip to content

Commit 832d5f0

Browse files
committed
Add migration
1 parent ff7002c commit 832d5f0

File tree

3 files changed

+113
-7
lines changed

3 files changed

+113
-7
lines changed

djangocms_frontend/migrations/0001_initial.py

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,10 @@
22

33
import django.core.serializers.json
44
import django.db.models.deletion
5-
from cms.utils.compat import DJANGO_3_1
65
from django.db import migrations, models
76

87
import djangocms_frontend.fields
98

10-
if DJANGO_3_1:
11-
from django_jsonfield_backport.models import JSONField
12-
else:
13-
JSONField = models.JSONField
14-
159

1610
class Migration(migrations.Migration):
1711
initial = True
@@ -49,7 +43,7 @@ class Migration(migrations.Migration):
4943
),
5044
(
5145
"config",
52-
JSONField(
46+
models.JSONField(
5347
default=dict,
5448
encoder=django.core.serializers.json.DjangoJSONEncoder,
5549
),
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
from django.db import migrations
2+
3+
4+
def convert_item(config, direction):
5+
"""Convert FrontendUIItem config to new djangocms_link format."""
6+
if direction == "forward":
7+
if config.get("external_link"):
8+
if config.get("anchor"):
9+
anchor = "#" + config.get("anchor")
10+
del config["anchor"]
11+
else:
12+
anchor = ""
13+
config["link"] = {"external_link": config.get("external_link") + anchor}
14+
del config["external_link"]
15+
return True
16+
if config.get("internal_link"):
17+
model = config.get("internal_link").get("model")
18+
pk = config.get("internal_link").get("pk")
19+
config["link"] = {"internal_link": f"{model}:{pk}"}
20+
if config.get("anchor"):
21+
config["link"]["anchor"] = "#" + config.get("anchor")
22+
del config["anchor"]
23+
del config["internal_link"]
24+
return True
25+
if config.get("file_link"):
26+
config["link"] = {"file_link": config.get("file_link").get("pk")}
27+
del config["file_link"]
28+
return True
29+
if config.get("phone"):
30+
config["link"] = {"external_link": f"tel:{config.get('phone')}"}
31+
del config["phone"]
32+
return True
33+
if config.get("mailto"):
34+
config["link"] = {"external_link": f"mailto:{config.get('mailto')}"}
35+
del config["mailto"]
36+
return True
37+
if config.get("anchor"):
38+
config["link"] = {"external_link": "#" + config.get('anchor')}
39+
del config["anchor"]
40+
return True
41+
42+
elif direction == "backward" and config.get("link"):
43+
link = config.get("link")
44+
if link.get("external_link"):
45+
if "#" in link.get("external_link"):
46+
config["anchor"] = link.get("external_link").split("#", 1)[1]
47+
ext = link.get("external_link").split("#", 1)[0]
48+
if ext.startswith("tel:"):
49+
config["phone"] = ext[4:]
50+
elif ext.startswith("mailto:"):
51+
config["mailto"] = ext[7:]
52+
elif ext:
53+
config["external_link"] = ext
54+
elif link.get("internal_link"):
55+
model, pk = link.get("internal_link").split(":")
56+
config["internal_link"] = {"model": model, "pk": int(pk)}
57+
if link.get("anchor"):
58+
config["anchor"] = link.get("anchor")[1:]
59+
elif link.get("file_link"):
60+
config["file_link"] = {"model": "filer.file", "pk": int(link.get("file_link"))}
61+
del config["link"]
62+
return True
63+
return False
64+
65+
66+
def convert(apps, schema_editor, direction):
67+
FrontendUIItem = apps.get_model("djangocms_frontend", "FrontendUIItem")
68+
for item in FrontendUIItem.objects.all():
69+
changed = convert_item(item.config, direction)
70+
if changed:
71+
item.save()
72+
73+
74+
class Migration(migrations.Migration):
75+
dependencies = [
76+
("djangocms_frontend", "0001_initial"),
77+
]
78+
79+
operations = [
80+
migrations.RunPython(
81+
lambda apps, schema_editor: convert(apps, schema_editor, "forward"),
82+
lambda apps, schema_editor: convert(apps, schema_editor, "backward"),
83+
elidable=True
84+
),
85+
]

tests/link/test_migration.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
from django.test.testcases import TestCase
2+
3+
4+
class LinkMigrationTestCase(TestCase):
5+
def setUp(self):
6+
import importlib
7+
8+
link_migration = importlib.import_module("djangocms_frontend.migrations.0002_migrate_links")
9+
self.convert = staticmethod(link_migration.convert_item)
10+
11+
def test_link_migration(self):
12+
test_links = (
13+
dict(external_link="https://www.django-cms.com"),
14+
dict(external_link="https://www.django-cms.com", anchor="top"),
15+
dict(internal_link=dict(model="cms.page", pk=1)),
16+
dict(internal_link=dict(model="cms.page", pk=1), anchor="top"),
17+
dict(file_link=dict(model="filer.file", pk=1)),
18+
dict(phone="1234567890"),
19+
dict(mailto="[email protected]")
20+
)
21+
22+
for link in test_links:
23+
with self.subTest(link=link):
24+
config = link.copy()
25+
self.convert(config, "forward")
26+
self.convert(config, "backward")
27+
self.assertEqual(link, config)

0 commit comments

Comments
 (0)