From 087ac0bd34a653874e72c5f8ee1674e4205c7ca5 Mon Sep 17 00:00:00 2001 From: Oliver Date: Sat, 4 Dec 2021 21:15:38 +1100 Subject: [PATCH 1/4] 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') From 9e1251d78d904711a3c6a379638269c64bf28a25 Mon Sep 17 00:00:00 2001 From: Oliver Date: Sat, 4 Dec 2021 21:30:11 +1100 Subject: [PATCH 2/4] Adds "assigned_to_me" filtering to build orders --- InvenTree/build/api.py | 20 +++++++++++++++++++ InvenTree/part/api.py | 2 ++ InvenTree/templates/js/translated/build.js | 7 ++++++- .../templates/js/translated/table_filters.js | 4 ++++ 4 files changed, 32 insertions(+), 1 deletion(-) diff --git a/InvenTree/build/api.py b/InvenTree/build/api.py index 2ca9dd31dc..806acd0ccc 100644 --- a/InvenTree/build/api.py +++ b/InvenTree/build/api.py @@ -20,6 +20,7 @@ from InvenTree.status_codes import BuildStatus from .models import Build, BuildItem, BuildOrderAttachment from .serializers import BuildAttachmentSerializer, BuildCompleteSerializer, BuildSerializer, BuildItemSerializer from .serializers import BuildAllocationSerializer, BuildUnallocationSerializer +from users.models import Owner class BuildFilter(rest_filters.FilterSet): @@ -51,6 +52,25 @@ class BuildFilter(rest_filters.FilterSet): return queryset + 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 BuildList(generics.ListCreateAPIView): """ API endpoint for accessing a list of Build objects. diff --git a/InvenTree/part/api.py b/InvenTree/part/api.py index dbc1140214..c1b86b6528 100644 --- a/InvenTree/part/api.py +++ b/InvenTree/part/api.py @@ -583,6 +583,8 @@ class PartFilter(rest_filters.FilterSet): active = rest_filters.BooleanFilter() + virtual = rest_filters.BooleanFilter() + class PartList(generics.ListCreateAPIView): """ diff --git a/InvenTree/templates/js/translated/build.js b/InvenTree/templates/js/translated/build.js index 02b2ff5321..0deec4f859 100644 --- a/InvenTree/templates/js/translated/build.js +++ b/InvenTree/templates/js/translated/build.js @@ -34,7 +34,12 @@ function buildFormFields() { reference: { prefix: global_settings.BUILDORDER_REFERENCE_PREFIX, }, - part: {}, + part: { + filters: { + assembly: true, + virtual: false, + } + }, title: {}, quantity: {}, parent: { diff --git a/InvenTree/templates/js/translated/table_filters.js b/InvenTree/templates/js/translated/table_filters.js index ac5331547d..b7ba79e498 100644 --- a/InvenTree/templates/js/translated/table_filters.js +++ b/InvenTree/templates/js/translated/table_filters.js @@ -298,6 +298,10 @@ function getAvailableTableFilters(tableKey) { type: 'bool', title: '{% trans "Overdue" %}', }, + assigned_to_me: { + type: 'bool', + title: '{% trans "Assigned to me" %}', + }, }; } From 20dac08158697c9f41cf2663dd45e5a5e2ffc0b6 Mon Sep 17 00:00:00 2001 From: Oliver Date: Sat, 4 Dec 2021 21:31:39 +1100 Subject: [PATCH 3/4] PEP fixes --- InvenTree/build/api.py | 2 +- InvenTree/order/api.py | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/InvenTree/build/api.py b/InvenTree/build/api.py index 806acd0ccc..4d47cf9076 100644 --- a/InvenTree/build/api.py +++ b/InvenTree/build/api.py @@ -53,7 +53,7 @@ class BuildFilter(rest_filters.FilterSet): return queryset 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 diff --git a/InvenTree/order/api.py b/InvenTree/order/api.py index a1de19837f..cb451b13df 100644 --- a/InvenTree/order/api.py +++ b/InvenTree/order/api.py @@ -8,9 +8,6 @@ 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 @@ -35,7 +32,7 @@ class POFilter(rest_filters.FilterSet): """ 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 From 66462d0a68370dbabf008e7c498d2b5f046fdd2c Mon Sep 17 00:00:00 2001 From: Oliver Date: Sat, 4 Dec 2021 22:07:55 +1100 Subject: [PATCH 4/4] Fix for APIFilter --- InvenTree/order/api.py | 1 + 1 file changed, 1 insertion(+) diff --git a/InvenTree/order/api.py b/InvenTree/order/api.py index cb451b13df..98b9bbe934 100644 --- a/InvenTree/order/api.py +++ b/InvenTree/order/api.py @@ -51,6 +51,7 @@ class POFilter(rest_filters.FilterSet): return queryset class Meta: + model = models.PurchaseOrder fields = [ 'supplier', ]