Rafał Pitoń 8 лет назад
Родитель
Сommit
1f40f41384
2 измененных файлов с 97 добавлено и 80 удалено
  1. 7 0
      misago/users/migrations/0001_initial.py
  2. 90 80
      misago/users/models/user.py

+ 7 - 0
misago/users/migrations/0001_initial.py

@@ -36,6 +36,13 @@ class Migration(migrations.Migration):
                 ('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into admin sites.', verbose_name='staff status')),
                 ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')),
                 ('acl_key', models.CharField(max_length=12, null=True, blank=True)),
+                ('is_active', models.BooleanField(
+                    default=True, verbose_name='active', help_text=(
+                        'Designates whether this user should be treated as active. Unselect this instead of deleting '
+                        'accounts.'
+                    )
+                )),
+                ('is_active_staff_message', models.TextField(null=True, blank=True)),
                 ('groups', models.ManyToManyField(related_query_name='user', related_name='user_set', to='auth.Group', blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of his/her group.', verbose_name='groups')),
                 ('roles', models.ManyToManyField(to='misago_acl.Role')),
                 ('user_permissions', models.ManyToManyField(related_query_name='user', related_name='user_set', to='auth.Permission', blank=True, help_text='Specific permissions for this user.', verbose_name='user permissions')),

+ 90 - 80
misago/users/models/user.py

@@ -72,102 +72,102 @@ PRIVATE_THREAD_INVITES_LIMITS_CHOICES = (
 
 
 class UserManager(BaseUserManager):
+    @transaction.atomic
     def create_user(self, username, email, password=None, set_default_avatar=False, **extra_fields):
         from ..validators import validate_email, validate_password, validate_username
 
         email = self.normalize_email(email)
         username = self.model.normalize_username(username)
 
-        with transaction.atomic():
-            if not email:
-                raise ValueError(_("User must have an email address."))
-            if not password:
-                raise ValueError(_("User must have a password."))
-
-            validate_username(username)
-            validate_email(email)
-            validate_password(password)
-
-            if not 'joined_from_ip' in extra_fields:
-                extra_fields['joined_from_ip'] = '127.0.0.1'
-
-            WATCH_DICT = {
-                'no': AUTO_SUBSCRIBE_NONE,
-                'watch': AUTO_SUBSCRIBE_NOTIFY,
-                'watch_email': AUTO_SUBSCRIBE_NOTIFY_AND_EMAIL,
-            }
-
-            if not 'subscribe_to_started_threads' in extra_fields:
-                new_value = WATCH_DICT[settings.subscribe_start]
-                extra_fields['subscribe_to_started_threads'] = new_value
-
-            if not 'subscribe_to_replied_threads' in extra_fields:
-                new_value = WATCH_DICT[settings.subscribe_reply]
-                extra_fields['subscribe_to_replied_threads'] = new_value
-
-            extra_fields.update({
-                'is_staff': False,
-                'is_superuser': False
-            })
-
-            now = timezone.now()
-            user = self.model(
-                last_login=now,
-                joined_on=now,
-                **extra_fields
-            )
-
-            user.set_username(username)
-            user.set_email(email)
-            user.set_password(password)
-
-            if not 'rank' in extra_fields:
-                user.rank = Rank.objects.get_default()
-
-            user.save(using=self._db)
-
-            if set_default_avatar:
-                avatars.set_default_avatar(user)
-                user.avatar_hash = avatars.get_avatar_hash(user)
-            else:
-                user.avatar_hash = 'abcdef01'
+        if not email:
+            raise ValueError(_("User must have an email address."))
+        if not password:
+            raise ValueError(_("User must have a password."))
 
-            authenticated_role = Role.objects.get(special_role='authenticated')
-            if authenticated_role not in user.roles.all():
-                user.roles.add(authenticated_role)
-            user.update_acl_key()
+        validate_username(username)
+        validate_email(email)
+        validate_password(password)
+
+        if not 'joined_from_ip' in extra_fields:
+            extra_fields['joined_from_ip'] = '127.0.0.1'
+
+        WATCH_DICT = {
+            'no': AUTO_SUBSCRIBE_NONE,
+            'watch': AUTO_SUBSCRIBE_NOTIFY,
+            'watch_email': AUTO_SUBSCRIBE_NOTIFY_AND_EMAIL,
+        }
+
+        if not 'subscribe_to_started_threads' in extra_fields:
+            new_value = WATCH_DICT[settings.subscribe_start]
+            extra_fields['subscribe_to_started_threads'] = new_value
+
+        if not 'subscribe_to_replied_threads' in extra_fields:
+            new_value = WATCH_DICT[settings.subscribe_reply]
+            extra_fields['subscribe_to_replied_threads'] = new_value
+
+        extra_fields.update({
+            'is_staff': False,
+            'is_superuser': False
+        })
+
+        now = timezone.now()
+        user = self.model(
+            last_login=now,
+            joined_on=now,
+            **extra_fields
+        )
+
+        user.set_username(username)
+        user.set_email(email)
+        user.set_password(password)
 
-            user.save(update_fields=['avatar_hash', 'acl_key'])
+        if not 'rank' in extra_fields:
+            user.rank = Rank.objects.get_default()
 
-            # populate online tracker with default value
-            Online.objects.create(
-                user=user,
-                current_ip=extra_fields['joined_from_ip'],
-                last_click=now,
-            )
+        user.save(using=self._db)
 
-            return user
+        if set_default_avatar:
+            avatars.set_default_avatar(user)
+            user.avatar_hash = avatars.get_avatar_hash(user)
+        else:
+            user.avatar_hash = 'abcdef01'
 
+        authenticated_role = Role.objects.get(special_role='authenticated')
+        if authenticated_role not in user.roles.all():
+            user.roles.add(authenticated_role)
+        user.update_acl_key()
+
+        user.save(update_fields=['avatar_hash', 'acl_key'])
+
+        # populate online tracker with default value
+        Online.objects.create(
+            user=user,
+            current_ip=extra_fields['joined_from_ip'],
+            last_click=now,
+        )
+
+        return user
+
+    @transaction.atomic
     def create_superuser(self, username, email, password,
                          set_default_avatar=False):
-        with transaction.atomic():
-            user = self.create_user(username, email,
-                password=password,
-                set_default_avatar=set_default_avatar,
-            )
+        user = self.create_user(username, email,
+            password=password,
+            set_default_avatar=set_default_avatar,
+        )
 
-            try:
-                user.rank = Rank.objects.get(name=_("Forum team"))
-                user.update_acl_key()
-            except Rank.DoesNotExist:
-                pass
+        try:
+            user.rank = Rank.objects.get(name=_("Forum team"))
+            user.update_acl_key()
+        except Rank.DoesNotExist:
+            pass
 
-            user.is_staff = True
-            user.is_superuser = True
+        user.is_staff = True
+        user.is_superuser = True
 
-            updated_fields = ('rank', 'acl_key', 'is_staff', 'is_superuser')
-            user.save(update_fields=updated_fields, using=self._db)
-            return user
+        updated_fields = ('rank', 'acl_key', 'is_staff', 'is_superuser')
+        user.save(update_fields=updated_fields, using=self._db)
+        return user
 
     def get_by_username(self, username):
         return self.get(slug=slugify(username))
@@ -216,6 +216,16 @@ class User(AbstractBaseUser, PermissionsMixin):
     roles = models.ManyToManyField('misago_acl.Role')
     acl_key = models.CharField(max_length=12, null=True, blank=True)
 
+    is_active = models.BooleanField(
+        _('active'),
+        default=True,
+        help_text=_(
+            "Designates whether this user should be treated as active. "
+            "Unselect this instead of deleting accounts."
+        ),
+    )
+    is_active_staff_message = models.TextField(null=True, blank=True)
+
     is_avatar_locked = models.BooleanField(default=False)
     avatar_hash = models.CharField(max_length=8, default='-')
     avatar_crop = models.CharField(max_length=255, null=True, blank=True)