Advertisement
Guest User

Untitled

a guest
Dec 15th, 2021
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. # MODELS
  2.  
  3. class User(models.Model):
  4.     name = models.CharField(max_length=50)
  5.     # ...etc...
  6.  
  7. class Assignment(models.Model):
  8.     user = models.ForeignKey(
  9.         settings.AUTH_USER_MODEL, on_delete=models.PROTECT
  10.     )
  11.     job = models.ForeignKey(Job, on_delete=models.PROTECT)
  12.     location = models.ForeignKey(Location, on_delete=models.PROTECT)
  13.  
  14. # SERIALIZER
  15.  
  16. class UserSerializer(serializers.HyperlinkedModelSerializer):
  17.     assignment_job = serializers.SerializerMethodField()
  18.     multiple_locations = serializers.SerializerMethodField()
  19.     multiple_jobs = serializers.SerializerMethodField()
  20.  
  21.     class Meta:
  22.         model = User
  23.         fields = [
  24.             "url",
  25.             "id",
  26.             "username",
  27.             "first_name",
  28.             "last_name",
  29.             "full_name",
  30.             "email",
  31.             "is_staff",
  32.             "assignment_job",
  33.             "multiple_locations",
  34.             "multiple_jobs",
  35.         ]
  36.  
  37.     def get_assignment_job(self, obj):
  38.         assignment = obj.assignment_set.get(primary=True)
  39.         return assignment.job.description
  40.  
  41.     def get_multiple_locations(self, obj):
  42.         location_count = obj.assignment_set.filter(
  43.             end_date__isnull=True
  44.         ).aggregate(total_locations=Count("location"))
  45.         if location_count["total_locations"] > 1:
  46.             return True
  47.         return False
  48.  
  49.     def get_multiple_jobs(self, obj):
  50.         job_count = obj.assignment_set.filter(end_date__isnull=True).aggregate(
  51.             total_jobs=Count("job")
  52.         )
  53.         if job_count["total_jobs"] > 1:
  54.             return True
  55.         return False
  56.  
  57.  
  58. # SERIALIZER VIEW
  59.  
  60. class UserViewSet(viewsets.ModelViewSet):
  61.     serializer_class = UserSerializer
  62.  
  63.     def get_queryset(self):
  64.         users = get_observable_users(self.request.user)
  65.         return users
  66.  
  67.  
  68. # get_observable_users Method
  69. # this returns the correct users - I've tried adding the prefetch_related here
  70.  
  71. def get_observable_users(user):
  72.     user_assignments = Assignment.active.filter(user=user)
  73.     user_jobs = user_assignments.values_list("job", flat=True)
  74.     locations = user_assignments.values_list("location", flat=True)
  75.     administrative_job_observations = JobObservation.objects.filter(
  76.         observer_job__in=user_jobs,
  77.         restrict_to_location=False,
  78.     )
  79.     observee_jobs = JobObservation.objects.filter(
  80.         observer_job__in=user_jobs
  81.     ).values_list("observee_job", flat=True)
  82.     if administrative_job_observations:
  83.         people_assignments = Assignment.objects.filter(job__in=observee_jobs)
  84.     else:
  85.         people_assignments = Assignment.objects.filter(
  86.             job__in=observee_jobs, location__in=locations
  87.         )
  88.     all_assignments = user_assignments | people_assignments
  89.     all_user_ids = all_assignments.values_list("user", flat=True)
  90.     user_list = User.objects.prefetch_related("assignment_set").filter(
  91.         id__in=all_user_ids
  92.     )
  93.     return user_list
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement