95 lines
3.2 KiB
Python
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')
|