"""Admin functionality for the 'order' app""" from django.contrib import admin import import_export.widgets as widgets from import_export.admin import ImportExportModelAdmin from import_export.fields import Field from InvenTree.admin import InvenTreeResource from .models import (PurchaseOrder, PurchaseOrderExtraLine, PurchaseOrderLineItem, SalesOrder, SalesOrderAllocation, SalesOrderExtraLine, SalesOrderLineItem, SalesOrderShipment) # region general classes class GeneralExtraLineAdmin: """Admin class template for the 'ExtraLineItem' models""" list_display = ( 'order', 'quantity', 'reference' ) search_fields = [ 'order__reference', 'order__customer__name', 'reference', ] autocomplete_fields = ('order', ) class GeneralExtraLineMeta: """Metaclass template for the 'ExtraLineItem' models""" skip_unchanged = True report_skipped = False clean_model_instances = True # endregion class PurchaseOrderLineItemInlineAdmin(admin.StackedInline): """Inline admin class for the PurchaseOrderLineItem model""" model = PurchaseOrderLineItem extra = 0 class PurchaseOrderAdmin(ImportExportModelAdmin): """Admin class for the PurchaseOrder model""" exclude = [ 'reference_int', ] list_display = ( 'reference', 'supplier', 'status', 'description', 'creation_date' ) search_fields = [ 'reference', 'supplier__name', 'description', ] inlines = [ PurchaseOrderLineItemInlineAdmin ] autocomplete_fields = ('supplier',) class SalesOrderAdmin(ImportExportModelAdmin): """Admin class for the SalesOrder model""" exclude = [ 'reference_int', ] list_display = ( 'reference', 'customer', 'status', 'description', 'creation_date', ) search_fields = [ 'reference', 'customer__name', 'description', ] autocomplete_fields = ('customer',) class PurchaseOrderResource(InvenTreeResource): """Class for managing import / export of PurchaseOrder data.""" # Add number of line items line_items = Field(attribute='line_count', widget=widgets.IntegerWidget(), readonly=True) # Is this order overdue? overdue = Field(attribute='is_overdue', widget=widgets.BooleanWidget(), readonly=True) class Meta: """Metaclass""" model = PurchaseOrder skip_unchanged = True clean_model_instances = True exclude = [ 'metadata', ] class PurchaseOrderLineItemResource(InvenTreeResource): """Class for managing import / export of PurchaseOrderLineItem data.""" part_name = Field(attribute='part__part__name', readonly=True) manufacturer = Field(attribute='part__manufacturer', readonly=True) MPN = Field(attribute='part__MPN', readonly=True) SKU = Field(attribute='part__SKU', readonly=True) class Meta: """Metaclass""" model = PurchaseOrderLineItem skip_unchanged = True report_skipped = False clean_model_instances = True class PurchaseOrderExtraLineResource(InvenTreeResource): """Class for managing import / export of PurchaseOrderExtraLine data.""" class Meta(GeneralExtraLineMeta): """Metaclass options.""" model = PurchaseOrderExtraLine class SalesOrderResource(InvenTreeResource): """Class for managing import / export of SalesOrder data.""" # Add number of line items line_items = Field(attribute='line_count', widget=widgets.IntegerWidget(), readonly=True) # Is this order overdue? overdue = Field(attribute='is_overdue', widget=widgets.BooleanWidget(), readonly=True) class Meta: """Metaclass options""" model = SalesOrder skip_unchanged = True clean_model_instances = True exclude = [ 'metadata', ] class SalesOrderLineItemResource(InvenTreeResource): """Class for managing import / export of SalesOrderLineItem data.""" part_name = Field(attribute='part__name', readonly=True) IPN = Field(attribute='part__IPN', readonly=True) description = Field(attribute='part__description', readonly=True) fulfilled = Field(attribute='fulfilled_quantity', readonly=True) def dehydrate_sale_price(self, item): """Return a string value of the 'sale_price' field, rather than the 'Money' object. Ref: https://github.com/inventree/InvenTree/issues/2207 """ if item.sale_price: return str(item.sale_price) else: return '' class Meta: """Metaclass options""" model = SalesOrderLineItem skip_unchanged = True report_skipped = False clean_model_instances = True class SalesOrderExtraLineResource(InvenTreeResource): """Class for managing import / export of SalesOrderExtraLine data.""" class Meta(GeneralExtraLineMeta): """Metaclass options.""" model = SalesOrderExtraLine class PurchaseOrderLineItemAdmin(ImportExportModelAdmin): """Admin class for the PurchaseOrderLine model""" resource_class = PurchaseOrderLineItemResource list_display = ( 'order', 'part', 'quantity', 'reference' ) search_fields = ('reference',) autocomplete_fields = ('order', 'part', 'destination',) class PurchaseOrderExtraLineAdmin(GeneralExtraLineAdmin, ImportExportModelAdmin): """Admin class for the PurchaseOrderExtraLine model""" resource_class = PurchaseOrderExtraLineResource class SalesOrderLineItemAdmin(ImportExportModelAdmin): """Admin class for the SalesOrderLine model""" resource_class = SalesOrderLineItemResource list_display = ( 'order', 'part', 'quantity', 'reference' ) search_fields = [ 'part__name', 'order__reference', 'order__customer__name', 'reference', ] autocomplete_fields = ('order', 'part',) class SalesOrderExtraLineAdmin(GeneralExtraLineAdmin, ImportExportModelAdmin): """Admin class for the SalesOrderExtraLine model""" resource_class = SalesOrderExtraLineResource class SalesOrderShipmentAdmin(ImportExportModelAdmin): """Admin class for the SalesOrderShipment model""" list_display = [ 'order', 'shipment_date', 'reference', ] search_fields = [ 'reference', 'order__reference', 'order__customer__name', ] autocomplete_fields = ('order',) class SalesOrderAllocationAdmin(ImportExportModelAdmin): """Admin class for the SalesOrderAllocation model""" list_display = ( 'line', 'item', 'quantity' ) autocomplete_fields = ('line', 'shipment', 'item',) admin.site.register(PurchaseOrder, PurchaseOrderAdmin) admin.site.register(PurchaseOrderLineItem, PurchaseOrderLineItemAdmin) admin.site.register(PurchaseOrderExtraLine, PurchaseOrderExtraLineAdmin) admin.site.register(SalesOrder, SalesOrderAdmin) admin.site.register(SalesOrderLineItem, SalesOrderLineItemAdmin) admin.site.register(SalesOrderExtraLine, SalesOrderExtraLineAdmin) admin.site.register(SalesOrderShipment, SalesOrderShipmentAdmin) admin.site.register(SalesOrderAllocation, SalesOrderAllocationAdmin)