Cómo implementar la opción de cuentas de conmutación en Django

Considere una aplicación donde hay una cuenta de empresa y cuenta de empleado. Quiero añadir empleados como administrador de la empresa. Entonces el administrador debe ser capaz de cambiar la cuenta con la empresa. ¿Es posible hacer la opción de la cuenta de cambio? Soy un principiante en Django. ¿Puede alguien ayudarme con este problema?

Estoy agregando mi modelo de usuario aquí:

# Custom user
class CustomUser(AbstractUser):
    """ Custom user model"""
    email = models.EmailField(unique=True, validators=[EmailValidator])
    is_company = models.BooleanField(default=True)
    is_employee = models.BooleanField(default=False)
    is_staff = models.BooleanField(default=False)
    slug = AutoSlugField(populate_from='username')

    def __str__(self):
        return f"{self.username}"

# Company user
class CompanyAccount(TimeStampedModel):
    user = models.OneToOneField(CustomUser, on_delete=models.CASCADE, related_name='company')
    name = models.CharField(max_length=50, null=True, blank=True)
    description = models.TextField(null=True, blank=True)
    email = models.EmailField(null=True, blank=True)
    website_url = models.URLField(null=True, blank=True)
    industry = models.CharField(max_length=50, null=True, blank=True)
    founded_year = models.PositiveSmallIntegerField(blank=True, null=True)
    headquarters = models.CharField(max_length=100, null=True, blank=True)


    def __str__(self):
        return f"{self.name}"

# Employee user
class Employee(TimeStampedModel):
    user = models.OneToOneField(CustomUser, on_delete=models.CASCADE, related_name="profile")
    first_name = models.CharField(max_length=50, null=True, blank=True)
    last_name = models.CharField(max_length=50, null=True, blank=True)
    city = models.CharField(max_length=100, null=True, blank=True)
    country = models.CharField(max_length=100, null=True, blank=True)
    job_title = models.CharField(max_length=100, null=True, blank=True)

    company = models.ForeignKey(CompanyAccount, on_delete=models.CASCADE, related_name="employee")


    def __str__(self):
        return f"{self.user.username}"


Pregunta hecha hace 3 años, 5 meses, 0 días - Por Kairo


2 Respuestas:

  • Para implementar la opción de cuentas de conmutación en Django, puedes seguir los siguientes pasos:

    • Agregar un campo en el modelo `CustomUser` para almacenar la referencia a la cuenta actual del usuario (puede ser una cuenta de empresa o una cuenta de empleado).
    • Crear un método en el modelo `CustomUser` para cambiar la cuenta activa del usuario.
    • Crear vistas y urls para permitir que los usuarios cambien de cuenta.
    • Implementar la lógica necesaria en las vistas para cambiar la cuenta del usuario.

    Aquí te dejo un ejemplo de cómo podrías modificar tu modelo CustomUser para añadir la funcionalidad de cambio de cuenta:

    python
    class CustomUser(AbstractUser):
        """Custom user model"""
        email = models.EmailField(unique=True, validators=[EmailValidator])
        is_company = models.BooleanField(default=False)
        is_employee = models.BooleanField(default=False)
        is_staff = models.BooleanField(default=False)
        slug = AutoSlugField(populate_from='username')
        current_account = models.ForeignKey('accounts.Account', on_delete=models.SET_NULL, null=True, blank=True)
    
        def __str__(self):
            return f"{self.username}"
    
        def switch_account(self, account):
            self.current_account = account
            self.save()
    

    En este ejemplo, se añadió el campo current_account al modelo CustomUser para almacenar la cuenta actual del usuario. Y se creó el método switch_account para cambiar la cuenta activa del usuario.

    Luego, en tus vistas, podrías implementar una vista para cambiar la cuenta actual del usuario. Por ejemplo:

    python
    from django.shortcuts import redirect
    
    def switch_account(request, account_id):
        user = request.user
        new_account = Account.objects.get(id=account_id)
        user.switch_account(new_account)
        return redirect('dashboard')  

    Redirigir a la página de inicio o a donde sea necesario

    En tus plantillas HTML, podrías tener un formulario o un enlace que permita al usuario cambiar su cuenta activa.

    Este es un enfoque general y deberás adaptarlo según tus necesidades específicas y la lógica de tu aplicación. Espero que esta guía te ayude a implementar la opción de cuentas de conmutación en tu aplicación Django.

    Respondida el Dec 18, 2020 a las 08:55 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Para implementar la opción de cambio de cuenta en Django, puedes seguir estos pasos:

    • Crear un middleware: Crea un middleware personalizado que intercepte todas las solicitudes y compruebe si el usuario autenticado es un administrador de empresa. Si es así, agrega al objeto `request` un atributo `company_account` con la cuenta de empresa asociada.
    • Modificar vistas: Modifica las vistas que necesitan acceder a la cuenta de empresa para utilizar el atributo `company_account` del objeto `request`. Por ejemplo, en la vista para editar un empleado, puedes utilizar `request.company_account` para obtener la cuenta de empresa a la que pertenece el empleado.
    • Crear una vista de cambio de cuenta: Crea una nueva vista que permita al administrador cambiar a la cuenta de empresa deseada. Esta vista debe aceptar el ID o slug de la cuenta de empresa y establecer la sesión `company_account_id` con el ID de la cuenta de empresa seleccionada.
    • Actualizar la plantilla HTML: Actualiza la plantilla HTML para incluir un enlace o menú desplegable que permita al administrador cambiar a una cuenta de empresa diferente. El enlace o menú desplegable debe dirigir a la vista de cambio de cuenta.

    Aquí tienes un ejemplo de un middleware personalizado que puedes utilizar:

    python
    from django.contrib.auth import get_user_model
    from django.contrib.sessions.middleware import SessionMiddleware
    
    class CompanyAccountMiddleware(SessionMiddleware):
        def process_request(self, request):
            super().process_request(request)
            user = request.user
            if user.is_authenticated and user.is_company:
                request.company_account = user.companyaccount
    

    Ejemplo de una vista de cambio de cuenta:

    python
    from django.contrib.auth.decorators import login_required
    from django.contrib.auth.mixins import LoginRequiredMixin
    from django.shortcuts import redirect
    from django.views.generic import View
    
    class ChangeCompanyAccountView(LoginRequiredMixin, View):
        def get(self, request, company_account_id):
            request.session['company_account_id'] = company_account_id
            return redirect('homepage')
    

    Recuerda que también debes actualizar las plantillas HTML para incluir un enlace o menú desplegable que dirija a la vista ChangeCompanyAccountView.

    Respondida el Dec 18, 2020 a las 09:01 - por Gemini

    Votos positivos: 0 | Votos negativos: 0