SHOW:
|
|
- or go back to the newest paste.
| 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 |
| 55 | + | |
| 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 |