Django all-auth, мысли о создании гостевой учетной записи без логина - PullRequest
0 голосов
/ 12 января 2019

Итак, я раньше использовал django-allauth, и он отлично подходит для регистрации пользователей и функций входа в систему.

В настоящее время я работаю над небольшим приложением, для которого требуется своего рода «Отъезд гостя», сотрудник должен иметь возможность создать пользователя без необходимости регистрации (создание пароля или возможность входа)

Я мог бы создать отдельную модель для учетных записей гостей, используя ту же информацию, которая использовалась в пользовательской модели, это было бы самое простое решение, но нарушающее сухой принцип.

Поскольку я наследую от "AbstractBaseUser", чтобы создать учетную запись пользователя с полем электронной почты в качестве уникального идентификатора, я подумал, что мы можем разделить модель на модель "CustomAccount", требуя адрес электронной почты и настройку отдельной модели для хранения всего пользователя. информация и установите guest_flag.

Теперь мы можем создать заказ с помощью guest_user, но затем мы не сможем зарегистрировать адрес электронной почты гостей или преобразовать их в зарегистрированного пользователя позже.

С другой стороны, мы не можем дважды создать «гостевой заказ», так как мы используем адрес электронной почты в качестве идентификатора unqiue, или мы не должны регистрировать адрес электронной почты для гостевых заказов, но тогда мы не можем информировать их об обновлениях заказов. .

У кого-нибудь есть указания, предложения по использованию как гостевых учетных записей, так и зарегистрированных пользователей?

Ниже приведен код, который я пытался использовать для разделения модели пользователя на учетную запись и модель пользователя.

models.py

'''
Functionality

#1;
- A user can signup using their emailaddress and password to create an account.
- Before a user can create an order, their emailaddress needs to be verified.
- Once the emailaddress has been verified, the user can create an order himself (or herself).

#2;
- A user flagged as "is_employee" can create an guest user without the need for an emailaddress or password.
- An employee can than use the newly created guest user to create an order.

'''

# "CustomAccount" model, overriding the default "User" model
class CustomAccount(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(_('email address'), unique=True, null=True)
    is_staff = models.BooleanField(
        _('staff status'),
        default=False,
        help_text=_('Designates whether the user can log into this site.'),
    )
    is_active = models.BooleanField(
        _('active'),
        default=True,
        help_text=_(
            'Designates whether this user should be treated as active. '
            'Unselect this instead of deleting accounts.'
        ),
    )
    date_joined = models.DateTimeField(_('date joined'), default=timezone.now)
    USERNAME_FIELD = 'email'
    objects = CustomAccountManager()

    def __str__(self):
        return self.email

    def get_full_name(self):
        return self.email

    def get_short_name(self):
        return self.email

# OneToOne model adding personal information to the account
class CustomUser(models.Model):
    first_name = models.CharField(_('first name'), max_length=30, blank=True)
    last_name = models.CharField(_('last name'), max_length=150, blank=True)
    street = models.CharField(max_length=200, blank=True)
    street_number = models.CharField(max_length=4, blank=True, null=True)
    postcode = models.CharField(max_length=7, blank=True, null=True)
    city = models.CharField(max_length=200, blank=True)
    remark = models.TextField(max_length=1000, blank=True)
    # Set primary_ket to True
    user = models.OneToOneField('CustomAccount', on_delete=models.CASCADE, primary_key=True, blank=True, null=True)
    # Flags
    is_guest = models.BooleanField(default=False)
    is_employee = models.BooleanField(default=False)

    # When a new user is created from the admin area and CustomUser data has not been updated, link CustomUser to emailaddress
    def __str__(self):
        return (self.last_name, self.first_name)

# When an account is created, create new record for CustomUser as well.
@receiver(post_save, sender=CustomAccount)
def create_custom_user(sender, instance, created, **kwargs):
    if created
        CustomUser.objects.create(user=instance)

@receiver(post_save, sender=CustomAccount)
def save_custom_user(sender, instance, **kwargs):
        instance.customuser.save()

managers.py

class CustomAccountManager(BaseUserManager):
    """
    A custom user manager to deal with emails as unique identifiers for auth
    instead of usernames. The default that's used is "UserManager"
    """
    def _create_user(self, email, password, **extra_fields):
        """
        Creates and saves a User with the given email and password.
        """
        if not email:
            raise ValueError('The Email must be set')
        email = self.normalize_email(email)
        user = self.model(email=email, **extra_fields)
        user.set_password(password)
        user.save()

        return user

    def create_superuser(self, email, password, **extra_fields):
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', True)
        extra_fields.setdefault('is_active', True)

        if extra_fields.get('is_staff') is not True:
            raise ValueError('Superuser must have is_staff=True.')
        if extra_fields.get('is_superuser') is not True:
            raise ValueError('Superuser must have is_superuser=True.')

        return self._create_user(email, password, **extra_fields)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...