@@ -0,0 +1,18 @@ +# Generated by Django 5.0.11 on 2025-10-04 05:48 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0022_emailtoken_idx_email_token_key'), + ] + + operations = [ + migrations.AddField( + model_name='customusermodel', + name='is_deleted', + field=models.BooleanField(default=False, verbose_name='Is deleted'), + ), + ] @@ -150,6 +150,7 @@ class CustomUserModel(AbstractBaseUser, PermissionsMixin, BaseModel): profile_picture_name = models.CharField( max_length=255, default=None, null=True, blank=True, verbose_name=_('Picture name') ) + is_deleted = models.BooleanField(default=False, verbose_name=_('Is deleted')) objects = CustomUserModelManager() @@ -56,13 +56,15 @@ class UserService: serializer.is_valid(raise_exception=True) user_data = serializer.validated_data username = user_data['email'] - if CustomUserModel.objects.filter(email=user_data['email']).first(): - raise UserAlreadyExists - - user = CustomUserModel.objects.create_user( - username=username, email=user_data['email'], password=user_data['password'] - ) - + if (user := CustomUserModel.objects.filter(email=username).first()): + if not user.is_deleted: + raise UserAlreadyExists + user.is_deleted = False + user.set_password(user_data['password']) + else: + user = CustomUserModel.objects.create_user( + username=username, email=username, password=user_data['password'] + ) UTMService(user).create_utm( user_data.get('utm_source'), user_data.get('utm_medium'), @@ -70,9 +72,6 @@ class UserService: user_data.get('utm_term'), user_data.get('utm_content'), ) - - user.save() - EmailService(user).send_reg_conf_email() if referer_username := user_data.get('referer'): try: @@ -111,12 +110,12 @@ class UserService: probable_user = CustomUserModel.objects.filter( email=serializer.validated_data['email'], - ) - if not probable_user.exists(): + ).first() + if not probable_user or probable_user.is_deleted: raise WrongEmail user = authenticate( - username=probable_user.first().username, + username=probable_user.username, password=serializer.validated_data['password'], ) @@ -272,7 +271,9 @@ class UserService: @atomic def delete_user(self, request: Request): logout(request) - self.user.delete() + self.user.is_deleted = True + self.user.is_confirmed = False + self.user.save() @classmethod def exists_in_whitelist(cls, request: Request) -> bool: @@ -317,6 +318,7 @@ def confirm_oauth_email(user: Any | None = None, *args, **kwargs): logger.info(f'{kwargs=} from confirm_oauth_email') if user: user.is_confirmed = True + user.is_deleted = False user.save() @@ -132,6 +132,7 @@ class CustomUserModelAdmin(UserAdmin, ExportActionModelAdmin): 'is_superuser', 'is_confirmed', 'is_subscribed_to_emails', + 'is_deleted', 'profile_picture_name', 'utm', 'groups',