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
+
+