From 471c8abcb590a295b63a6ed495a72ee08f4e8e29 Mon Sep 17 00:00:00 2001 From: Jake Rosenberg Date: Sat, 18 Nov 2023 13:49:00 -0600 Subject: [PATCH] update institution in db when profile update form is submitted --- designsafe/apps/accounts/forms.py | 2 +- designsafe/apps/accounts/tests.py | 1 + designsafe/apps/accounts/views.py | 6 ++++-- designsafe/apps/auth/tasks.py | 13 +++++++++++++ 4 files changed, 19 insertions(+), 3 deletions(-) diff --git a/designsafe/apps/accounts/forms.py b/designsafe/apps/accounts/forms.py index 22a72ae1f8..2ae74268f5 100644 --- a/designsafe/apps/accounts/forms.py +++ b/designsafe/apps/accounts/forms.py @@ -348,7 +348,7 @@ def clean_website(self): class Meta: model = DesignSafeProfile - exclude = ['user', 'ethnicity', 'gender', 'update_required'] + exclude = ['user', 'ethnicity', 'gender', 'update_required', 'institution'] class UserRegistrationForm(UserProfileForm, ProfessionalProfileForm): diff --git a/designsafe/apps/accounts/tests.py b/designsafe/apps/accounts/tests.py index be9084feec..7649deafb5 100644 --- a/designsafe/apps/accounts/tests.py +++ b/designsafe/apps/accounts/tests.py @@ -137,6 +137,7 @@ def mock_user_side_effect(username = 'ds_admin', email = 'test@test.test'): # pass test for duplicate email check mock_tas().get_user.side_effect = mock_user_side_effect + mock_tas().save_user.side_effect = mock_user_side_effect edit_url = reverse('designsafe_accounts:profile_edit') self.client.login(username='ds_admin', password='admin/password') diff --git a/designsafe/apps/accounts/views.py b/designsafe/apps/accounts/views.py index b730b75aa7..33510ff4ef 100644 --- a/designsafe/apps/accounts/views.py +++ b/designsafe/apps/accounts/views.py @@ -286,7 +286,7 @@ def profile_edit(request): # retain original account source data['source'] = tas_user['source'] - tas.save_user(tas_user['id'], data) + saved_user = tas.save_user(tas_user['id'], data) messages.success(request, 'Your profile has been updated!') try: @@ -298,6 +298,7 @@ def profile_edit(request): ds_profile.orcid_id = pro_data['orcid_id'] ds_profile.professional_level = pro_data['professional_level'] ds_profile.nh_interests_primary = pro_data['nh_interests_primary'] + ds_profile.institution = saved_user.get('institution', None) except ObjectDoesNotExist as e: logger.info('exception e: {} {}'.format(type(e), e )) @@ -309,7 +310,8 @@ def profile_edit(request): website=pro_data['website'], orcid_id=pro_data['orcid_id'], professional_level=pro_data['professional_level'], - nh_interests_primary=pro_data['nh_interests_primary'] + nh_interests_primary=pro_data['nh_interests_primary'], + institution=saved_user.get('institution', None) ) ds_profile.update_required = False diff --git a/designsafe/apps/auth/tasks.py b/designsafe/apps/auth/tasks.py index 754c72907d..df2dcf6bf6 100644 --- a/designsafe/apps/auth/tasks.py +++ b/designsafe/apps/auth/tasks.py @@ -5,6 +5,8 @@ from designsafe.apps.api.tasks import agave_indexer from designsafe.apps.api.notifications.models import Notification from celery import shared_task +from django.contrib.auth import get_user_model +from pytas.http import TASClient from requests import HTTPError from django.contrib.auth import get_user_model @@ -101,3 +103,14 @@ def clear_old_notifications(self): """Delete notifications older than 30 days to prevent them cluttering the db.""" time_cutoff = datetime.now() - timedelta(days=30) Notification.objects.filter(datetime__lte=time_cutoff).delete() + + +@shared_task(bind=True, max_retries=3) +def update_institution_from_tas(self, username): + user_model = get_user_model().objects.get(username=username) + try: + tas_model = TASClient().get_user(username=username) + except Exception as exc: + raise self.retry(exc=exc) + user_model.profile.institution = tas_model.get('institution', None) + user_model.profile.save()