173 lines
7.9 KiB
Python
173 lines
7.9 KiB
Python
from django.db import models
|
|
from employee.models import Employee
|
|
# importing simple history
|
|
from simple_history.models import HistoricalRecords
|
|
from django.utils.translation import gettext_lazy as _
|
|
|
|
|
|
"""Objectives and key result section"""
|
|
|
|
|
|
class Period(models.Model):
|
|
""" this is a period model used for creating period """
|
|
|
|
period_name = models.CharField(max_length=150,unique=True)
|
|
start_date = models.DateField(null=True, blank=True)
|
|
end_date = models.DateField(null=True, blank=True)
|
|
|
|
def __str__(self):
|
|
return self.period_name
|
|
|
|
class EmployeeObjective(models.Model):
|
|
|
|
""" this is a EmployObjective model used for creating Employee objectives """
|
|
|
|
STATUS_CHOICES = [
|
|
('On Track', _('On Track')),
|
|
('Behind', _('Behind')),
|
|
('Closed', _('Closed')),
|
|
('At Risk', _('At Risk')),
|
|
('Not Started', _('Not Started')),
|
|
]
|
|
objective = models.CharField(null=False, blank=False, max_length=100)
|
|
objective_description = models.TextField(blank=False, null=False)
|
|
created_at = models.DateField(auto_now_add=True)
|
|
employee_id = models.ForeignKey(Employee, on_delete=models.DO_NOTHING, related_name='employee_objective', null=True, blank=True)
|
|
updated_at = models.DateField(auto_now=True)
|
|
start_date = models.DateField(null=False, blank=False)
|
|
end_date = models.DateField(null=False, blank=False)
|
|
status = models.CharField(max_length=20,choices=STATUS_CHOICES,null=False, blank=False, default='Not Started')
|
|
history = HistoricalRecords()
|
|
archive =models.BooleanField(default=False,null=True,blank=True)
|
|
|
|
def __str__(self):
|
|
return f'{self.employee_id.employee_first_name} -{self.objective}'
|
|
|
|
|
|
|
|
class Comment(models.Model):
|
|
"""comments for objectives"""
|
|
|
|
comment = models.CharField(max_length=150)
|
|
employee_id = models.ForeignKey(Employee, on_delete=models.DO_NOTHING, related_name='comment', null=True, blank=True)
|
|
employee_objective_id = models.ForeignKey(EmployeeObjective, on_delete=models.CASCADE, related_name='emp_objective', null=True, blank=True)
|
|
created_at = models.DateTimeField(auto_now_add=True, null=True, blank=True)
|
|
history = HistoricalRecords(excluded_fields=['comment'])
|
|
|
|
def __str__(self):
|
|
return f'{self.employee_id.employee_first_name} -{self.comment} '
|
|
|
|
|
|
class EmployeeKeyResult(models.Model):
|
|
"""employee key result creation """
|
|
PROGRESS_CHOICES = (
|
|
('%', _('Percentage')),
|
|
('#', _('Number')),
|
|
('Currency', (('$', 'USD$'), ('₹', 'INR'), ('€', 'EUR')))
|
|
)
|
|
STATUS_CHOICES = (
|
|
('On Track', _('On Track')),
|
|
('Behind', _('Behind')),
|
|
('Closed', _('Closed')),
|
|
('At Risk', _('At Risk')),
|
|
('Not Started', _('Not Started'))
|
|
)
|
|
|
|
key_result = models.CharField(max_length=60, null=True, blank=False)
|
|
key_result_description = models.TextField(blank=False, null=True)
|
|
employee_objective_id = models.ForeignKey(EmployeeObjective, on_delete=models.CASCADE, related_name='emp_obj_id')
|
|
employee_id = models.ForeignKey(Employee, on_delete=models.DO_NOTHING, related_name='emp_kpi', null=True, blank=True)
|
|
progress_type = models.CharField(max_length=60, null=True, blank=True, choices=PROGRESS_CHOICES)
|
|
status = models.CharField(max_length=20,choices=STATUS_CHOICES,null=True, blank=True, default='Not Started')
|
|
created_at = models.DateField(auto_now_add=True, blank=True, null=True)
|
|
updated_at = models.DateField(auto_now=True, null=True, blank=True)
|
|
start_value = models.IntegerField(null=True, blank=True, default=0)
|
|
current_value = models.IntegerField(null=True, blank=True, default=0)
|
|
target_value = models.IntegerField(null=True, blank=True, default=0)
|
|
start_date = models.DateField(null=True, blank=True)
|
|
end_date = models.DateField(null=True, blank=True)
|
|
history = HistoricalRecords()
|
|
|
|
def __str__(self):
|
|
return f'{self.key_result} '
|
|
|
|
|
|
|
|
|
|
"""360degree feedback section"""
|
|
|
|
|
|
class QuestionTemplate(models.Model):
|
|
"""question template creation"""
|
|
question_template = models.CharField(max_length=100, null=False, blank=False , unique=True)
|
|
|
|
def __str__(self):
|
|
return self.question_template
|
|
|
|
|
|
class Question(models.Model):
|
|
"""question creation"""
|
|
QUESTION_TYPE_CHOICE = (
|
|
('1', _('Text')),
|
|
('2', _('Rating')),
|
|
('3', _('Boolean')),
|
|
('4', _('Multi-choices')),
|
|
('5', _('Likert'))
|
|
)
|
|
question = models.CharField(max_length=250, null=False, blank=False)
|
|
question_type = models.CharField(choices=QUESTION_TYPE_CHOICE, max_length=100, null=True, blank=True)
|
|
template_id = models.ForeignKey(QuestionTemplate, on_delete=models.CASCADE, related_name='question', null=True, blank=True)
|
|
|
|
def __str__(self):
|
|
return self.question
|
|
|
|
|
|
class QuestionOptions(models.Model):
|
|
"""options for question """
|
|
question_id = models.ForeignKey(Question, on_delete=models.CASCADE, related_name='question_options', null=True, blank=True)
|
|
option_a = models.CharField(max_length=250, null=True, blank=True)
|
|
option_b = models.CharField(max_length=250, null=True, blank=True)
|
|
option_c = models.CharField(max_length=250, null=True, blank=True)
|
|
option_d = models.CharField(max_length=250, null=True, blank=True)
|
|
|
|
|
|
class Feedback(models.Model):
|
|
"""feedback model for creating feedback """
|
|
STATUS_CHOICES = (
|
|
('On Track', 'On Track'),
|
|
('Behind', 'Behind' ),
|
|
('Closed', 'Closed' ),
|
|
('At Risk', 'At Risk' ),
|
|
('Not Started', 'Not Started')
|
|
)
|
|
review_cycle = models.CharField(max_length=100, null=False, blank=False)
|
|
manager_id = models.ForeignKey(Employee, related_name='feedback_manager', on_delete=models.DO_NOTHING, null=True, blank=False)
|
|
employee_id = models.ForeignKey(Employee, on_delete=models.DO_NOTHING, related_name='feedback_employee',null=False,blank=False)
|
|
colleague_id = models.ManyToManyField(Employee, related_name='feedback_colleague',blank=True)
|
|
subordinate_id = models.ManyToManyField(Employee, related_name='feedback_subordinate',blank=True)
|
|
question_template_id = models.ForeignKey(QuestionTemplate, on_delete=models.DO_NOTHING, related_name='feedback_question_template',null=False,blank=False)
|
|
status = models.CharField(max_length=50,choices=STATUS_CHOICES,default='Not Started')
|
|
created_at = models.DateField(auto_now_add=True)
|
|
archive = models.BooleanField(null=True, blank=True, default=False)
|
|
start_date = models.DateField(null=False, blank=False)
|
|
end_date = models.DateField(null=True, blank=False)
|
|
employee_key_results_id = models.ManyToManyField(EmployeeKeyResult, blank=True,)
|
|
|
|
def __str__(self):
|
|
return f'{self.employee_id.employee_first_name} - {self.review_cycle}'
|
|
|
|
|
|
class Answer(models.Model):
|
|
"""feedback answer model """
|
|
answer = models.JSONField(max_length=200, null=True, blank=True)
|
|
question_id = models.ForeignKey(Question, on_delete=models.DO_NOTHING, related_name='answer_question_id',null=True,blank=True)
|
|
employee_id = models.ForeignKey(Employee, on_delete=models.DO_NOTHING, related_name='employee_answer',null=True,blank=True)
|
|
feedback_id = models.ForeignKey(Feedback, on_delete=models.CASCADE, related_name='feedback_answer')
|
|
|
|
def __str__(self):
|
|
return f'{self.employee_id.employee_first_name} -{self.answer}'
|
|
class KeyresultFeedback(models.Model):
|
|
feedback_id = models.ForeignKey(Feedback, on_delete=models.CASCADE, related_name='feedback_key_result', null=True,blank=True)
|
|
employee_id = models.ForeignKey(Employee, on_delete=models.DO_NOTHING, related_name='employee_key_result')
|
|
answer = models.JSONField(max_length=200, null=True, blank=True)
|
|
key_result_id = models.ForeignKey(EmployeeKeyResult,related_name='key_result_feedback',null=True,blank=True,on_delete=models.DO_NOTHING) |