mirror of
				https://github.com/inventree/InvenTree.git
				synced 2025-10-31 13:15:43 +00:00 
			
		
		
		
	refactor: remove blank lines after docstring (#5736)
There shouldn't be any blank lines after the function docstring. Remove the blank lines to fix this issue. Co-authored-by: deepsource-autofix[bot] <62050782+deepsource-autofix[bot]@users.noreply.github.com>
This commit is contained in:
		| @@ -100,7 +100,6 @@ class BuildFilter(rest_filters.FilterSet): | ||||
|  | ||||
|     def filter_has_project_code(self, queryset, name, value): | ||||
|         """Filter by whether or not the order has a project code""" | ||||
|  | ||||
|         if str2bool(value): | ||||
|             return queryset.exclude(project_code=None) | ||||
|         else: | ||||
| @@ -235,7 +234,6 @@ class BuildDetail(RetrieveUpdateDestroyAPI): | ||||
|  | ||||
|     def destroy(self, request, *args, **kwargs): | ||||
|         """Only allow deletion of a BuildOrder if the build status is CANCELLED""" | ||||
|  | ||||
|         build = self.get_object() | ||||
|  | ||||
|         if build.status != BuildStatus.CANCELLED: | ||||
| @@ -292,7 +290,6 @@ class BuildLineFilter(rest_filters.FilterSet): | ||||
|  | ||||
|     def filter_allocated(self, queryset, name, value): | ||||
|         """Filter by whether each BuildLine is fully allocated""" | ||||
|  | ||||
|         if str2bool(value): | ||||
|             return queryset.filter(allocated__gte=F('quantity')) | ||||
|         else: | ||||
| @@ -309,7 +306,6 @@ class BuildLineFilter(rest_filters.FilterSet): | ||||
|         - The quantity available for each BuildLine | ||||
|         - The quantity allocated for each BuildLine | ||||
|         """ | ||||
|  | ||||
|         flt = Q(quantity__lte=F('total_available_stock') + F('allocated')) | ||||
|  | ||||
|         if str2bool(value): | ||||
|   | ||||
| @@ -348,7 +348,6 @@ class Build(MPTTModel, InvenTree.models.InvenTreeBarcodeMixin, InvenTree.models. | ||||
|     @property | ||||
|     def tracked_line_items(self): | ||||
|         """Returns the "trackable" BOM lines for this BuildOrder.""" | ||||
|  | ||||
|         return self.build_lines.filter(bom_item__sub_part__trackable=True) | ||||
|  | ||||
|     def has_tracked_line_items(self): | ||||
| @@ -358,7 +357,6 @@ class Build(MPTTModel, InvenTree.models.InvenTreeBarcodeMixin, InvenTree.models. | ||||
|     @property | ||||
|     def untracked_line_items(self): | ||||
|         """Returns the "non trackable" BOM items for this BuildOrder.""" | ||||
|  | ||||
|         return self.build_lines.filter(bom_item__sub_part__trackable=False) | ||||
|  | ||||
|     @property | ||||
| @@ -432,7 +430,6 @@ class Build(MPTTModel, InvenTree.models.InvenTreeBarcodeMixin, InvenTree.models. | ||||
|  | ||||
|     def is_partially_allocated(self): | ||||
|         """Test is this build order has any stock allocated against it""" | ||||
|  | ||||
|         return self.allocated_stock.count() > 0 | ||||
|  | ||||
|     @property | ||||
| @@ -497,7 +494,6 @@ class Build(MPTTModel, InvenTree.models.InvenTreeBarcodeMixin, InvenTree.models. | ||||
|         - Completed count must meet the required quantity | ||||
|         - Untracked parts must be allocated | ||||
|         """ | ||||
|  | ||||
|         if self.incomplete_count > 0: | ||||
|             return False | ||||
|  | ||||
| @@ -780,7 +776,6 @@ class Build(MPTTModel, InvenTree.models.InvenTreeBarcodeMixin, InvenTree.models. | ||||
|     @transaction.atomic | ||||
|     def trim_allocated_stock(self): | ||||
|         """Called after save to reduce allocated stock if the build order is now overallocated.""" | ||||
|  | ||||
|         # Only need to worry about untracked stock here | ||||
|         for build_line in self.untracked_line_items: | ||||
|  | ||||
| @@ -817,7 +812,6 @@ class Build(MPTTModel, InvenTree.models.InvenTreeBarcodeMixin, InvenTree.models. | ||||
|     @transaction.atomic | ||||
|     def subtract_allocated_stock(self, user): | ||||
|         """Called when the Build is marked as "complete", this function removes the allocated untracked items from stock.""" | ||||
|  | ||||
|         # Find all BuildItem objects which point to this build | ||||
|         items = self.allocated_stock.filter( | ||||
|             build_line__bom_item__sub_part__trackable=False | ||||
| @@ -839,7 +833,6 @@ class Build(MPTTModel, InvenTree.models.InvenTreeBarcodeMixin, InvenTree.models. | ||||
|         - Set the item status to "scrapped" | ||||
|         - Add a transaction entry to the stock item history | ||||
|         """ | ||||
|  | ||||
|         if not output: | ||||
|             raise ValidationError(_("No build output specified")) | ||||
|  | ||||
| @@ -1069,7 +1062,6 @@ class Build(MPTTModel, InvenTree.models.InvenTreeBarcodeMixin, InvenTree.models. | ||||
|  | ||||
|     def unallocated_lines(self, tracked=None): | ||||
|         """Returns a list of BuildLine objects which have not been fully allocated.""" | ||||
|  | ||||
|         lines = self.build_lines.all() | ||||
|  | ||||
|         if tracked is True: | ||||
| @@ -1096,7 +1088,6 @@ class Build(MPTTModel, InvenTree.models.InvenTreeBarcodeMixin, InvenTree.models. | ||||
|         Returns: | ||||
|             True if the BuildOrder has been fully allocated, otherwise False | ||||
|         """ | ||||
|  | ||||
|         lines = self.unallocated_lines(tracked=tracked) | ||||
|         return len(lines) == 0 | ||||
|  | ||||
| @@ -1109,7 +1100,6 @@ class Build(MPTTModel, InvenTree.models.InvenTreeBarcodeMixin, InvenTree.models. | ||||
|         To determine if the output has been fully allocated, | ||||
|         we need to test all "trackable" BuildLine objects | ||||
|         """ | ||||
|  | ||||
|         for line in self.build_lines.filter(bom_item__sub_part__trackable=True): | ||||
|             # Grab all BuildItem objects which point to this output | ||||
|             allocations = BuildItem.objects.filter( | ||||
| @@ -1134,7 +1124,6 @@ class Build(MPTTModel, InvenTree.models.InvenTreeBarcodeMixin, InvenTree.models. | ||||
|         Returns: | ||||
|             True if any BuildLine has been over-allocated. | ||||
|         """ | ||||
|  | ||||
|         for line in self.build_lines.all(): | ||||
|             if line.is_overallocated(): | ||||
|                 return True | ||||
| @@ -1159,7 +1148,6 @@ class Build(MPTTModel, InvenTree.models.InvenTreeBarcodeMixin, InvenTree.models. | ||||
|     @transaction.atomic | ||||
|     def create_build_line_items(self, prevent_duplicates=True): | ||||
|         """Create BuildLine objects for each BOM line in this BuildOrder.""" | ||||
|  | ||||
|         lines = [] | ||||
|  | ||||
|         bom_items = self.part.get_bom_items() | ||||
| @@ -1192,7 +1180,6 @@ class Build(MPTTModel, InvenTree.models.InvenTreeBarcodeMixin, InvenTree.models. | ||||
|     @transaction.atomic | ||||
|     def update_build_line_items(self): | ||||
|         """Rebuild required quantity field for each BuildLine object""" | ||||
|  | ||||
|         lines_to_update = [] | ||||
|  | ||||
|         for line in self.build_lines.all(): | ||||
| @@ -1296,7 +1283,6 @@ class BuildLine(models.Model): | ||||
|  | ||||
|     def allocated_quantity(self): | ||||
|         """Calculate the total allocated quantity for this BuildLine""" | ||||
|  | ||||
|         # Queryset containing all BuildItem objects allocated against this BuildLine | ||||
|         allocations = self.allocations.all() | ||||
|  | ||||
| @@ -1312,7 +1298,6 @@ class BuildLine(models.Model): | ||||
|  | ||||
|     def is_fully_allocated(self): | ||||
|         """Return True if this BuildLine is fully allocated""" | ||||
|  | ||||
|         if self.bom_item.consumable: | ||||
|             return True | ||||
|  | ||||
|   | ||||
| @@ -129,7 +129,6 @@ class BuildSerializer(InvenTreeModelSerializer): | ||||
|  | ||||
|     def validate_reference(self, reference): | ||||
|         """Custom validation for the Build reference field""" | ||||
|  | ||||
|         # Ensure the reference matches the required pattern | ||||
|         Build.validate_reference_field(reference) | ||||
|  | ||||
| @@ -209,7 +208,6 @@ class BuildOutputQuantitySerializer(BuildOutputSerializer): | ||||
|  | ||||
|     def validate(self, data): | ||||
|         """Validate the serializer data""" | ||||
|  | ||||
|         data = super().validate(data) | ||||
|  | ||||
|         output = data.get('output') | ||||
| @@ -450,7 +448,6 @@ class BuildOutputScrapSerializer(serializers.Serializer): | ||||
|  | ||||
|     def save(self): | ||||
|         """Save the serializer to scrap the build outputs""" | ||||
|  | ||||
|         build = self.context['build'] | ||||
|         request = self.context['request'] | ||||
|         data = self.validated_data | ||||
| @@ -625,7 +622,6 @@ class BuildCompleteSerializer(serializers.Serializer): | ||||
|  | ||||
|         This is so we can determine (at run time) whether the build is ready to be completed. | ||||
|         """ | ||||
|  | ||||
|         build = self.context['build'] | ||||
|  | ||||
|         return { | ||||
| @@ -1095,7 +1091,6 @@ class BuildLineSerializer(InvenTreeModelSerializer): | ||||
|         - available: Total stock available for allocation against this build line | ||||
|         - on_order: Total stock on order for this build line | ||||
|         """ | ||||
|  | ||||
|         queryset = queryset.select_related( | ||||
|             'build', 'bom_item', | ||||
|         ) | ||||
|   | ||||
| @@ -29,7 +29,6 @@ def update_build_order_lines(bom_item_pk: int): | ||||
|  | ||||
|     This task is triggered when a BomItem is created or updated. | ||||
|     """ | ||||
|  | ||||
|     logger.info("Updating build order lines for BomItem %s", bom_item_pk) | ||||
|  | ||||
|     bom_item = part_models.BomItem.objects.filter(pk=bom_item_pk).first() | ||||
| @@ -156,7 +155,6 @@ def check_build_stock(build: build.models.Build): | ||||
|  | ||||
| def notify_overdue_build_order(bo: build.models.Build): | ||||
|     """Notify appropriate users that a Build has just become 'overdue'""" | ||||
|  | ||||
|     targets = [] | ||||
|  | ||||
|     if bo.issued_by: | ||||
| @@ -202,7 +200,6 @@ def check_overdue_build_orders(): | ||||
|     - Look at the 'target_date' of any outstanding BuildOrder objects | ||||
|     - If the 'target_date' expired *yesterday* then the order is just out of date | ||||
|     """ | ||||
|  | ||||
|     yesterday = datetime.now().date() - timedelta(days=1) | ||||
|  | ||||
|     overdue_orders = build.models.Build.objects.filter( | ||||
|   | ||||
| @@ -279,7 +279,6 @@ class BuildTest(BuildAPITest): | ||||
|  | ||||
|     def test_delete(self): | ||||
|         """Test that we can delete a BuildOrder via the API""" | ||||
|  | ||||
|         bo = Build.objects.get(pk=1) | ||||
|  | ||||
|         url = reverse('api-build-detail', kwargs={'pk': bo.pk}) | ||||
| @@ -684,9 +683,7 @@ class BuildAllocationTest(BuildAPITest): | ||||
|  | ||||
|     def test_invalid_bom_item(self): | ||||
|         """Test by passing an invalid BOM item.""" | ||||
|  | ||||
|         # Find the right (in this case, wrong) BuildLine instance | ||||
|  | ||||
|         si = StockItem.objects.get(pk=11) | ||||
|         lines = self.build.build_lines.all() | ||||
|  | ||||
| @@ -718,7 +715,6 @@ class BuildAllocationTest(BuildAPITest): | ||||
|  | ||||
|         This should result in creation of a new BuildItem object | ||||
|         """ | ||||
|  | ||||
|         # Find the correct BuildLine | ||||
|         si = StockItem.objects.get(pk=2) | ||||
|  | ||||
| @@ -758,7 +754,6 @@ class BuildAllocationTest(BuildAPITest): | ||||
|  | ||||
|         This should increment the quantity of the existing BuildItem object | ||||
|         """ | ||||
|  | ||||
|         # Find the correct BuildLine | ||||
|         si = StockItem.objects.get(pk=2) | ||||
|  | ||||
| @@ -875,7 +870,6 @@ class BuildOverallocationTest(BuildAPITest): | ||||
|  | ||||
|     def test_setup(self): | ||||
|         """Validate expected state after set-up.""" | ||||
|  | ||||
|         self.assertEqual(self.build.incomplete_outputs.count(), 0) | ||||
|         self.assertEqual(self.build.complete_outputs.count(), 1) | ||||
|         self.assertEqual(self.build.completed, self.build.quantity) | ||||
| @@ -1040,7 +1034,6 @@ class BuildOutputScrapTest(BuildAPITest): | ||||
|  | ||||
|     def scrap(self, build_id, data, expected_code=None): | ||||
|         """Helper method to POST to the scrap API""" | ||||
|  | ||||
|         url = reverse('api-build-output-scrap', kwargs={'pk': build_id}) | ||||
|  | ||||
|         response = self.post(url, data, expected_code=expected_code) | ||||
| @@ -1049,7 +1042,6 @@ class BuildOutputScrapTest(BuildAPITest): | ||||
|  | ||||
|     def test_invalid_scraps(self): | ||||
|         """Test that invalid scrap attempts are rejected""" | ||||
|  | ||||
|         # Test with missing required fields | ||||
|         response = self.scrap(1, {}, expected_code=400) | ||||
|  | ||||
| @@ -1113,7 +1105,6 @@ class BuildOutputScrapTest(BuildAPITest): | ||||
|  | ||||
|     def test_valid_scraps(self): | ||||
|         """Test that valid scrap attempts succeed""" | ||||
|  | ||||
|         # Create a build output | ||||
|         build = Build.objects.get(pk=1) | ||||
|  | ||||
|   | ||||
| @@ -45,7 +45,6 @@ class BuildTestBase(TestCase): | ||||
|         - 7 x output_2 | ||||
|  | ||||
|         """ | ||||
|  | ||||
|         super().setUpTestData() | ||||
|  | ||||
|         # Create a base "Part" | ||||
| @@ -145,7 +144,6 @@ class BuildTest(BuildTestBase): | ||||
|  | ||||
|     def test_ref_int(self): | ||||
|         """Test the "integer reference" field used for natural sorting""" | ||||
|  | ||||
|         # Set build reference to new value | ||||
|         common.models.InvenTreeSetting.set_setting('BUILDORDER_REFERENCE_PATTERN', 'BO-{ref}-???', change_user=None) | ||||
|  | ||||
| @@ -174,9 +172,7 @@ class BuildTest(BuildTestBase): | ||||
|  | ||||
|     def test_ref_validation(self): | ||||
|         """Test that the reference field validation works as expected""" | ||||
|  | ||||
|         # Default reference pattern = 'BO-{ref:04d} | ||||
|  | ||||
|         # These patterns should fail | ||||
|         for ref in [ | ||||
|             'BO-1234x', | ||||
| @@ -223,7 +219,6 @@ class BuildTest(BuildTestBase): | ||||
|  | ||||
|     def test_next_ref(self): | ||||
|         """Test that the next reference is automatically generated""" | ||||
|  | ||||
|         common.models.InvenTreeSetting.set_setting('BUILDORDER_REFERENCE_PATTERN', 'XYZ-{ref:06d}', change_user=None) | ||||
|  | ||||
|         build = Build.objects.create( | ||||
| @@ -250,7 +245,6 @@ class BuildTest(BuildTestBase): | ||||
|  | ||||
|     def test_init(self): | ||||
|         """Perform some basic tests before we start the ball rolling""" | ||||
|  | ||||
|         self.assertEqual(StockItem.objects.count(), 10) | ||||
|  | ||||
|         # Build is PENDING | ||||
| @@ -272,7 +266,6 @@ class BuildTest(BuildTestBase): | ||||
|  | ||||
|     def test_build_item_clean(self): | ||||
|         """Ensure that dodgy BuildItem objects cannot be created""" | ||||
|  | ||||
|         stock = StockItem.objects.create(part=self.assembly, quantity=99) | ||||
|  | ||||
|         # Create a BuiltItem which points to an invalid StockItem | ||||
| @@ -299,7 +292,6 @@ class BuildTest(BuildTestBase): | ||||
|  | ||||
|     def test_duplicate_bom_line(self): | ||||
|         """Try to add a duplicate BOM item - it should be allowed""" | ||||
|  | ||||
|         BomItem.objects.create( | ||||
|             part=self.assembly, | ||||
|             sub_part=self.sub_part_1, | ||||
| @@ -313,7 +305,6 @@ class BuildTest(BuildTestBase): | ||||
|             output: StockItem object (or None) | ||||
|             allocations: Map of {StockItem: quantity} | ||||
|         """ | ||||
|  | ||||
|         items_to_create = [] | ||||
|  | ||||
|         for item, quantity in allocations.items(): | ||||
| @@ -335,7 +326,6 @@ class BuildTest(BuildTestBase): | ||||
|  | ||||
|     def test_partial_allocation(self): | ||||
|         """Test partial allocation of stock""" | ||||
|  | ||||
|         # Fully allocate tracked stock against build output 1 | ||||
|         self.allocate_stock( | ||||
|             self.output_1, | ||||
| @@ -409,7 +399,6 @@ class BuildTest(BuildTestBase): | ||||
|  | ||||
|     def test_overallocation_and_trim(self): | ||||
|         """Test overallocation of stock and trim function""" | ||||
|  | ||||
|         # Fully allocate tracked stock (not eligible for trimming) | ||||
|         self.allocate_stock( | ||||
|             self.output_1, | ||||
| @@ -484,9 +473,7 @@ class BuildTest(BuildTestBase): | ||||
|  | ||||
|     def test_cancel(self): | ||||
|         """Test cancellation of the build""" | ||||
|  | ||||
|         # TODO | ||||
|  | ||||
|         """ | ||||
|         self.allocate_stock(50, 50, 200, self.output_1) | ||||
|         self.build.cancel_build(None) | ||||
| @@ -497,7 +484,6 @@ class BuildTest(BuildTestBase): | ||||
|  | ||||
|     def test_complete(self): | ||||
|         """Test completion of a build output""" | ||||
|  | ||||
|         self.stock_1_1.quantity = 1000 | ||||
|         self.stock_1_1.save() | ||||
|  | ||||
| @@ -567,7 +553,6 @@ class BuildTest(BuildTestBase): | ||||
|  | ||||
|     def test_overdue_notification(self): | ||||
|         """Test sending of notifications when a build order is overdue.""" | ||||
|  | ||||
|         self.build.target_date = datetime.now().date() - timedelta(days=1) | ||||
|         self.build.save() | ||||
|  | ||||
| @@ -583,7 +568,6 @@ class BuildTest(BuildTestBase): | ||||
|  | ||||
|     def test_new_build_notification(self): | ||||
|         """Test that a notification is sent when a new build is created""" | ||||
|  | ||||
|         Build.objects.create( | ||||
|             reference='BO-9999', | ||||
|             title='Some new build', | ||||
| @@ -609,7 +593,6 @@ class BuildTest(BuildTestBase): | ||||
|  | ||||
|     def test_metadata(self): | ||||
|         """Unit tests for the metadata field.""" | ||||
|  | ||||
|         # Make sure a BuildItem exists before trying to run this test | ||||
|         b = BuildItem(stock_item=self.stock_1_2, build_line=self.line_1, install_into=self.output_1, quantity=10) | ||||
|         b.save() | ||||
| @@ -664,7 +647,6 @@ class AutoAllocationTests(BuildTestBase): | ||||
|  | ||||
|         A "fully auto" allocation should allocate *all* of these stock items to the build | ||||
|         """ | ||||
|  | ||||
|         # No build item allocations have been made against the build | ||||
|         self.assertEqual(self.build.allocated_stock.count(), 0) | ||||
|  | ||||
| @@ -717,7 +699,6 @@ class AutoAllocationTests(BuildTestBase): | ||||
|  | ||||
|     def test_fully_auto(self): | ||||
|         """We should be able to auto-allocate against a build in a single go""" | ||||
|  | ||||
|         self.build.auto_allocate_stock( | ||||
|             interchangeable=True, | ||||
|             substitutes=True, | ||||
|   | ||||
| @@ -111,7 +111,6 @@ class TestReferencePatternMigration(MigratorTestCase): | ||||
|  | ||||
|     def prepare(self): | ||||
|         """Create some initial data prior to migration""" | ||||
|  | ||||
|         Setting = self.old_state.apps.get_model('common', 'inventreesetting') | ||||
|  | ||||
|         # Create a custom existing prefix so we can confirm the operation is working | ||||
| @@ -141,7 +140,6 @@ class TestReferencePatternMigration(MigratorTestCase): | ||||
|  | ||||
|     def test_reference_migration(self): | ||||
|         """Test that the reference fields have been correctly updated""" | ||||
|  | ||||
|         Build = self.new_state.apps.get_model('build', 'build') | ||||
|  | ||||
|         for build in Build.objects.all(): | ||||
| @@ -170,7 +168,6 @@ class TestBuildLineCreation(MigratorTestCase): | ||||
|  | ||||
|     def prepare(self): | ||||
|         """Create data to work with""" | ||||
|  | ||||
|         # Model references | ||||
|         Part = self.old_state.apps.get_model('part', 'part') | ||||
|         BomItem = self.old_state.apps.get_model('part', 'bomitem') | ||||
| @@ -235,7 +232,6 @@ class TestBuildLineCreation(MigratorTestCase): | ||||
|  | ||||
|     def test_build_line_creation(self): | ||||
|         """Test that the BuildLine objects have been created correctly""" | ||||
|  | ||||
|         Build = self.new_state.apps.get_model('build', 'build') | ||||
|         BomItem = self.new_state.apps.get_model('part', 'bomitem') | ||||
|         BuildLine = self.new_state.apps.get_model('build', 'buildline') | ||||
|   | ||||
| @@ -3,7 +3,6 @@ | ||||
|  | ||||
| def generate_next_build_reference(): | ||||
|     """Generate the next available BuildOrder reference""" | ||||
|  | ||||
|     from build.models import Build | ||||
|  | ||||
|     return Build.generate_reference() | ||||
| @@ -11,7 +10,6 @@ def generate_next_build_reference(): | ||||
|  | ||||
| def validate_build_order_reference_pattern(pattern): | ||||
|     """Validate the BuildOrder reference 'pattern' setting""" | ||||
|  | ||||
|     from build.models import Build | ||||
|  | ||||
|     Build.validate_reference_pattern(pattern) | ||||
| @@ -19,7 +17,6 @@ def validate_build_order_reference_pattern(pattern): | ||||
|  | ||||
| def validate_build_order_reference(value): | ||||
|     """Validate that the BuildOrder reference field matches the required pattern.""" | ||||
|  | ||||
|     from build.models import Build | ||||
|  | ||||
|     # If we get to here, run the "default" validation routine | ||||
|   | ||||
		Reference in New Issue
	
	Block a user