|
@@ -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)
|