import os import tempfile from django.forms import ValidationError from rest_framework import serializers from .models import Exercice, Tag from api.Generateur import Generateur import importlib.util from .utils import checkExoModelObject class ExerciceSerializer(serializers.ModelSerializer): exo_model = '' class Meta: model = Exercice fields = ('id', 'name', 'id_code', 'consigne', 'exemple', 'tags', 'isPdf', 'isCsv', 'isWeb') class ExerciceCreateSerializer(serializers.ModelSerializer): class Meta: model = Exercice fields = ('name', 'consigne', 'exo_model') def validate_exo_model(self, value): with tempfile.TemporaryDirectory() as d: with open(os.path.join(d, 'tmp.py'), 'w') as f: data = value.read().decode('utf8') f.write(data) spec = importlib.util.spec_from_file_location( "tmp", os.path.join(d, 'tmp.py')) tmp = importlib.util.module_from_spec(spec) spec.loader.exec_module(tmp) try: main_func = tmp.main except AttributeError: raise serializers.ValidationError( 'Manque main', code='invalid') main_result = main_func() default_object = {"calcul": False, 'pdf': False, 'csv': False, 'web': False, 'correction': False} # les valeurs par défaut # Si l'utilisateur n'a pas entré une valeur, elle est définie à False result_object = {**default_object, **main_result} exoCategory = checkExoModelObject(result_object) if not exoCategory['isPdf'] and not exoCategory['isCsv'] and not exoCategory['isWeb']: raise serializers.ValidationError('object invalid', code= 'invalid') return { **exoCategory, 'file': value } ''' code = value.split(CODE_SEPARATOR) if(len(code) == 1 or code[1] == ""): raise serializers.ValidationError('This field may not be blank', code="blank") if(len(code) == 2 and code[0] == 'python'): # Generateur(value, 1) try: Generateur(value, 1) except KeyError as e: if e.args[0] == 'calcul' or e.args[0] == "result": raise serializers.ValidationError( f'Verifiez que l\'objet correspond à ce qui ai demandé ({e} manquant)', code="invalid") if e.args[0] == 'main': raise serializers.ValidationError( 'Code non conforme (fonction "main" requise)', code="invalid") else: raise serializers.ValidationError( 'Code non conforme', code="invalid") except TypeError: raise serializers.ValidationError('Il y a eu une erreur (vérifiez que la fontion main renvoie l\'objet demandé)') return value ''' def create(self, validated_data, **kwargs): exo_model = validated_data.pop('exo_model') return Exercice.objects.create(**validated_data) class TagSerializer(serializers.ModelSerializer): class Meta: model = Tag fields = ('id', 'name', 'color', 'id_code')