diff --git a/apps/establishment/models.py b/apps/establishment/models.py index 5f8ec73d..e21c95a6 100644 --- a/apps/establishment/models.py +++ b/apps/establishment/models.py @@ -1063,6 +1063,15 @@ class EmployeeQuerySet(models.QuerySet): def with_extended_related(self): return self.prefetch_related('establishments') + def with_back_office_related(self): + return self.prefetch_related( + Prefetch('establishmentemployee_set', + queryset=EstablishmentEmployee.objects.actual() + .prefetch_related('establishment', 'position').order_by('-from_date'), + to_attr='prefetched_establishment_employee'), + 'awards' + ) + class Employee(BaseAttributes): """Employee model.""" diff --git a/apps/establishment/serializers/back.py b/apps/establishment/serializers/back.py index 8f9631f1..41ddc6d5 100644 --- a/apps/establishment/serializers/back.py +++ b/apps/establishment/serializers/back.py @@ -247,12 +247,18 @@ class EmployeeBackSerializers(serializers.ModelSerializer): def get_public_mark(self, obj): """Get last list actual public_mark""" + if hasattr(obj, 'prefetched_establishment_employee'): + return obj.prefetched_establishment_employee[0].establishment.public_mark if len( + obj.prefetched_establishment_employee) else None qs = self.get_qs(obj) if qs: return qs.public_mark return None def get_toque_number(self, obj): + if hasattr(obj, 'prefetched_establishment_employee'): + return obj.prefetched_establishment_employee[0].establishment.toque_number if len( + obj.prefetched_establishment_employee) else None qs = self.get_qs(obj) if qs: return qs.toque_number @@ -260,6 +266,11 @@ class EmployeeBackSerializers(serializers.ModelSerializer): def get_positions(self, obj): """Get last list actual positions""" + if hasattr(obj, 'prefetched_establishment_employee'): + if not len(obj.prefetched_establishment_employee): + return [] + return [PositionBackSerializer(ee.position).data for ee in obj.prefetched_establishment_employee] + est_id = self.get_qs(obj) if not est_id: @@ -275,6 +286,11 @@ class EmployeeBackSerializers(serializers.ModelSerializer): def get_establishment(self, obj): """Get last actual establishment""" + if hasattr(obj, 'prefetched_establishment_employee'): + return { + 'id': obj.prefetched_establishment_employee[0].establishment.pk, + 'slug': obj.prefetched_establishment_employee[0].establishment.slug, + } if len(obj.prefetched_establishment_employee) else None est = self.get_qs(obj) if not est: diff --git a/apps/establishment/views/back.py b/apps/establishment/views/back.py index f98747b6..5ef8fff3 100644 --- a/apps/establishment/views/back.py +++ b/apps/establishment/views/back.py @@ -174,21 +174,14 @@ class EmployeeListCreateView(generics.ListCreateAPIView): permission_classes = (permissions.AllowAny,) filter_class = filters.EmployeeBackFilter serializer_class = serializers.EmployeeBackSerializers - queryset = models.Employee.objects.all().prefetch_related( - 'establishmentemployee_set', - 'establishmentemployee_set__establishment', - 'awards', - ) + queryset = models.Employee.objects.all().with_back_office_related() class EmployeesListSearchViews(generics.ListAPIView): """Employee search view""" pagination_class = None permission_classes = (permissions.AllowAny,) - queryset = models.Employee.objects.all().prefetch_related( - 'establishmentemployee_set', - 'establishmentemployee_set__establishment', - ).select_related('photo') + queryset = models.Employee.objects.all().with_back_office_related().select_related('photo') filter_class = filters.EmployeeBackSearchFilter serializer_class = serializers.EmployeeBackSerializers @@ -207,7 +200,7 @@ class EstablishmentEmployeeListView(generics.ListCreateAPIView): class EmployeeRUDView(generics.RetrieveUpdateDestroyAPIView): """Employee RUD view.""" serializer_class = serializers.EmployeeBackSerializers - queryset = models.Employee.objects.all() + queryset = models.Employee.objects.all().with_back_office_related() class EstablishmentTypeListCreateView(generics.ListCreateAPIView):