354 lines
12 KiB
Python
354 lines
12 KiB
Python
import logging
|
|
from django.db import transaction
|
|
from django_q.models import Schedule
|
|
from django_q.tasks import schedule
|
|
|
|
from django.dispatch import receiver
|
|
from django_q.tasks import async_task
|
|
from django.db.models.signals import post_save
|
|
from .models import FormField,FormStage,FormTemplate,Candidate,JobPosting
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
@receiver(post_save, sender=JobPosting)
|
|
def format_job(sender, instance, created, **kwargs):
|
|
if created:
|
|
# FormTemplate.objects.create(job=instance, is_active=False, name=instance.title)
|
|
async_task(
|
|
'recruitment.tasks.format_job_description',
|
|
instance.pk,
|
|
# hook='myapp.tasks.email_sent_callback' # Optional callback
|
|
)
|
|
else:
|
|
existing_schedule = Schedule.objects.filter(
|
|
func='recruitment.tasks.form_close',
|
|
args=f'[{instance.pk}]',
|
|
schedule_type=Schedule.ONCE
|
|
).first()
|
|
|
|
if instance.STATUS_CHOICES=='ACTIVE' and instance.application_deadline:
|
|
if not existing_schedule:
|
|
# Create a new schedule if one does not exist
|
|
schedule(
|
|
'recruitment.tasks.form_close',
|
|
instance.pk,
|
|
schedule_type=Schedule.ONCE,
|
|
next_run=instance.application_deadline,
|
|
repeats=-1, # Ensure the schedule is deleted after it runs
|
|
name=f'job_closing_{instance.pk}' # Add a name for easier lookup
|
|
)
|
|
elif existing_schedule.next_run != instance.application_deadline:
|
|
# Update an existing schedule's run time
|
|
existing_schedule.next_run = instance.application_deadline
|
|
existing_schedule.save()
|
|
elif existing_schedule:
|
|
# If the instance is no longer active, delete the scheduled task
|
|
existing_schedule.delete()
|
|
|
|
@receiver(post_save, sender=Candidate)
|
|
def score_candidate_resume(sender, instance, created, **kwargs):
|
|
if not instance.is_resume_parsed:
|
|
logger.info(f"Scoring resume for candidate {instance.pk}")
|
|
async_task(
|
|
'recruitment.tasks.handle_reume_parsing_and_scoring',
|
|
instance.pk,
|
|
# hook='myapp.tasks.email_sent_callback' # Optional callback
|
|
)
|
|
|
|
@receiver(post_save, sender=FormTemplate)
|
|
def create_default_stages(sender, instance, created, **kwargs):
|
|
"""
|
|
Create default resume stages when a new FormTemplate is created
|
|
"""
|
|
if created:
|
|
with transaction.atomic():
|
|
# Stage 1: Contact Information
|
|
contact_stage = FormStage.objects.create(
|
|
template=instance,
|
|
name='Contact Information',
|
|
order=0,
|
|
is_predefined=True
|
|
)
|
|
FormField.objects.create(
|
|
stage=contact_stage,
|
|
label='First Name',
|
|
field_type='text',
|
|
required=True,
|
|
order=0,
|
|
is_predefined=True
|
|
)
|
|
FormField.objects.create(
|
|
stage=contact_stage,
|
|
label='Last Name',
|
|
field_type='text',
|
|
required=True,
|
|
order=1,
|
|
is_predefined=True
|
|
)
|
|
FormField.objects.create(
|
|
stage=contact_stage,
|
|
label='Email Address',
|
|
field_type='email',
|
|
required=True,
|
|
order=2,
|
|
is_predefined=True
|
|
)
|
|
FormField.objects.create(
|
|
stage=contact_stage,
|
|
label='Phone Number',
|
|
field_type='phone',
|
|
required=True,
|
|
order=3,
|
|
is_predefined=True
|
|
)
|
|
FormField.objects.create(
|
|
stage=contact_stage,
|
|
label='Address',
|
|
field_type='text',
|
|
required=False,
|
|
order=4,
|
|
is_predefined=True
|
|
)
|
|
FormField.objects.create(
|
|
stage=contact_stage,
|
|
label='National ID / Iqama Number',
|
|
field_type='text',
|
|
required=False,
|
|
order=5,
|
|
is_predefined=True
|
|
)
|
|
FormField.objects.create(
|
|
stage=contact_stage,
|
|
label='Resume Upload',
|
|
field_type='file',
|
|
required=True,
|
|
order=6,
|
|
is_predefined=True,
|
|
file_types='.pdf,.doc,.docx',
|
|
max_file_size=1
|
|
)
|
|
|
|
# # Stage 2: Resume Objective
|
|
# objective_stage = FormStage.objects.create(
|
|
# template=instance,
|
|
# name='Resume Objective',
|
|
# order=1,
|
|
# is_predefined=True
|
|
# )
|
|
# FormField.objects.create(
|
|
# stage=objective_stage,
|
|
# label='Career Objective',
|
|
# field_type='textarea',
|
|
# required=False,
|
|
# order=0,
|
|
# is_predefined=True
|
|
# )
|
|
|
|
# # Stage 3: Education
|
|
# education_stage = FormStage.objects.create(
|
|
# template=instance,
|
|
# name='Education',
|
|
# order=2,
|
|
# is_predefined=True
|
|
# )
|
|
# FormField.objects.create(
|
|
# stage=education_stage,
|
|
# label='Degree',
|
|
# field_type='text',
|
|
# required=True,
|
|
# order=0,
|
|
# is_predefined=True
|
|
# )
|
|
# FormField.objects.create(
|
|
# stage=education_stage,
|
|
# label='Institution',
|
|
# field_type='text',
|
|
# required=True,
|
|
# order=1,
|
|
# is_predefined=True
|
|
# )
|
|
# FormField.objects.create(
|
|
# stage=education_stage,
|
|
# label='Location',
|
|
# field_type='text',
|
|
# required=False,
|
|
# order=2,
|
|
# is_predefined=True
|
|
# )
|
|
# FormField.objects.create(
|
|
# stage=education_stage,
|
|
# label='Graduation Date',
|
|
# field_type='date',
|
|
# required=False,
|
|
# order=3,
|
|
# is_predefined=True
|
|
# )
|
|
|
|
# # Stage 4: Experience
|
|
# experience_stage = FormStage.objects.create(
|
|
# template=instance,
|
|
# name='Experience',
|
|
# order=3,
|
|
# is_predefined=True
|
|
# )
|
|
# FormField.objects.create(
|
|
# stage=experience_stage,
|
|
# label='Position Title',
|
|
# field_type='text',
|
|
# required=True,
|
|
# order=0,
|
|
# is_predefined=True
|
|
# )
|
|
# FormField.objects.create(
|
|
# stage=experience_stage,
|
|
# label='Company Name',
|
|
# field_type='text',
|
|
# required=True,
|
|
# order=1,
|
|
# is_predefined=True
|
|
# )
|
|
# FormField.objects.create(
|
|
# stage=experience_stage,
|
|
# label='Location',
|
|
# field_type='text',
|
|
# required=False,
|
|
# order=2,
|
|
# is_predefined=True
|
|
# )
|
|
# FormField.objects.create(
|
|
# stage=experience_stage,
|
|
# label='Start Date',
|
|
# field_type='date',
|
|
# required=True,
|
|
# order=3,
|
|
# is_predefined=True
|
|
# )
|
|
# FormField.objects.create(
|
|
# stage=experience_stage,
|
|
# label='End Date',
|
|
# field_type='date',
|
|
# required=True,
|
|
# order=4,
|
|
# is_predefined=True
|
|
# )
|
|
# FormField.objects.create(
|
|
# stage=experience_stage,
|
|
# label='Responsibilities & Achievements',
|
|
# field_type='textarea',
|
|
# required=False,
|
|
# order=5,
|
|
# is_predefined=True
|
|
# )
|
|
|
|
# # Stage 5: Skills
|
|
# skills_stage = FormStage.objects.create(
|
|
# template=instance,
|
|
# name='Skills',
|
|
# order=4,
|
|
# is_predefined=True
|
|
# )
|
|
# FormField.objects.create(
|
|
# stage=skills_stage,
|
|
# label='Technical Skills',
|
|
# field_type='checkbox',
|
|
# required=False,
|
|
# order=0,
|
|
# is_predefined=True,
|
|
# options=['Programming Languages', 'Frameworks', 'Tools & Technologies']
|
|
# )
|
|
|
|
# # Stage 6: Summary
|
|
# summary_stage = FormStage.objects.create(
|
|
# template=instance,
|
|
# name='Summary',
|
|
# order=5,
|
|
# is_predefined=True
|
|
# )
|
|
# FormField.objects.create(
|
|
# stage=summary_stage,
|
|
# label='Professional Summary',
|
|
# field_type='textarea',
|
|
# required=False,
|
|
# order=0,
|
|
# is_predefined=True
|
|
# )
|
|
|
|
# # Stage 7: Certifications
|
|
# certifications_stage = FormStage.objects.create(
|
|
# template=instance,
|
|
# name='Certifications',
|
|
# order=6,
|
|
# is_predefined=True
|
|
# )
|
|
# FormField.objects.create(
|
|
# stage=certifications_stage,
|
|
# label='Certification Name',
|
|
# field_type='text',
|
|
# required=False,
|
|
# order=0,
|
|
# is_predefined=True
|
|
# )
|
|
# FormField.objects.create(
|
|
# stage=certifications_stage,
|
|
# label='Issuing Organization',
|
|
# field_type='text',
|
|
# required=False,
|
|
# order=1,
|
|
# is_predefined=True
|
|
# )
|
|
# FormField.objects.create(
|
|
# stage=certifications_stage,
|
|
# label='Issue Date',
|
|
# field_type='date',
|
|
# required=False,
|
|
# order=2,
|
|
# is_predefined=True
|
|
# )
|
|
# FormField.objects.create(
|
|
# stage=certifications_stage,
|
|
# label='Expiration Date',
|
|
# field_type='date',
|
|
# required=False,
|
|
# order=3,
|
|
# is_predefined=True
|
|
# )
|
|
|
|
# # Stage 8: Awards and Recognitions
|
|
# awards_stage = FormStage.objects.create(
|
|
# template=instance,
|
|
# name='Awards and Recognitions',
|
|
# order=7,
|
|
# is_predefined=True
|
|
# )
|
|
# FormField.objects.create(
|
|
# stage=awards_stage,
|
|
# label='Award Name',
|
|
# field_type='text',
|
|
# required=False,
|
|
# order=0,
|
|
# is_predefined=True
|
|
# )
|
|
# FormField.objects.create(
|
|
# stage=awards_stage,
|
|
# label='Issuing Organization',
|
|
# field_type='text',
|
|
# required=False,
|
|
# order=1,
|
|
# is_predefined=True
|
|
# )
|
|
# FormField.objects.create(
|
|
# stage=awards_stage,
|
|
# label='Date Received',
|
|
# field_type='date',
|
|
# required=False,
|
|
# order=2,
|
|
# is_predefined=True
|
|
# )
|
|
# FormField.objects.create(
|
|
# stage=awards_stage,
|
|
# label='Description',
|
|
# field_type='textarea',
|
|
# required=False,
|
|
# order=3,
|
|
# is_predefined=True
|
|
# ) |