This commit is contained in:
parent
7e1b92a162
commit
f738f5f485
6 changed files with 449 additions and 2 deletions
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue