From d93d5f9b2fec413825776db02a60a20d33fba8aa Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Mon, 25 May 2026 12:09:01 +0000 Subject: [PATCH] Updated API endpoints for NotesImage model --- src/backend/InvenTree/common/api.py | 27 ++++++++++++++++--- src/backend/InvenTree/common/models.py | 16 +---------- src/backend/InvenTree/common/serializers.py | 2 +- src/frontend/lib/enums/ApiEndpoints.tsx | 2 +- .../src/components/editors/NotesEditor.tsx | 4 +-- 5 files changed, 29 insertions(+), 22 deletions(-) diff --git a/src/backend/InvenTree/common/api.py b/src/backend/InvenTree/common/api.py index 6397d493a7..4d7956680b 100644 --- a/src/backend/InvenTree/common/api.py +++ b/src/backend/InvenTree/common/api.py @@ -465,17 +465,38 @@ class ConfigViewSet(viewsets.ReadOnlyModelViewSet): admin_router.register('config', ConfigViewSet, basename='api-config') +class NotesImageFilter(FilterSet): + """Filterset for the NotesImage API endpoint.""" + + class Meta: + """Metaclass options.""" + + model = common.models.NotesImage + fields = ['user', 'note'] + + model_id = rest_filters.NumberFilter( + label=_('Model ID'), field_name='note__model_id' + ) + + model_type = rest_filters.CharFilter(method='filter_model_type', label='Model Type') + + def filter_model_type(self, queryset, name, value): + """Filter queryset to include only Parameters of the given model type.""" + return common.filters.filter_content_type( + queryset, 'note__model_type', value, allow_null=False + ) + + class NotesImageList(ListCreateAPI): """List view for all notes images.""" queryset = common.models.NotesImage.objects.all() serializer_class = common.serializers.NotesImageSerializer permission_classes = [IsAuthenticatedOrReadScope] + filterset_class = NotesImageFilter filter_backends = SEARCH_ORDER_FILTER - search_fields = ['user', 'model_type', 'model_id'] - def perform_create(self, serializer): """Create (upload) a new notes image.""" image = serializer.save() @@ -1501,7 +1522,7 @@ common_api_urls = [ # Webhooks path('webhook//', WebhookView.as_view(), name='api-webhook'), # Uploaded images for notes - path('notes-image-upload/', NotesImageList.as_view(), name='api-notes-image-list'), + path('notes-image/', NotesImageList.as_view(), name='api-notes-image-list'), # Background task information path( 'background-task/', diff --git a/src/backend/InvenTree/common/models.py b/src/backend/InvenTree/common/models.py index 29738961f5..eb301b033b 100644 --- a/src/backend/InvenTree/common/models.py +++ b/src/backend/InvenTree/common/models.py @@ -3109,22 +3109,8 @@ class NotesImage(models.Model): date = models.DateTimeField(auto_now_add=True) - model_type = models.CharField( - max_length=100, - blank=True, - null=True, - help_text=_('Target model type for this image'), - ) - - model_id = models.IntegerField( - help_text=_('Target model ID for this image'), - blank=True, - null=True, - default=None, - ) - note = models.ForeignKey( - Note, on_delete=models.CASCADE, null=True, blank=True, related_name='images' + Note, on_delete=models.CASCADE, null=False, blank=False, related_name='images' ) diff --git a/src/backend/InvenTree/common/serializers.py b/src/backend/InvenTree/common/serializers.py index c86d3e5198..5b11100f78 100644 --- a/src/backend/InvenTree/common/serializers.py +++ b/src/backend/InvenTree/common/serializers.py @@ -400,7 +400,7 @@ class NotesImageSerializer(InvenTreeModelSerializer): """Meta options for NotesImageSerializer.""" model = common_models.NotesImage - fields = ['pk', 'image', 'user', 'date', 'model_type', 'model_id'] + fields = ['pk', 'image', 'user', 'date', 'note'] read_only_fields = ['date', 'user'] diff --git a/src/frontend/lib/enums/ApiEndpoints.tsx b/src/frontend/lib/enums/ApiEndpoints.tsx index fc6180928b..ae339859ef 100644 --- a/src/frontend/lib/enums/ApiEndpoints.tsx +++ b/src/frontend/lib/enums/ApiEndpoints.tsx @@ -253,7 +253,7 @@ export enum ApiEndpoints { project_code_list = 'project-code/', custom_unit_list = 'units/', note_list = 'note/', - notes_image_upload = 'notes-image-upload/', + notes_image_list = 'notes-image/', email_list = 'admin/email/', email_test = 'admin/email/test/', config_list = 'admin/config/', diff --git a/src/frontend/src/components/editors/NotesEditor.tsx b/src/frontend/src/components/editors/NotesEditor.tsx index 1314e38374..eb8bbaf589 100644 --- a/src/frontend/src/components/editors/NotesEditor.tsx +++ b/src/frontend/src/components/editors/NotesEditor.tsx @@ -120,11 +120,11 @@ export default function NotesEditor({ const uploadFile = useCallback( (file: File) => { const formData = new FormData(); - formData.append('note', String(selectedNoteId)); + formData.append('note', selectedNoteId?.toString() ?? ''); formData.append('image', file); return api - .post(apiUrl(ApiEndpoints.notes_image_upload), formData, { + .post(apiUrl(ApiEndpoints.notes_image_list), formData, { headers: { 'Content-Type': 'multipart/form-data' } }) .then((response) => response.data.image);