Django conseguir etiquetado en información de usuario fuera de las vistas. py

He estado trabajando en DRF. Normalmente prefiero escribir lógica de negocio en otro archivo de pitón en lugar de vistas. Py. Intenté tener la corriente registrada en el usuario en las vistas. py

self.request.user

Pero no sé cómo puedo obtener la misma información de usuario en mi archivo de lógica de negocio aquí es lo que he venido hasta ahora en Views. py

    class AddBusCompanyStaffView(generics.CreateAPIView):
        serializer_class = AddBusCompanyUserSerializer
    
        def get_bus_company(self):
            return GetBusCompanyUseCase(bus_company_id=self.kwargs.get('bus_company_id')).execute()
    
        def perform_create(self, serializer):
            print(self.request.user)
            return AddBusCompanyUserUseCase(serializer=serializer,
                                            bus_company=self.get_bus_company()
                                            ).execute()

Quiero user en mi sección de lógica de negocio aquí...

User = get_user_model()


class AddBusCompanyUserUseCase(BaseUseCase):
    """
    use this to add bus company of specific bus company
    """

    def __init__(self,
                 serializer: bus_company_user_serializers.AddBusCompanyUserSerializer,
                 bus_company: BusCompany):
        self.serializer = serializer
        self._data = serializer.validated_data
        self._bus_company = bus_company

    def execute(self):
        self._factory()

    def _factory(self):
        user_position = self._data.pop('position')
        user_password = self._data.pop('password')
        user = User(**self._data)
        user.set_password(user_password)
        user.save()
        bus_company_user=BusCompanyStaff(user=user,
                                         position=user_position,
                                         staff_of=self._bus_company,
                                         created_by= #logged in user here
                                         )

¿Cómo puedo conseguir auto.request.user en created_by? mi maleta base es

class BaseUseCase:
    """
    Base Use Case
    """

    def execute(self):
        raise NotImplementedError("Subclasses should implement this!")

    def _factory(self):
        raise NotImplementedError("Subclasses should implement this!")

    def is_valid(self):
        return True

Pregunta hecha hace 3 años, 4 meses, 29 días - Por scriptsculptorbf10


3 Respuestas:

  • Ya que no puedes cambiar tu Base UseCase, tienes que añadir el atributo a la clase AddBusCompanyUserUseCase.

    La clave aquí es pasar auto.request.user a su AddBusCompanyUserUseCase cuando se crea para que pueda acceder más tarde como atributo auto.usuario.

    #usecases.py
    
    class AddBusCompanyUserUseCase(BaseUseCase):
        """
        use this to add bus company of specific bus company
        """
    
        def __init__(self,
                     serializer: bus_company_user_serializers.AddBusCompanyUserSerializer,
                     bus_company: BusCompany,
                     user: None,
                     ):
            self.serializer = serializer
            self._data = serializer.validated_data
            self._bus_company = bus_company
            self.user = user
    
        def execute(self):
            self._factory()
    
        def _factory(self):
            user_position = self._data.pop('position')
            user_password = self._data.pop('password')
            user = User(**self._data)
            user.set_password(user_password)
            user.save()
            bus_company_user=BusCompanyStaff(user=user,
                                             position=user_position,
                                             staff_of=self._bus_company,
                                             created_by= self.user
                                             )
    
    
    # views.py
    
    class AddBusCompanyStaffView(generics.CreateAPIView):
            serializer_class = AddBusCompanyUserSerializer
        
            def get_bus_company(self):
                return GetBusCompanyUseCase(bus_company_id=self.kwargs.get('bus_company_id')).execute()
        
            def perform_create(self, serializer):
                print(self.request.user)
                return AddBusCompanyUserUseCase(serializer=serializer,
                                                bus_company=self.get_bus_company(),
                                                user=self.request.user,
                                                ).execute()
    

    Respondida el Dec 17, 2020 a las 09:48 - por Brian

    Votos positivos: 0 | Votos negativos: 0

  • Para acceder al usuario en cualquier parte de tu código de Django, incluyendo tus clases de lógica de negocio fuera de las vistas, puedes utilizar la función get_current_user de Django, que te permite acceder al usuario actual que está haciendo la solicitud. Aquí te muestro cómo puedes integrarlo en tu código:

    En tu archivo de lógica de negocio, puedes importar get_current_user de Django y llamarlo para obtener el usuario actual. Luego puedes pasarlo como argumento a tu caso de uso AddBusCompanyUserUseCase. Aquí está cómo puedes hacerlo:

    python
    from django.contrib.auth import get_user_model
    from django.contrib.auth.models import AnonymousUser
    
    User = get_user_model()
    
    class AddBusCompanyUserUseCase(BaseUseCase):
        """
        use this to add bus company of specific bus company
        """
    
        def __init__(self,
                     serializer: bus_company_user_serializers.AddBusCompanyUserSerializer,
                     bus_company: BusCompany,
                     created_by: User = None):  

    Añade created_by aquí como argumento opcional

    self.serializer = serializer self._data = serializer.validated_data self._bus_company = bus_company self._created_by = created_by def execute(self): self._factory() def _factory(self): user_position = self._data.pop('position') user_password = self._data.pop('password') user = User(**self._data) user.set_password(user_password) user.save() created_by = self._created_by if created_by is None or isinstance(created_by, AnonymousUser): created_by = get_current_user()

    Obtén el usuario actual si created_by no se proporciona

    bus_company_user = BusCompanyStaff(user=user, position=user_position, staff_of=self._bus_company, created_by=created_by )

    De esta forma, puedes proporcionar el usuario actual al momento de crear un BusCompanyStaff dentro de tu lógica de negocio. Es importante tener en cuenta que el usuario puede ser AnonymousUser si no está autenticado, por lo que es una buena práctica verificar si es un usuario válido antes de pasarlo como argumento.

    Respondida el Dec 18, 2020 a las 09:43 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Para acceder a la información del usuario autenticado en tu archivo de lógica de negocio, puedes pasar el request como argumento al constructor de la clase de caso de uso. Aquí tienes un ejemplo modificado de tu código:

    En views.py:

    python
    class AddBusCompanyView(generics.CreateAPIView):
        serializer_class = AddBusCompanyUserSerializer
    
        def get_bus_company(self):
            return GetBusCompanyUseCase(bus_company_id=self.request.data.get('bus_company_id')).execute()
    
        def perform_create(self, serializer):
            return AddBusCompanyUserUseCase(serializer=serializer,
                                            bus_company=self.get_bus_company(),
                                            request=self.request  

    Pass the request object

    ).execute()

    En use_cases.py:

    python
    class AddBusCompanyUserUseCase(BaseUseCase):
        """
        use this to add bus company of specific bus company
        """
    
        def __init__(self,
                     serializer: bus_company_user_serializers.AddBusCompanyUserSerializer,
                     bus_company: BusCompany,
                     request: HttpRequest):
            

    ... Previous code ...

    self.request = request def _factory(self):

    ... Previous code ...

    bus_company_user = BusCompanyUser(user=user, position=user_position, bus_company=self._bus_company, created_by=self.request.user

    Access the authenticated user here

    )

    ... Remaining code ...

    Con estos cambios, puedes acceder a la información del usuario autenticado (request.user) en tu clase de caso de uso y utilizarla para establecer el valor de created_by.

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

    Votos positivos: 0 | Votos negativos: 0