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 |