wagtailtrans
wagtailtrans copied to clipboard
Remove a Language
As suggested in the issue #10 pre_delete
signal couldn't be used. The signal doesn't Trigger before raising ProtectedError. Therefore Implemented a custom delete view for LanguageModelAdmin
which will:
- Show a clear warning to the user, which related Translatable pages are going to be removed.
- Remove those pages and language itself.
Codecov Report
Merging #100 into master will increase coverage by
0.36%
. The diff coverage is100%
.
@@ Coverage Diff @@
## master #100 +/- ##
==========================================
+ Coverage 89.5% 89.86% +0.36%
==========================================
Files 14 16 +2
Lines 505 523 +18
==========================================
+ Hits 452 470 +18
Misses 53 53
Impacted Files | Coverage Δ | |
---|---|---|
...gtailtrans/templatetags/languages_wagtail_admin.py | 100% <100%> (ø) |
|
src/wagtailtrans/views/language.py | 100% <100%> (ø) |
reviews are implemented! @mikedingjan
Whats the update on this one? can this be merged now?
Hi @arifin4web, It is awaiting review and I want to take it for a spin really soon.
I'm getting the following stacktrace when I click on delete language:
TemplateSyntaxError at /admin/wagtailtrans/language/delete/3/
Invalid block tag on line 15: 'get_language_relate_pages', expected 'endif'. Did you forget to register or load this tag?
Can we fix this and add a test for that?
Stacktrace
Environment:
Request Method: GET
Request URL: http://localhost:8000/admin/wagtailtrans/language/delete/3/
Django Version: 1.10.5
Python Version: 2.7.10
Installed Applications:
['django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'wagtail.contrib.settings',
'wagtail.contrib.modeladmin',
'wagtail.wagtailforms',
'wagtail.wagtailredirects',
'wagtail.wagtailembeds',
'wagtail.wagtailsites',
'wagtail.wagtailusers',
'wagtail.wagtailsnippets',
'wagtail.wagtaildocs',
'wagtail.wagtailimages',
'wagtail.wagtailsearch',
'wagtail.wagtailadmin',
'wagtail.wagtailcore',
'wagtailtrans',
'modelcluster',
'taggit',
'tests._sandbox.pages',
'tests._sandbox.search']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'wagtail.wagtailcore.middleware.SiteMiddleware',
'wagtail.wagtailredirects.middleware.RedirectMiddleware',
'wagtailtrans.middleware.TranslationMiddleware']
Template error:
In template /Users/j.janssen/Sites/git-projects/wagtailtrans/src/wagtailtrans/templates/modeladmin/wagtailtrans/language/delete.html, error at line 15
Invalid block tag on line 15: 'get_language_relate_pages', expected 'endif'. Did you forget to register or load this tag? 5 : <div class="nice-padding">
6 : {% if protected_error %}
7 : <h2>{% blocktrans with view.verbose_name|capfirst as model_name %}{{ model_name }} could not be deleted{% endblocktrans %}</h2>
8 : <p>{% blocktrans with instance as instance_name %}'{{ instance_name }}' is currently referenced by other objects, and cannot be deleted without jeopardising data integrity. To delete it successfully, first remove references from the following objects, then try again:{% endblocktrans %}</p>
9 : <ul>
10 : {% for obj in linked_objects %}<li><b>{{ obj|get_content_type_for_obj|title }}:</b> {{ obj }}</li>{% endfor %}
11 : </ul>
12 : <p><a href="{{ view.index_url }}" class="button">{% trans 'Go back to listing' %}</a></p>
13 : {% else %}
14 : <p>{{ view.confirmation_message }}</p>
15 : {% get_language_relate_pages instance as related_pages %}
16 : {% if related_pages %}
17 : {% with instance as instance_name %}
18 : <p>{% blocktrans %}'{{ instance_name }}' is currently referenced by Following TranslatablePage : {% endblocktrans %}</p>
19 : <ul>
20 : {% for obj in related_pages %}<li><b>{{ obj }} ({{instance_name}})</b></li>{% endfor %}
21 : </ul>
22 : <p>{% blocktrans %} If you delete the language '{{ instance_name }}', All of these pages will also be deleted. {% endblocktrans %}</p>
23 : {% endwith %}
24 : {% endif %}
25 : <form action="{{ view.delete_url }}" method="POST">
File "/Users/j.janssen/.virtualenvs/wagtailtrans/lib/python2.7/site-packages/django/core/handlers/exception.py" in inner
39. response = get_response(request)
File "/Users/j.janssen/.virtualenvs/wagtailtrans/lib/python2.7/site-packages/django/core/handlers/base.py" in _get_response
217. response = self.process_exception_by_middleware(e, request)
File "/Users/j.janssen/.virtualenvs/wagtailtrans/lib/python2.7/site-packages/django/core/handlers/base.py" in _get_response
215. response = response.render()
File "/Users/j.janssen/.virtualenvs/wagtailtrans/lib/python2.7/site-packages/django/template/response.py" in render
109. self.content = self.rendered_content
File "/Users/j.janssen/.virtualenvs/wagtailtrans/lib/python2.7/site-packages/django/template/response.py" in rendered_content
84. template = self.resolve_template(self.template_name)
File "/Users/j.janssen/.virtualenvs/wagtailtrans/lib/python2.7/site-packages/django/template/response.py" in resolve_template
66. return select_template(template, using=self.using)
File "/Users/j.janssen/.virtualenvs/wagtailtrans/lib/python2.7/site-packages/django/template/loader.py" in select_template
48. return engine.get_template(template_name)
File "/Users/j.janssen/.virtualenvs/wagtailtrans/lib/python2.7/site-packages/django/template/backends/django.py" in get_template
39. return Template(self.engine.get_template(template_name), self)
File "/Users/j.janssen/.virtualenvs/wagtailtrans/lib/python2.7/site-packages/django/template/engine.py" in get_template
160. template, origin = self.find_template(template_name)
File "/Users/j.janssen/.virtualenvs/wagtailtrans/lib/python2.7/site-packages/django/template/engine.py" in find_template
134. name, template_dirs=dirs, skip=skip,
File "/Users/j.janssen/.virtualenvs/wagtailtrans/lib/python2.7/site-packages/django/template/loaders/base.py" in get_template
44. contents, origin, origin.template_name, self.engine,
File "/Users/j.janssen/.virtualenvs/wagtailtrans/lib/python2.7/site-packages/django/template/base.py" in __init__
191. self.nodelist = self.compile_nodelist()
File "/Users/j.janssen/.virtualenvs/wagtailtrans/lib/python2.7/site-packages/django/template/base.py" in compile_nodelist
233. return parser.parse()
File "/Users/j.janssen/.virtualenvs/wagtailtrans/lib/python2.7/site-packages/django/template/base.py" in parse
518. raise self.error(token, e)
Exception Type: TemplateSyntaxError at /admin/wagtailtrans/language/delete/3/
Exception Value: Invalid block tag on line 15: 'get_language_relate_pages', expected 'endif'. Did you forget to register or load this tag?
Hi @arifin4web
I took a moment to make the overview for deletion a little more appealing. Last thing I noticed when we would be deleting a canonical language it would also be relevant to show the impact of connected pages which are linked to the canonical language.
For eg we have the following languages:
- English (default)
- Dutch
Deleting English will also delete Dutch. It is this something we can show accordingly in the list of pages we are about to delete?
As I remember correctly the canonical_page
is a foreign key with models.SET_NULL
e.g. when removing a default language it'll remove all pages of that language, and make all the other pages canonical
, no more linked pages at all.
Because we have a signal
which synchronises the deletion of pages with SYNC_TREE=True
this will have other behaviour than expected.
So we can either disconnect the pre_delete
signal for this specific use-case. An other option is to disallow the removal of the default language when SYNC_TREE=True
and other languages are still in the database.
Thing to keep in mind, LANGUAGES_PER_SITE=True
can be tricky with this.
I apologize for being so late with this MR.
My opinion about removing a default language is that we should never allow them to be deleted. One of the reason being, after we delete a default language we wouldn't be able to create a translatable page. We have to create/set another language as default.