Skip to content

Commit f196ff5

Browse files
authored
Remove wagtail-import-export (#495)
1 parent 2040f85 commit f196ff5

17 files changed

Lines changed: 130 additions & 95 deletions

File tree

coderedcms/admin_urls.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
from django.urls import include, path, re_path
2-
from wagtailimportexport import urls as wagtailimportexport_urls
32
from wagtail.admin import urls as wagtailadmin_urls
4-
from coderedcms.views import import_pages_from_csv_file
3+
from coderedcms.views import import_index, import_pages_from_csv_file
54

65

76
urlpatterns = [
7+
path('codered/import-export/',
8+
import_index, name="import_index"),
89
path('codered/import-export/import_from_csv/',
910
import_pages_from_csv_file, name="import_from_csv"),
1011
re_path(r'', include(wagtailadmin_urls)),
11-
re_path(r'', include(wagtailimportexport_urls)),
1212
]

coderedcms/forms.py

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
"""
44
import csv
55
import os
6-
import re
76
from django import forms
7+
from django.contrib.contenttypes.models import ContentType
88
from django.core.exceptions import ValidationError
99
from django.db import models
1010
from django.http import HttpResponse
@@ -172,16 +172,13 @@ class SearchForm(forms.Form):
172172
def get_page_model_choices():
173173
"""
174174
Returns a list of tuples of all creatable Codered pages
175-
in the format of ("Custom Codered Page", "CustomCoderedPage")
175+
in the format of (app_label:model, "Verbose Name")
176176
"""
177177
from coderedcms.models import get_page_models
178-
return (
179-
(
180-
page.__name__,
181-
re.sub(
182-
r'((?<=[a-z])[A-Z]|(?<!\A)[A-Z](?=[a-z]))',
183-
r' \1',
184-
page.__name__
185-
)
186-
) for page in get_page_models() if page.is_creatable
187-
)
178+
179+
rval = []
180+
for page in get_page_models():
181+
if page.is_creatable:
182+
ct = ContentType.objects.get_for_model(page)
183+
rval.append((f"{ct.app_label}:{ct.model}", ct.name))
184+
return rval

coderedcms/importexport.py

Lines changed: 64 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,73 @@
1+
"""
2+
This code is largely copied or extended upon the now defunct
3+
``wagtailimportexport`` package.
4+
5+
In the future we may want to build a more robust import/exporter for CSV files,
6+
or simply deprecate all of this functionality.
7+
8+
See: https://github.com/torchbox/wagtail-import-export/
9+
"""
110
import csv
211
import copy
312

413
from django import forms
514
from django.apps import apps
615
from django.contrib.contenttypes.models import ContentType
7-
from django.db import transaction
8-
16+
from django.db import models, transaction
17+
from django.utils.translation import ugettext as _
18+
from modelcluster.models import get_all_child_relations
19+
from wagtail.admin.widgets import AdminPageChooser
920
from wagtail.core.models import Page
1021

11-
from wagtailimportexport.forms import ImportFromFileForm
12-
from wagtailimportexport.importing import update_page_references
13-
1422
from coderedcms.forms import get_page_model_choices
1523

1624

17-
class ImportPagesFromCSVFileForm(ImportFromFileForm):
25+
class ImportPagesFromCSVFileForm(forms.Form):
26+
"""
27+
Mostly copied from:
28+
https://github.com/torchbox/wagtail-import-export/blob/master/wagtailimportexport/forms.py#L29
29+
with addition of ``page_type``.
30+
"""
1831
page_type = forms.ChoiceField(choices=get_page_model_choices)
1932

33+
file = forms.FileField(label=_("File to import"))
34+
35+
parent_page = forms.ModelChoiceField(
36+
queryset=Page.objects.all(),
37+
widget=AdminPageChooser(can_choose_root=True, show_edit_link=False),
38+
label=_("Destination parent page"),
39+
help_text=_("Imported pages will be created as children of this page.")
40+
)
41+
42+
43+
def update_page_references(model, pages_by_original_id):
44+
"""
45+
Copied from:
46+
https://github.com/torchbox/wagtail-import-export/blob/master/wagtailimportexport/importing.py#L67
47+
"""
48+
for field in model._meta.get_fields():
49+
if isinstance(field, models.ForeignKey) and issubclass(field.related_model, Page):
50+
linked_page_id = getattr(model, field.attname)
51+
try:
52+
# see if the linked page is one of the ones we're importing
53+
linked_page = pages_by_original_id[linked_page_id]
54+
except KeyError:
55+
# any references to pages outside of the import should be left unchanged
56+
continue
57+
58+
# update fk to the linked page's new ID
59+
setattr(model, field.attname, linked_page.id)
60+
61+
# update references within inline child models, including the ParentalKey pointing back
62+
# to the page
63+
for rel in get_all_child_relations(model):
64+
for child in getattr(model, rel.get_accessor_name()).all():
65+
# reset the child model's PK so that it will be inserted as a new record
66+
# rather than updating an existing one
67+
child.pk = None
68+
# update page references on the child model, including the ParentalKey
69+
update_page_references(child, pages_by_original_id)
70+
2071

2172
@transaction.atomic()
2273
def import_pages(import_data, parent_page):
@@ -69,7 +120,7 @@ def import_pages(import_data, parent_page):
69120
strict_fks=False
70121
)
71122
base_page = pages_by_original_id[specific_page.id]
72-
specific_page.page_ptr = base_page
123+
specific_page.base_page_ptr = base_page
73124
specific_page.__dict__.update(base_page.__dict__)
74125
specific_page.content_type = ContentType.objects.get_for_model(model)
75126
update_page_references(specific_page, pages_by_original_id)
@@ -80,7 +131,12 @@ def import_pages(import_data, parent_page):
80131

81132
def convert_csv_to_json(csv_file, page_type):
82133
pages_json = {"pages": []}
83-
default_page_data = {"app_label": "website", "content": {"pk": None}, "model": page_type}
134+
app_label, klass = page_type.split(":")
135+
default_page_data = {
136+
"app_label": app_label,
137+
"content": {"pk": None},
138+
"model": klass,
139+
}
84140

85141
pages_csv_dict = csv.DictReader(csv_file)
86142
for row in pages_csv_dict:

coderedcms/models/page_models.py

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -554,17 +554,6 @@ def body_preview(self):
554554
preview = body[:200] + "..." if len(body) > 200 else body
555555
return mark_safe(preview)
556556

557-
@property
558-
def page_ptr(self):
559-
"""
560-
Overwrite of `page_ptr` to make it compatible with wagtailimportexport.
561-
"""
562-
return self.base_page_ptr
563-
564-
@page_ptr.setter
565-
def page_ptr(self, value):
566-
self.base_page_ptr = value
567-
568557

569558
class CoderedArticlePage(CoderedWebPage):
570559
"""

coderedcms/project_template/basic/project_name/settings/base.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@
3434
'modelcluster',
3535
'taggit',
3636
'wagtailcache',
37-
'wagtailimportexport',
3837
'wagtailseo',
3938

4039
# Wagtail

coderedcms/project_template/sass/project_name/settings/base.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333
'modelcluster',
3434
'taggit',
3535
'wagtailcache',
36-
'wagtailimportexport',
3736
'wagtailseo',
3837

3938
# Wagtail

coderedcms/templates/wagtailimportexport/export_to_file.html

Lines changed: 0 additions & 11 deletions
This file was deleted.

coderedcms/templates/wagtailimportexport/import_from_api.html

Lines changed: 0 additions & 11 deletions
This file was deleted.

coderedcms/templates/wagtailimportexport/import_from_csv.html

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,24 @@
1414
{% include "wagtailadmin/shared/header.html" with title=title_str icon="download" %}
1515

1616
<div class="nice-padding">
17-
<form action="{% url 'import_from_csv' %}" enctype="multipart/form-data" method="POST" novalidate>
17+
<form action="{% url 'import_from_csv' %}" enctype="multipart/form-data" method="POST">
1818
{% csrf_token %}
1919
<ul class="fields">
2020
{% for field in form %}
2121
{% include "wagtailadmin/shared/field_as_li.html" %}
2222
{% endfor %}
2323
</ul>
2424

25+
<br>
26+
<p>
27+
<b>{% trans "IMPORTANT:" %}</b>
28+
{% trans "CSV file must be in the correct format before importing." %}
29+
<a href="https://docs.coderedcorp.com/wagtail-crx/features/import_export.html">
30+
{% trans "Read the importing guide." %}
31+
</a>
32+
</p>
33+
<br>
34+
2535
<input type="submit" value="{% trans 'Import' %}" class="button">
2636
</form>
2737
</div>

coderedcms/templates/wagtailimportexport/import_from_file.html

Lines changed: 0 additions & 11 deletions
This file was deleted.

0 commit comments

Comments
 (0)