Skip to content

Commit 0302ccd

Browse files
authored
Merge pull request #11681 from Ostap-Zherebetskyi/feature/sso_constrains
[ENG-10736] Add constrains between delegation protocol and SSO availability for institution
2 parents bb67d74 + 4c4f559 commit 0302ccd

3 files changed

Lines changed: 37 additions & 3 deletions

File tree

admin/institutions/forms.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from django import forms
2-
from osf.models import Institution
2+
from osf.models.institution import Institution, SSOAvailability
33

44

55
class InstitutionForm(forms.ModelForm):
@@ -10,6 +10,18 @@ class Meta:
1010
'is_deleted', 'contributors', 'storage_regions',
1111
]
1212

13+
def clean(self):
14+
super().clean()
15+
16+
if hasattr(self, 'cleaned_data') and self.changed_data:
17+
if not self.cleaned_data['delegation_protocol']:
18+
if self.cleaned_data['sso_availability'] != SSOAvailability.UNAVAILABLE.value:
19+
self.add_error('sso_availability', 'Must be UNAVAILABLE when no protocol')
20+
21+
elif self.cleaned_data['deactivated']:
22+
if self.cleaned_data['sso_availability'] != SSOAvailability.HIDDEN.value:
23+
self.add_error('sso_availability', 'Inactive must be HIDDEN')
24+
1325

1426
class InstitutionalMetricsAdminRegisterForm(forms.Form):
1527
""" A form that finds an existing OSF User, and grants permissions to that

admin/institutions/views.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,16 @@ def get_context_data(self, *args, **kwargs):
118118
def get_success_url(self, *args, **kwargs):
119119
return reverse_lazy('institutions:detail', kwargs={'institution_id': self.kwargs.get('institution_id')})
120120

121+
def post(self, request, *args, **kwargs):
122+
# Override `post` method in `django.views.generic.edit.ProcessFormView` due to custom behavior
123+
self.object = self.get_object()
124+
form = self.get_form()
125+
if form.is_valid():
126+
return self.form_valid(form)
127+
else:
128+
messages.error(request, form.errors)
129+
return redirect('institutions:detail', institution_id=self.kwargs.get('institution_id'))
130+
121131

122132
class InstitutionExport(PermissionRequiredMixin, View):
123133
permission_required = 'osf.view_institution'

admin_tests/institutions/test_views.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -140,11 +140,23 @@ def test_institution_form(self):
140140
'logo_name': 'awesome_logo.png',
141141
'domains': 'http://kris.biz/, http://www.little.biz/',
142142
'_id': 'newawesomeprov',
143-
'sso_availability': 'Public',
143+
'sso_availability': 'Unavailable',
144144
}
145145
form = InstitutionForm(data=new_data)
146146
assert form.is_valid()
147147

148+
def test_institution_form_invalid(self):
149+
new_data = {
150+
'name': 'New Name',
151+
'logo_name': 'awesome_logo.png',
152+
'domains': 'http://kris.biz/, http://www.little.biz/',
153+
'_id': 'newawesomeprov',
154+
'sso_availability': 'Public',
155+
}
156+
form = InstitutionForm(data=new_data)
157+
assert not form.is_valid()
158+
assert 'sso_availability' in form.errors
159+
148160

149161
class TestInstitutionExport(AdminTestCase):
150162
def setUp(self):
@@ -216,7 +228,7 @@ def test_monthly_reporter_called_on_create(self, mock_monthly_reporter_do):
216228
'orcid_record_verified_source': '',
217229
'delegation_protocol': '',
218230
'institutional_request_access_enabled': False,
219-
'sso_availability': 'Public',
231+
'sso_availability': 'Unavailable',
220232
}
221233
form = InstitutionForm(data=data)
222234
assert form.is_valid()

0 commit comments

Comments
 (0)