Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 18 additions & 1 deletion admin/providers/views.py
Original file line number Diff line number Diff line change
@@ -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):
Expand Down Expand Up @@ -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})')

Expand Down
6 changes: 4 additions & 2 deletions admin_tests/registration_providers/test_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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

Expand Down Expand Up @@ -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()

Expand Down
83 changes: 83 additions & 0 deletions api_tests/mailhog/provider/test_registration_provider_moderator.py
Original file line number Diff line number Diff line change
@@ -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
Comment thread
Ostap-Zherebetskyi marked this conversation as resolved.
# 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()
Loading