generateur_v3/backend/api/dbo/exercices/models.py
Kilton937342 936931f047 api
2022-10-10 01:34:38 +02:00

106 lines
3.9 KiB
Python

import asyncio
from io import BytesIO
import io
import os
import random
import string
from tortoise.models import Model
from tortoise import fields
from tortoise.contrib.pydantic import pydantic_model_creator
import async_to_sync as sync
from tortoise.manager import Manager
from generateur.generateur_main import generate_from_path
from services.io import add_fast_api_root
from database.utils.ExoSourceValidator import ExoSourceValidator
from services.exoValidation import get_support_from_path, get_support_from_data
from database.utils.FileField import FileField
class Tag(Model):
id = fields.IntField(pk=True)
id_code = fields.CharField(unique=True, default="", max_length=255)
label = fields.CharField(max_length=35)
color = fields.CharField(max_length=100)
owner = fields.ForeignKeyField('models.User')
class Exercice(Model):
id = fields.IntField(pk=True)
id_code = fields.CharField(default="", max_length=10, unique=True)
name = fields.CharField(max_length=50)
consigne = fields.CharField(max_length=200, null=True, default="")
exo_source = FileField(upload_root="/uploads",
validators=[ExoSourceValidator()])
updated_at = fields.DatetimeField(auto_now=True)
private = fields.BooleanField(default=False)
tags = fields.ManyToManyField('models.Tag', null=True)
origin = fields.ForeignKeyField('models.Exercice', null=True)
isOriginal = fields.BooleanField(default=True)
author = fields.ForeignKeyField('models.User')
def pdfSupport(self) -> bool:
if not isinstance(self.exo_source, io.BytesIO) and not isinstance(self.exo_source, io.StringIO):
if os.path.exists(add_fast_api_root(self.exo_source)):
support_compatibility = get_support_from_path(
add_fast_api_root(self.exo_source))
return support_compatibility['isPdf']
return False
else:
self.exo_source.seek(0)
support_compatibility = get_support_from_data(
self.exo_source.read())
return support_compatibility['isPdf']
def csvSupport(self) -> bool:
if not isinstance(self.exo_source, io.BytesIO) and not isinstance(self.exo_source, io.StringIO):
if os.path.exists(add_fast_api_root(self.exo_source)):
support_compatibility = get_support_from_path(
add_fast_api_root(self.exo_source))
return support_compatibility['isCsv']
return False
else:
self.exo_source.seek(0)
support_compatibility = get_support_from_data(
self.exo_source.read())
return support_compatibility['isCsv']
def webSupport(self) -> bool:
if not isinstance(self.exo_source, io.BytesIO) and not isinstance(self.exo_source, io.StringIO):
if os.path.exists(add_fast_api_root(self.exo_source)):
support_compatibility = get_support_from_path(
add_fast_api_root(self.exo_source))
return support_compatibility['isWeb']
return False
else:
self.exo_source.seek(0)
support_compatibility = get_support_from_data(
self.exo_source.read())
return support_compatibility['isWeb']
def examples(self) -> dict:
if not isinstance(self.exo_source, io.BytesIO) and not isinstance(self.exo_source, io.StringIO):
return {
"type": "Csv" if self.csvSupport() else "web" if self.webSupport() else None,
"data": generate_from_path(add_fast_api_root(self.exo_source), 3, "csv" if self.csvSupport() else "web" if self.pdfSupport() else None, True) if self.csvSupport() == True or self.webSupport() == True else None
}
return {}
class PydanticMeta:
computed = ["pdfSupport", "csvSupport", "webSupport", 'examples']
exclude = ["exo_source", "exercices", 'id']