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 }}
- {% for field in form %} - {% if field.label != "Profile" and field.label != 'Country' and field.label != 'State' and field.label != 'Badge id' %} -
-
- + {% for field in form %} + {% if field.name != 'profile' and field.name != 'country' and field.name != 'state' and field.name != 'badge_id' %} +
+
+ - {% if field.field.widget.input_type == 'checkbox' %} -
{{ field|add_class:'oh-switch__checkbox' }}
- {% else %} - {{ field|add_class:'form-control' }} - {% endif %} + {% if field.field.widget.input_type == 'checkbox' %} +
{{ field|add_class:'oh-switch__checkbox' }}
+ {% else %} + {{ field|add_class:'form-control' }} + {% endif %} - {{ field.errors }} -
-
- {% elif field.label == 'Country' %} -
-
- - - {{form.country.errors}} - - -
-
- - - {{form.state.errors}} -
-
- {% endif %} - {% endfor %} + {{ field.errors }} +
+
+ {% elif field.name == 'country' %} +
+
+ + + {{form.country.errors}} + + +
+
+ + + {{form.state.errors}} +
+
+ {% endif %} + {% endfor %}
diff --git a/recruitment/templates/pipeline/form/recruitment_update.html b/recruitment/templates/pipeline/form/recruitment_update.html index 99634d5f9..fc4a633b4 100644 --- a/recruitment/templates/pipeline/form/recruitment_update.html +++ b/recruitment/templates/pipeline/form/recruitment_update.html @@ -2,13 +2,13 @@ {% if form.non_field_errors %} {% endif %}
- {% trans "Edit Recruitment" %} + {% trans "Update" %} {{form.verbose_name}}
+
+ {% trans "Update" %} {{form.verbose_name}} +
+
-
-
- {% csrf_token %} -
-
- - {{form.stage}} {{form.stage.errors}} + +
+ {% csrf_token %} +
+
+ + {{form.stage}} {{form.stage.errors}} +
+
+ + {{form.recruitment_id}} {{form.recruitment_id.errors}} +
+
+ + {{form.stage_managers}} {{form.stage_managers.errors}} + +
+
+ + {{form.stage_type}} {{form.stage_type.errors}} +
+
-
- - {{form.recruitment_id}} {{form.recruitment_id.errors}} +
+
-
- - {{form.stage_managers}} {{form.stage_managers.errors}} -
-
- - {{form.stage_type}} {{form.stage_type.errors}} -
-
-
-
- -
- +
diff --git a/recruitment/templates/recruitment/recruitment_form.html b/recruitment/templates/recruitment/recruitment_form.html index 126116618..4a82cfe15 100644 --- a/recruitment/templates/recruitment/recruitment_form.html +++ b/recruitment/templates/recruitment/recruitment_form.html @@ -52,7 +52,7 @@ {% endif %}
{% if duplicate %}{% trans "Duplicate Recruitment" %}{% else %}{% trans "Add Recruitment" %}{% endif %}{% if duplicate %}{% trans "Duplicate" %}{% else %}{% trans "Create" %}{% endif %} {{form.verbose_name}}
@@ -84,7 +84,7 @@ {{form.description.label}} {{form.description}} {{form.description.errors}}
@@ -95,7 +95,7 @@ {{form.open_positions.label}} {{form.open_positions}} {{form.open_positions.errors}}
@@ -103,53 +103,53 @@ {{form.recruitment_managers.label}} {{form.recruitment_managers}} {{form.recruitment_managers.errors}}
{{form.start_date.label}} {{form.start_date}} {{form.start_date.errors}}
{{form.end_date.label}} {{form.end_date}} {{form.end_date.errors}}
{{form.vacancy.label}} {{form.vacancy}} {{form.vacancy.errors}}
{{form.company_id.label}} {{form.company_id}} {{form.company_id.errors}}
{{form.survey_templates.label}} {{form.survey_templates}}
- {{form.skills.label}} {{form.skills}}
- {{form.publish_in_linkedin.label}}
{{form.publish_in_linkedin}}
@@ -165,9 +165,9 @@
{{form.is_published.label}} ?
{{form.is_published}}
@@ -176,9 +176,9 @@
{{form.optional_profile_image.label}}
{{form.optional_profile_image}}
@@ -187,9 +187,9 @@
{{form.optional_resume.label}}
{{form.optional_resume}}
@@ -204,7 +204,7 @@ hx-post="{% url 'recruitment-create' %}" hx-target="#objectCreateModalTarget" > - {% trans "Add" %} + {% trans "Save" %}
diff --git a/recruitment/templates/recruitment/recruitment_update_form.html b/recruitment/templates/recruitment/recruitment_update_form.html index ccd5d4ff0..9b94798ea 100644 --- a/recruitment/templates/recruitment/recruitment_update_form.html +++ b/recruitment/templates/recruitment/recruitment_update_form.html @@ -51,7 +51,7 @@ {% endif %}
{% trans "Edit Recruitment" %}{% trans "Update" %} {{form.verbose_name}} + {% trans "Create" %} {{form.verbose_name}} +
-
-
- {% csrf_token %} -
-
- - {{form.stage}} {{form.stage.errors}} + +
+ {% csrf_token %} +
+
+ + {{form.stage}} {{form.stage.errors}} +
+
+ + {{form.recruitment_id}} {{form.recruitment_id.errors}} +
+
+ + {{form.stage_managers}} {{form.stage_managers.errors}} + +
+
+ + {{form.stage_type}} {{form.stage_type.errors}} +
+
-
- - {{form.recruitment_id}} {{form.recruitment_id.errors}} +
+
-
- - {{form.stage_managers}} {{form.stage_managers.errors}} - -
-
- - {{form.stage_type}} {{form.stage_type.errors}} -
-
-
-
- -
- + - -
+ +
diff --git a/recruitment/templates/stage/stage_update_form.html b/recruitment/templates/stage/stage_update_form.html index 16f046a6e..36858c045 100644 --- a/recruitment/templates/stage/stage_update_form.html +++ b/recruitment/templates/stage/stage_update_form.html @@ -1,58 +1,57 @@ -{% load i18n %} {% if messages %} -
- {% for message in messages %} -
{{ message }}
- {% endfor %} -
+{% load i18n %} +{% if messages %} +
+ {% for message in messages %} +
{{ message }}
+ {% endfor %} +
{% endif %}
-
- {% trans "Edit Stage" %} -
- +
+ {% trans "Update" %} {{form.verbose_name}} +
+
-
- {% csrf_token %} -
- {% csrf_token %} -
-
- - {{form.stage}} {{form.stage.errors}} + + {% csrf_token %} +
+ {% csrf_token %} +
+
+ + {{form.stage}} {{form.stage.errors}} +
+
+ + {{form.recruitment_id}} {{form.recruitment_id.errors}} +
+
+ + {{form.stage_managers}} {{form.stage_managers.errors}} + +
+
+ + {{form.stage_type}} {{form.stage_type.errors}} +
+
-
- - {{form.recruitment_id}} {{form.recruitment_id.errors}} -
-
- - {{form.stage_managers}} {{form.stage_managers.errors}} - -
-
- - {{form.stage_type}} {{form.stage_type.errors}} -
-
-
-
- -
- +
+ +
+
+ $(document).ready(function () { + $("#stageFormCreate [name=stage_managers]").removeAttr("required"); + }); + diff --git a/recruitment/templates/survey/template_accordion.html b/recruitment/templates/survey/template_accordion.html index d1a35e22c..011203543 100644 --- a/recruitment/templates/survey/template_accordion.html +++ b/recruitment/templates/survey/template_accordion.html @@ -43,8 +43,8 @@ {% if perms.recruitment.change_surveytemplate %}
  • + hx-target="#templateModalBody" data-toggle="oh-modal-toggle" + data-target="#templateModal" class="oh-dropdown__link"> {% trans "Edit" %}