testing / interview /models.py
Danielsz's picture
deploy
16e8be2
Raw
History Blame Contribute Delete
5.04 kB
from django.db import models
class Organization(models.Model):
type = models.CharField(max_length=50, default='Ingenier铆a')
career = models.CharField(max_length=200)
gradient_index = models.IntegerField(default=0)
created_at = models.DateTimeField(auto_now_add=True)
class Group(models.Model):
name = models.CharField(max_length=100)
organization = models.ForeignKey(Organization, on_delete=models.CASCADE, related_name='groups')
class Applicant(models.Model):
STATUS_CHOICES = (
('registered', 'Registrado'),
('approved', 'Aprobado'),
('rejected', 'Reprobado'),
('error', 'Error en Evaluaci贸n'),
)
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
email = models.EmailField(unique=True)
status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='registered')
modality = models.CharField(max_length=50, choices=(('Virtual', 'Virtual'), ('Semi presencial', 'Semi presencial')), default='Virtual')
organization = models.ForeignKey(Organization, on_delete=models.SET_NULL, null=True, blank=True)
group = models.ForeignKey(Group, on_delete=models.SET_NULL, null=True, blank=True)
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return f"{self.first_name} {self.last_name} ({self.get_status_display()})"
# ponytail: Modelo ultra-minimalista para entrevistas. Relaci贸n N:M impl铆cita con Applicant.
class Interview(models.Model):
title = models.CharField(max_length=200, default='Entrevista T茅cnica')
date = models.DateField()
time_index = models.IntegerField(help_text="0=7AM, 1=8AM, 2=9AM, etc.")
duration_minutes = models.IntegerField(default=60, help_text="Duraci贸n de la entrevista en minutos")
active = models.BooleanField(default=False)
applicants = models.ManyToManyField(Applicant, blank=True)
class Meta:
ordering = ['date', 'time_index']
def __str__(self):
return f"{self.title} on {self.date} (slot {self.time_index})"
class EvaluationCategory(models.Model):
name = models.CharField(max_length=100)
description = models.TextField(blank=True)
weight = models.FloatField(default=1.0)
order = models.IntegerField(default=0)
active = models.BooleanField(default=True)
color = models.CharField(max_length=7, default='#0F766E')
class InterviewSession(models.Model):
STATUS_CHOICES = (
('in_progress', 'En Progreso'),
('completed', 'Completada'),
('evaluated', 'Evaluada'),
('error', 'Error'),
)
applicant = models.ForeignKey(Applicant, on_delete=models.CASCADE)
interview = models.ForeignKey(Interview, on_delete=models.CASCADE)
started_at = models.DateTimeField(auto_now_add=True)
ended_at = models.DateTimeField(null=True, blank=True)
recording_url = models.CharField(max_length=500, blank=True)
status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='in_progress')
overall_score = models.FloatField(null=True, blank=True)
dynamic_traits = models.JSONField(null=True, blank=True)
interviewer_notes = models.TextField(blank=True)
hr_recommendation = models.TextField(blank=True)
class QuestionResponse(models.Model):
session = models.ForeignKey(InterviewSession, on_delete=models.CASCADE)
question_index = models.IntegerField()
question_text = models.TextField()
audio_url = models.CharField(max_length=500, blank=True)
transcription = models.TextField(blank=True)
duration_seconds = models.IntegerField(default=0)
created_at = models.DateTimeField(auto_now_add=True)
class EvaluationResult(models.Model):
session = models.ForeignKey(InterviewSession, on_delete=models.CASCADE)
category = models.ForeignKey(EvaluationCategory, on_delete=models.CASCADE)
score = models.FloatField()
feedback = models.TextField(blank=True)
class LLMProviderConfig(models.Model):
name = models.CharField(max_length=50)
provider_type = models.CharField(max_length=20)
api_key = models.CharField(max_length=200, blank=True)
endpoint = models.CharField(max_length=200, blank=True)
model = models.CharField(max_length=100)
is_active = models.BooleanField(default=False)
is_embedding = models.BooleanField(default=False)
class TranscriptionProviderConfig(models.Model):
name = models.CharField(max_length=50)
provider_type = models.CharField(max_length=20)
endpoint = models.CharField(max_length=200, blank=True)
api_key = models.CharField(max_length=200, blank=True)
is_active = models.BooleanField(default=False)
model = models.CharField(max_length=150, blank=True, null=True)
role = models.CharField(max_length=50, blank=True, null=True)
class SystemPromptConfig(models.Model):
prompt_text = models.TextField(default="Act煤a como un reclutador experto ITCA. Eval煤a al candidato en base a sus respuestas en la entrevista.")
updated_at = models.DateTimeField(auto_now=True)