239 lines
7.9 KiB
Python
239 lines
7.9 KiB
Python
from django.db import models
|
|
from django.conf import settings
|
|
from django.utils import timezone
|
|
from django.contrib import admin
|
|
import uuid
|
|
|
|
EVAL_TYPE = [
|
|
('1', 'Intervention'),
|
|
('2', 'Journée'),
|
|
('3','Exercice')
|
|
]
|
|
INTER_NATURE = [
|
|
('1', 'Trauma'),
|
|
('2', 'non-Trauma'),
|
|
]
|
|
INTER_PRIORITY = [
|
|
('1', 'P1'),
|
|
('2', 'P2'),
|
|
('3', 'P3'),
|
|
('4', 'S1'),
|
|
('5', 'S2'),
|
|
('6', 'S3'),
|
|
('7', 'Exercice'),
|
|
]
|
|
INTER_COMPLEXITY = [
|
|
('1', 'Stable / Simple'),
|
|
('2', 'Stable / Complexe'),
|
|
('3', 'Instable / Simple'),
|
|
('4', 'Instable / Complexe'),
|
|
]
|
|
|
|
STUDENT_ROLE = [
|
|
('1', 'Leader'),
|
|
('2', 'Équipier'),
|
|
('3', '3e position (observateur)'),
|
|
]
|
|
|
|
EVAL_MODE = [
|
|
('1', 'Auto-évaluation'),
|
|
('2', 'Encadrant'),
|
|
]
|
|
def increment_ID():
|
|
obj = cl_Student_eval.objects.all().order_by('ID').last()
|
|
|
|
if obj is None:
|
|
return 1
|
|
|
|
last_id = int(obj.ID)
|
|
return last_id + 1
|
|
|
|
class cl_Student_eval(models.Model):
|
|
uuid = models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True)
|
|
ID = models.IntegerField("ID du Suivi", editable=False, unique=True, default=increment_ID)
|
|
|
|
# Informations sur l'auteur
|
|
Author = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name="Auteur", on_delete=models.SET_NULL, null=True, related_name="eval_author")
|
|
sAuthor = models.CharField("Auteur", max_length=120)
|
|
Author_2e = models.ForeignKey(settings.AUTH_USER_MODEL,limit_choices_to={'groups__name': "FI-Encadrants"}, verbose_name="Co-auteur", on_delete=models.SET_NULL, null=True, related_name="eval_second_author", blank=True,)
|
|
sAuthor_2e = models.CharField("Co-auteur", max_length=120, blank=True,)
|
|
|
|
#Information sur l 'étudiant/stagiaire
|
|
Student = models.ForeignKey(settings.AUTH_USER_MODEL,limit_choices_to={'groups__name': "FI-Étudiants"}, verbose_name="Nom du stagiaire/étudaint", on_delete=models.SET_NULL, null=True)
|
|
sStudent = models.CharField("Nom de l'étudiant/stagiaire", max_length=120)
|
|
|
|
#Information sur le suivi
|
|
nEval_Type = models.CharField('Type de suivi', max_length=1, choices=EVAL_TYPE, default=0)
|
|
dtDate = models.DateField("Date concernée", default=timezone.now)
|
|
sRef = models.CharField("N° de référence / FIP", max_length=120, blank=True,)
|
|
nEval_Mode = models.CharField('Mode de suivi ', max_length=1, choices=EVAL_MODE, default=0)
|
|
sDesc_neg = models.TextField("Points à améliorer")
|
|
sDesc_pos = models.TextField("Points positifs")
|
|
sDesc_global = models.TextField("Avis global sur l'intervention/journée/exercice")
|
|
|
|
#Information sur l'intervention
|
|
nInter_Nature = models.CharField('Nature', max_length=1, choices=INTER_NATURE, default=0, blank=True,)
|
|
nInter_Priority = models.CharField('Priorité', max_length=1, choices=INTER_PRIORITY, default=0, blank=True,)
|
|
nInter_Complexity = models.CharField('Nature de complexité', max_length=1, choices=INTER_COMPLEXITY, default=0, blank=True,)
|
|
sInter_Desc = models.TextField("Description courte", blank=True,)
|
|
nStudent_Role = models.CharField("Rôle de l'étudiant/stagiaire", max_length=1, choices=STUDENT_ROLE, default=0, blank=True,)
|
|
|
|
|
|
#Automatic data
|
|
dtUpdated = models.DateTimeField('date updated', auto_now=True)
|
|
dtCreated = models.DateTimeField('date published', auto_now_add=True)
|
|
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
super().__init__(*args, **kwargs)
|
|
self.a_evals = None
|
|
|
|
self.o_Auto_eval = None
|
|
self.o_Encadrant_eval = None
|
|
self.mirrored = False
|
|
|
|
|
|
|
|
@admin.display(description='Référence du suivi')
|
|
def get_ref_of_eval(self):
|
|
sRet = ""
|
|
|
|
if int(self.nEval_Type) == 1:
|
|
sRet = self.sRef
|
|
elif int(self.nEval_Type) == 2:
|
|
sRet = self.dtDate.strftime("%d.%b.%Y")
|
|
|
|
|
|
#print(sRet)
|
|
#print(f"Eval_Type = {self.nEval_Type} => {int(self.nEval_Type)-1}")
|
|
return f"{EVAL_TYPE[int(self.nEval_Type)-1][1]}: {sRet}"
|
|
|
|
def get_mirror_eval(self, evals):
|
|
#print(self)
|
|
for eval in evals:
|
|
eval = eval["eval"]
|
|
|
|
to_be_set = False
|
|
if eval.ID == self.ID:
|
|
to_be_set = True
|
|
else:
|
|
#print(f"check eval {eval}")
|
|
if eval.nEval_Type == "1" and eval.sRef == self.sRef:
|
|
print(f"Eval mirror found {eval} / {self}")
|
|
to_be_set = True
|
|
elif eval.nEval_Type == "2" and eval.dtDate == self.dtDate:
|
|
print(f"Eval mirror found {eval} / {self}")
|
|
to_be_set = True
|
|
|
|
if to_be_set:
|
|
match int(eval.nEval_Mode):
|
|
case 1:
|
|
self.o_Auto_eval = eval
|
|
case 2:
|
|
self.o_Encadrant_eval = eval
|
|
|
|
|
|
|
|
if self.o_Encadrant_eval is not None and self.o_Auto_eval is not None:
|
|
self.mirrored = True
|
|
#print(f" auto = {self.o_Auto_eval} / encadrant = {self.o_Encadrant_eval}")
|
|
|
|
|
|
def get_all_evals_for_student(self,sStudent=None):
|
|
if sStudent is None:
|
|
sStudent = self.sStudent
|
|
|
|
print(f"get_all_evals_for_student launched ! {sStudent}")
|
|
|
|
self.a_evals = []
|
|
evals = cl_Student_eval.objects.filter(sStudent=sStudent).order_by('sRef')
|
|
for eval in evals:
|
|
self.a_evals.append({"uuid":eval.uuid,"sRef":eval.sRef, "nEval_Mode": eval.nEval_Mode, "nEval_Type": eval.nEval_Type, "eval":eval, "dtDate": eval.dtDate})
|
|
|
|
|
|
#print(self.a_evals)
|
|
return self.a_evals
|
|
|
|
@admin.display(description="Mirroir ?", boolean=True)
|
|
def get_mirrored(self):
|
|
self.get_all_evals_for_student()
|
|
self.get_mirror_eval(self.a_evals)
|
|
return self.mirrored
|
|
|
|
def get_eval_type(self):
|
|
if isinstance(self.nEval_Type, int):
|
|
return EVAL_TYPE[int(self.nEval_Type) - 1][1]
|
|
return "Unknown"
|
|
|
|
def get_inter_complexity(self):
|
|
if isinstance(self.nInter_Nature, int):
|
|
return INTER_COMPLEXITY[int(self.nInter_Nature) - 1][1]
|
|
return "Unknown"
|
|
|
|
def get_inter_priority(self):
|
|
if isinstance(self.nInter_Priority, int):
|
|
return INTER_PRIORITY[int(self.nInter_Priority) - 1][1]
|
|
return "Unknown"
|
|
|
|
def get_eval_mode(self):
|
|
if isinstance(self.nEval_Mode, int):
|
|
return EVAL_MODE[int(self.nEval_Mode) - 1][1]
|
|
return "Unknown"
|
|
|
|
def get_student_role(self):
|
|
if isinstance(self.nStudent_Role, int):
|
|
return STUDENT_ROLE[int(self.nStudent_Role) - 1][1]
|
|
return "Unknown"
|
|
|
|
def get_inter_nature(self):
|
|
if isinstance(self.nInter_Nature,int):
|
|
return INTER_NATURE[int(self.nInter_Nature)-1][1]
|
|
return "Uncknow"
|
|
|
|
|
|
|
|
|
|
|
|
def __str__(self):
|
|
try:
|
|
return f"#{self.ID} { self.sStudent } => {self.get_ref_of_eval()} ({EVAL_MODE[int(self.nEval_Mode)-1][1]} / {EVAL_TYPE[int(self.nEval_Type)-1][1]})"
|
|
except:
|
|
return ""
|
|
|
|
class Meta:
|
|
verbose_name = "Suivi étudiants"
|
|
verbose_name_plural = "Suivis étudiants"
|
|
|
|
|
|
import csv
|
|
import os
|
|
from datetime import datetime
|
|
from django.core.exceptions import ValidationError
|
|
|
|
chemin_actuel = os.path.dirname(__file__)
|
|
def import_data_csv():
|
|
with open(os.path.join(chemin_actuel, 'import.csv'), 'r', encoding='utf-8') as file_csv:
|
|
file_csv = csv.DictReader(file_csv)
|
|
first_line = True
|
|
for line in file_csv:
|
|
# Ne rien faire avec la première ligne = Header
|
|
|
|
|
|
new_eval = cl_Student_eval()
|
|
|
|
for key in line.keys():
|
|
if key == "Zeitstempel":
|
|
continue
|
|
value = line[key]
|
|
if key == "dtDate":
|
|
value = datetime.strptime(value, "%d.%m.%Y").date()
|
|
elif key == "sStudent":
|
|
#temp_obj = cl_Student_eval(
|
|
pass
|
|
|
|
setattr(new_eval, key,value)
|
|
|
|
new_eval.save()
|
|
print(f"Save new eval {new_eval.ID}")
|
|
|
|
#import_data_csv() |