Skip to content

Commit 8cb38c7

Browse files
authored
[ENG-4673] Add search by ORCID functionality to admin (#11129)
## Purpose Add search by ORCID field to users search admin page ## Ticket https://openscience.atlassian.net/browse/ENG-4673
1 parent b046a63 commit 8cb38c7

File tree

3 files changed

+57
-1
lines changed

3 files changed

+57
-1
lines changed

admin/users/forms.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ class UserSearchForm(forms.Form):
1414
guid = forms.CharField(label='guid', min_length=5, max_length=5, required=False) # TODO: Move max to 6 when needed
1515
name = forms.CharField(label='name', required=False)
1616
email = forms.EmailField(label='email', required=False)
17+
orcid = forms.CharField(label='orcid', required=False)
1718

1819

1920
class MergeUserForm(forms.Form):

admin/users/views.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
from framework.auth.core import generate_verification_key
2626

2727
from website import search
28+
from website.settings import EXTERNAL_IDENTITY_PROFILE
2829

2930
from osf.models.admin_log_entry import (
3031
update_admin_log,
@@ -126,6 +127,7 @@ def form_valid(self, form):
126127
guid = form.cleaned_data['guid']
127128
name = form.cleaned_data['name']
128129
email = form.cleaned_data['email']
130+
orcid = form.cleaned_data['orcid']
129131
if name:
130132
return redirect(reverse('users:search-list', kwargs={'name': name}))
131133

@@ -148,6 +150,18 @@ def form_valid(self, form):
148150

149151
return redirect(reverse('users:user', kwargs={'guid': guid}))
150152

153+
if orcid:
154+
external_id_provider = EXTERNAL_IDENTITY_PROFILE.get('OrcidProfile')
155+
user = get_user(external_id_provider=external_id_provider, external_id=orcid)
156+
157+
if not user:
158+
return page_not_found(
159+
self.request,
160+
AttributeError(f'resource with id "{orcid}" not found.')
161+
)
162+
163+
return redirect(reverse('users:user', kwargs={'guid': user._id}))
164+
151165
return super().form_valid(form)
152166

153167

admin_tests/users/test_views.py

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -402,7 +402,14 @@ def test_correct_view_permissions(self):
402402
class TestUserSearchView(AdminTestCase):
403403

404404
def setUp(self):
405-
self.user_1 = AuthUserFactory(fullname='Broken Matt Hardy')
405+
self.user_1 = AuthUserFactory(
406+
fullname='Broken Matt Hardy',
407+
external_identity={
408+
settings.EXTERNAL_IDENTITY_PROFILE.get('OrcidProfile'): {
409+
'1234-5678': 'VERIFIED'
410+
}
411+
}
412+
)
406413
self.user_2 = AuthUserFactory(fullname='Jeff Hardy')
407414
self.user_3 = AuthUserFactory(fullname='Reby Sky')
408415
self.user_4 = AuthUserFactory(fullname='King Maxel Hardy')
@@ -425,6 +432,14 @@ def test_search_user_by_guid(self):
425432
assert response.status_code == 302
426433
assert response.headers['location'] == f'/users/{self.user_1.guids.first()._id}/'
427434

435+
form_data = {
436+
'guid': 'wrong'
437+
}
438+
form = UserSearchForm(data=form_data)
439+
assert form.is_valid()
440+
response = self.view.form_valid(form)
441+
assert response.status_code == 404
442+
428443
def test_search_user_by_name(self):
429444
form_data = {
430445
'name': 'Hardy'
@@ -455,6 +470,14 @@ def test_search_user_by_username(self):
455470
assert response.status_code == 302
456471
assert response.headers['location'] == f'/users/{self.user_1.guids.first()._id}/'
457472

473+
form_data = {
474+
'email': '[email protected]'
475+
}
476+
form = UserSearchForm(data=form_data)
477+
assert form.is_valid()
478+
response = self.view.form_valid(form)
479+
assert response.status_code == 404
480+
458481
def test_search_user_by_alternate_email(self):
459482
form_data = {
460483
'email': self.user_2_alternate_email
@@ -487,6 +510,24 @@ def test_search_user_list_case_insensitive(self):
487510
for user in results:
488511
assert 'Hardy' in user.fullname
489512

513+
def test_search_user_by_orcid(self):
514+
form_data = {
515+
'orcid': '1234-5678'
516+
}
517+
form = UserSearchForm(data=form_data)
518+
assert form.is_valid()
519+
response = self.view.form_valid(form)
520+
assert response.status_code == 302
521+
assert response.headers['location'] == f'/users/{self.user_1.guids.first()._id}/'
522+
523+
form_data = {
524+
'orcid': '1234-5678-90'
525+
}
526+
form = UserSearchForm(data=form_data)
527+
assert form.is_valid()
528+
response = self.view.form_valid(form)
529+
assert response.status_code == 404
530+
490531

491532
class TestGetLinkView(AdminTestCase):
492533

0 commit comments

Comments
 (0)