mirror of
				https://github.com/inventree/InvenTree.git
				synced 2025-10-30 20:55:42 +00:00 
			
		
		
		
	Refactor total_price into a mixin
- Required for PurchaseOrder and SalesOrder - May not be required for ReturnOrder (remains to be seen)
This commit is contained in:
		| @@ -46,68 +46,16 @@ from users import models as UserModels | |||||||
| logger = logging.getLogger('inventree') | logger = logging.getLogger('inventree') | ||||||
|  |  | ||||||
|  |  | ||||||
| class Order(MetadataMixin, ReferenceIndexingMixin): | class TotalPriceMixin: | ||||||
|     """Abstract model for an order. |     """Mixin which provides 'total_price' field for an order""" | ||||||
|  |  | ||||||
|     Instances of this class: |  | ||||||
|  |  | ||||||
|     - PuchaseOrder |  | ||||||
|     - SalesOrder |  | ||||||
|  |  | ||||||
|     Attributes: |  | ||||||
|         reference: Unique order number / reference / code |  | ||||||
|         description: Long form description (required) |  | ||||||
|         notes: Extra note field (optional) |  | ||||||
|         creation_date: Automatic date of order creation |  | ||||||
|         created_by: User who created this order (automatically captured) |  | ||||||
|         issue_date: Date the order was issued |  | ||||||
|         complete_date: Date the order was completed |  | ||||||
|         responsible: User (or group) responsible for managing the order |  | ||||||
|     """ |  | ||||||
|  |  | ||||||
|     class Meta: |  | ||||||
|         """Metaclass options. Abstract ensures no database table is created.""" |  | ||||||
|         abstract = True |  | ||||||
|  |  | ||||||
|     def save(self, *args, **kwargs): |     def save(self, *args, **kwargs): | ||||||
|         """Custom save method for the order models: |         """Update the total_price field when saved""" | ||||||
|  |  | ||||||
|         Ensures that the reference field is rebuilt whenever the instance is saved. |  | ||||||
|         """ |  | ||||||
|         self.reference_int = self.rebuild_reference_field(self.reference) |  | ||||||
|  |  | ||||||
|         if not self.creation_date: |  | ||||||
|             self.creation_date = datetime.now().date() |  | ||||||
|  |  | ||||||
|         # Recalculate total_price for this order |         # Recalculate total_price for this order | ||||||
|         self.update_total_price(commit=False) |         self.update_total_price(commit=False) | ||||||
|  |  | ||||||
|         super().save(*args, **kwargs) |         super().save(*args, **kwargs) | ||||||
|  |  | ||||||
|     description = models.CharField(max_length=250, verbose_name=_('Description'), help_text=_('Order description')) |  | ||||||
|  |  | ||||||
|     link = InvenTreeURLField(blank=True, verbose_name=_('Link'), help_text=_('Link to external page')) |  | ||||||
|  |  | ||||||
|     creation_date = models.DateField(blank=True, null=True, verbose_name=_('Creation Date')) |  | ||||||
|  |  | ||||||
|     created_by = models.ForeignKey(User, |  | ||||||
|                                    on_delete=models.SET_NULL, |  | ||||||
|                                    blank=True, null=True, |  | ||||||
|                                    related_name='+', |  | ||||||
|                                    verbose_name=_('Created By') |  | ||||||
|                                    ) |  | ||||||
|  |  | ||||||
|     responsible = models.ForeignKey( |  | ||||||
|         UserModels.Owner, |  | ||||||
|         on_delete=models.SET_NULL, |  | ||||||
|         blank=True, null=True, |  | ||||||
|         help_text=_('User or group responsible for this order'), |  | ||||||
|         verbose_name=_('Responsible'), |  | ||||||
|         related_name='+', |  | ||||||
|     ) |  | ||||||
|  |  | ||||||
|     notes = InvenTreeNotesField(help_text=_('Order notes')) |  | ||||||
|  |  | ||||||
|     total_price = InvenTreeModelMoneyField( |     total_price = InvenTreeModelMoneyField( | ||||||
|         null=True, blank=True, |         null=True, blank=True, | ||||||
|         allow_negative=False, |         allow_negative=False, | ||||||
| @@ -183,7 +131,67 @@ class Order(MetadataMixin, ReferenceIndexingMixin): | |||||||
|         return total |         return total | ||||||
|  |  | ||||||
|  |  | ||||||
| class PurchaseOrder(Order): | class Order(MetadataMixin, ReferenceIndexingMixin): | ||||||
|  |     """Abstract model for an order. | ||||||
|  |  | ||||||
|  |     Instances of this class: | ||||||
|  |  | ||||||
|  |     - PuchaseOrder | ||||||
|  |     - SalesOrder | ||||||
|  |  | ||||||
|  |     Attributes: | ||||||
|  |         reference: Unique order number / reference / code | ||||||
|  |         description: Long form description (required) | ||||||
|  |         notes: Extra note field (optional) | ||||||
|  |         creation_date: Automatic date of order creation | ||||||
|  |         created_by: User who created this order (automatically captured) | ||||||
|  |         issue_date: Date the order was issued | ||||||
|  |         complete_date: Date the order was completed | ||||||
|  |         responsible: User (or group) responsible for managing the order | ||||||
|  |     """ | ||||||
|  |  | ||||||
|  |     class Meta: | ||||||
|  |         """Metaclass options. Abstract ensures no database table is created.""" | ||||||
|  |         abstract = True | ||||||
|  |  | ||||||
|  |     def save(self, *args, **kwargs): | ||||||
|  |         """Custom save method for the order models: | ||||||
|  |  | ||||||
|  |         Ensures that the reference field is rebuilt whenever the instance is saved. | ||||||
|  |         """ | ||||||
|  |         self.reference_int = self.rebuild_reference_field(self.reference) | ||||||
|  |  | ||||||
|  |         if not self.creation_date: | ||||||
|  |             self.creation_date = datetime.now().date() | ||||||
|  |  | ||||||
|  |         super().save(*args, **kwargs) | ||||||
|  |  | ||||||
|  |     description = models.CharField(max_length=250, verbose_name=_('Description'), help_text=_('Order description')) | ||||||
|  |  | ||||||
|  |     link = InvenTreeURLField(blank=True, verbose_name=_('Link'), help_text=_('Link to external page')) | ||||||
|  |  | ||||||
|  |     creation_date = models.DateField(blank=True, null=True, verbose_name=_('Creation Date')) | ||||||
|  |  | ||||||
|  |     created_by = models.ForeignKey(User, | ||||||
|  |                                    on_delete=models.SET_NULL, | ||||||
|  |                                    blank=True, null=True, | ||||||
|  |                                    related_name='+', | ||||||
|  |                                    verbose_name=_('Created By') | ||||||
|  |                                    ) | ||||||
|  |  | ||||||
|  |     responsible = models.ForeignKey( | ||||||
|  |         UserModels.Owner, | ||||||
|  |         on_delete=models.SET_NULL, | ||||||
|  |         blank=True, null=True, | ||||||
|  |         help_text=_('User or group responsible for this order'), | ||||||
|  |         verbose_name=_('Responsible'), | ||||||
|  |         related_name='+', | ||||||
|  |     ) | ||||||
|  |  | ||||||
|  |     notes = InvenTreeNotesField(help_text=_('Order notes')) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class PurchaseOrder(TotalPriceMixin, Order): | ||||||
|     """A PurchaseOrder represents goods shipped inwards from an external supplier. |     """A PurchaseOrder represents goods shipped inwards from an external supplier. | ||||||
|  |  | ||||||
|     Attributes: |     Attributes: | ||||||
| @@ -596,7 +604,7 @@ def after_save_purchase_order(sender, instance: PurchaseOrder, created: bool, ** | |||||||
|         notify_responsible(instance, sender, exclude=instance.created_by) |         notify_responsible(instance, sender, exclude=instance.created_by) | ||||||
|  |  | ||||||
|  |  | ||||||
| class SalesOrder(Order): | class SalesOrder(TotalPriceMixin, Order): | ||||||
|     """A SalesOrder represents a list of goods shipped outwards to a customer. |     """A SalesOrder represents a list of goods shipped outwards to a customer. | ||||||
|  |  | ||||||
|     Attributes: |     Attributes: | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user