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