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='recruitment.hooks.callback_ai_parsing' ) @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 # )