mirror of
https://github.com/inventree/InvenTree.git
synced 2025-12-17 17:58:22 +00:00
[refactor] Improve primary_address annotation for Company API (#11006)
* Refactor primary_address annotation - Remove SerializerMethodField - Better cache introspection * Allow address detail to be optional * Refactor address caching * Fix primary_address annotation * Remove "address_count" field - Pointless annotation which is not used anywhere * Update API version * Tweak docs page * Tweak unit tests
This commit is contained in:
@@ -6,7 +6,6 @@ from django.core.files.base import ContentFile
|
||||
from django.db.models import Prefetch
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
|
||||
from drf_spectacular.utils import extend_schema_field
|
||||
from rest_framework import serializers
|
||||
from sql_util.utils import SubqueryCount
|
||||
from taggit.serializers import TagListSerializerField
|
||||
@@ -136,7 +135,6 @@ class CompanySerializer(
|
||||
'website',
|
||||
'name',
|
||||
'phone',
|
||||
'address',
|
||||
'email',
|
||||
'currency',
|
||||
'contact',
|
||||
@@ -150,7 +148,6 @@ class CompanySerializer(
|
||||
'parts_supplied',
|
||||
'parts_manufactured',
|
||||
'remote_image',
|
||||
'address_count',
|
||||
'primary_address',
|
||||
'tax_id',
|
||||
'parameters',
|
||||
@@ -166,8 +163,6 @@ class CompanySerializer(
|
||||
|
||||
queryset = queryset.annotate(parts_supplied=SubqueryCount('supplied_parts'))
|
||||
|
||||
queryset = queryset.annotate(address_count=SubqueryCount('addresses'))
|
||||
|
||||
queryset = queryset.prefetch_related(
|
||||
Prefetch(
|
||||
'addresses',
|
||||
@@ -180,30 +175,12 @@ class CompanySerializer(
|
||||
|
||||
return queryset
|
||||
|
||||
address = serializers.SerializerMethodField(
|
||||
label=_('Primary Address'),
|
||||
help_text=_(
|
||||
'Return the string representation for the primary address. This property exists for backwards compatibility.'
|
||||
),
|
||||
allow_null=True,
|
||||
primary_address = enable_filter(
|
||||
AddressBriefSerializer(read_only=True, allow_null=True),
|
||||
True,
|
||||
filter_name='address_detail',
|
||||
)
|
||||
|
||||
primary_address = serializers.SerializerMethodField(allow_null=True)
|
||||
|
||||
@extend_schema_field(serializers.CharField())
|
||||
def get_address(self, obj):
|
||||
"""Return string version of primary address (for backwards compatibility)."""
|
||||
if hasattr(obj, 'primary_address_list') and obj.primary_address_list:
|
||||
return str(obj.primary_address_list[0])
|
||||
return None
|
||||
|
||||
@extend_schema_field(AddressSerializer())
|
||||
def get_primary_address(self, obj):
|
||||
"""Return full address object for primary address using prefetch data."""
|
||||
if hasattr(obj, 'primary_address_list') and obj.primary_address_list:
|
||||
return AddressSerializer(obj.primary_address_list[0]).data
|
||||
return None
|
||||
|
||||
image = InvenTreeImageSerializerField(required=False, allow_null=True)
|
||||
|
||||
email = serializers.EmailField(
|
||||
@@ -211,8 +188,8 @@ class CompanySerializer(
|
||||
)
|
||||
|
||||
parts_supplied = serializers.IntegerField(read_only=True)
|
||||
|
||||
parts_manufactured = serializers.IntegerField(read_only=True)
|
||||
address_count = serializers.IntegerField(read_only=True)
|
||||
|
||||
currency = InvenTreeCurrencySerializer(
|
||||
help_text=_('Default currency used for this supplier'), required=True
|
||||
|
||||
Reference in New Issue
Block a user