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..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'] @@ -1189,10 +1207,12 @@ 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(), + ], + ) def stock_entries(self, include_variants=True, in_stock=None): """ Return all stock entries for this Part. 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 diff --git a/requirements.txt b/requirements.txt index 75bce438f6..1392531e29 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,8 +1,8 @@ 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 +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