diff --git a/backend/toolshed/admin.py b/backend/toolshed/admin.py index aeefc0c..a334c12 100644 --- a/backend/toolshed/admin.py +++ b/backend/toolshed/admin.py @@ -1,11 +1,11 @@ from django.contrib import admin -from toolshed.models import InventoryItem, Property, Tag, Category +from toolshed.models import InventoryItem, Property, Tag, Category, StorageLocation, WorkflowInstance class InventoryItemAdmin(admin.ModelAdmin): - list_display = ('name', 'description', 'category', 'availability_policy', 'owned_quantity', 'owner') - search_fields = ('name', 'description', 'category', 'availability_policy', 'owned_quantity', 'owner') + list_display = ('name', 'description', 'category', 'availability_policy', 'owned_quantity', 'owner', 'storage_location') + search_fields = ('name', 'description', 'category__name', 'availability_policy', 'owner__username', 'storage_location__name') admin.site.register(InventoryItem, InventoryItemAdmin) @@ -13,7 +13,7 @@ admin.site.register(InventoryItem, InventoryItemAdmin) class PropertyAdmin(admin.ModelAdmin): list_display = ('name', 'description', 'category', 'unit_symbol', 'base2_prefix', 'dimensions', 'origin') - search_fields = ('name', 'description', 'category', 'unit_symbol', 'base2_prefix', 'dimensions', 'origin') + search_fields = ('name', 'description', 'category__name', 'unit_symbol', 'origin') admin.site.register(Property, PropertyAdmin) @@ -21,7 +21,7 @@ admin.site.register(Property, PropertyAdmin) class TagAdmin(admin.ModelAdmin): list_display = ('name', 'description', 'category', 'origin') - search_fields = ('name', 'description', 'category', 'origin') + search_fields = ('name', 'description', 'category__name', 'origin') admin.site.register(Tag, TagAdmin) @@ -29,7 +29,16 @@ admin.site.register(Tag, TagAdmin) class CategoryAdmin(admin.ModelAdmin): list_display = ('name', 'description', 'parent', 'origin') - search_fields = ('name', 'description', 'parent', 'origin') + search_fields = ('name', 'description', 'parent__name', 'origin') admin.site.register(Category, CategoryAdmin) + + +class StorageLocationAdmin(admin.ModelAdmin): + list_display = ('name', 'description', 'category', 'parent', 'owner') + search_fields = ('name', 'description', 'category__name', 'parent__name', 'owner__username') + list_filter = ('category', 'owner') + + +admin.site.register(StorageLocation, StorageLocationAdmin) diff --git a/backend/toolshed/api/inventory.py b/backend/toolshed/api/inventory.py index c39a5c8..2ebd582 100644 --- a/backend/toolshed/api/inventory.py +++ b/backend/toolshed/api/inventory.py @@ -72,6 +72,19 @@ class StorageLocationViewSet(viewsets.ModelViewSet): return StorageLocation.objects.filter(owner=self.request.user.user.get()) return StorageLocation.objects.none() + def perform_create(self, serializer): + with transaction.atomic(): + serializer.save(owner=self.request.user.user.get()) + + def perform_update(self, serializer): + with transaction.atomic(): + if serializer.instance.owner == self.request.user.user.get(): + serializer.save() + + def perform_destroy(self, instance): + if instance.owner == self.request.user.user.get(): + instance.delete() + router.register(r'inventory_items', InventoryItemViewSet, basename='inventory_items') router.register(r'storage_locations', StorageLocationViewSet, basename='storage_locations') diff --git a/backend/toolshed/models.py b/backend/toolshed/models.py index 2dd0713..e85b53c 100644 --- a/backend/toolshed/models.py +++ b/backend/toolshed/models.py @@ -1,5 +1,5 @@ from django.db import models -from django.core.validators import MinValueValidator +from django.core.validators import MinValueValidator, MaxValueValidator from django_softdelete.models import SoftDeleteModel from rest_framework.exceptions import ValidationError diff --git a/backend/toolshed/serializers.py b/backend/toolshed/serializers.py index 73edeff..0f5b90a 100644 --- a/backend/toolshed/serializers.py +++ b/backend/toolshed/serializers.py @@ -50,12 +50,12 @@ class CategorySerializer(serializers.ModelSerializer): class StorageLocationSerializer(serializers.ModelSerializer): owner = OwnerSerializer(read_only=True) - category = CategorySerializer(required=False, allow_null=True) + category = serializers.CharField(required=False, allow_null=True, allow_blank=True) path = serializers.SerializerMethodField() class Meta: model = StorageLocation - fields = ['id', 'name', 'description', 'path', 'category', 'owner'] + fields = ['id', 'name', 'description', 'path', 'category', 'owner', 'parent'] read_only_fields = ['path'] @staticmethod diff --git a/frontend/src/components/Sidebar.vue b/frontend/src/components/Sidebar.vue index b6dd9dc..c55f002 100644 --- a/frontend/src/components/Sidebar.vue +++ b/frontend/src/components/Sidebar.vue @@ -15,6 +15,18 @@ Inventory + +