You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

104 lines
3.5 KiB

from django.contrib.auth.models import User
from rest_framework import serializers
from . import models
from authserver.settings import FIRMWARE_VERSION_MAGIC
class CategorySerializer(serializers.HyperlinkedModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name='category-detail', lookup_field='slug')
class Meta:
model = models.Category
fields = '__all__'
class CourseSerializer(serializers.HyperlinkedModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name='course-detail', lookup_field='slug')
tools = serializers.SlugRelatedField(
allow_null=True,
many=True,
slug_field='slug',
queryset=models.Tool.objects.all()
)
class Meta:
model = models.Course
fields = '__all__'
class ToolSerializer(serializers.HyperlinkedModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name='tool-detail', lookup_field='slug')
category = serializers.HyperlinkedRelatedField(
view_name='category-detail',
lookup_field='slug',
queryset=models.Category.objects.all()
)
firmware = serializers.SlugRelatedField(
allow_null=True,
slug_field='version',
queryset=models.Firmware.objects.all().order_by('-version')
)
class Meta:
model = models.Tool
fields = '__all__'
class CategoryToolSerializer(serializers.HyperlinkedModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name='category-detail', lookup_field='slug')
tools = ToolSerializer(many=True)
class Meta:
model = models.Category
fields = '__all__'
class ProfileSerializer(serializers.HyperlinkedModelSerializer):
user = serializers.StringRelatedField()
cards = serializers.StringRelatedField(many=True, read_only=True)
courses = serializers.SlugRelatedField(
many=True,
slug_field='slug',
queryset=models.Course.objects.all()
)
authorized_tools = serializers.SerializerMethodField()
class Meta:
model = models.Profile
fields = '__all__'
def get_authorized_tools(self, obj):
return [tool.slug for tool in models.Tool.objects.filter(course__profile=obj)]
class UserSerializer(serializers.ModelSerializer):
profile = ProfileSerializer(read_only=True)
class Meta:
model = User
fields = ('username', 'profile')
depth = 1
class FirmwareSerializer(serializers.HyperlinkedModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name='firmware-detail', lookup_field='version')
version = serializers.CharField(read_only=True)
tools = serializers.StringRelatedField(read_only=True, many=True)
class Meta:
model = models.Firmware
fields = '__all__'
def create(self, validated_data):
binary = validated_data['binary'].read().decode('ascii', 'replace')
if binary.count(FIRMWARE_VERSION_MAGIC) != 2 or 'setup()' in binary:
raise serializers.ValidationError('Uploaded binary not a valid lockout firmware.')
try:
binary_parts = binary.split(FIRMWARE_VERSION_MAGIC)
version = binary_parts[1].strip()
_ = int(version)
except:
raise serializers.ValidationError('Unable to extract firmware version.')
if models.Firmware.objects.filter(version=version).exists():
raise serializers.ValidationError('Firmware version already exists.')
validated_data['version'] = version
return serializers.ModelSerializer.create(self, validated_data)