add InventoryItems
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
j3d1 2023-06-22 04:51:18 +02:00
parent 7e1b92a162
commit f738f5f485
6 changed files with 449 additions and 2 deletions

View file

@ -1,6 +1,6 @@
from rest_framework import serializers
from authentication.models import KnownIdentity
from toolshed.models import Category, Property
from authentication.models import KnownIdentity, ToolshedUser
from toolshed.models import Category, Property, ItemProperty, InventoryItem, Tag
class FriendSerializer(serializers.ModelSerializer):
@ -29,3 +29,69 @@ class CategorySerializer(serializers.ModelSerializer):
def to_representation(self, instance):
return str(instance)
def to_internal_value(self, data):
return Category.objects.get(name=data.split("/")[-1])
class InventoryItemOwnerSerializer(serializers.ReadOnlyField):
class Meta:
model = ToolshedUser
fields = '__all__'
def to_representation(self, value):
return value.username + '@' + value.domain
class ItemPropertySerializer(serializers.ModelSerializer):
property = PropertySerializer(read_only=True)
class Meta:
model = ItemProperty
fields = ['property', 'value']
def to_representation(self, instance):
return {'value': instance.value, 'name': instance.property.name}
def to_internal_value(self, data):
prop = Property.objects.get(name=data['name'])
value = data['value']
return {'property': prop, 'value': value}
class InventoryItemSerializer(serializers.ModelSerializer):
owner = InventoryItemOwnerSerializer(read_only=True)
tags = serializers.SlugRelatedField(many=True, required=False, queryset=Tag.objects.all(), slug_field='name')
properties = ItemPropertySerializer(many=True, required=False, source='itemproperty_set')
category = CategorySerializer(required=False, allow_null=True)
class Meta:
model = InventoryItem
fields = ['id', 'name', 'description', 'owner', 'category', 'availability_policy', 'owned_quantity', 'owner',
'tags', 'properties']
def create(self, validated_data):
tags = validated_data.pop('tags', [])
props = validated_data.pop('itemproperty_set', [])
item = InventoryItem.objects.create(**validated_data)
for tag in tags:
item.tags.add(tag, through_defaults={})
for prop in props:
ItemProperty.objects.create(inventory_item=item, property=prop['property'], value=prop['value'])
item.save()
return item
def update(self, instance, validated_data):
tags = validated_data.pop('tags', [])
props = validated_data.pop('itemproperty_set', [])
item = super().update(instance, validated_data)
item.tags.clear()
item.properties.clear()
if 'category' not in validated_data:
item.category = None
for tag in tags:
item.tags.add(tag)
for prop in props:
ItemProperty.objects.create(inventory_item=item, property=prop['property'], value=prop['value'])
item.save()
return item