From 12f1fb952673256cc3cb47b9c0ae8d75ad54dae8 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Tue, 20 Apr 2021 08:15:43 +1000 Subject: [PATCH 1/3] Update to django 3.2 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 75bce438f6..e942698d50 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,6 @@ invoke>=1.4.0 # Invoke build tool wheel>=0.34.2 # Wheel -Django==3.1.8 # Django package +Django==3.2 # Django package pillow==8.1.1 # Image manipulation djangorestframework==3.11.2 # DRF framework django-dbbackup==3.3.0 # Database backup / restore functionality From 6b9145ae56807d82480f57cfeacc8485491a96c3 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Tue, 20 Apr 2021 09:14:08 +1000 Subject: [PATCH 2/3] Fixes required for v3.2 compatibility - Specify DEFAULT_AUTO_FIELD - Specify output_field for annotations --- InvenTree/InvenTree/settings.py | 3 +++ InvenTree/build/models.py | 8 +++++++- InvenTree/part/models.py | 11 +++++++---- requirements.txt | 4 ++-- 4 files changed, 19 insertions(+), 7 deletions(-) diff --git a/InvenTree/InvenTree/settings.py b/InvenTree/InvenTree/settings.py index b1256dccee..366fc9c6ee 100644 --- a/InvenTree/InvenTree/settings.py +++ b/InvenTree/InvenTree/settings.py @@ -52,6 +52,9 @@ def get_setting(environment_var, backup_val, default_value=None): # Determine if we are running in "test" mode e.g. "manage.py test" TESTING = 'test' in sys.argv +# New requirement for django 3.2+ +DEFAULT_AUTO_FIELD = 'django.db.models.AutoField' + # Build paths inside the project like this: os.path.join(BASE_DIR, ...) BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) diff --git a/InvenTree/build/models.py b/InvenTree/build/models.py index 4ee8de0d73..5a23752071 100644 --- a/InvenTree/build/models.py +++ b/InvenTree/build/models.py @@ -807,7 +807,13 @@ class Build(MPTTModel): allocations = self.allocatedItems(part, output) - allocated = allocations.aggregate(q=Coalesce(Sum('quantity'), 0)) + allocated = allocations.aggregate( + q=Coalesce( + Sum('quantity'), + 0, + output_field=models.DecimalField(), + ) + ) return allocated['q'] diff --git a/InvenTree/part/models.py b/InvenTree/part/models.py index bd02672b3e..be2d31063f 100644 --- a/InvenTree/part/models.py +++ b/InvenTree/part/models.py @@ -1189,10 +1189,13 @@ class Part(MPTTModel): against both build orders and sales orders. """ - return sum([ - self.build_order_allocation_count(), - self.sales_order_allocation_count(), - ]) + return sum( + [ + self.build_order_allocation_count(), + self.sales_order_allocation_count(), + ], + output_field=models.DecimalField() + ) def stock_entries(self, include_variants=True, in_stock=None): """ Return all stock entries for this Part. diff --git a/requirements.txt b/requirements.txt index e942698d50..1392531e29 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,7 +2,7 @@ invoke>=1.4.0 # Invoke build tool wheel>=0.34.2 # Wheel Django==3.2 # Django package pillow==8.1.1 # Image manipulation -djangorestframework==3.11.2 # DRF framework +djangorestframework==3.12.4 # DRF framework django-dbbackup==3.3.0 # Database backup / restore functionality django-cors-headers==3.2.0 # CORS headers extension for DRF django-filter==2.4.0 # Extended filtering options @@ -13,7 +13,7 @@ django-markdownify==0.8.0 # Markdown rendering coreapi==2.3.0 # API documentation pygments==2.7.4 # Syntax highlighting tablib==0.13.0 # Import / export data files -django-crispy-forms==1.8.1 # Form helpers +django-crispy-forms==1.11.2 # Form helpers django-import-export==2.0.0 # Data import / export for admin interface django-cleanup==5.1.0 # Manage deletion of old / unused uploaded files flake8==3.8.3 # PEP checking From 0fbf39f1bce17670bba3c1c98e53e71aa97ae3e1 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Tue, 20 Apr 2021 10:59:28 +1000 Subject: [PATCH 3/3] More fixes --- InvenTree/part/models.py | 23 ++++++++++++++++++++--- InvenTree/part/serializers.py | 8 +++++++- InvenTree/users/models.py | 4 +++- 3 files changed, 30 insertions(+), 5 deletions(-) diff --git a/InvenTree/part/models.py b/InvenTree/part/models.py index be2d31063f..137781ba2b 100644 --- a/InvenTree/part/models.py +++ b/InvenTree/part/models.py @@ -1163,7 +1163,16 @@ class Part(MPTTModel): Return the total amount of this part allocated to build orders """ - query = self.build_order_allocations().aggregate(total=Coalesce(Sum('quantity'), 0)) + query = self.build_order_allocations().aggregate( + total=Coalesce( + Sum( + 'quantity', + output_field=models.DecimalField() + ), + 0, + output_field=models.DecimalField(), + ) + ) return query['total'] @@ -1179,7 +1188,16 @@ class Part(MPTTModel): Return the tutal quantity of this part allocated to sales orders """ - query = self.sales_order_allocations().aggregate(total=Coalesce(Sum('quantity'), 0)) + query = self.sales_order_allocations().aggregate( + total=Coalesce( + Sum( + 'quantity', + output_field=models.DecimalField(), + ), + 0, + output_field=models.DecimalField(), + ) + ) return query['total'] @@ -1194,7 +1212,6 @@ class Part(MPTTModel): self.build_order_allocation_count(), self.sales_order_allocation_count(), ], - output_field=models.DecimalField() ) def stock_entries(self, include_variants=True, in_stock=None): diff --git a/InvenTree/part/serializers.py b/InvenTree/part/serializers.py index 1ada816357..58df62283a 100644 --- a/InvenTree/part/serializers.py +++ b/InvenTree/part/serializers.py @@ -4,6 +4,7 @@ JSON serializers for Part app import imghdr from decimal import Decimal +from django.db import models from django.db.models import Q from django.db.models.functions import Coalesce from InvenTree.serializers import (InvenTreeAttachmentSerializerField, @@ -208,7 +209,8 @@ class PartSerializer(InvenTreeModelSerializer): queryset = queryset.annotate( in_stock=Coalesce( SubquerySum('stock_items__quantity', filter=StockItem.IN_STOCK_FILTER), - Decimal(0) + Decimal(0), + output_field=models.DecimalField(), ), ) @@ -227,6 +229,7 @@ class PartSerializer(InvenTreeModelSerializer): building=Coalesce( SubquerySum('builds__quantity', filter=build_filter), Decimal(0), + output_field=models.DecimalField(), ) ) @@ -240,9 +243,11 @@ class PartSerializer(InvenTreeModelSerializer): ordering=Coalesce( SubquerySum('supplier_parts__purchase_order_line_items__quantity', filter=order_filter), Decimal(0), + output_field=models.DecimalField(), ) - Coalesce( SubquerySum('supplier_parts__purchase_order_line_items__received', filter=order_filter), Decimal(0), + output_field=models.DecimalField(), ) ) @@ -251,6 +256,7 @@ class PartSerializer(InvenTreeModelSerializer): suppliers=Coalesce( SubqueryCount('supplier_parts'), Decimal(0), + output_field=models.DecimalField(), ), ) diff --git a/InvenTree/users/models.py b/InvenTree/users/models.py index 55f2b00007..73388a88bc 100644 --- a/InvenTree/users/models.py +++ b/InvenTree/users/models.py @@ -57,6 +57,7 @@ class RuleSet(models.Model): 'auth_user', 'auth_permission', 'authtoken_token', + 'authtoken_tokenproxy', 'users_ruleset', ], 'part_category': [ @@ -199,7 +200,8 @@ class RuleSet(models.Model): if check_user_role(user, role, permission): return True - print("failed permission check for", table, permission) + # Print message instead of throwing an error + print("Failed permission check for", table, permission) return False @staticmethod