From ba911a60d6935360da0cefbad8adaa3a30f42ed4 Mon Sep 17 00:00:00 2001 From: ismail Date: Wed, 22 Oct 2025 16:02:54 +0300 Subject: [PATCH] small update --- .../__pycache__/urls.cpython-313.pyc | Bin 2280 -> 2348 bytes NorahUniversity/urls.py | 8 +++--- .../__pycache__/signals.cpython-313.pyc | Bin 3272 -> 4317 bytes recruitment/signals.py | 27 ++++++++++++++++++ recruitment/tasks.py | 7 +++++ templates/base.html | 2 +- templates/forms/form_wizard.html | 2 +- templates/recruitment/source_form.html | 2 +- 8 files changed, 41 insertions(+), 7 deletions(-) diff --git a/NorahUniversity/__pycache__/urls.cpython-313.pyc b/NorahUniversity/__pycache__/urls.cpython-313.pyc index e4ba51d7308eedaf340b07dfd76567414085227d..2d1e76d9a0cf17944a5721146fcd84791559d1d6 100644 GIT binary patch delta 1052 zcmZvbPiPZC6vk)vU$#xQO=?ryG>J)STH2;bQBrNSR-^|>(8I0>g+;09HbzY%Z#VWL zMDQv|8N7=p1;K*{FCL0FZ{}1C1W!V}RlMlUHyce$yTda3_ItnY?d+SKz0lhs?U$zY z6C9u3{l0r^TN^ujQ6%IAF^EBnq(Fftcq|l!f(W7;i$$p*gY3pqQ7QOfdu?_BA+B%2FJ5Ag2ql&dJ7&N8~kilS!1u1 zQ31m2gYtYPhcy3_ZHDu{NGbhJVjYse>l;aT$V`XKbx5v5=2_MEESY}U*qvH#O)c+S vYf1W7N&V87d2Q`xS6bPXooY+E!6NF@fDjaZ5`hX&{QCj+M!g`-;T!$}-0iqQ delta 981 zcmZ{i&1(}u7{+IIw%g6eCTVM|X*YGVHijf^8q`P|rFc#hA$v+$gc{Q{qAAR7^`b-+ zPxfFKynEAw7ZJpxe}R}&HL!RR^dLk;Jb3Y)jV6JtbC`YSd4BIRv%|cY{W7EcP!vCc z@$=cQ-OY{?JDn#8JwXOCa2b^_#Tu`LvQQ$Flte1JYf_#nNmO!cvD~ROC~M$I zn@d418A<^U(1I}dx_HR-!k%8l^=3T1SvXf_@)*XPab$zI$x$Fy+8)T!AuZrG|oKAj4@H7#-Pf|YFs@rz6)v(xW zqWjXgH+8F7ziqJ(kzve)dqRieb>1 zBgNQn=^(WV3;rOj$1wK^#`rVRKB1(8G7i!lwC13^gW~Mv^g%*7%Q6rNe{+Pm4cy&IeS+NqtSNu0z<)DUO_Y7Z?3oF61_5C{iZ8++nx>a5M| zhK5SWh+Bm~4J)-m0+F6*D+Gr~h!b2naEJw!t))Q~fhJaTshvO<{AFkOQU$2qc`hYjAqG^S`sUkGA{GheRbgIA z`LRD0z=2c{2U9YZQwmmMU!7yak)F7aU9S^g3LnQqrdrSfNl{y#z6l9#`H=4Q0$ zXG;aZG()Q5je!CQBi&;|Zzz7I#@uxPwEm-Xh*x;E=y&5JA4Xk#{B{qCN>gz+M@^v_ zr_UXGy6E&53DF*Bu2ybDFv{UA-P%NkHDPJyHFILEgg3LfV#!1f%sBA%gvVjmwv3#^ zYPeuJez#e&)>~!tKk%bZ*rVZ@yx?x(HkwcD;>}r3(NZpQtwsq5@ zp}VP>R3&DA%PflH1kqZUL1=e+E>`}KK=gbqGG2|0*CNx^$aGzqtcSw4UcHmq$=q7p zRrZyEM?L+YCO=9xd?5OC1F+Gyzjz?ZH_yK}+z^1!(~y7^u8C3d?2gp>FO%oz(BQ9f zS3P{89**3Z-&nW`pJ`*Qq8d9*IaYw}Q49(pK`kdWFJ;h#JRoO>)q zYtmp<8hj`XH8`@cx9pjMqcM_evjn7!^u+KmHMG5Of*6w)B}N7wvp-=Y+yye7vcF-k zz~mmo^?6{(j`Qgb+HCk4Vr~cvnrX$Bv`vHs`zC+8=OU$MshOkZIckpF?O9=Rh~7My zHaza5hWtL+DZSuLau`T`+ezIma6>=a9>%o delta 625 zcmYk3&2G~`5XW~Duj8+E(l#lL804m=9Jp_T-6R27uZu;!{4yvlQ7k0{#scLU3ADg&Y4>w2 z-62co0)g=hg^v{Dk}`3jSR=)}q?8ltS;D4O@rWLps%&M-J3J=hj2Z?)OZ9b3oVkn41>%^HuX&&Jr zZXnLn#VvmOx{m%hVgjK_cnmn&R}fQ(s`$XKQb&B^(`;D=8olrQ3#ApYU38lZ?XC16 z>TYZTersm8x1;@}6TV*PM(IupOq><#?{Qn1y4PvPyXj~Mj0WQl0JjJhCg@4rUF{@E z44D>&`|=TC2o02RVStYZoPSE7hPES-X%A)FH@oo)JeDs0`t+T|AWtd%P3%5#`$TM& YykdbG!#v5&4|3A_Qx=~~_Y`dNA783^+5i9m diff --git a/recruitment/signals.py b/recruitment/signals.py index ebc9f9b..ebba334 100644 --- a/recruitment/signals.py +++ b/recruitment/signals.py @@ -1,5 +1,8 @@ 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 @@ -16,7 +19,31 @@ def format_job(sender, instance, created, **kwargs): 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.is_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): diff --git a/recruitment/tasks.py b/recruitment/tasks.py index 3c3adeb..bf024e9 100644 --- a/recruitment/tasks.py +++ b/recruitment/tasks.py @@ -552,3 +552,10 @@ def linkedin_post_task(job_slug, access_token): job.linkedin_post_status = f"CRITICAL_ERROR: {str(e)}" job.save() return False + + +def form_close(job_id): + job = get_object_or_404(JobPosting, pk=job_id) + job.is_active = False + job.template_form.is_active = False + job.save() \ No newline at end of file diff --git a/templates/base.html b/templates/base.html index 0250f32..333d46d 100644 --- a/templates/base.html +++ b/templates/base.html @@ -344,7 +344,7 @@ }); } - form_loader(); + //form_loader(); try{ document.addEventListener('htmx:afterSwap', form_loader); diff --git a/templates/forms/form_wizard.html b/templates/forms/form_wizard.html index bacb6d1..1447255 100644 --- a/templates/forms/form_wizard.html +++ b/templates/forms/form_wizard.html @@ -824,7 +824,7 @@ }); try { - const response = await fetch(`/${state.templateId}/submit/`, { + const response = await fetch(`/form/${state.templateId}/submit/`, { method: 'POST', body: formData // IMPORTANT: Do NOT set Content-Type header when using FormData diff --git a/templates/recruitment/source_form.html b/templates/recruitment/source_form.html index bf81f61..05f789a 100644 --- a/templates/recruitment/source_form.html +++ b/templates/recruitment/source_form.html @@ -297,7 +297,7 @@ window.generateRandomKey = generateRandomKey; {% endblock %} -{% block extra_js %} +{% block customJS %}