Skip to content

WIP: Add reference sources model #8638

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 16 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion src/backend/InvenTree/InvenTree/api_version.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
"""InvenTree API version information."""

# InvenTree API version
INVENTREE_API_VERSION = 312
INVENTREE_API_VERSION = 313

"""Increment this API version number whenever there is a significant change to the API that any clients need to know about."""


INVENTREE_API_TEXT = """

v313 - 2025-02-20 : https://github.com/inventree/InvenTree/pull/8596
- Adds ReferenceSource and Reference endpoints to the API

v312 - 2025-02-15 : https://github.com/inventree/InvenTree/pull/9079
- Remove old API endpoints associated with legacy BOM import functionality

Expand Down
2 changes: 2 additions & 0 deletions src/backend/InvenTree/common/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -118,3 +118,5 @@ class NewsFeedEntryAdmin(admin.ModelAdmin):


admin.site.register(common.models.WebhookMessage, admin.ModelAdmin)
admin.site.register(common.models.Reference, admin.ModelAdmin)
admin.site.register(common.models.ReferenceSource, admin.ModelAdmin)
113 changes: 113 additions & 0 deletions src/backend/InvenTree/common/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -882,6 +882,117 @@ class SelectionEntryDetail(EntryMixin, RetrieveUpdateDestroyAPI):
path('', SelectionListList.as_view(), name='api-selectionlist-list'),
]


class ReferenceSourceList(ListCreateAPI):
"""List view for all reference sources."""

queryset = common.models.ReferenceSource.objects.all()
serializer_class = common.serializers.ReferenceSourceSerializer
permission_classes = [permissions.IsAuthenticated, IsStaffOrReadOnly]
filter_backends = SEARCH_ORDER_FILTER

ordering_fields = [
'name',
'description',
'slug',
'locked',
'active',
'source_plugin',
'created',
'last_updated',
]
search_fields = ['name', 'description', 'slug']


class ReferenceSourceDetail(RetrieveUpdateDestroyAPI):
"""Detail view for a particular reference source."""

queryset = common.models.ReferenceSource.objects.all()
serializer_class = common.serializers.ReferenceSourceSerializer
permission_classes = [permissions.IsAuthenticated, IsStaffOrReadOnly]


class ReferenceList(ListCreateAPI):
"""List view for all references."""

queryset = common.models.Reference.objects.all()
serializer_class = common.serializers.ReferenceSerializer
permission_classes = [permissions.IsAuthenticated, IsStaffOrReadOnly]
filter_backends = SEARCH_ORDER_FILTER

ordering_fields = [
'source',
'target',
'value',
'locked',
'created',
'last_updated',
'checked',
'last_checked',
]
search_fields = ['source', 'target', 'value']

def get_queryset(self):
"""Return prefetched queryset."""
queryset = (
super()
.get_queryset()
.prefetch_related('target_content_type', 'target_object_id')
)

return queryset


class ReferenceDetail(RetrieveUpdateDestroyAPI):
"""Detail view for a particular reference."""

queryset = common.models.Reference.objects.all()
serializer_class = common.serializers.ReferenceSerializer
permission_classes = [permissions.IsAuthenticated, IsStaffOrReadOnly]

def get_queryset(self):
"""Return prefetched queryset."""
queryset = (
super()
.get_queryset()
.prefetch_related('target_content_type', 'target_object_id')
)

return queryset


reference_urls = [
path(
'source/',
include([
path(
'<int:pk>/',
include([
path(
'',
ReferenceSourceDetail.as_view(),
name='api-reference-source-detail',
)
]),
),
path('', ReferenceSourceList.as_view(), name='api-reference-source-list'),
]),
),
# TODO add api endpoint to get all references for a target
path(
'',
include([
path(
'<int:pk>/',
include([
path('', ReferenceDetail.as_view(), name='api-reference-detail')
]),
),
path('', ReferenceList.as_view(), name='api-reference-list'),
]),
),
]

# API URL patterns
settings_api_urls = [
# User settings
Expand Down Expand Up @@ -1093,6 +1204,8 @@ class SelectionEntryDetail(EntryMixin, RetrieveUpdateDestroyAPI):
path('icons/', IconList.as_view(), name='api-icon-list'),
# Selection lists
path('selection/', include(selection_urls)),
# References
path('reference/', include(reference_urls)),
]

admin_api_urls = [
Expand Down
Loading
Loading