""" Serializers for the APIs. """ from rest_framework import serializers from rest_framework.validators import UniqueTogetherValidator from centralisedFileSystem.models import File, ScreenPlay, Script from scriptAudit.models import ScriptAuditModel class ScreenPlaySerializer(serializers.ModelSerializer): ''' ScreenPlay model serializer. For creating one-single ScreenPlay(not for creating script and a screenplay togeather) ''' class Meta: model = ScreenPlay fields = "__all__" def validate(self, data): """ Check that the start is before the stop. """ data = super().validate(data) try: data["user"] = self.context['request'].user if ScreenPlay.objects.filter( name=data["name"], user=data["user"], ).exists(): raise serializers.ValidationError({ "non_field_errors": [ "The fields user, name must make a unique set." ] }) except KeyError: print( "user was not found in request. Maybe Serializer was not saved from a APIView") return data class ScriptSerializer(serializers.ModelSerializer): ''' Script model serializer. For creating one-single script(not for creating script and a screenplay togeather) ''' class InnerFileSerializer(serializers.ModelSerializer): class Meta: model = File exclude = ("script", ) file = InnerFileSerializer() def validate(self, data): """ Check that the start is before the stop. """ try: if self.context['request'].user != ScreenPlay.objects.get(name=data['screenplay']).user: raise serializers.ValidationError( f"User dosen't have any screenplay named {data['screenplay']}") except KeyError: pass return data class Meta: model = Script fields = ("id", "screenplay", "file", "language", "version", "created_on", "modified_on") def create(self, validated_data) -> Script: file_data = validated_data.pop('file') script = Script.objects.create(**validated_data) script.file = File.objects.create(script=script, **file_data) return script class FileSerializer(serializers.ModelSerializer): class Meta: model = File fields = "__all__" class ScreenPlayScriptSerializer(serializers.ModelSerializer): ''' ScreenPlay model serializer. For creating a script and a screenplay togeather. ''' class InnerScriptSerializer(serializers.ModelSerializer): ''' Script model serializer. For creating one-single script(not for creating script and a screenplay togeather) ''' class InnerFileSerializer(serializers.ModelSerializer): class Meta: model = File # fields = "__all__" exclude = ("script", ) file = InnerFileSerializer() class Meta: model = Script fields = ("id", "file", "language", "version", "created_on", "modified_on") script = InnerScriptSerializer() class Meta: model = ScreenPlay fields = ("user", "author", "name", "script", "created_on", "version_count") def validate(self, data): """ Check that the start is before the stop. """ data = super().validate(data) try: data["user"] = self.context['request'].user except KeyError: print( "user was not found in request. Maybe Serializer was not saved from a APIView", data, self.context.items()) data["user"] = self.user if ScreenPlay.objects.filter( name = data["name"], user = data["user"], ).exists(): raise serializers.ValidationError({ "non_field_errors": [ "The fields user, name must make a unique set." ] }) return data def create(self, validated_data) -> ScreenPlay: script_data = validated_data.pop('script') file_data = script_data.pop('file') screenplay = ScreenPlay.objects.create(**validated_data) screenplay.script = Script.objects.create( screenplay=screenplay, **script_data) screenplay.script.file = File.objects.create( script=screenplay.script, **file_data) return screenplay class UserScriptsSerializer(serializers.ModelSerializer): ''' To serialize all the scripts that a given user has. ''' class InnerScriptSerializer(serializers.ModelSerializer): class InnerAuditSerializer(serializers.ModelSerializer): class Meta: model = ScriptAuditModel exclude = ("script", "id") script_audit = InnerAuditSerializer(read_only=True) class Meta: model = Script fields = ("id", "created_on", "modified_on", "version", "language", "script_audit") scripts = InnerScriptSerializer(many=True, read_only=True) class Meta: model = ScreenPlay fields = ("id", "name", "author", "version_count", "created_on", "scripts") #class BeatSheetSerializer(serializers.ModelSerializer): # class Meta: # model = BeatSheet # fields = ("script","scene_number","beat_note","gpt_response","beat") # extra_kwargs = { # 'scene_number': {'required': False} # } #class BeatSheetSerializer(serializers.ModelSerializer): # class Meta: # model = BeatSheet # 3 fields = '__all__' # from centralisedFileSystem.models import TitlePage # class TitlePageSerializer(serializers.ModelSerializer): # class Meta: # model = TitlePage # fields = ("id","script","file","type","created_on") #class SerializerBeatSheet(serializers.ModelSerializer): # class Meta: # model = BeatSheet # fields = ["id","script","scene_number","beat","beat_note","created_on","modified_on","had_used_gpt","gpt_response","has_notes","archeive"]