lord stock
lord stock

Reputation: 1201

Django Get Logged In User Info Outsides Views.py

I have been working on DRF. I usually prefer writing business logic on another python file rather than views.py. I tried to get current logged in user in views.py using

self.request.user

But I don't know how can I get same user info in my business logic file here is what I have came upto now in 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()

I want user in my business logic section here -->usecases.py

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
                                         )

how can I get self.request.user in created_by? my baseusecase is

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

Upvotes: 0

Views: 48

Answers (1)

Guillaume
Guillaume

Reputation: 2006

Since you can not change your BaseUseCase, you have to add the attribute to the AddBusCompanyUserUseCase class.

The key here is to pass self.request.user to your AddBusCompanyUserUseCase when created so you can access later as self.user attribute.

#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()

Upvotes: 1

Related Questions