diff --git a/pms/admin.py b/pms/admin.py index 9eea64589..ab00def42 100644 --- a/pms/admin.py +++ b/pms/admin.py @@ -1,25 +1,28 @@ +""" +admin.py + +This page is used to register PMS models with admins site. +""" from django.contrib import admin -from . models import Comment,EmployeeKeyResult,Period,EmployeeObjective -from . models import Question,QuestionTemplate,Feedback,Answer,KeyresultFeedback, QuestionOptions -from .models import EmployeeObjective from simple_history.admin import SimpleHistoryAdmin +from .models import Comment, EmployeeKeyResult, Period, EmployeeObjective +from .models import ( + Question, + QuestionTemplate, + Feedback, + Answer, + KeyResultFeedback, + QuestionOptions, +) # Register your models here. objective = [Period] -feedback = [ Question,QuestionTemplate,Feedback,Answer, QuestionOptions] -admin.site.register(EmployeeObjective,SimpleHistoryAdmin) -admin.site.register(EmployeeKeyResult,SimpleHistoryAdmin) +feedback = [Question, QuestionTemplate, Feedback, Answer, QuestionOptions] +admin.site.register(EmployeeObjective, SimpleHistoryAdmin) +admin.site.register(EmployeeKeyResult, SimpleHistoryAdmin) admin.site.register(objective) admin.site.register(feedback) -admin.site.register(KeyresultFeedback) -admin.site.register(Comment,SimpleHistoryAdmin) - - - - - - - - +admin.site.register(KeyResultFeedback) +admin.site.register(Comment, SimpleHistoryAdmin) diff --git a/pms/apps.py b/pms/apps.py index 76503b0aa..61d042235 100644 --- a/pms/apps.py +++ b/pms/apps.py @@ -1,6 +1,14 @@ +""" +Django application configuration for the PMS (Performance Management System) app. +""" from django.apps import AppConfig class PmsConfig(AppConfig): - default_auto_field = 'django.db.models.BigAutoField' - name = 'pms' + """ + This class provides configuration settings for the PMS app, such as the default + database field type and the app's name. + """ + + default_auto_field = "django.db.models.BigAutoField" + name = "pms" diff --git a/pms/filters.py b/pms/filters.py index 532941f8f..f964104c1 100644 --- a/pms/filters.py +++ b/pms/filters.py @@ -1,24 +1,39 @@ +""" +Module: filters.py + +This module contains custom Django filters and filter sets for +the PMS (Performance Management System) app. +""" import datetime import django_filters -from pms.models import EmployeeObjective, Feedback -from django_filters import DateFilter from django import forms +from django_filters import DateFilter +from pms.models import EmployeeObjective, Feedback + + class DateRangeFilter(django_filters.Filter): + """ + A custom Django filter for filtering querysets based on date ranges. + + This filter allows you to filter a queryset based on date ranges such as 'today', + 'yesterday', 'week', or 'month' in the 'created_at' field of model. + """ + def filter(self, qs, value): if value: - if value == 'today': + if value == "today": today = datetime.date.today() - qs = qs.filter(created_at=today) - if value == 'yesterday': + qs = qs.filter(created_at=today) + if value == "yesterday": today = datetime.date.today() yesterday = today - datetime.timedelta(days=1) - qs = qs.filter(created_at=yesterday) - if value == 'week': + qs = qs.filter(created_at=yesterday) + if value == "week": today = datetime.date.today() start_of_week = today - datetime.timedelta(days=today.weekday()) end_of_week = start_of_week + datetime.timedelta(days=6) qs = qs.filter(created_at__range=[start_of_week, end_of_week]) - elif value == 'month': + elif value == "month": today = datetime.date.today() start_of_month = datetime.date(today.year, today.month, 1) end_of_month = start_of_month + datetime.timedelta(days=31) @@ -32,65 +47,109 @@ class CustomFilterSet(django_filters.FilterSet): for field_name, field in self.filters.items(): filter_widget = self.filters[field_name] widget = filter_widget.field.widget - if isinstance(widget, (forms.NumberInput, forms.EmailInput, forms.TextInput)): - filter_widget.field.widget.attrs.update( - {'class': 'oh-input w-100'}) + if isinstance( + widget, (forms.NumberInput, forms.EmailInput, forms.TextInput) + ): + filter_widget.field.widget.attrs.update({"class": "oh-input w-100"}) elif isinstance(widget, (forms.Select,)): filter_widget.field.widget.attrs.update( - {'class': 'oh-select oh-select-2 select2-hidden-accessible', }) + { + "class": "oh-select oh-select-2 select2-hidden-accessible", + } + ) elif isinstance(widget, (forms.Textarea)): + filter_widget.field.widget.attrs.update({"class": "oh-input w-100"}) + elif isinstance( + widget, + ( + forms.CheckboxInput, + forms.CheckboxSelectMultiple, + ), + ): filter_widget.field.widget.attrs.update( - {'class': 'oh-input w-100'}) - elif isinstance(widget, (forms.CheckboxInput, forms.CheckboxSelectMultiple,)): - filter_widget.field.widget.attrs.update( - {'class': 'oh-switch__checkbox'}) + {"class": "oh-switch__checkbox"} + ) elif isinstance(widget, (forms.ModelChoiceField)): filter_widget.field.widget.attrs.update( - {'class': 'oh-select oh-select-2 select2-hidden-accessible', }) + { + "class": "oh-select oh-select-2 select2-hidden-accessible", + } + ) if isinstance(field, django_filters.CharFilter): - field.lookup_expr='icontains' + field.lookup_expr = "icontains" + - class ObjectiveFilter(CustomFilterSet): - - # objective = django_filters.CharFilter(lookup_expr='icontains') - created_at_date_range = DateRangeFilter(field_name='created_at') + """ + Custom filter set for EmployeeObjective records. + + This filter set allows to filter EmployeeObjective records based on various criteria. + """ + + created_at_date_range = DateRangeFilter(field_name="created_at") created_at = DateFilter( - widget=forms.DateInput(attrs={'type': 'date','class':'oh-input w-100'}), - # add lookup expression here + widget=forms.DateInput(attrs={"type": "date", "class": "oh-input w-100"}), + # add lookup expression here ) updated_at = DateFilter( - widget=forms.DateInput(attrs={'type': 'date','class':'oh-input w-100'}), - # add lookup expression here + widget=forms.DateInput(attrs={"type": "date", "class": "oh-input w-100"}), + # add lookup expression here ) start_date = DateFilter( - widget=forms.DateInput(attrs={'type': 'date','class':'oh-input w-100'}), - # add lookup expression here + widget=forms.DateInput(attrs={"type": "date", "class": "oh-input w-100"}), + # add lookup expression here ) end_date = DateFilter( - widget=forms.DateInput(attrs={'type': 'date','class':'oh-input w-100'}), - # add lookup expression here + widget=forms.DateInput(attrs={"type": "date", "class": "oh-input w-100"}), + # add lookup expression here ) class Meta: + """ + A nested class that specifies the model and fields for the filter. + """ + model = EmployeeObjective - fields = ['objective','status','employee_id','created_at','start_date','updated_at','end_date','archive','emp_obj_id'] - + fields = [ + "objective", + "status", + "employee_id", + "created_at", + "start_date", + "updated_at", + "end_date", + "archive", + "emp_obj_id", + ] + class FeedbackFilter(CustomFilterSet): - review_cycle = django_filters.CharFilter(lookup_expr='icontains') - created_at_date_range = DateRangeFilter(field_name='created_at') + """ + Custom filter set for Feedback records. + + This filter set allows to filter Feedback records based on various criteria. + """ + + review_cycle = django_filters.CharFilter(lookup_expr="icontains") + created_at_date_range = DateRangeFilter(field_name="created_at") start_date = DateFilter( - widget=forms.DateInput(attrs={'type': 'date','class':'oh-input w-100'}), - # add lookup expression here + widget=forms.DateInput(attrs={"type": "date", "class": "oh-input w-100"}), + # add lookup expression here ) end_date = DateFilter( - widget=forms.DateInput(attrs={'type': 'date','class':'oh-input w-100'}), + widget=forms.DateInput(attrs={"type": "date", "class": "oh-input w-100"}), + # add lookup expression here + ) - # add lookup expression here - ) class Meta: + """ + A nested class that specifies the model and fields for the filter. + """ + model = Feedback - fields = '__all__' + fields = "__all__" + def __init__(self, data=None, queryset=None, *, request=None, prefix=None): - super(FeedbackFilter, self).__init__(data=data, queryset=queryset, request=request, prefix=prefix) + super(FeedbackFilter, self).__init__( + data=data, queryset=queryset, request=request, prefix=prefix + ) diff --git a/pms/forms.py b/pms/forms.py index 132ecd507..45e70baa7 100644 --- a/pms/forms.py +++ b/pms/forms.py @@ -4,10 +4,9 @@ forms.py This module is used to register the forms for pms models """ import uuid +from django import forms from django.core.exceptions import ValidationError -from django import forms from django.utils.translation import gettext_lazy as _ -from django import forms from employee.models import Department, JobPosition from pms.models import ( Question, @@ -23,6 +22,9 @@ from pms.models import ( def validate_date(start_date, end_date): + """ + Validates that the start date is before or equal to the end date. + """ if start_date and end_date and start_date > end_date: raise forms.ValidationError("The start date must be before the end date.") @@ -102,11 +104,18 @@ class ObjectiveForm(forms.ModelForm): ) class Meta: + """ + A nested class that specifies the model,fields and style of fields for the form. + """ + model = EmployeeObjective exclude = ["status"] widgets = { "objective": forms.TextInput( - attrs={"class": "oh-input oh-input--block", "placeholder": _("Objective")} + attrs={ + "class": "oh-input oh-input--block", + "placeholder": _("Objective"), + } ), "objective_description": forms.Textarea( attrs={ @@ -215,6 +224,10 @@ class KeyResultForm(forms.ModelForm): ) class Meta: + """ + A nested class that specifies the model,fields and exclude fields for the form. + """ + model = EmployeeKeyResult fields = "__all__" exclude = [ @@ -287,6 +300,9 @@ class KeyResultForm(forms.ModelForm): self.fields["employee_id"].widget.attrs.update({"id": str(uuid.uuid4())}) def clean_value(self, value_type): + """ + Validate the 'current_value' and 'target_value' field of model EmployeeKeyResult. + """ value = self.cleaned_data.get(value_type) other_value = self.cleaned_data.get( "current_value" if value_type == "target_value" else "target_value" @@ -348,8 +364,11 @@ class FeedbackForm(forms.ModelForm): required=False, ) - # employee_key_results_id = forms.ModelChoiceField(queryset=EmployeeKeyResult.objects.filter(id=-8451257845215),widget=forms.SelectMultiple(attrs={"class":"oh-select oh-select-2 w-100 oh-select-2--large","multiple":"multiple"}),required=False) class Meta: + """ + A nested class that specifies the model,fields and exclude fields for the form. + """ + model = Feedback fields = "__all__" exclude = ["status", "archive"] @@ -376,7 +395,6 @@ class FeedbackForm(forms.ModelForm): "class": "oh-select oh-select-2 ", "style": "width:100%; display:none;", "required": "false", - }, ), "colleague_id": forms.SelectMultiple( @@ -398,7 +416,6 @@ class FeedbackForm(forms.ModelForm): "class": "oh-select oh-select--lg oh-select-no-search", "style": "width:100%; display:none;", "required": "false", - } ), } @@ -466,6 +483,10 @@ class QuestionTemplateForm(forms.ModelForm): ) class Meta: + """ + A nested class that specifies the model and fields for the form. + """ + model = QuestionTemplate fields = "__all__" @@ -517,8 +538,11 @@ class QuestionForm(forms.ModelForm): ) class Meta: - model = Question + """ + A nested class that specifies the model,exclude fields and style of fields for the form. + """ + model = Question exclude = ["question_option_id", "template_id"] widgets = { "question_type": forms.Select( @@ -559,6 +583,10 @@ class ObjectiveCommentForm(forms.ModelForm): """ class Meta: + """ + A nested class that specifies the model,exclude fields and style of fields for the form. + """ + model = Comment exclude = ["employee_id", "employee_objective_id"] widgets = { @@ -578,6 +606,10 @@ class PeriodForm(forms.ModelForm): """ class Meta: + """ + A nested class that specifies the model,fields and style of fields for the form. + """ + model = Period fields = "__all__" widgets = { @@ -593,12 +625,11 @@ class PeriodForm(forms.ModelForm): } def __init__(self, *args, **kwargs): + """ + django forms not showing value inside the date, time html element. + so here overriding default forms instance method to set initial value + """ if instance := kwargs.get("instance"): - """ - django forms not showing value inside the date, time html element. - so here overriding default forms instance method to set initial value - """ - kwargs["initial"] = set_date_field_initial(instance) super(PeriodForm, self).__init__(*args, **kwargs) diff --git a/pms/models.py b/pms/models.py index e1370a633..9eee99cee 100644 --- a/pms/models.py +++ b/pms/models.py @@ -1,84 +1,129 @@ from django.db import models -from employee.models import Employee +from django.utils.translation import gettext_lazy as _ + # importing simple history from simple_history.models import HistoricalRecords -from django.utils.translation import gettext_lazy as _ +from employee.models import Employee """Objectives and key result section""" class Period(models.Model): - """ this is a period model used for creating period """ + """this is a period model used for creating period""" - period_name = models.CharField(max_length=150,unique=True) + 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) + objects = models.Manager() def __str__(self): return self.period_name + class EmployeeObjective(models.Model): - """ this is a EmployObjective model used for creating Employee objectives """ + """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')), + ("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) + 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') + 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) + archive = models.BooleanField(default=False, null=True, blank=True) + objects = models.Manager() def __str__(self): - return f'{self.employee_id.employee_first_name} -{self.objective}' - + 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) + 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']) + history = HistoricalRecords(excluded_fields=["comment"]) + objects = models.Manager() def __str__(self): - return f'{self.employee_id.employee_first_name} -{self.comment} ' + return f"{self.employee_id.employee_first_name} -{self.comment} " class EmployeeKeyResult(models.Model): - """employee key result creation """ + """employee key result creation""" + PROGRESS_CHOICES = ( - ('%', _('Percentage')), - ('#', _('Number')), - ('Currency', (('$', 'USD$'), ('₹', 'INR'), ('€', 'EUR'))) + ("%", _("Percentage")), + ("#", _("Number")), + ("Currency", (("$", "USD$"), ("₹", "INR"), ("€", "EUR"))), ) STATUS_CHOICES = ( - ('On Track', _('On Track')), - ('Behind', _('Behind')), - ('Closed', _('Closed')), - ('At Risk', _('At Risk')), - ('Not Started', _('Not Started')) + ("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') + 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) @@ -87,11 +132,10 @@ class EmployeeKeyResult(models.Model): start_date = models.DateField(null=True, blank=True) end_date = models.DateField(null=True, blank=True) history = HistoricalRecords() + objects = models.Manager() def __str__(self): - return f'{self.key_result} ' - - + return f"{self.key_result} " """360degree feedback section""" @@ -99,7 +143,11 @@ class EmployeeKeyResult(models.Model): class QuestionTemplate(models.Model): """question template creation""" - question_template = models.CharField(max_length=100, null=False, blank=False , unique=True) + + question_template = models.CharField( + max_length=100, null=False, blank=False, unique=True + ) + objects = models.Manager() def __str__(self): return self.question_template @@ -107,67 +155,147 @@ class QuestionTemplate(models.Model): class Question(models.Model): """question creation""" + QUESTION_TYPE_CHOICE = ( - ('1', _('Text')), - ('2', _('Rating')), - ('3', _('Boolean')), - ('4', _('Multi-choices')), - ('5', _('Likert')) + ("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) + 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, + ) + objects = models.Manager() 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) + """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) + objects = models.Manager() class Feedback(models.Model): - """feedback model for creating feedback """ + """feedback model for creating feedback""" + STATUS_CHOICES = ( - ('On Track', _('On Track')), - ('Behind', _('Behind') ), - ('Closed', _('Closed') ), - ('At Risk', _('At Risk') ), - ('Not Started', _('Not Started')) + ("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') + 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,) + employee_key_results_id = models.ManyToManyField( + EmployeeKeyResult, + blank=True, + ) + objects = models.Manager() def __str__(self): - return f'{self.employee_id.employee_first_name} - {self.review_cycle}' + return f"{self.employee_id.employee_first_name} - {self.review_cycle}" class Answer(models.Model): - """feedback answer 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') + 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" + ) + objects = models.Manager() 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') + 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) \ No newline at end of file + key_result_id = models.ForeignKey( + EmployeeKeyResult, + related_name="key_result_feedback", + null=True, + blank=True, + on_delete=models.DO_NOTHING, + ) + objects = models.Manager() diff --git a/pms/templates/feedback/question_template/question_template_update.html b/pms/templates/feedback/question_template/question_template_update.html index ff7939226..6cc661271 100644 --- a/pms/templates/feedback/question_template/question_template_update.html +++ b/pms/templates/feedback/question_template/question_template_update.html @@ -1,5 +1,5 @@ {% load i18n %} -