import logging from django.db import transaction 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 create_form_for_job(sender, instance, created, **kwargs): # if created: # FormTemplate.objects.create(job=instance, is_active=True, name=instance.title) @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='Resume Upload', field_type='file', required=True, order=5, 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 )