From 087ac0bd34a653874e72c5f8ee1674e4205c7ca5 Mon Sep 17 00:00:00 2001 From: Oliver Date: Sat, 4 Dec 2021 21:15:38 +1100 Subject: [PATCH] Adds filter to purchase order for "assigned to me" --- InvenTree/order/api.py | 40 ++++++++++++++++--- .../templates/js/translated/table_filters.js | 4 ++ InvenTree/users/models.py | 28 +++++++++++++ 3 files changed, 67 insertions(+), 5 deletions(-) diff --git a/InvenTree/order/api.py b/InvenTree/order/api.py index 1ae6ae0184..a1de19837f 100644 --- a/InvenTree/order/api.py +++ b/InvenTree/order/api.py @@ -8,6 +8,9 @@ from __future__ import unicode_literals from django.conf.urls import url, include from django.db.models import Q, F +from django.contrib.auth import get_user_model +from django.contrib.auth.models import Group + from django_filters import rest_framework as rest_filters from rest_framework import generics from rest_framework import filters, status @@ -22,8 +25,38 @@ from InvenTree.status_codes import PurchaseOrderStatus, SalesOrderStatus import order.models as models import order.serializers as serializers - from part.models import Part +from users.models import Owner + + +class POFilter(rest_filters.FilterSet): + """ + Custom API filters for the POList endpoint + """ + + assigned_to_me = rest_filters.BooleanFilter(label='assigned_to_me', method='filter_assigned_to_me') + + def filter_assigned_to_me(self, queryset, name, value): + """ + Filter by orders which are assigned to the current user + """ + + value = str2bool(value) + + # Work out who "me" is! + owners = Owner.get_owners_matching_user(self.request.user) + + if value: + queryset = queryset.filter(responsible__in=owners) + else: + queryset = queryset.exclude(responsible__in=owners) + + return queryset + + class Meta: + fields = [ + 'supplier', + ] class POList(generics.ListCreateAPIView): @@ -35,6 +68,7 @@ class POList(generics.ListCreateAPIView): queryset = models.PurchaseOrder.objects.all() serializer_class = serializers.POSerializer + filterset_class = POFilter def create(self, request, *args, **kwargs): """ @@ -150,10 +184,6 @@ class POList(generics.ListCreateAPIView): 'reference': ['reference_int', 'reference'], } - filter_fields = [ - 'supplier', - ] - search_fields = [ 'reference', 'supplier__name', diff --git a/InvenTree/templates/js/translated/table_filters.js b/InvenTree/templates/js/translated/table_filters.js index 6920626284..ac5331547d 100644 --- a/InvenTree/templates/js/translated/table_filters.js +++ b/InvenTree/templates/js/translated/table_filters.js @@ -327,6 +327,10 @@ function getAvailableTableFilters(tableKey) { type: 'bool', title: '{% trans "Overdue" %}', }, + assigned_to_me: { + type: 'bool', + title: '{% trans "Assigned to me" %}', + }, }; } diff --git a/InvenTree/users/models.py b/InvenTree/users/models.py index 2b16a9bb05..e9d0a62d8e 100644 --- a/InvenTree/users/models.py +++ b/InvenTree/users/models.py @@ -477,6 +477,34 @@ class Owner(models.Model): owner: Returns the Group or User instance combining the owner_type and owner_id fields """ + @classmethod + def get_owners_matching_user(cls, user): + """ + Return all "owner" objects matching the provided user: + + A) An exact match for the user + B) Any groups that the user is a part of + """ + + user_type = ContentType.objects.get(app_label='auth', model='user') + group_type = ContentType.objects.get(app_label='auth', model='group') + + owners = [] + + try: + owners.append(cls.objects.get(owner_id=user.pk, owner_type=user_type)) + except: + pass + + for group in user.groups.all(): + try: + owner = cls.objects.get(owner_id=group.pk, owner_type=group_type) + owners.append(owner) + except: + pass + + return owners + @staticmethod def get_api_url(): return reverse('api-owner-list')