diff --git a/label_studio/users/admin.py b/label_studio/users/admin.py index 309f48455024..241ae6338cca 100644 --- a/label_studio/users/admin.py +++ b/label_studio/users/admin.py @@ -15,6 +15,10 @@ class UserAdminShort(UserAdmin): add_fieldsets = ((None, {'fields': ('email', 'password1', 'password2')}),) + def get_queryset(self, request): + # Use the with_deleted method to include soft-deleted users in the queryset + return User.with_deleted.all() + def __init__(self, *args, **kwargs): super(UserAdminShort, self).__init__(*args, **kwargs) diff --git a/label_studio/users/migrations/0001_squashed_0009_auto_20210219_1237.py b/label_studio/users/migrations/0001_squashed_0009_auto_20210219_1237.py index 51618d695a59..7281d075f036 100644 --- a/label_studio/users/migrations/0001_squashed_0009_auto_20210219_1237.py +++ b/label_studio/users/migrations/0001_squashed_0009_auto_20210219_1237.py @@ -12,7 +12,7 @@ def add_tokens(apps, schema_editor): User = apps.get_model('users', 'User') - all_users = User.objects.all() + all_users = User.with_deleted.all() for user_one in all_users: if not hasattr(user_one, 'auth_token'): @@ -67,6 +67,9 @@ class Migration(migrations.Migration): 'verbose_name_plural': 'users', 'db_table': 'htx_user', }, + managers=[ + ('with_deleted', users.models.UserManagerWithDeleted()), + ], ), migrations.RunPython(add_tokens), # migrations.RunPython(add_users), # TODO: flag:ent diff --git a/label_studio/users/migrations/0008_alter_user_managers.py b/label_studio/users/migrations/0008_alter_user_managers.py index 5a9dd03f1644..44bf404ed6b7 100644 --- a/label_studio/users/migrations/0008_alter_user_managers.py +++ b/label_studio/users/migrations/0008_alter_user_managers.py @@ -16,8 +16,7 @@ class Migration(migrations.Migration): name='user', managers=[ ('objects', django.db.models.manager.Manager()), - # Previously, this migration contained an addition of UserManagerWithDeleted, which has since been - # removed in order to avoid referencing a non-existent manager. + ('with_deleted', users.models.UserManagerWithDeleted()), ], ), ] diff --git a/label_studio/users/migrations/0009_auto_20231201_0001.py b/label_studio/users/migrations/0009_auto_20231201_0001.py deleted file mode 100644 index aef96bc56aae..000000000000 --- a/label_studio/users/migrations/0009_auto_20231201_0001.py +++ /dev/null @@ -1,24 +0,0 @@ -# Generated by Django 3.2.23 on 2023-12-01 00:01 - -from django.db import migrations -import users.models - - -class Migration(migrations.Migration): - - dependencies = [ - ('users', '0008_alter_user_managers'), - ] - - operations = [ - migrations.AlterModelManagers( - name='user', - managers=[ - ('objects', users.models.UserManager()), - ], - ), - migrations.RemoveField( - model_name='user', - name='is_deleted', - ), - ] diff --git a/label_studio/users/models.py b/label_studio/users/models.py index a8b9b9e2857b..ad13a1e194af 100644 --- a/label_studio/users/models.py +++ b/label_studio/users/models.py @@ -26,8 +26,8 @@ year = models.IntegerField(_('year'), choices=YEAR_CHOICES, default=datetime.datetime.now().year) -class UserManager(BaseUserManager): - use_in_migrations = True +class UserManagerWithDeleted(BaseUserManager): + use_in_migrations: bool = True def _create_user(self, email, password, **extra_fields): """ @@ -61,6 +61,15 @@ def create_superuser(self, email, password, **extra_fields): return self._create_user(email, password, **extra_fields) +class UserManager(UserManagerWithDeleted): + use_in_migrations: bool = False + + def get_queryset(self): + qs = super().get_queryset() + qs = qs.filter(is_deleted=False) + return qs + + class UserLastActivityMixin(models.Model): last_activity = models.DateTimeField(_('last activity'), default=timezone.now, editable=False) @@ -100,6 +109,12 @@ class User(UserMixin, AbstractBaseUser, PermissionsMixin, UserLastActivityMixin) default=True, help_text=_('Designates whether to treat this user as active. Unselect this instead of deleting accounts.'), ) + is_deleted = models.BooleanField( + _('deleted'), + default=False, + db_index=True, + help_text=_('Designates whether to treat this user as deleted. Select this instead of deleting accounts.'), + ) date_joined = models.DateTimeField(_('date joined'), default=timezone.now) @@ -114,6 +129,7 @@ class User(UserMixin, AbstractBaseUser, PermissionsMixin, UserLastActivityMixin) ) objects = UserManager() + with_deleted = UserManagerWithDeleted() EMAIL_FIELD = 'email' USERNAME_FIELD = 'email'