diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 0239f9959..d42ff7563 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -17,6 +17,10 @@ Unreleased ---------- * nothing unreleased +[4.31.0] +-------- +* feat: add new endpoint to unlink the logged in user. + [4.30.1] -------- * fix: serialize best_mode_for_course_run field in DefaultEnterpriseEnrollmentIntentionSerializer. diff --git a/enterprise/__init__.py b/enterprise/__init__.py index c39375715..e1ddcb95b 100644 --- a/enterprise/__init__.py +++ b/enterprise/__init__.py @@ -2,4 +2,4 @@ Your project description goes here. """ -__version__ = "4.30.1" +__version__ = "4.31.0" diff --git a/enterprise/api/v1/views/enterprise_customer.py b/enterprise/api/v1/views/enterprise_customer.py index cd4660dbe..f4d271bd8 100644 --- a/enterprise/api/v1/views/enterprise_customer.py +++ b/enterprise/api/v1/views/enterprise_customer.py @@ -17,6 +17,7 @@ HTTP_202_ACCEPTED, HTTP_400_BAD_REQUEST, HTTP_409_CONFLICT, + HTTP_422_UNPROCESSABLE_ENTITY, ) from django.contrib import auth @@ -460,7 +461,6 @@ def unlink_users(self, request, pk=None): # pylint: disable=unused-argument """ Unlinks users with the given emails from the enterprise. """ - serializer = serializers.EnterpriseCustomerUnlinkUsersSerializer( data=request.data ) @@ -487,3 +487,27 @@ def unlink_users(self, request, pk=None): # pylint: disable=unused-argument raise UnlinkUserFromEnterpriseError(msg) from exc return Response(status=HTTP_200_OK) + + @action(methods=['post'], detail=True, permission_classes=[permissions.IsAuthenticated]) + def unlink_self(self, request, pk=None): # pylint: disable=unused-argument + """ + Unlink request user from the enterprise. + """ + user_email = request.user.email + enterprise_customer = self.get_object() + + try: + models.EnterpriseCustomerUser.objects.unlink_user( + enterprise_customer=enterprise_customer, user_email=user_email, is_relinkable=True + ) + except (models.EnterpriseCustomerUser.DoesNotExist, models.PendingEnterpriseCustomerUser.DoesNotExist): + msg = "[UNLINK_SELF] User with email {} does not exist in enterprise {}.".format( + user_email, enterprise_customer + ) + LOGGER.warning(msg) + return Response(status=HTTP_422_UNPROCESSABLE_ENTITY) + except Exception as exc: + msg = "[UNLINK_SELF] Could not unlink {} from {}".format(user_email, enterprise_customer) + raise UnlinkUserFromEnterpriseError(msg) from exc + + return Response(status=HTTP_200_OK)