Generateurv2/backend/api/exercices/serializers.py
2022-05-18 10:15:54 +02:00

95 lines
3.2 KiB
Python

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