From 3086b38a2336a120e259aa9f7eb390905ab1e12d Mon Sep 17 00:00:00 2001 From: ismail Date: Tue, 21 Oct 2025 19:24:42 +0300 Subject: [PATCH] lot of updates --- .../__pycache__/settings.cpython-313.pyc | Bin 8441 -> 8441 bytes .../__pycache__/urls.cpython-313.pyc | Bin 2268 -> 2280 bytes NorahUniversity/urls.py | 12 +++--- recruitment/__pycache__/admin.cpython-313.pyc | Bin 12148 -> 12148 bytes recruitment/__pycache__/forms.cpython-313.pyc | Bin 27062 -> 27062 bytes .../linkedin_service.cpython-313.pyc | Bin 16545 -> 16545 bytes .../__pycache__/models.cpython-313.pyc | Bin 60891 -> 60891 bytes .../__pycache__/signals.cpython-313.pyc | Bin 3126 -> 3272 bytes recruitment/__pycache__/urls.cpython-313.pyc | Bin 11908 -> 11429 bytes .../__pycache__/validators.cpython-313.pyc | Bin 1131 -> 1131 bytes recruitment/__pycache__/views.cpython-313.pyc | Bin 93422 -> 93319 bytes .../views_frontend.cpython-313.pyc | Bin 23362 -> 23362 bytes recruitment/signals.py | 16 ++++---- recruitment/urls.py | 10 ++--- recruitment/views.py | 35 +++++++++++------- templates/base.html | 34 +++++++++++++++-- templates/forms/form_builder.html | 22 +++++------ templates/forms/form_wizard.html | 17 +++++---- 18 files changed, 93 insertions(+), 53 deletions(-) diff --git a/NorahUniversity/__pycache__/settings.cpython-313.pyc b/NorahUniversity/__pycache__/settings.cpython-313.pyc index b45cc7587cf0fda178d031e7c62b3364c3b40a2e..5a18c3c5afafe57b17c9066ed528dbcf27bec153 100644 GIT binary patch delta 19 ZcmezA_|uW=GcPX}0}z~ diff --git a/NorahUniversity/__pycache__/urls.cpython-313.pyc b/NorahUniversity/__pycache__/urls.cpython-313.pyc index fcd6221195b56d806972ee0d66f20c974828467c..e4ba51d7308eedaf340b07dfd76567414085227d 100644 GIT binary patch delta 266 zcmca3_(G8PGcPX}0}y;&{yoEPBd<1#gQ!h$PHDPTNosCEPGU)FJcwtfe~UXUzbH4p zJhLjXC`FU;7E4}YZfcbb7PXU$SW=^v6ALo+VMY||V^Ib)QYa@sF(n>sE=*~a7D0`h zbyyEFDJm>by{=?&QOROQ?L`*fn=Bj`IMr8(Ue~m`sA+XT_9Bb_WIhgEWxWlo*9|-_ j8hBjrPrk^K0#;_aq4c_W;6?Mm3lVu2S@I{xanu0--}GfY delta 217 zcmaDMct?=;GcPX}0}$M2`kG<2kyo2VP{<}Tuf(b(HMbxqu_QG/', 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 ad3e681e0dc8ce8e211b8f28a677cae6a31af6d9..37bb7955f7a30c2c429c237ceb3b2965b119e88b 100644 GIT binary patch delta 19 Zcmewo_a%<&GcPX}0}z~Qf delta 21 bcmdmXnQ_}?My}7iyj%=GV3xg+YfUBqQUV62 diff --git a/recruitment/__pycache__/linkedin_service.cpython-313.pyc b/recruitment/__pycache__/linkedin_service.cpython-313.pyc index e84214f042256427d0ad3b5168681e380477741d..a50a2965cbf2f3b7895796699ddf17788dccf4e3 100644 GIT binary patch delta 21 bcmZ43$hfePk?S)rFBbz4oSD9nYq|pfM*;?2 delta 21 bcmZ43$hfePk?S)rFBbz4^!9Azn(hDqMNtM5 diff --git a/recruitment/__pycache__/models.cpython-313.pyc b/recruitment/__pycache__/models.cpython-313.pyc index fbd3902ebaab9bf7390f8c7a8ee26384ca504722..feba0fa4ed6f276be2e2838810a0ff7cd0699fc5 100644 GIT binary patch delta 21 bcmcb8oB8%_X0Fe?yj%=GaAx{Ou8VI0UO@d7*TuI0Tn-2k diff --git a/recruitment/__pycache__/signals.cpython-313.pyc b/recruitment/__pycache__/signals.cpython-313.pyc index a1a22633916589c3e52b2577adc8474a6a7f6ace..421b1994c0fe66655987769a9027fab16852f8a9 100644 GIT binary patch delta 214 zcmdlcaYB;!GcPX}0}w>7{hndGk(ZBEWC{}l!&HV)CJm4<5V$iY>TlL({mID67AzPn zGC7gWR$Vk$ESNc19Ec@?IfErFITRRzr9jXWs2Kzl7}BNEr6&8bOLI!uGRrfhF=|S0 zE@YQsl$G*JEXmBzOUzO5bWzY(@GMNsO;qqJ%}q)zddWJuljA0r1yH{{5EoC_oWm*4 zI600>l-=ltwBij(xycG#YLgdmS#Y@sx>zzFvE*`PpZthx4Wq^6er_p7r^&0hdjNZ_ BGIIa` delta 162 zcmX>hxlMxiGcPX}0}%L5{GQ>wk(ZBEB!G#5VJbr?lLkl_2;3PHc{l5`{$x}Y31$u! z1!A#a&R}s%4h4o_2@o^|Y5)NRhIEN^iOCb$r8y;RndKSM7&Rp~Z)KNZocxL7DwjD> zg**@!CvU#UDbL8LF!>{w$YdjK3od7U7jfnz;#@AOlS{bQFq%(R0|0db BB2@qY diff --git a/recruitment/__pycache__/urls.cpython-313.pyc b/recruitment/__pycache__/urls.cpython-313.pyc index c867c4d3311e99b23d0af8899b08bd651fca3218..0f0a705656f9c041c2c75a15dd4724ef054bf9cc 100644 GIT binary patch delta 115 zcmZpPT^h;znU|M~0SHzu|DN%4BCjMP&qj4_UbdpZ^hKJBH=p43i_@% delta 594 zcmZ1)*%Hh9nU|M~0SKz6eb0D5kyny&&PH`^-uf6uC5GTdF)TrgK$55+cyTa?C365H zSj`fknkA_6AYSlNBsI%`YL;P9vm8my3ZR-5a5ds^R`5!QqN33BRhp|eTk!hw)bk}4 zWa^is<`(26mZTQz-xAKrEG~&p%P-1}hl^GTqbe#+EKAkDB?O{SRaPmWDzwSWE3twZ z6Q7x42h^35pO}KsKm5}=(T5C%d&Nc-j%$rx6~u+0zU_A?0C7KMZO5g;NGL_|$iQi|rP0WukZxVUd~yV5-N`YI*{R?Z8Y zk~2)NOPgGjHo0IOaFHeOLp75V6F<|(8i=gi0@mva78eyPF4zZOWC{6D3z4mZ$ZD?$ zy{_weQP=f?Pr^l(#1HilSqEmY$wnJoubcQ?H1WF-nthQa=Yu0N*km_|>}DOUQYMxv Gpo0J&jjOBx diff --git a/recruitment/__pycache__/validators.cpython-313.pyc b/recruitment/__pycache__/validators.cpython-313.pyc index 535cebdd543abe5ae5920387017e897a7fb87a4b..b58e1326108ed297fd46c2bd3a4f29e64c3e5723 100644 GIT binary patch delta 19 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 lLADV@*vJ~u>VwVk(WA%%Kt3oK6g{HQk/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 %}