121 lines
4.1 KiB
Python
121 lines
4.1 KiB
Python
from django.contrib.auth.models import User
|
|
from rest_framework import serializers
|
|
|
|
from . import models
|
|
|
|
from authserver.settings import FIRMWARE_VERSION_MAGIC, UPGRADE_GROUPS
|
|
|
|
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')
|
|
)
|
|
upgrade_group = serializers.ChoiceField(choices=UPGRADE_GROUPS)
|
|
|
|
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 set([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)
|
|
deploy_to_group = serializers.ChoiceField(write_only=True, choices=['None', 'All'] + UPGRADE_GROUPS)
|
|
|
|
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
|
|
group = validated_data.pop('deploy_to_group')
|
|
firmware = serializers.ModelSerializer.create(self, validated_data)
|
|
|
|
if group == 'None':
|
|
tools = []
|
|
elif group == 'All':
|
|
tools = models.Tool.objects.all()
|
|
else:
|
|
tools = models.Tool.objects.filter(upgrade_group=group)
|
|
|
|
for tool in tools:
|
|
tool.firmware = firmware
|
|
tool.save()
|
|
|
|
return firmware
|