diff --git a/admin/providers/views.py b/admin/providers/views.py index d21cd65a93b..182be5190fe 100644 --- a/admin/providers/views.py +++ b/admin/providers/views.py @@ -1,7 +1,8 @@ from django.shortcuts import redirect from django.views.generic import TemplateView from django.contrib import messages -from osf.models import RegistrationProvider, OSFUser +from osf.models import RegistrationProvider, OSFUser, NotificationType +from website.settings import DOMAIN class AddAdminOrModerator(TemplateView): @@ -33,12 +34,28 @@ def post(self, request, *args, **kwargs): messages.error(request, f'User with guid: {data["add-moderators-form"][0]} is already a moderator or admin') return redirect(f'{self.url_namespace}:add_admin_or_moderator', provider_id=provider.id) + context = {} + context['notification_settings_url'] = f'{DOMAIN}reviews/preprints/{provider._id}/notifications' + context['provider_name'] = provider.name + context['provider__id'] = provider._id + context['is_reviews_moderator_notification'] = True + context['referrer_fullname'] = target_user.fullname + context['user_fullname'] = target_user.fullname + context['is_reviews_moderator_notification'] = True if 'admin' in data: provider.add_to_group(target_user, 'admin') target_type = 'admin' + context['is_admin'] = True else: provider.add_to_group(target_user, 'moderator') target_type = 'moderator' + context['is_admin'] = False + + notification_type = NotificationType.Type.PROVIDER_MODERATOR_ADDED + notification_type.instance.emit( + user=target_user, + event_context=context, + ) messages.success(request, f'The following {target_type} was successfully added: {target_user.fullname} ({target_user.username})') diff --git a/admin_tests/registration_providers/test_views.py b/admin_tests/registration_providers/test_views.py index 29e9b3f7223..f5cf8bb242f 100644 --- a/admin_tests/registration_providers/test_views.py +++ b/admin_tests/registration_providers/test_views.py @@ -9,7 +9,7 @@ RegistrationProviderFactory, ProviderAssetFileFactory ) -from osf.models import RegistrationProvider, RegistrationSchema +from osf.models import RegistrationProvider, RegistrationSchema, NotificationType from admin_tests.utilities import setup_view, setup_form_view from admin.registration_providers import views from admin.providers.views import AddAdminOrModerator, RemoveAdminsAndModerators @@ -26,6 +26,7 @@ from django.contrib.messages.storage.fallback import FallbackStorage from osf.migrations import update_provider_auth_groups +from tests.utils import assert_notification pytestmark = pytest.mark.django_db @@ -318,7 +319,8 @@ def test_post_add(self, add_moderator_view, req, user, provider): messages = FallbackStorage(req) setattr(req, '_messages', messages) - res = add_moderator_view.post(req) + with assert_notification(type=NotificationType.Type.PROVIDER_MODERATOR_ADDED, user=user): + res = add_moderator_view.post(req) assert res.status_code == 302 assert user in provider.get_group('moderator').user_set.all() diff --git a/api_tests/mailhog/provider/test_registration_provider_moderator.py b/api_tests/mailhog/provider/test_registration_provider_moderator.py new file mode 100644 index 00000000000..1dc0005ad67 --- /dev/null +++ b/api_tests/mailhog/provider/test_registration_provider_moderator.py @@ -0,0 +1,83 @@ +import pytest +from waffle.testutils import override_switch +from osf import features +from django.test import RequestFactory + +from osf_tests.factories import ( + AuthUserFactory, + RegistrationProviderFactory +) +from admin_tests.utilities import setup_view +from admin.providers.views import AddAdminOrModerator + +from django.contrib.messages.storage.fallback import FallbackStorage +from osf.migrations import update_provider_auth_groups +from tests.utils import get_mailhog_messages, delete_mailhog_messages +from osf.models import NotificationType + +pytestmark = pytest.mark.django_db + + +@pytest.mark.urls('admin.base.urls') +class TestEditModerators: + + @pytest.fixture() + def req(self, user): + req = RequestFactory().get('/fake_path') + req.user = user + return req + + @pytest.fixture() + def provider(self): + provider = RegistrationProviderFactory() + update_provider_auth_groups() + return provider + + @pytest.fixture() + def user(self): + return AuthUserFactory() + + @pytest.fixture() + def add_moderator_view(self, req, provider): + view = AddAdminOrModerator() + view = setup_view(view, req) + view.kwargs = {'provider_id': provider.id} + return view + + @override_switch(features.ENABLE_MAILHOG, active=True) + def test_post_add(self, add_moderator_view, req, user, provider): + delete_mailhog_messages() + + req.POST = { + 'csrfmiddlewaretoken': 'fake csfr', + 'add-moderators-form': [user._id], + 'moderator': ['Add Moderator'] + } + + # django.contrib.messages has a bug which effects unittests + # more info here -> https://code.djangoproject.com/ticket/17971 + setattr(req, 'session', 'session') + messages = FallbackStorage(req) + setattr(req, '_messages', messages) + + res = add_moderator_view.post(req) + assert res.status_code == 302 + assert user in provider.get_group('moderator').user_set.all() + + # try to add the same user, but another group + req.POST = { + 'csrfmiddlewaretoken': 'fake csfr', + 'add-moderators-form': [user._id], + 'admin': ['Add Admin'] + } + res = add_moderator_view.post(req) + assert res.status_code == 302 + assert user in provider.get_group('moderator').user_set.all() + assert user not in provider.get_group('admin').user_set.all() + res = get_mailhog_messages() + assert res['count'] == 1 + assert res['items'][0]['Content']['Headers']['To'][0] == user.username + assert res['items'][0]['Content']['Headers']['Subject'][0] == NotificationType.objects.get( + name=NotificationType.Type.PROVIDER_MODERATOR_ADDED + ).subject + delete_mailhog_messages()