diff --git a/src/backend/InvenTree/InvenTree/api_version.py b/src/backend/InvenTree/InvenTree/api_version.py index fd4c051027..006d7bc600 100644 --- a/src/backend/InvenTree/InvenTree/api_version.py +++ b/src/backend/InvenTree/InvenTree/api_version.py @@ -1,12 +1,16 @@ """InvenTree API version information.""" # InvenTree API version -INVENTREE_API_VERSION = 364 +INVENTREE_API_VERSION = 365 """Increment this API version number whenever there is a significant change to the API that any clients need to know about.""" INVENTREE_API_TEXT = """ +v365 -> 2025-07-09 : https://github.com/inventree/InvenTree/pull/9984 + - Allow filtering of DataOutput API by "user" field + - Allow individual deletion of DataOutput objects via the API + v364 -> 2025-07-06 : https://github.com/inventree/InvenTree/pull/9962 - Fix permissions for the DataImportSession API endpoints diff --git a/src/backend/InvenTree/common/api.py b/src/backend/InvenTree/common/api.py index 3de89b2a5a..866996a77f 100644 --- a/src/backend/InvenTree/common/api.py +++ b/src/backend/InvenTree/common/api.py @@ -20,7 +20,7 @@ from djmoney.contrib.exchange.models import ExchangeBackend, Rate from drf_spectacular.utils import OpenApiResponse, extend_schema from error_report.models import Error from pint._typing import UnitLike -from rest_framework import serializers +from rest_framework import generics, serializers from rest_framework.exceptions import NotAcceptable, NotFound, PermissionDenied from rest_framework.permissions import IsAdminUser, IsAuthenticated from rest_framework.response import Response @@ -852,9 +852,10 @@ class DataOutputList(DataOutputEndpointMixin, BulkDeleteMixin, ListAPI): filter_backends = SEARCH_ORDER_FILTER ordering_fields = ['pk', 'user', 'plugin', 'output_type', 'created'] + filterset_fields = ['user'] -class DataOutputDetail(DataOutputEndpointMixin, RetrieveAPI): +class DataOutputDetail(DataOutputEndpointMixin, generics.DestroyAPIView, RetrieveAPI): """Detail view for a DataOutput object.""" diff --git a/src/frontend/src/tables/settings/ExportSessionTable.tsx b/src/frontend/src/tables/settings/ExportSessionTable.tsx index 3096d11eeb..ce3d218da8 100644 --- a/src/frontend/src/tables/settings/ExportSessionTable.tsx +++ b/src/frontend/src/tables/settings/ExportSessionTable.tsx @@ -1,13 +1,17 @@ import { ApiEndpoints } from '@lib/enums/ApiEndpoints'; import { apiUrl } from '@lib/functions/Api'; +import type { TableFilter } from '@lib/types/Filters'; import { t } from '@lingui/core/macro'; -import { useMemo } from 'react'; +import { useCallback, useMemo, useState } from 'react'; import { AttachmentLink } from '../../components/items/AttachmentLink'; import { RenderUser } from '../../components/render/User'; +import { useDeleteApiFormModal } from '../../hooks/UseForm'; import { useTable } from '../../hooks/UseTable'; import type { TableColumn } from '../Column'; import { DateColumn } from '../ColumnRenderers'; +import { UserFilter } from '../Filter'; import { InvenTreeTable } from '../InvenTreeTable'; +import { type RowAction, RowDeleteAction } from '../RowActions'; export default function ExportSessionTable() { const table = useTable('exportsession'); @@ -43,8 +47,33 @@ export default function ExportSessionTable() { ]; }, []); + const tableFilters: TableFilter[] = useMemo(() => { + return [UserFilter({})]; + }, []); + + const [selectedRow, setSeletectedRow] = useState({}); + + const deleteRow = useDeleteApiFormModal({ + url: ApiEndpoints.data_output, + pk: selectedRow.pk, + title: t`Delete Output`, + onFormSuccess: () => table.refreshTable() + }); + + const rowActions = useCallback((record: any): RowAction[] => { + return [ + RowDeleteAction({ + onClick: () => { + setSeletectedRow(record); + deleteRow.open(); + } + }) + ]; + }, []); + return ( <> + {deleteRow.modal}