diff --git a/apps/common/mixins.py b/apps/common/mixins.py index b12416623..892b0fae6 100644 --- a/apps/common/mixins.py +++ b/apps/common/mixins.py @@ -40,10 +40,9 @@ class NoDeleteModelMixin(models.Model): class JSONResponseMixin(object): - """JSON mixin""" - - def render_json_response(self, context): + @staticmethod + def render_json_response(context): return JsonResponse(context) diff --git a/apps/users/api.py b/apps/users/api.py index bc881d9b4..f122b49cf 100644 --- a/apps/users/api.py +++ b/apps/users/api.py @@ -29,6 +29,9 @@ class UserViewSet(BulkModelViewSet): serializer_class = serializers.UserSerializer permission_classes = (IsSuperUser,) + def allow_bulk_destroy(self, qs, filtered): + return qs is not filtered + class UserUpdateGroupApi(generics.RetrieveUpdateAPIView): queryset = User.objects.all() diff --git a/apps/users/models.py b/apps/users/models.py index 934aaea61..84ec5d6a1 100644 --- a/apps/users/models.py +++ b/apps/users/models.py @@ -79,7 +79,7 @@ class User(AbstractUser): role = models.CharField(choices=ROLE_CHOICES, default='User', max_length=10, blank=True, verbose_name=_('Role')) avatar = models.ImageField(upload_to="avatar", verbose_name=_('Avatar')) wechat = models.CharField(max_length=30, blank=True, verbose_name=_('Wechat')) - phone = models.CharField(max_length=20, blank=True, verbose_name=_('Phone')) + phone = models.CharField(max_length=20, blank=True, null=True, verbose_name=_('Phone')) enable_otp = models.BooleanField(default=False, verbose_name=_('Enable OTP')) secret_key_otp = models.CharField(max_length=16, blank=True) _private_key = models.CharField(max_length=5000, blank=True, verbose_name=_('ssh private key')) diff --git a/apps/users/templates/users/_user_bulk_update_modal.html b/apps/users/templates/users/_user_bulk_update_modal.html index 8ebed3065..40ab6efb1 100644 --- a/apps/users/templates/users/_user_bulk_update_modal.html +++ b/apps/users/templates/users/_user_bulk_update_modal.html @@ -27,7 +27,7 @@