diff --git a/NorahUniversity/__pycache__/settings.cpython-313.pyc b/NorahUniversity/__pycache__/settings.cpython-313.pyc index b45cc75..5a18c3c 100644 Binary files a/NorahUniversity/__pycache__/settings.cpython-313.pyc and b/NorahUniversity/__pycache__/settings.cpython-313.pyc differ diff --git a/NorahUniversity/__pycache__/urls.cpython-313.pyc b/NorahUniversity/__pycache__/urls.cpython-313.pyc index fcd6221..e4ba51d 100644 Binary files a/NorahUniversity/__pycache__/urls.cpython-313.pyc and b/NorahUniversity/__pycache__/urls.cpython-313.pyc differ diff --git a/NorahUniversity/urls.py b/NorahUniversity/urls.py index e1bce77..d4a3203 100644 --- a/NorahUniversity/urls.py +++ b/NorahUniversity/urls.py @@ -16,25 +16,25 @@ urlpatterns = [ path('admin/', admin.site.urls), path('api/', include(router.urls)), path('accounts/', include('allauth.urls')), - + path('i18n/', include('django.conf.urls.i18n')), # path('summernote/', include('django_summernote.urls')), # path('', include('recruitment.urls')), path("ckeditor5/", include('django_ckeditor_5.urls')), - path('/', views.form_wizard_view, name='form_wizard'), - path('/submit/', views.submit_form, name='submit_form'), + path('/', views.form_wizard_view, name='form_wizard'), + path('/submit/', views.submit_form, name='submit_form'), path('api/templates/', views.list_form_templates, name='list_form_templates'), path('api/templates/save/', views.save_form_template, name='save_form_template'), - path('api/templates//', views.load_form_template, name='load_form_template'), - path('api/templates//delete/', views.delete_form_template, name='delete_form_template'), + path('api/templates//', views.load_form_template, name='load_form_template'), + path('api/templates//delete/', views.delete_form_template, name='delete_form_template'), path('api/webhook/',views.zoom_webhook_view,name='zoom_webhook_view') ] urlpatterns += i18n_patterns( path('', include('recruitment.urls')), - + ) # 2. URLs that DO have a language prefix (user-facing views) # This includes the root path (''), which is handled by 'recruitment.urls' diff --git a/recruitment/__pycache__/admin.cpython-313.pyc b/recruitment/__pycache__/admin.cpython-313.pyc index ad3e681..37bb795 100644 Binary files a/recruitment/__pycache__/admin.cpython-313.pyc and b/recruitment/__pycache__/admin.cpython-313.pyc differ diff --git a/recruitment/__pycache__/forms.cpython-313.pyc b/recruitment/__pycache__/forms.cpython-313.pyc index 56f5f32..4d4c47a 100644 Binary files a/recruitment/__pycache__/forms.cpython-313.pyc and b/recruitment/__pycache__/forms.cpython-313.pyc differ diff --git a/recruitment/__pycache__/linkedin_service.cpython-313.pyc b/recruitment/__pycache__/linkedin_service.cpython-313.pyc index e84214f..a50a296 100644 Binary files a/recruitment/__pycache__/linkedin_service.cpython-313.pyc and b/recruitment/__pycache__/linkedin_service.cpython-313.pyc differ diff --git a/recruitment/__pycache__/models.cpython-313.pyc b/recruitment/__pycache__/models.cpython-313.pyc index fbd3902..feba0fa 100644 Binary files a/recruitment/__pycache__/models.cpython-313.pyc and b/recruitment/__pycache__/models.cpython-313.pyc differ diff --git a/recruitment/__pycache__/signals.cpython-313.pyc b/recruitment/__pycache__/signals.cpython-313.pyc index a1a2263..421b199 100644 Binary files a/recruitment/__pycache__/signals.cpython-313.pyc and b/recruitment/__pycache__/signals.cpython-313.pyc differ diff --git a/recruitment/__pycache__/urls.cpython-313.pyc b/recruitment/__pycache__/urls.cpython-313.pyc index c867c4d..0f0a705 100644 Binary files a/recruitment/__pycache__/urls.cpython-313.pyc and b/recruitment/__pycache__/urls.cpython-313.pyc differ diff --git a/recruitment/__pycache__/validators.cpython-313.pyc b/recruitment/__pycache__/validators.cpython-313.pyc index 535cebd..b58e132 100644 Binary files a/recruitment/__pycache__/validators.cpython-313.pyc and b/recruitment/__pycache__/validators.cpython-313.pyc differ diff --git a/recruitment/__pycache__/views.cpython-313.pyc b/recruitment/__pycache__/views.cpython-313.pyc index 62edf4b..69a5aed 100644 Binary files a/recruitment/__pycache__/views.cpython-313.pyc and b/recruitment/__pycache__/views.cpython-313.pyc differ diff --git a/recruitment/__pycache__/views_frontend.cpython-313.pyc b/recruitment/__pycache__/views_frontend.cpython-313.pyc index f0fcd8b..c1ef67b 100644 Binary files a/recruitment/__pycache__/views_frontend.cpython-313.pyc and b/recruitment/__pycache__/views_frontend.cpython-313.pyc differ diff --git a/recruitment/signals.py b/recruitment/signals.py index e27c531..ebc9f9b 100644 --- a/recruitment/signals.py +++ b/recruitment/signals.py @@ -82,14 +82,14 @@ def create_default_stages(sender, instance, created, **kwargs): 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='National ID / Iqama Number', + field_type='text', + required=False, + order=5, + is_predefined=True + ) FormField.objects.create( stage=contact_stage, label='Resume Upload', diff --git a/recruitment/urls.py b/recruitment/urls.py index 3940ee8..4d391ff 100644 --- a/recruitment/urls.py +++ b/recruitment/urls.py @@ -96,11 +96,11 @@ urlpatterns = [ # path('api/forms/save/', views.save_form_builder, name='save_form_builder'), # path('api/forms//load/', views.load_form, name='load_form'), # path('api/forms//update/', views.update_form_builder, name='update_form_builder'), - path('api/templates/', views.list_form_templates, name='list_form_templates'), - path('api/templates/save/', views.save_form_template, name='save_form_template'), - path('api/templates//', views.load_form_template, name='load_form_template'), - path('api/templates//delete/', views.delete_form_template, name='delete_form_template'), - + # path('api/templates/', views.list_form_templates, name='list_form_templates'), + # path('api/templates/save/', views.save_form_template, name='save_form_template'), + # path('api/templates//', views.load_form_template, name='load_form_template'), + # path('api/templates//delete/', views.delete_form_template, name='delete_form_template'), + path('jobs//calendar/', views.interview_calendar_view, name='interview_calendar'), path('jobs//calendar/interview//', views.interview_detail_view, name='interview_detail'), diff --git a/recruitment/views.py b/recruitment/views.py index 4d1d2fb..73fc246 100644 --- a/recruitment/views.py +++ b/recruitment/views.py @@ -637,10 +637,10 @@ def form_builder(request, template_slug=None): context = {} if template_slug: template = get_object_or_404( - FormTemplate, slug=template_slug, created_by=request.user + FormTemplate, slug=template_slug ) context['template']=template - context["template_id"] = template.id + context["template_slug"] = template.slug context["template_name"] = template.name return render(request, "forms/form_builder.html", context) @@ -653,12 +653,12 @@ def save_form_template(request): data = json.loads(request.body) template_name = data.get("name", "Untitled Form") stages_data = data.get("stages", []) - template_id = data.get("template_id") + template_slug = data.get("template_slug") - if template_id: + if template_slug: # Update existing template template = get_object_or_404( - FormTemplate, id=template_id, created_by=request.user + FormTemplate, slug=template_slug ) template.name = template_name template.save() @@ -667,7 +667,7 @@ def save_form_template(request): else: # Create new template template = FormTemplate.objects.create( - name=template_name, created_by=request.user + name=template_name ) # Create stages and fields @@ -703,7 +703,7 @@ def save_form_template(request): return JsonResponse( { "success": True, - "template_id": template.id, + "template_slug": template.slug, "message": "Form template saved successfully!", } ) @@ -712,9 +712,9 @@ def save_form_template(request): @require_http_methods(["GET"]) -def load_form_template(request, template_id): +def load_form_template(request, template_slug): """Load an existing form template""" - template = get_object_or_404(FormTemplate, id=template_id, created_by=request.user) + template = get_object_or_404(FormTemplate, slug=template_slug) stages = [] for stage in template.stages.all(): @@ -747,6 +747,7 @@ def load_form_template(request, template_id): "success": True, "template": { "id": template.id, + "template_slug": template.slug, "name": template.name, "description": template.description, "is_active": template.is_active, @@ -844,6 +845,7 @@ def form_wizard_view(request, template_slug): ) +@csrf_exempt @require_POST def submit_form(request, template_slug): """Handle form submission""" @@ -862,6 +864,7 @@ def submit_form(request, template_slug): {"success": False, "message": "Application limit reached for this job."} ) submission = FormSubmission.objects.create(template=template) + # Process field responses for field_id, value in request.POST.items(): if field_id.startswith("field_"): @@ -906,7 +909,7 @@ def submit_form(request, template_slug): ) submission.applicant_email = email.display_value submission.save() - time=timezone.now() + # time=timezone.now() Candidate.objects.create( first_name=first_name.display_value, last_name=last_name.display_value, @@ -914,10 +917,16 @@ def submit_form(request, template_slug): phone=phone.display_value, address=address.display_value, resume=resume.get_file if resume.is_file else None, - job=submission.template.job, - + job=job ) - return redirect('application_success',slug=job.slug) + return JsonResponse( + { + "success": True, + "message": "Form submitted successfully!", + "redirect_url": reverse('application_success',kwargs={'slug':job.slug}), + } + ) + # return redirect('application_success',slug=job.slug) except Exception as e: logger.error(f"Candidate creation failed,{e}") diff --git a/templates/base.html b/templates/base.html index b4a6c35..0250f32 100644 --- a/templates/base.html +++ b/templates/base.html @@ -16,9 +16,9 @@ {% endif %} - + - + @@ -120,7 +120,7 @@ {% endif %}