View difference between Paste ID: b2buA5TR and 8gN3haBd
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