From 203a0cd12b363787de37fa8ac24b4ae03ad396ea Mon Sep 17 00:00:00 2001 From: claire-peters Date: Tue, 21 May 2024 14:23:33 -0400 Subject: [PATCH] improve process and exceptions --- coldfront/core/project/models.py | 2 +- coldfront/core/project/views.py | 19 +++++++++++++++---- coldfront/plugins/ldap/utils.py | 23 ++++++++++++++++------- 3 files changed, 32 insertions(+), 12 deletions(-) diff --git a/coldfront/core/project/models.py b/coldfront/core/project/models.py index 3f83640af..653f6beec 100644 --- a/coldfront/core/project/models.py +++ b/coldfront/core/project/models.py @@ -73,7 +73,7 @@ def get_by_natural_key(self, title, pi_username): DEFAULT_DESCRIPTION = ("We do not have information about your research. " "Please provide a detailed description of your work.") - title = models.CharField(max_length=255,) + title = models.CharField(max_length=255, unique=True) pi = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE,) description = models.TextField( default=DEFAULT_DESCRIPTION, diff --git a/coldfront/core/project/views.py b/coldfront/core/project/views.py index f936c4733..3969f635b 100644 --- a/coldfront/core/project/views.py +++ b/coldfront/core/project/views.py @@ -395,22 +395,33 @@ def form_valid(self, form): sender=self.__class__, project_title=project_obj.title, ) except Exception as exception: + logger.exception(exception) messages.error(self.request, str(exception)) return HttpResponseRedirect(reverse('project-create')) form.instance.status = ProjectStatusChoice.objects.get(name='New') form.instance.pi = self.request.user - project_obj.save() + try: + project_obj.save() + except Exception as exception: + logger.exception(exception) + messages.error( + self.request, + f"the project could not be created, an error was encountered: {exception}" + ) + return HttpResponseRedirect(reverse('project-create')) + form_valid_status = super().form_valid(form) try: project_post_create.send( - sender=self.__class__, project_pk=project_obj.pk + sender=self.__class__, project_obj=project_obj ) except Exception as exception: + logger.exception(exception) messages.error( self.request, - "the project was created but an error was encountered in post-creation processes - please contact a system administrator." + f"the project was created but an error was encountered in post-creation processes - please contact a system administrator: {exception}" ) return HttpResponseRedirect(reverse('project-create')) - return super().form_valid(form) + return form_valid_status def get_success_url(self): return reverse('project-detail', kwargs={'pk': self.object.pk}) diff --git a/coldfront/plugins/ldap/utils.py b/coldfront/plugins/ldap/utils.py index 9057639ae..443828b64 100644 --- a/coldfront/plugins/ldap/utils.py +++ b/coldfront/plugins/ldap/utils.py @@ -644,22 +644,25 @@ def identify_ad_group(sender, **kwargs): project_title = kwargs['project_title'] try: ad_conn = LDAPConn() - group_entry = ad_conn.return_group_by_name(project_title) + members, manager = ad_conn.return_group_members_manager(project_title) except Exception as e: raise ValueError(f"ldap connection error: {e}") - return group_entry + try: + ifx_pi = get_user_model().objects.get(username=manager['sAMAccountName'][0]) + except Exception as e: + raise ValueError(f"issue retrieving pi's ifxuser entry: {e}") + + return ifx_pi @receiver(project_post_create) def update_new_project(sender, **kwargs): """Update the new project using the AD group information""" - project_pk = kwargs['project_pk'] - project = Project.objects.get(pk=project_pk) + project = kwargs['project_obj'] try: ad_conn = LDAPConn() members, manager = ad_conn.return_group_members_manager(project.title) except Exception as e: raise ValueError(f"ldap connection error: {e}") - project.pi = get_user_model().objects.get(username=manager['sAMAccountName'][0]) # locate field_of_science if 'department' in manager.keys() and manager['department']: field_of_science_name=manager['department'][0] @@ -671,13 +674,19 @@ def update_new_project(sender, **kwargs): logger.info('added new field_of_science: %s', field_of_science_name) else: raise ValueError(f'no department for AD group {project.title}, will not add unless fixed') + + project.field_of_science = field_of_science_obj + project.pi = get_user_model().objects.get(username=manager['sAMAccountName'][0]) project.save() for member in members: role_name = "User" if member['sAMAccountName'][0] != manager['sAMAccountName'][0] else "Manager" + try: + user_obj = get_user_model().objects.get(username=member['sAMAccountName'][0]) + except get_user_model().DoesNotExist: + continue ProjectUser.objects.create( project=project, - user=get_user_model().objects.get(username=member['sAMAccountName'][0]), + user=user_obj, role=ProjectUserRoleChoice.objects.get(name=role_name), - field_of_science=field_of_science_obj.pk, status=ProjectUserStatusChoice.objects.get(name='Active'), )