diff --git a/src/wagtailtrans/permissions.py b/src/wagtailtrans/permissions.py index 1966e1b5..12ba6dab 100644 --- a/src/wagtailtrans/permissions.py +++ b/src/wagtailtrans/permissions.py @@ -57,6 +57,23 @@ def get_or_create_language_group(language): return group +def remove_language_group(language): + """Remove translator group for a specific language (if exists). + + :param language: Language instance + :return: Boolean True + """ + try: + group = Group.objects.get(name='translator-%s' % language.code) + except Group.DoesNotExist: + # Do Nothing + pass + else: + group.delete() + + return True + + def create_group_page_permission(page, language): """Create new GroupPagePermissions for the newly created page diff --git a/src/wagtailtrans/signals.py b/src/wagtailtrans/signals.py index c909203d..bd036a36 100644 --- a/src/wagtailtrans/signals.py +++ b/src/wagtailtrans/signals.py @@ -1,12 +1,12 @@ from django.core.exceptions import ObjectDoesNotExist -from django.db.models.signals import m2m_changed, post_save, pre_delete +from django.db.models.signals import m2m_changed, post_save, pre_delete, post_delete from wagtail.admin.signals import init_new_page from wagtail.core.models import Site, get_page_models from wagtailtrans.conf import get_wagtailtrans_setting from wagtailtrans.models import Language, SiteLanguages, TranslatablePage from wagtailtrans.permissions import ( - create_group_permissions, get_or_create_language_group) + create_group_permissions, get_or_create_language_group, remove_language_group) def synchronize_trees(sender, instance, **kwargs): @@ -122,6 +122,16 @@ def create_language_permissions_and_group(sender, instance, **kwargs): create_group_permissions(group, instance) +def remove_language_roles(sender, instance, **kwargs): + """Remove the `Translator` role which was created along with Language. + + :param sender: Sender model + :param instance: Language instance + :param kwargs: kwargs + """ + remove_language_group(instance) + + def force_parent_language(**kwargs): """Force the initial language of the first page, before creating.. @@ -154,6 +164,7 @@ def register_signal_handlers(): """ post_save.connect(create_language_permissions_and_group, sender=Language) + post_delete.connect(remove_language_roles, sender=Language) init_new_page.connect(force_parent_language) if get_wagtailtrans_setting('SYNC_TREE'): if get_wagtailtrans_setting('LANGUAGES_PER_SITE'): diff --git a/tests/unit/test_views.py b/tests/unit/test_views.py index 26e55822..94ecb0be 100644 --- a/tests/unit/test_views.py +++ b/tests/unit/test_views.py @@ -8,6 +8,8 @@ from django.test import override_settings from tests.factories import language, pages, sites, users +from django.contrib.auth.models import Group +from wagtailtrans import permissions from wagtailtrans.models import Language, TranslatablePage from wagtailtrans.views.language import LanguageDeleteView from wagtailtrans.views.translation import TranslationView @@ -112,7 +114,7 @@ def test_response_language_edit_view(self, admin_client): class TestLanguageDeleteView(object): def setup(self): - self.default_language = language.LanguageFactory.create(code='en', is_default=True) + self.default_language = language.LanguageFactory(is_default=True, code='en', position=1) self.pages = sites.create_site_tree(language=self.default_language) self.second_language = language.LanguageFactory(is_default=False, code='fr', position=2) self.view = lambda language: LanguageDeleteView( @@ -120,10 +122,13 @@ def setup(self): model_admin=LanguageModelAdmin() ) + def _get_language_group_name(self, language): + return 'translator-%s' % language.code + def test_post(self, rf): """ When we delete non canonical language it should also delete the related - pages. + pages and related roles/groups. After a successfull post request the language and related pages for that specific language should be deleted. @@ -147,6 +152,8 @@ def test_post(self, rf): assert TranslatablePage.objects.count() == 6 assert TranslatablePage.objects.filter(language=self.second_language).count() == 3 assert self.second_language in Language.objects.all() + assert Group.objects.\ + filter(name=self._get_language_group_name(self.second_language)).count() == 1 response = self.view(self.second_language).dispatch(request) @@ -154,6 +161,8 @@ def test_post(self, rf): assert TranslatablePage.objects.count() == 3 assert TranslatablePage.objects.filter(language=self.second_language).count() == 0 assert self.second_language not in Language.objects.all() + assert Group.objects.\ + filter(name=self._get_language_group_name(self.second_language)).count() == 0 # New messages should be added assert messages.added_new