diff --git a/recruitment/forms.py b/recruitment/forms.py index 6df8958c2..df13f7ee1 100644 --- a/recruitment/forms.py +++ b/recruitment/forms.py @@ -226,7 +226,7 @@ class DropDownForm(forms.ModelForm): field.widget.attrs.update({"class": "oh-switch__checkbox "}) -class RecruitmentCreationForm(ModelForm): +class RecruitmentCreationForm(BaseModelForm): """ Form for Recruitment model """ @@ -254,14 +254,13 @@ class RecruitmentCreationForm(ModelForm): "end_date": forms.DateInput(attrs={"type": "date"}), "description": forms.Textarea(attrs={"data-summernote": ""}), } - labels = {"description": _("Description"), "vacancy": _("Vacancy")} def as_p(self, *args, **kwargs): """ Render the form fields as HTML table rows with Bootstrap styling. """ context = {"form": self} - table_html = render_to_string("attendance_form.html", context) + table_html = render_to_string("horilla_form.html", context) return table_html def __init__(self, *args, **kwargs): @@ -278,7 +277,7 @@ class RecruitmentCreationForm(ModelForm): filter_template_path="employee_filters.html", required=True, ), - label="Employee", + label=f"{self._meta.model()._meta.get_field('recruitment_managers').verbose_name}", ) skill_choices = [("", _("---Choose Skills---"))] + list( @@ -326,7 +325,7 @@ class RecruitmentCreationForm(ModelForm): super().clean() -class StageCreationForm(ModelForm): +class StageCreationForm(BaseModelForm): """ Form for Stage model """ @@ -356,7 +355,7 @@ class StageCreationForm(ModelForm): filter_template_path="employee_filters.html", required=True, ), - label="Employee", + label=f"{self._meta.model()._meta.get_field('stage_managers').verbose_name}", ) def clean(self): @@ -367,7 +366,7 @@ class StageCreationForm(ModelForm): super().clean() -class CandidateCreationForm(ModelForm): +class CandidateCreationForm(BaseModelForm): """ Form for Candidate model """ @@ -421,13 +420,6 @@ class CandidateCreationForm(ModelForm): "scheduled_date": forms.DateInput(attrs={"type": "date"}), "dob": forms.DateInput(attrs={"type": "date"}), } - labels = { - "name": _("Name"), - "email": _("Email"), - "mobile": _("Mobile"), - "address": _("Address"), - "zip": _("Zip"), - } def save(self, commit: bool = ...): candidate = self.instance @@ -904,13 +896,11 @@ class SurveyPreviewForm(forms.Form): # self -class TemplateForm(ModelForm): +class TemplateForm(BaseModelForm): """ TemplateForm """ - verbose_name = "Template" - class Meta: model = SurveyTemplate fields = "__all__" @@ -1008,8 +998,8 @@ class SkillZoneCreateForm(BaseModelForm): exclude = ["is_active"] -class SkillZoneCandidateForm(ModelForm): - verbose_name = "Skill Zone Candidate" +class SkillZoneCandidateForm(BaseModelForm): + verbose_name = _("Skill Zone Candidate") candidate_id = forms.ModelMultipleChoiceField( queryset=Candidate.objects.all(), widget=forms.SelectMultiple, @@ -1076,8 +1066,8 @@ class SkillZoneCandidateForm(ModelForm): return self.instance -class ToSkillZoneForm(ModelForm): - verbose_name = "Add To Skill Zone" +class ToSkillZoneForm(BaseModelForm): + verbose_name = _("Add To Skill Zone") skill_zone_ids = forms.ModelMultipleChoiceField( queryset=SkillZone.objects.all(), label=_("Skill Zones") ) @@ -1177,13 +1167,11 @@ class RejectedCandidateForm(ModelForm): self.fields["candidate_id"].widget = self.fields["candidate_id"].hidden_widget() -class ScheduleInterviewForm(ModelForm): +class ScheduleInterviewForm(BaseModelForm): """ ScheduleInterviewForm """ - verbose_name = "Schedule Interview" - class Meta: model = InterviewSchedule fields = "__all__" diff --git a/recruitment/models.py b/recruitment/models.py index 702f02091..a7b9c74e2 100644 --- a/recruitment/models.py +++ b/recruitment/models.py @@ -95,6 +95,10 @@ class SurveyTemplate(HorillaModel): def __str__(self) -> str: return self.title + class Meta: + verbose_name = _("Survey Template") + verbose_name_plural = _("Survey Templates") + class Skill(HorillaModel): title = models.CharField(max_length=100) @@ -107,14 +111,20 @@ class Skill(HorillaModel): self.title = title.capitalize() super().save(*args, **kwargs) + class Meta: + verbose_name = _("Skill") + verbose_name_plural = _("Skills") + class Recruitment(HorillaModel): """ Recruitment model """ - title = models.CharField(max_length=50, null=True, blank=True) - description = models.TextField(null=True) + title = models.CharField( + max_length=50, null=True, blank=True, verbose_name=_("Title") + ) + description = models.TextField(null=True, verbose_name=_("Description")) is_event_based = models.BooleanField( default=False, help_text=_("To start recruitment for multiple job positions"), @@ -131,6 +141,7 @@ class Recruitment(HorillaModel): "To publish a recruitment in website, if false then it \ will not appear on open recruitment page." ), + verbose_name=_("Is Published"), ) is_active = models.BooleanField( default=True, @@ -140,7 +151,10 @@ class Recruitment(HorillaModel): ), ) open_positions = models.ManyToManyField( - JobPosition, related_name="open_positions", blank=True + JobPosition, + related_name="open_positions", + blank=True, + verbose_name=_("Job Position"), ) job_position_id = models.ForeignKey( JobPosition, @@ -152,9 +166,11 @@ class Recruitment(HorillaModel): verbose_name=_("Job Position"), editable=False, ) - vacancy = models.IntegerField(default=0, null=True) - recruitment_managers = models.ManyToManyField(Employee) - survey_templates = models.ManyToManyField(SurveyTemplate, blank=True) + vacancy = models.IntegerField(default=0, null=True, verbose_name=_("Vacancy")) + recruitment_managers = models.ManyToManyField(Employee, verbose_name=_("Managers")) + survey_templates = models.ManyToManyField( + SurveyTemplate, blank=True, verbose_name=_("Survey Templates") + ) company_id = models.ForeignKey( Company, on_delete=models.PROTECT, @@ -164,7 +180,7 @@ class Recruitment(HorillaModel): ) start_date = models.DateField(default=django.utils.timezone.now) end_date = models.DateField(blank=True, null=True) - skills = models.ManyToManyField(Skill, blank=True) + skills = models.ManyToManyField(Skill, blank=True, verbose_name=_("Skills")) linkedin_account_id = models.ForeignKey( "recruitment.LinkedInAccount", on_delete=models.PROTECT, @@ -179,14 +195,19 @@ class Recruitment(HorillaModel): "To publish a recruitment in Linkedin, if active is false then it \ will not post on LinkedIn." ), + verbose_name=_("Post on LinkedIn"), ) objects = HorillaCompanyManager() default = models.manager.Manager() optional_profile_image = models.BooleanField( - default=False, help_text=_("Profile image not mandatory for candidate creation") + default=False, + help_text=_("Profile image not mandatory for candidate creation"), + verbose_name=_("Optional Profile Image"), ) optional_resume = models.BooleanField( - default=False, help_text=_("Resume not mandatory for candidate creation") + default=False, + help_text=_("Resume not mandatory for candidate creation"), + verbose_name=_("Optional Resume"), ) class Meta: @@ -202,6 +223,8 @@ class Recruitment(HorillaModel): ("job_position_id", "start_date", "company_id"), ] permissions = (("archive_recruitment", "Archive Recruitment"),) + verbose_name = _("Recruitment") + verbose_name_plural = _("Recruitments") def total_hires(self): """ @@ -287,10 +310,13 @@ class Stage(HorillaModel): related_name="stage_set", verbose_name=_("Recruitment"), ) - stage_managers = models.ManyToManyField(Employee) - stage = models.CharField(max_length=50) + stage_managers = models.ManyToManyField(Employee, verbose_name=_("Stage Managers")) + stage = models.CharField(max_length=50, verbose_name=_("Stage")) stage_type = models.CharField( - max_length=20, choices=stage_types, default="interview" + max_length=20, + choices=stage_types, + default="interview", + verbose_name=_("Stage Type"), ) sequence = models.IntegerField(null=True, default=0) objects = HorillaCompanyManager(related_company_field="recruitment_id__company_id") @@ -306,6 +332,8 @@ class Stage(HorillaModel): permissions = (("archive_Stage", "Archive Stage"),) unique_together = ["recruitment_id", "stage"] ordering = ["sequence"] + verbose_name = _("Stage") + verbose_name_plural = _("Stages") def active_candidates(self): """ @@ -325,11 +353,11 @@ class Candidate(HorillaModel): choices = [("male", _("Male")), ("female", _("Female")), ("other", _("Other"))] offer_letter_statuses = [ - ("not_sent", "Not Sent"), - ("sent", "Sent"), - ("accepted", "Accepted"), - ("rejected", "Rejected"), - ("joined", "Joined"), + ("not_sent", _("Not Sent")), + ("sent", _("Sent")), + ("accepted", _("Accepted")), + ("rejected", _("Rejected")), + ("joined", _("Joined")), ] source_choices = [ ("application", _("Application Form")), @@ -377,7 +405,7 @@ class Candidate(HorillaModel): validators=[ validate_mobile, ], - verbose_name=_("Phone"), + verbose_name=_("Mobile"), ) resume = models.FileField( upload_to="recruitment/resume", @@ -614,6 +642,8 @@ class Candidate(HorillaModel): ("archive_candidate", "Archive Candidate"), ) ordering = ["sequence"] + verbose_name = _("Candidate") + verbose_name_plural = _("Candidates") class RejectReason(HorillaModel): @@ -637,6 +667,10 @@ class RejectReason(HorillaModel): def __str__(self) -> str: return self.title + class Meta: + verbose_name = _("Reject Reason") + verbose_name_plural = _("Reject Reasons") + class RejectedCandidate(HorillaModel): """ @@ -952,6 +986,10 @@ class InterviewSchedule(HorillaModel): def __str__(self) -> str: return f"{self.candidate_id} -Interview." + class Meta: + verbose_name = _("Schedule Interview") + verbose_name_plural = _("Schedule Interviews") + class Resume(models.Model): file = models.FileField( diff --git a/recruitment/scheduler.py b/recruitment/scheduler.py index d07e873b4..c1b71d06b 100644 --- a/recruitment/scheduler.py +++ b/recruitment/scheduler.py @@ -55,7 +55,7 @@ if not any( Initializes and starts background tasks using APScheduler when the server is running. """ scheduler = BackgroundScheduler() - scheduler.add_job(candidate_convert, "interval", seconds=10) + scheduler.add_job(candidate_convert, "interval", minutes=5) scheduler.add_job(recruitment_close, "interval", hours=1) scheduler.start() diff --git a/recruitment/templates/candidate/candidate_create_form_as_p.html b/recruitment/templates/candidate/candidate_create_form_as_p.html index 14ba2d5a5..68bbc1193 100644 --- a/recruitment/templates/candidate/candidate_create_form_as_p.html +++ b/recruitment/templates/candidate/candidate_create_form_as_p.html @@ -2,47 +2,43 @@ {{ form.non_field_errors }}