diff --git a/src/documents/filters.py b/src/documents/filters.py index 86c7fc579..1635468cf 100644 --- a/src/documents/filters.py +++ b/src/documents/filters.py @@ -7,6 +7,7 @@ from django.db.models.functions import Cast from django_filters.rest_framework import BooleanFilter from django_filters.rest_framework import Filter from django_filters.rest_framework import FilterSet +from django_filters import CharFilter, NumberFilter from guardian.utils import get_group_obj_perms_model from guardian.utils import get_user_obj_perms_model from rest_framework_guardian.filters import ObjectPermissionsFilter @@ -206,6 +207,28 @@ class DocumentFilterSet(FilterSet): custom_fields__icontains = CustomFieldsFilter() shared_by__id = SharedByUser() + + warehouse__id = NumberFilter(method='filter_by_warehouse') + + def filter_by_warehouse(self, queryset, name, value): + warehouse = Warehouse.objects.get(id=value) + return self.get_warehouse_documents(warehouse) + + def get_warehouse_documents(self, warehouse): + if warehouse.type == Warehouse.BOXCASE: + return Document.objects.filter(warehouse=warehouse) + elif warehouse.type == Warehouse.SHELF: + boxcases = Warehouse.objects.filter(parent_warehouse=warehouse) + return Document.objects.filter(warehouse__in=[b.id for b in boxcases]) + elif warehouse.type == Warehouse.WAREHOUSE: + shelves = Warehouse.objects.filter(parent_warehouse=warehouse) + boxcases = Warehouse.objects.filter(parent_warehouse__in=[s.id for s in shelves]) + return Document.objects.filter(warehouse__in=[b.id for b in boxcases]) + else: + return Document.objects.none() + + + class Meta: model = Document diff --git a/src/documents/serialisers.py b/src/documents/serialisers.py index 1a43fb5f6..926fc3b3a 100644 --- a/src/documents/serialisers.py +++ b/src/documents/serialisers.py @@ -1826,13 +1826,32 @@ class WorkflowSerializer(serializers.ModelSerializer): return instance +class AdjustedNameField(serializers.CharField): + def to_internal_value(self, data): + model = self.parent.Meta.model + + if hasattr(model, 'name'): + existing_names = model.objects.filter(name__startswith=data).values_list('name', flat=True) + + if data in existing_names: + data = self.generate_unique_name(data, existing_names) + + return data + + def generate_unique_name(self, name, existing_names): + i = 1 + new_name = name + while new_name in existing_names: + new_name = f"{name}({i})" + i += 1 + return new_name class WarehouseSerializer(MatchingModelSerializer, OwnedObjectSerializer): document_count = serializers.SerializerMethodField() - + name = AdjustedNameField() class Meta: model = Warehouse fields = '__all__' @@ -1860,7 +1879,7 @@ class WarehouseSerializer(MatchingModelSerializer, OwnedObjectSerializer): class FolderSerializer(MatchingModelSerializer, OwnedObjectSerializer): - + name = AdjustedNameField() class Meta: model = Folder fields = '__all__' diff --git a/src/documents/views.py b/src/documents/views.py index 69a607887..03f470f1f 100644 --- a/src/documents/views.py +++ b/src/documents/views.py @@ -753,33 +753,7 @@ class DocumentViewSet( ] return Response(links) - def get_queryset(self): - queryset = self.queryset - warehouse_id = self.request.query_params.get('warehouse_id', None) - - if warehouse_id is not None: - queryset = self.get_warehouse(warehouse_id) - - return queryset - - def get_warehouse(self, warehouse_id): - warehouse = Warehouse.objects.get(id=int(warehouse_id)) - return self.get_warehouse_documents(warehouse) - - def get_warehouse_documents(self, warehouse): - if warehouse.type == Warehouse.BOXCASE: - return Document.objects.filter(warehouse=warehouse) - elif warehouse.type == Warehouse.SHELF: - boxcases = Warehouse.objects.filter(parent_warehouse=warehouse) - return Document.objects.filter(warehouse__in=[b.id for b in boxcases]) - elif warehouse.type == Warehouse.WAREHOUSE: - shelves = Warehouse.objects.filter(parent_warehouse=warehouse) - boxcases = Warehouse.objects.filter(parent_warehouse__in=[s.id for s in shelves]) - return Document.objects.filter(warehouse__in=[b.id for b in boxcases]) - else: - return Document.objects.none() - class SearchResultSerializer(DocumentSerializer, PassUserMixin): def to_representation(self, instance): doc = ( @@ -1961,29 +1935,29 @@ class WarehouseViewSet(ModelViewSet, PermissionsAwareDocumentCountMixin): def create(self, request, *args, **kwargs): - # try: - currentUser = request.user + # try: serializer = WarehouseSerializer(data=request.data) parent_warehouse = None if serializer.is_valid(raise_exception=True): parent_warehouse = serializer.validated_data.get('parent_warehouse',None) - + + existing_warehouse = Warehouse.objects.filter(name=serializer.validated_data['name'], owner=request.user).first() + if existing_warehouse: + return Response({'error': 'A warehouse with the same name already exists.'}, status=status.HTTP_400_BAD_REQUEST) + parent_warehouse = Warehouse.objects.filter(id=parent_warehouse.id if parent_warehouse else 0).first() if serializer.validated_data.get("type") == Warehouse.WAREHOUSE and not parent_warehouse: - warehouse = serializer.save() + warehouse = serializer.save(owner=request.user) warehouse.path = str(warehouse.id) - warehouse.owner = currentUser warehouse.save() elif serializer.validated_data.get("type", "") == Warehouse.SHELF and getattr(parent_warehouse, 'type', "") == Warehouse.WAREHOUSE : - warehouse = serializer.save(type=Warehouse.SHELF, parent_warehouse=parent_warehouse) + warehouse = serializer.save(type=Warehouse.SHELF, parent_warehouse=parent_warehouse,owner=request.user) warehouse.path = f"{parent_warehouse.path}/{warehouse.id}" - warehouse.owner = currentUser warehouse.save() elif serializer.validated_data.get("type", "") == Warehouse.BOXCASE and getattr(parent_warehouse, 'type', "") == Warehouse.SHELF : - warehouse = serializer.save(type=Warehouse.BOXCASE, parent_warehouse=parent_warehouse) + warehouse = serializer.save(type=Warehouse.BOXCASE, parent_warehouse=parent_warehouse,owner=request.user) warehouse.path = f"{parent_warehouse.path}/{warehouse.id}" - warehouse.owner = currentUser warehouse.save() else: return Response(status=status.HTTP_400_BAD_REQUEST) @@ -2153,25 +2127,26 @@ class FolderViewSet(ModelViewSet, PermissionsAwareDocumentCountMixin): def create(self, request, *args, **kwargs): - # try: - currentUser = request.user + # try: serializer = FolderSerializer(data=request.data) parent_folder = None if serializer.is_valid(raise_exception=True): parent_folder = serializer.validated_data.get('parent_folder',None) - + + existing_folder = Folder.objects.filter(name=serializer.validated_data['name'], owner=request.user).first() + if existing_folder: + return Response({'error': 'A folder with the same name already exists.'}, status=status.HTTP_400_BAD_REQUEST) + parent_folder = Folder.objects.filter(id=parent_folder.id if parent_folder else 0).first() if parent_folder == None: - folder = serializer.save() + folder = serializer.save(owner=request.user) folder.path = str(folder.id) - folder.owner = currentUser folder.checksum = hashlib.md5(f'{folder.id}.{folder.name}'.encode()).hexdigest() folder.save() elif parent_folder: - folder = serializer.save(parent_folder=parent_folder) + folder = serializer.save(parent_folder=parent_folder,owner=request.user) folder.path = f"{parent_folder.path}/{folder.id}" - folder.owner = currentUser folder.checksum = hashlib.md5(f'{folder.id}.{folder.name}'.encode()).hexdigest() folder.save() else: