wagtailtrans icon indicating copy to clipboard operation
wagtailtrans copied to clipboard

Remove a Language

Open arifin4web opened this issue 7 years ago • 8 comments

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:

  1. Show a clear warning to the user, which related Translatable pages are going to be removed.
  2. Remove those pages and language itself.

arifin4web avatar Jul 27 '17 08:07 arifin4web

Codecov Report

Merging #100 into master will increase coverage by 0.36%. The diff coverage is 100%.

@@            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%> (ø)

codecov[bot] avatar Jul 27 '17 08:07 codecov[bot]

reviews are implemented! @mikedingjan

arifin4web avatar Aug 01 '17 09:08 arifin4web

Whats the update on this one? can this be merged now?

arifin4web avatar Aug 09 '17 16:08 arifin4web

Hi @arifin4web, It is awaiting review and I want to take it for a spin really soon.

jjanssen avatar Aug 14 '17 17:08 jjanssen

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?

jjanssen avatar Aug 22 '17 10:08 jjanssen

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?

jjanssen avatar Sep 25 '17 16:09 jjanssen

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.

mikedingjan avatar Sep 27 '17 11:09 mikedingjan

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.

arifin4web avatar Jul 25 '18 06:07 arifin4web