From a23c96cc171c9034e7f6b09bee231dd73bcef6ff Mon Sep 17 00:00:00 2001 From: ismail Date: Thu, 9 Oct 2025 16:57:53 +0300 Subject: [PATCH] update on the models and forms --- .../__pycache__/settings.cpython-313.pyc | Bin 5165 -> 5225 bytes .../__pycache__/urls.cpython-313.pyc | Bin 2012 -> 1535 bytes NorahUniversity/settings.py | 4 +- db.sqlite3 | Bin 761856 -> 643072 bytes recruitment/__pycache__/admin.cpython-313.pyc | Bin 11345 -> 11440 bytes recruitment/__pycache__/forms.cpython-313.pyc | Bin 21802 -> 22858 bytes .../__pycache__/models.cpython-313.pyc | Bin 42715 -> 44705 bytes .../__pycache__/signals.cpython-313.pyc | Bin 10981 -> 11075 bytes recruitment/__pycache__/urls.cpython-313.pyc | Bin 6478 -> 6478 bytes recruitment/__pycache__/utils.cpython-313.pyc | Bin 16536 -> 17282 bytes recruitment/__pycache__/views.cpython-313.pyc | Bin 36841 -> 36329 bytes .../views_frontend.cpython-313.pyc | Bin 19442 -> 19821 bytes recruitment/forms.py | 16 +- recruitment/linkedin.py | 15 +- recruitment/migrations/0001_initial.py | 15 +- .../migrations/0002_candidate_address.py | 19 - ...reason_jobposting_cancelled_at_and_more.py | 33 + ...003_candidate_is_resume_parsed_and_more.py | 23 + .../0003_scheduledinterview_slug.py | 19 - recruitment/migrations/0027_profile.py | 24 - .../__pycache__/0001_initial.cpython-311.pyc | Bin 2319 -> 0 bytes .../__pycache__/0001_initial.cpython-312.pyc | Bin 2291 -> 0 bytes .../__pycache__/0001_initial.cpython-313.pyc | Bin 28040 -> 28730 bytes .../0002_trainingmaterial.cpython-311.pyc | Bin 1817 -> 0 bytes .../0002_trainingmaterial.cpython-312.pyc | Bin 1796 -> 0 bytes .../0002_trainingmaterial.cpython-313.pyc | Bin 1791 -> 0 bytes ...at_job_updated_at_and_more.cpython-311.pyc | Bin 1107 -> 0 bytes ...at_job_updated_at_and_more.cpython-312.pyc | Bin 1022 -> 0 bytes ...at_job_updated_at_and_more.cpython-313.pyc | Bin 1041 -> 0 bytes ...e_status_candidate_applied.cpython-311.pyc | Bin 971 -> 0 bytes ...e_status_candidate_applied.cpython-312.pyc | Bin 887 -> 0 bytes ...e_status_candidate_applied.cpython-313.pyc | Bin 930 -> 0 bytes .../0005_zoommeeting.cpython-312.pyc | Bin 2422 -> 0 bytes .../0005_zoommeeting.cpython-313.pyc | Bin 2338 -> 0 bytes ...alter_job_options_and_more.cpython-312.pyc | Bin 13587 -> 0 bytes ...alter_job_options_and_more.cpython-313.pyc | Bin 12593 -> 0 bytes ...07_alter_jobposting_status.cpython-312.pyc | Bin 952 -> 0 bytes ...07_alter_jobposting_status.cpython-313.pyc | Bin 1003 -> 0 bytes ...at_alter_jobposting_status.cpython-312.pyc | Bin 1112 -> 0 bytes ...at_alter_jobposting_status.cpython-313.pyc | Bin 1147 -> 0 bytes ...g_jobposting_slug_and_more.cpython-312.pyc | Bin 2171 -> 0 bytes ...g_jobposting_slug_and_more.cpython-313.pyc | Bin 2136 -> 0 bytes ...0010_remove_candidate_name.cpython-312.pyc | Bin 668 -> 0 bytes ...0010_remove_candidate_name.cpython-313.pyc | Bin 727 -> 0 bytes ...0011_alter_candidate_stage.cpython-312.pyc | Bin 897 -> 0 bytes ...0011_alter_candidate_stage.cpython-313.pyc | Bin 948 -> 0 bytes ...ormsubmission_uploadedfile.cpython-312.pyc | Bin 3453 -> 0 bytes ...ormsubmission_uploadedfile.cpython-313.pyc | Bin 3314 -> 0 bytes ...idate_match_score_and_more.cpython-312.pyc | Bin 1250 -> 0 bytes ...idate_match_score_and_more.cpython-313.pyc | Bin 1253 -> 0 bytes ...rmsubmission_form_and_more.cpython-312.pyc | Bin 8277 -> 0 bytes ...rmsubmission_form_and_more.cpython-313.pyc | Bin 7863 -> 0 bytes ...4_source_jobposting_source.cpython-312.pyc | Bin 1843 -> 0 bytes ...4_source_jobposting_source.cpython-313.pyc | Bin 1859 -> 0 bytes ...bmitted_by_agency_and_more.cpython-312.pyc | Bin 2770 -> 0 bytes ...bmitted_by_agency_and_more.cpython-313.pyc | Bin 2717 -> 0 bytes ...ingagency_address_and_more.cpython-312.pyc | Bin 2610 -> 0 bytes ...ingagency_address_and_more.cpython-313.pyc | Bin 2548 -> 0 bytes ...r_jobposting_hiring_agency.cpython-312.pyc | Bin 977 -> 0 bytes ...r_jobposting_hiring_agency.cpython-313.pyc | Bin 1028 -> 0 bytes ...r_jobposting_hiring_agency.cpython-312.pyc | Bin 972 -> 0 bytes ...r_jobposting_hiring_agency.cpython-313.pyc | Bin 1023 -> 0 bytes .../0019_merge_20251006_1224.cpython-312.pyc | Bin 606 -> 0 bytes .../0019_merge_20251006_1224.cpython-313.pyc | Bin 673 -> 0 bytes .../0020_delete_job.cpython-313.pyc | Bin 658 -> 0 bytes ...ource_description_and_more.cpython-313.pyc | Bin 4812 -> 0 bytes ...2_alter_source_trusted_ips.cpython-313.pyc | Bin 961 -> 0 bytes ...g_application_url_and_more.cpython-313.pyc | Bin 1265 -> 0 bytes ...ieldresponse_slug_and_more.cpython-313.pyc | Bin 4902 -> 0 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 179 -> 0 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 158 -> 0 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 167 -> 167 bytes recruitment/models.py | 53 +- recruitment/signals.py | 6 +- recruitment/utils.py | 17 +- recruitment/views.py | 849 +++--- recruitment/views_frontend.py | 16 +- .../forms/form_template_submissions_list.html | 389 ++- templates/forms/form_templates_list.html | 153 +- templates/forms/form_wizard.html | 2444 +++++++++-------- templates/includes/_list_view_switcher.html | 159 ++ templates/jobs/job_candidates_list.html | 273 +- templates/jobs/job_detail.html | 51 +- templates/jobs/job_list.html | 117 +- templates/meetings/list_meetings.html | 203 +- templates/recruitment/candidate_list.html | 144 +- templates/recruitment/training_list.html | 139 +- 87 files changed, 3045 insertions(+), 2136 deletions(-) delete mode 100644 recruitment/migrations/0002_candidate_address.py create mode 100644 recruitment/migrations/0002_jobposting_cancel_reason_jobposting_cancelled_at_and_more.py create mode 100644 recruitment/migrations/0003_candidate_is_resume_parsed_and_more.py delete mode 100644 recruitment/migrations/0003_scheduledinterview_slug.py delete mode 100644 recruitment/migrations/0027_profile.py delete mode 100644 recruitment/migrations/__pycache__/0001_initial.cpython-311.pyc delete mode 100644 recruitment/migrations/__pycache__/0001_initial.cpython-312.pyc delete mode 100644 recruitment/migrations/__pycache__/0002_trainingmaterial.cpython-311.pyc delete mode 100644 recruitment/migrations/__pycache__/0002_trainingmaterial.cpython-312.pyc delete mode 100644 recruitment/migrations/__pycache__/0002_trainingmaterial.cpython-313.pyc delete mode 100644 recruitment/migrations/__pycache__/0003_candidate_updated_at_job_updated_at_and_more.cpython-311.pyc delete mode 100644 recruitment/migrations/__pycache__/0003_candidate_updated_at_job_updated_at_and_more.cpython-312.pyc delete mode 100644 recruitment/migrations/__pycache__/0003_candidate_updated_at_job_updated_at_and_more.cpython-313.pyc delete mode 100644 recruitment/migrations/__pycache__/0004_remove_candidate_status_candidate_applied.cpython-311.pyc delete mode 100644 recruitment/migrations/__pycache__/0004_remove_candidate_status_candidate_applied.cpython-312.pyc delete mode 100644 recruitment/migrations/__pycache__/0004_remove_candidate_status_candidate_applied.cpython-313.pyc delete mode 100644 recruitment/migrations/__pycache__/0005_zoommeeting.cpython-312.pyc delete mode 100644 recruitment/migrations/__pycache__/0005_zoommeeting.cpython-313.pyc delete mode 100644 recruitment/migrations/__pycache__/0006_jobposting_alter_candidate_options_alter_job_options_and_more.cpython-312.pyc delete mode 100644 recruitment/migrations/__pycache__/0006_jobposting_alter_candidate_options_alter_job_options_and_more.cpython-313.pyc delete mode 100644 recruitment/migrations/__pycache__/0007_alter_jobposting_status.cpython-312.pyc delete mode 100644 recruitment/migrations/__pycache__/0007_alter_jobposting_status.cpython-313.pyc delete mode 100644 recruitment/migrations/__pycache__/0008_jobposting_published_at_alter_jobposting_status.cpython-312.pyc delete mode 100644 recruitment/migrations/__pycache__/0008_jobposting_published_at_alter_jobposting_status.cpython-313.pyc delete mode 100644 recruitment/migrations/__pycache__/0009_candidate_slug_job_slug_jobposting_slug_and_more.cpython-312.pyc delete mode 100644 recruitment/migrations/__pycache__/0009_candidate_slug_job_slug_jobposting_slug_and_more.cpython-313.pyc delete mode 100644 recruitment/migrations/__pycache__/0010_remove_candidate_name.cpython-312.pyc delete mode 100644 recruitment/migrations/__pycache__/0010_remove_candidate_name.cpython-313.pyc delete mode 100644 recruitment/migrations/__pycache__/0011_alter_candidate_stage.cpython-312.pyc delete mode 100644 recruitment/migrations/__pycache__/0011_alter_candidate_stage.cpython-313.pyc delete mode 100644 recruitment/migrations/__pycache__/0012_form_formsubmission_uploadedfile.cpython-312.pyc delete mode 100644 recruitment/migrations/__pycache__/0012_form_formsubmission_uploadedfile.cpython-313.pyc delete mode 100644 recruitment/migrations/__pycache__/0013_candidate_criteria_checklist_candidate_match_score_and_more.cpython-312.pyc delete mode 100644 recruitment/migrations/__pycache__/0013_candidate_criteria_checklist_candidate_match_score_and_more.cpython-313.pyc delete mode 100644 recruitment/migrations/__pycache__/0013_formfield_formstage_remove_formsubmission_form_and_more.cpython-312.pyc delete mode 100644 recruitment/migrations/__pycache__/0013_formfield_formstage_remove_formsubmission_form_and_more.cpython-313.pyc delete mode 100644 recruitment/migrations/__pycache__/0014_source_jobposting_source.cpython-312.pyc delete mode 100644 recruitment/migrations/__pycache__/0014_source_jobposting_source.cpython-313.pyc delete mode 100644 recruitment/migrations/__pycache__/0015_hiringagency_candidate_submitted_by_agency_and_more.cpython-312.pyc delete mode 100644 recruitment/migrations/__pycache__/0015_hiringagency_candidate_submitted_by_agency_and_more.cpython-313.pyc delete mode 100644 recruitment/migrations/__pycache__/0016_alter_source_options_hiringagency_address_and_more.cpython-312.pyc delete mode 100644 recruitment/migrations/__pycache__/0016_alter_source_options_hiringagency_address_and_more.cpython-313.pyc delete mode 100644 recruitment/migrations/__pycache__/0017_alter_jobposting_hiring_agency.cpython-312.pyc delete mode 100644 recruitment/migrations/__pycache__/0017_alter_jobposting_hiring_agency.cpython-313.pyc delete mode 100644 recruitment/migrations/__pycache__/0018_alter_jobposting_hiring_agency.cpython-312.pyc delete mode 100644 recruitment/migrations/__pycache__/0018_alter_jobposting_hiring_agency.cpython-313.pyc delete mode 100644 recruitment/migrations/__pycache__/0019_merge_20251006_1224.cpython-312.pyc delete mode 100644 recruitment/migrations/__pycache__/0019_merge_20251006_1224.cpython-313.pyc delete mode 100644 recruitment/migrations/__pycache__/0020_delete_job.cpython-313.pyc delete mode 100644 recruitment/migrations/__pycache__/0021_source_api_key_source_api_secret_source_description_and_more.cpython-313.pyc delete mode 100644 recruitment/migrations/__pycache__/0022_alter_source_trusted_ips.cpython-313.pyc delete mode 100644 recruitment/migrations/__pycache__/0023_alter_jobposting_application_url_and_more.cpython-313.pyc delete mode 100644 recruitment/migrations/__pycache__/0024_fieldresponse_created_at_fieldresponse_slug_and_more.cpython-313.pyc delete mode 100644 recruitment/migrations/__pycache__/__init__.cpython-311.pyc delete mode 100644 recruitment/migrations/__pycache__/__init__.cpython-312.pyc create mode 100644 templates/includes/_list_view_switcher.html diff --git a/NorahUniversity/__pycache__/settings.cpython-313.pyc b/NorahUniversity/__pycache__/settings.cpython-313.pyc index 988431b8898dd93c0f2df0cbafbc9a8a90dca444..b611091643af3dd5d92d1bf93673663119ebf9d8 100644 GIT binary patch delta 173 zcmZ3h@lu2LGcPX}0}zz0d7crnkynU?QDU1wn{Bz8*tv>;d`2KH zj+%T@(2reGh^c|^gV|&`A#rwYKBfk)4^oqDgnAieCZ7`e#V9fPsIb5I15wor3_>>~ TZ7wi~-H>p<$RJu&05kyrOj<{Q)ySPe|yqL#o~ zVEbiEH>5*GMN$Sm<2lrXRM)h|~EolamV&83cuM!{z{m#m;5c zAv|FcTmZJG7{5l(+FY@?64@1$rYr1)`G~Y5JoiCwTzC_sURj|Y@rc2;@VjS3>d|N_ zQ}IuH{;H*XSgzK~ zE${uuxAj`1^sZ6gEgjMQW{K-9vw3uIutV#O!<}+#D$Q&UwRl5WMA=`Tl~2f#@DWyJOAF zlER5xnnb<8p$a|q+<%atQOl7?Rw7l^Q*Vh-FFkc;?Uh}iQoFLe&%EF7Gw;lvBoZnR z&o@urGq~B;IG$S*gXD4`*&p+%F z(!M;FJ5QJNbmOOWxQI zILFjx4`9n=98%(N%%F(IASZC!#E+N;?}$(qp%|LBh-&rXw_6x73>n6G6^f_Hd7I^R zy+#bC)wYn`AbvW7SUR@#oVKKM(l!mIOJiN6XS#a(TV#n?EU(^iY{M(vOX~$))ZlWh z29XU-t4%1+Ls+N8g4RwIwcCARuT0N=sc$bkkPQrVC|pIe%}hEy*YB%IEIbEoWZ}=! z5~s83N((VIzbP844MqL8DhO|4DhtuPiv4oF5V8JGHPT)~tSW5VZBdfzDHMYJ2XkSUu55Q&LibNSG(CF4P6lEXG%+f z7dM^Fs(;8?%?8{Ms#&I;4Z4bC+>P|Dg(l3nm>xr*D8rnKwwS;PbMd-e^+!<(Zs9s| zTD&C3kqSY`BiL28$R=}D1KBmRhQy@qhP_n!u7cX8z8gb^K^&VieRmYKTFBu|uQ(U% zj#F$<$K)2axhIop#H>0}P^E}CHnDs?G}8L!r<7|KV4KGeJeNg0*by&E6ufyz&V z8}8}dD8&tNelc|?3S{$3!X&j{iFqnx?vAhceEAYZ+y>ZH=gxJl@Ar@iRCPRRH%BU7jD^WEL`8djHrn9f^&2h>+8)N_6Tn z@{YgO-f^R!TBPQ*@aJ?^#F95JdoBLnjsyaMcfn*p`4fV`2fu>ZV{q*lz+<2vgN0-8 z{%^6=_tSgfS0MZ(`8c^BIh;JYywJJ4@DeQgvc#ctG@a{A=U#%3--SUa_Vm(z?s@(o z|NQ2`&8~9gwGw@rI=Fb4`f2LNsqVyVSGg)hQwNPhyPKNtDw zW1(blFaCBE1V*22?>CQ9nNBM6B6@Va*b%?vS_iD{#b1GVPnqqcvM(+j-MHHkzvOxc LtUr!Z`T6`C6%r)z diff --git a/NorahUniversity/settings.py b/NorahUniversity/settings.py index 249db2c..baaf0bb 100644 --- a/NorahUniversity/settings.py +++ b/NorahUniversity/settings.py @@ -67,7 +67,7 @@ MIDDLEWARE = [ 'corsheaders.middleware.CorsMiddleware', 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.locale.LocaleMiddleware', + 'django.middleware.locale.LocaleMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', @@ -196,7 +196,6 @@ SOCIALACCOUNT_PROVIDERS = { } } - ZOOM_ACCOUNT_ID = 'HoGikHXsQB2GNDC5Rvyw9A' ZOOM_CLIENT_ID = 'brC39920R8C8azfudUaQgA' ZOOM_CLIENT_SECRET = 'rvfhjlbID4ychXPOvZ2lYsoAC0B0Ny2L' @@ -215,7 +214,6 @@ CELERY_TASK_SERIALIZER = 'json' CELERY_RESULT_SERIALIZER = 'json' CELERY_TIMEZONE = 'UTC' - LINKEDIN_CLIENT_ID = '867jwsiyem1504' LINKEDIN_CLIENT_SECRET = 'WPL_AP1.QNH5lYnfRSQpp0Qp.GO8Srw==' LINKEDIN_REDIRECT_URI = 'http://127.0.0.1:8000/jobs/linkedin/callback/' \ No newline at end of file diff --git a/db.sqlite3 b/db.sqlite3 index feeaaa27f46162ece01545369ffeb01f7e9a9579..1e9728d508c14b0642ba406495a0ef0d63cc9795 100644 GIT binary patch delta 28553 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 z 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 O8ulQX*vuBtwf`S-Dno4m literal 761856 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 diff --git a/recruitment/__pycache__/admin.cpython-313.pyc b/recruitment/__pycache__/admin.cpython-313.pyc index 6bb62fc07d1d0df2e6686846b4c1f919eff6e74a..a4f7fc816d70a93d57aa4c730802ee26c8e53b21 100644 GIT binary patch delta 2789 zcmai0U2Kz8817lScI(eN_S3ap*R|WawybQ!4v_=|f>DqKajOHAF-rSwE0ndKuLZUk z7cSK31#EeNXu{7>A^{UM0(#*TNeIXd$p|8Rdf^Rf^g@k^8a2f8zF%1fYhy2-p7-~> z=lwb7o7w!~7R&Dzi%}zfZ@&7&@Mn`22fIG$musG`<8>a5UDKrLH8?fBWm{QKCwQ2% zk~@f5E||vq%o6T|G_!%8IoM-DtC=+r{roKLCi?wZx{>IT64XzZ_(5jX&_@(ndr5kB zmTn^Y-YnfrbdMITztF1I?-C`f9X=6OH=gLhU(ZtbSL>@)O}qgKH$o$V2f>2iMQB23MnG4JAu*Cnj7TzXK^D5;}CXpK9VW=waFd?6lK^JtFJ6IIJmw zgr6$BEDUC=V|=M#1od;3QDZBqAq)smbWcPx(O?PhN6t3n7$il}pNX8s(&ajVNiCn|UX3EfE0Qk6S_bnfk{wQM{W@?Mng6QES=P4Qjn zWHcrXWJc3cuG~Tr)bcE9?Lo+>4E)Q-_P~kqy5xHdHEDyg?o^D1BB)g?kf>S7y5LOB zu{QLj7-L+b{OlOb`&CTq@}m?i<$dsC?Itz~*J{6G`{1lCP;@>Hz|S_EkJWXc2jPFr z4IkL-zBrE#X4?5GjH$p>9mGhS@T;vBLiVLp@UeP0;IP5CJ*)a@L_gkGG9^p#;*KUD z?7;0`cQob3vvOWfV%e6dWqTImIe^fEfMM_nghC_BQNY3O{9Elvv8=xvn$vJ{MvS9k zh^EuYgcMhMQ^%*!>?A@Mg06P^tbwS8PEKZra%qQ@%UPFe&UaA#6oRS^Q?6#yiCITe zaNYGOOTilr^?J2W;k|~#>?Evqw-l|+d3f24sk!N%WS_ubWAPeZfYXgzgeLPWDt^a_ zBzDb7;&}{?l6V1Eh4Ob41xMkC=bDcb^7p^A#s;r$-U3uHfn_LK1#yuDxH5 zJo`(OU4#0T6K!Phf4g2r{mXE-Wm4VsGQ8xQ7^gQZA3D8!1mu&XT@(aD{?gK^_Z*4H znqIxKNMg5yPp-JNAC4(#nb-ZoC7iU@wg=GnLWE}!@Ln!hwHqk70oPm8>IrU$6F8vX zf7+y=OAD3(ZcM>ZMd>*(`>zBPCNE(V=_AvA~}NC-5h)N537ssJ4V_Yf18$Vd|t^WYB C7ebx@ delta 2869 zcmai0TWl0%6y9mKd*8MTz3gmvz`3wgcOp<)2wf zYfN8EeB!bkNlb{g5fda4qbc!0Vi1X_iN@4Oq$3YR(-(ur$dkV4fBvC+vD>&0-<~<& zIp_cXbNOdJJTSN4{mAWhnCP#*dtvm=yqo9V$cNSXpvh}$H^r2P=O9?lJ*3nYSwt}U-sw_mHKpZY7 zf(7EEB5}3~WB*ZA7Q4M*d7!#1c1MA@Rz~ohl-PkODgO5-R$X z2gj#FP4LjXovVfQHFv;l`Hu6!50)*KW=fG}@LSs~orbvCDjw!h^ikL?I7ur$_z~I= z0tjw|AVLVC9RWk>RymWFGm=U=P=z4~i`#`#m;wA_U1cm5o{ie7xo{7v*C0HJ(1*}X zL3bu4H9_R8CMy}z2P5`gC+Z1vSPSRuJl6|X?fqTotgn5nkWerRxwP|M@4kk`mc z-IA=pW!KA3ZKQ6xM;%p&7BAgLn z5k?ByYTczOIg*g#@r*bok$sfW-4Y=RiH}LDDyAgCW!N+KeehSU;ABBw!XUlST^Hi| zU{4)CwSg)GOQ|th9Ast)M=0p#t)eChRpbzA4x`38B&oTyrqUf267SICKMTBIe`CbCj# z?TLm~IRur0P|f~|TPr(I(U!%YKrgm{ZKsl8!y;7cZg{_86So!~HoO(Zkh&v5B$l3| z6UDf?bFesKLJb*#>y7)k)8J})z>ULiO_60M=nV8UkFcUm24IeFg6Zbd+y(G@JC}7i z3nSjWhKrB6eD2Lrm#6uzWnIqERhr=pKR{>o8@}CdG+%w?=A#7)^^!A~j=czH5zZl0 zs@h2;PQt;Kzm3+TqHp1elCDxUI&!*I%x2TFlr$R9Os3Io2B8nqtv!PU2by!Un$D$) z$(?L?f!GshG%#%i6WE*@Cpb2lYFPpbnxYdUDTXP`KeGFFv%h&Nb{2Dl56eSF;fmVSIQ*iOjM!J_? zjkrOahtO&=i!w|1b(AV)`VtbCU_SV@k?Bip$Zv&SeTH@NYe=&rGC-YfO(?W4GaA9U zENT8KV^BVY@%HGNqGQSQ5(PbQ<0Y@D8~AtwzHgs&bTW}bBJXL06CKyKu~jXoX3`fZ z-9f;plXbf!Ns}|F;8sZ!<+Qq3zM|QeX!{i$>70(T0ROj{+h~6qB3*eS9k=0T*ZC>- z8Z4fOy*wGPn2cS!xT%tan2j5eQOujYIBmo7n1pX_dcFU5PlCJB^lVwYyXoF`;ySw! z!UzJwZiGDul`1@k#2k3SS>s4^^hi9+gs(W~k@*qf9t=ggSFk&|+R*5zo`-zIAH9d- zPZS>C!4<1`7me=1d?e*!RmA7r!YbG)%uMO-Vex1#Es{a@wZcAK*!FcBky5g%Nkn(- zQj$`7b8<}1kSNBAAtVvlWx)EBwF)Z{I~1-#=US%zJ~U(t<0ph}>mO5+xwJGu7EC6q YiK9BT1;$rLX5U@?Cuh5BTE&e21yJ;H$^ZZW diff --git a/recruitment/__pycache__/forms.cpython-313.pyc b/recruitment/__pycache__/forms.cpython-313.pyc index 62636ce517f03e8ec95214222faa33fd7815e80d..ffffc9f8f277ea12f9d9f8080e9813e409b46793 100644 GIT binary patch delta 7120 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 delta 6050 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 diff --git a/recruitment/__pycache__/models.cpython-313.pyc b/recruitment/__pycache__/models.cpython-313.pyc index 4b04a431a61d1b232c3eda5fbb868b3b43e34b60..7de510d782a45d32a2b42e26ea8b9d65c33c7315 100644 GIT binary patch delta 12062 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 G?Ee9^0PSM{ diff --git a/recruitment/__pycache__/signals.cpython-313.pyc b/recruitment/__pycache__/signals.cpython-313.pyc index fcfcc913062d6ff873c417fc153f2ae69f795aa8..530e3d0bd289545b8e713b9a9b34ac4766373eb8 100644 GIT binary patch delta 794 zcmaDFdN_>tGcPX}0}ya;dY^zoeHkfD-%VY;JjmeHoqTFDcK;l8XlM|WLmHA<6LRn0Kc7Q-0YqTJQ z#Q?HTX!3I=Jtb5jm^6Y85}UlANoukvvoNFNWKCvuAQ{Lks*Es*17>_EV-7D&Unp0Q zEYKOkljkt=@FJW76FtGq$18xL_8U+XVJ=9mAd8~35KLV#56}h}2jl_u$@VOwqP&5O z!F-mC3JlSRAkYNa&B_l{qcypaMO9V@rj4B;Q6Cr(+(>Hm!Dj?2ZL+kWiqI{A%;NZ>)Z)_I)cAtLqT4VRlK^D#D6Hv{Hl2CQzTo6n21aj{tdO)RpU94+4}WesB5fCyU)O*w|!1a#E88wKNq$eklS; ztz`HNBpHf~fy6Bio80`A(wtPgqQc41T45%sjEsSdpP3n$^gb|w*&m~T9Ig({89o;o UH9s=NvoP|3q_rT-q5_~H07;>W761SM delta 737 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 E8?fwCQ2+n{ diff --git a/recruitment/__pycache__/views_frontend.cpython-313.pyc b/recruitment/__pycache__/views_frontend.cpython-313.pyc index 16dcc88ec6134334c1d632a2215480bb197bab08..7a1340ca2b54806f830a0bccd24264406c6daaea 100644 GIT binary patch delta 3822 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 MIGS$*_vWqt0gxmHwEzGB diff --git a/recruitment/forms.py b/recruitment/forms.py index 3363fb2..8317b4b 100644 --- a/recruitment/forms.py +++ b/recruitment/forms.py @@ -469,4 +469,18 @@ class InterviewScheduleForm(forms.ModelForm): def clean_working_days(self): working_days = self.cleaned_data.get('working_days') # Convert string values to integers - return [int(day) for day in working_days] \ No newline at end of file + return [int(day) for day in working_days] + + +class JobPostingCancelReasonForm(forms.ModelForm): + class Meta: + model = JobPosting + fields = ['cancel_reason'] +class JobPostingStatusForm(forms.ModelForm): + class Meta: + model = JobPosting + fields = ['status'] +class FormTemplateIsActiveForm(forms.ModelForm): + class Meta: + model = FormTemplate + fields = ['is_active'] \ No newline at end of file diff --git a/recruitment/linkedin.py b/recruitment/linkedin.py index b67abde..dae3bfc 100644 --- a/recruitment/linkedin.py +++ b/recruitment/linkedin.py @@ -2,12 +2,13 @@ import requests LINKEDIN_API_BASE = "https://api.linkedin.com/v2" + class LinkedInService: def __init__(self, access_token): self.headers = { - 'Authorization': f'Bearer {access_token}', - 'X-Restli-Protocol-Version': '2.0.0', - 'Content-Type': 'application/json' + "Authorization": f"Bearer {access_token}", + "X-Restli-Protocol-Version": "2.0.0", + "Content-Type": "application/json", } def post_job(self, organization_id, job_data): @@ -17,10 +18,10 @@ class LinkedInService: "lifecycleState": "PUBLISHED", "specificContent": { "com.linkedin.ugc.ShareContent": { - "shareCommentary": {"text": job_data['text']}, - "shareMediaCategory": "NONE" + "shareCommentary": {"text": job_data["text"]}, + "shareMediaCategory": "NONE", } }, - "visibility": {"com.linkedin.ugc.MemberNetworkVisibility": "PUBLIC"} + "visibility": {"com.linkedin.ugc.MemberNetworkVisibility": "PUBLIC"}, } - return requests.post(url, json=data, headers=self.headers) \ No newline at end of file + return requests.post(url, json=data, headers=self.headers) diff --git a/recruitment/migrations/0001_initial.py b/recruitment/migrations/0001_initial.py index d0381aa..27ae747 100644 --- a/recruitment/migrations/0001_initial.py +++ b/recruitment/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 5.2.6 on 2025-10-08 15:48 +# Generated by Django 5.2.6 on 2025-10-09 10:10 import django.core.validators import django.db.models.deletion @@ -213,6 +213,7 @@ class Migration(migrations.Migration): ('last_name', models.CharField(max_length=255, verbose_name='Last Name')), ('email', models.EmailField(max_length=254, verbose_name='Email')), ('phone', models.CharField(max_length=20, verbose_name='Phone')), + ('address', models.TextField(max_length=200, verbose_name='Address')), ('resume', models.FileField(upload_to='resumes/', verbose_name='Resume')), ('parsed_summary', models.TextField(blank=True, verbose_name='Parsed Summary')), ('applied', models.BooleanField(default=False, verbose_name='Applied')), @@ -311,6 +312,14 @@ class Migration(migrations.Migration): name='job', field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='candidates', to='recruitment.jobposting', verbose_name='Job'), ), + migrations.CreateModel( + name='Profile', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('profile_image', models.ImageField(blank=True, null=True, upload_to='profile_pic/')), + ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='profile', to=settings.AUTH_USER_MODEL)), + ], + ), migrations.CreateModel( name='SharedFormTemplate', fields=[ @@ -374,6 +383,7 @@ class Migration(migrations.Migration): name='ScheduledInterview', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('slug', django_extensions.db.fields.RandomCharField(blank=True, editable=False, length=8, unique=True, verbose_name='Slug')), ('interview_date', models.DateField(verbose_name='Interview Date')), ('interview_time', models.TimeField(verbose_name='Interview Time')), ('status', models.CharField(choices=[('scheduled', 'Scheduled'), ('confirmed', 'Confirmed'), ('cancelled', 'Cancelled'), ('completed', 'Completed')], default='scheduled', max_length=20)), @@ -384,5 +394,8 @@ class Migration(migrations.Migration): ('schedule', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='interviews', to='recruitment.interviewschedule')), ('zoom_meeting', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='interview', to='recruitment.zoommeeting')), ], + options={ + 'abstract': False, + }, ), ] diff --git a/recruitment/migrations/0002_candidate_address.py b/recruitment/migrations/0002_candidate_address.py deleted file mode 100644 index c9713a1..0000000 --- a/recruitment/migrations/0002_candidate_address.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 5.2.6 on 2025-10-08 17:46 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('recruitment', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='candidate', - name='address', - field=models.TextField(default='', max_length=200, verbose_name='Address'), - preserve_default=False, - ), - ] diff --git a/recruitment/migrations/0002_jobposting_cancel_reason_jobposting_cancelled_at_and_more.py b/recruitment/migrations/0002_jobposting_cancel_reason_jobposting_cancelled_at_and_more.py new file mode 100644 index 0000000..91b6321 --- /dev/null +++ b/recruitment/migrations/0002_jobposting_cancel_reason_jobposting_cancelled_at_and_more.py @@ -0,0 +1,33 @@ +# Generated by Django 5.2.6 on 2025-10-09 10:33 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('recruitment', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='jobposting', + name='cancel_reason', + field=models.TextField(blank=True, help_text='Reason for canceling the job posting', verbose_name='Cancel Reason'), + ), + migrations.AddField( + model_name='jobposting', + name='cancelled_at', + field=models.DateTimeField(blank=True, null=True), + ), + migrations.AddField( + model_name='jobposting', + name='cancelled_by', + field=models.CharField(blank=True, help_text='Name of person who cancelled this job', max_length=100, verbose_name='Cancelled By'), + ), + migrations.AlterField( + model_name='jobposting', + name='status', + field=models.CharField(blank=True, choices=[('DRAFT', 'Draft'), ('ACTIVE', 'Active'), ('CLOSED', 'Closed'), ('CANCELLED', 'Cancelled'), ('ARCHIVED', 'Archived')], default='DRAFT', max_length=20, null=True), + ), + ] diff --git a/recruitment/migrations/0003_candidate_is_resume_parsed_and_more.py b/recruitment/migrations/0003_candidate_is_resume_parsed_and_more.py new file mode 100644 index 0000000..959dd78 --- /dev/null +++ b/recruitment/migrations/0003_candidate_is_resume_parsed_and_more.py @@ -0,0 +1,23 @@ +# Generated by Django 5.2.6 on 2025-10-09 12:59 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('recruitment', '0002_jobposting_cancel_reason_jobposting_cancelled_at_and_more'), + ] + + operations = [ + migrations.AddField( + model_name='candidate', + name='is_resume_parsed', + field=models.BooleanField(default=False, verbose_name='Resume Parsed'), + ), + migrations.AlterField( + model_name='formtemplate', + name='is_active', + field=models.BooleanField(default=False, help_text='Whether this template is active'), + ), + ] diff --git a/recruitment/migrations/0003_scheduledinterview_slug.py b/recruitment/migrations/0003_scheduledinterview_slug.py deleted file mode 100644 index 364117e..0000000 --- a/recruitment/migrations/0003_scheduledinterview_slug.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 5.2.6 on 2025-10-08 17:47 - -import django_extensions.db.fields -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('recruitment', '0002_candidate_address'), - ] - - operations = [ - migrations.AddField( - model_name='scheduledinterview', - name='slug', - field=django_extensions.db.fields.RandomCharField(blank=True, editable=False, length=8, unique=True, verbose_name='Slug'), - ), - ] diff --git a/recruitment/migrations/0027_profile.py b/recruitment/migrations/0027_profile.py deleted file mode 100644 index d2b58c8..0000000 --- a/recruitment/migrations/0027_profile.py +++ /dev/null @@ -1,24 +0,0 @@ -# Generated by Django 5.2.7 on 2025-10-08 13:01 - -import django.db.models.deletion -from django.conf import settings -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('recruitment', '0026_interviewschedule_scheduledinterview'), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ] - - operations = [ - migrations.CreateModel( - name='Profile', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('profile_image', models.ImageField(blank=True, null=True, upload_to='profile_pic/')), - ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='profile', to=settings.AUTH_USER_MODEL)), - ], - ), - ] diff --git a/recruitment/migrations/__pycache__/0001_initial.cpython-311.pyc b/recruitment/migrations/__pycache__/0001_initial.cpython-311.pyc deleted file mode 100644 index a76b82e9c3a4a67d16e45fd889eddf3c4583852d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2319 zcmb7FJ#Z686uvu2rytAq$r#I$0HMf)Sh+ZCQ+{;&nF1qRHURbYN$5QA8Ssjx6|3fJ^id`*AF&oUgd#vtEM4Dw@N z!&}1~_!#CHbhlLkh`q<;0!OyEk>hBjDc5z$lr`0$d{aYMF=_)_XNV1iHyzGC8$0J# zIK)DY{Vr=jy_;5X&ij16t#o$1qlql9BK#2B%i$1B}yikx{j*aLs3Eq9<1MSh2N5~f(#li zN-B~O1ffrZTQq>1lB^v4Y4f~}jdl}14!NU|huy;MmZC}ad33BL=>{APHg@PR8K^3f z`hfC=DVc491`Dm0B4c!f?0`9a5(ZtcclI>^%t*~U+IT#!t!WCDR96~Z1-I_Y zP3(%1J2rTOH6>Z`)Fn;Fa$Wrva)U<=Nv&&?Lsc4b!h;*9!D8WFv9NlFMzj_lRMX#> zH{cZWc0Iod`DEk){TLM zJ6o3~nWd*wR%Yq>Cdm}LnWB{`5@EF$`;^QsKi#ormtR~Zv*qq=*_tgAVZ9f-NYab@ zJ63w}#Ux3Wy6KXYE)ij^KOUMK>jy@{k=G26W1IA+-$irbBch3uL~eh|O5_gjk;L_G z;<}Z%PK0GA%y~P^`9p&wSGvg+E4f018@*V9q~`apS*iKM21ymVse+X%5aITTSf9_3 z?5%G0mX*Clgs)GoD8I~-)J8Y8VWl>R@clnV1~);bbNjqCojWZ3UbdE2t);ux(k4Nz zKEv#=Ya9%TZ@AYEJ$5K)Vr8x$3)`4PZA^e1+oYdLPVjr{_D}!H%ZeON6K;Mkpz4DA zF<n8a#8}&^zLWU0l46J*LH<+N%Uxu|3v9(H;G{8~LByz2~0& zcJ4-9T(Xakm(FoK=He#$;Kp0=(^z1_#r4SrWLn8HxYU38HvuoVCVPC)%)KLvFzs5L zyyzj~YgaDL)`t4bP4$_(dT|cE4>PSRz1y?NRzjy4tgxlgovbiL!fU--v`&0?wGG0` zut?a|Wx-FPQq$1HGDebtAQ@<2xh~-yaSQE`u#T`SDe@ykqT2{>XgU&Asg6j%kPQVL z{Y~8w7enqr*L>0)3*k<=~1>4s!9brLKz8j6hI z5p)7(u~Smm=^VsYqhvMp(E(LT-38<0QCLxW80bzC$8f19kiM58#+O1^z7Ls#+c8Hl->; zFjrW=pWBk8W|bya&z)f{ciQoD*REarNbH6_*Vw`I?E&sDNCo|8+IF9SS3@I@S2})X zlzaSDCj`Rj?<00-(h5x;#>QU7E}7#qPq*#y8Ebsz!2fc}EQzLy+vB>)8;7yDnVi|Z zYA0u`an}@NCnVo-r!_LlI+4*0y*G>LL|GBi8$v+>nGkGhMKX}m2ESdcB zVeA8Qdg1xDJ-uK}FTA+ko?bQiyN9vMW_o^i+fL70>G>C&TKseHg zpYwa-ZGMlN31N54P6$>)*uURSd}8toZZxw_G_zK6c3*ENZ<_q#VJu;$W_NGcsaY#E zyI*Uk3MPO1d^`tJ?d)eJ|M|bLt1q+d)IF2`y1)07UNbK2a&}y>;=+FMr_~=TMjU^=v}8MaS^U&%Ko!@(KU>;9SpWb4 diff --git a/recruitment/migrations/__pycache__/0001_initial.cpython-313.pyc b/recruitment/migrations/__pycache__/0001_initial.cpython-313.pyc index 492600eafc48dcf83960c43b86c91377bbc47416..dfcea98fcbf9529d32fc91c3c8d37926a2e39ae8 100644 GIT binary patch delta 2365 zcmZ8iX;9Ng6wm&X03ncY2;?L{Kn{T*VU(yKha4W93s~y`2;pj?7(}dAYg@4vt=H>; z+7>Ey+S*QMI+^Kcr=zwVXFB#nfe&TCN~yKg9$L^^?V;`4P56t=^iKvpiE;+{M_D?`r-KHS!5whglW}!I!fDZLWV%c)+j3r zj|gGPOY|FhnM319(JQ{C6MXd@3@Y^G3PgpQgTJpJ^a{$NIy|y31IB z_q?n>(fJjSCe^|@yi68W9jS-3phWOKT9F;5y zoDslu>OihjP3s^*R}6==Y7&g0Y5Z|R2+hSY6t?Ni>RC7o6HSDp^SU5}BItbPH9u7Y zQ3j)0OZD`iXh}Cs)XyLqV3$lM!`(($rY})Ova8}Jm{{^KRsJMudSCR6eKF{m76J|a z#0(lkoH`b7@u8_W)aoKFEMv2IWbrhe3b;yOm(0&kWFC?vIANHpoFiII=6zO0)j?oHkV=S4+Pn_>Ty|yzsW_!ft1&|hLR4>F* z{7B5$B8XCGgZt1*7L5{fn+@Z!M(tumb5JBS3&&hBt~^#VJ_zMg0VaYL!&*(K4wp+% z3Q!7J_3#W7;i?!uNQfs(VS}lUEWnIwSV+sLKMM+H%cr3gB2eH7sEKU5ThB04I;3tU`Gl_J_2? zsU)ppHH#jRH87s+lr#NW=!r>@ujAM!F;00c$5PE^dEGQGa3#Y~>QUCipgEc}V5AAm z;YN56Z&KRn8L#aoz(YtgJP0v@n;03T1leWMP{s2!CKMWOR7#Zf3nhU5Q91P4Qw|czJXowpGNQ#I);z zcnxp!G!#^Ce+WJ$f;+_BJH_2kvnRxgVi%o&Q}K!98D=(=nSE9yJ%U+UM!eINQ&jQwUC8 z6rlsGuS1$%t2~JKA(X@Tf)0cjpeD%~aRk@EjVf^V63WYBdSAi&OoV(aXx6y3%9~>O zy$bDwN75@oalF+XI^fGi zt=3-r^K-EwQ5cgIY^`^?j(Qe~r5iTeU0Yi1U9MvuL|)d^WOuoaLvvPXP@f0$DXedG z*c)B_a3QNLWWWRZRodI^4Vw`@>CVl*PKX6O z+Sr6Aj0LuPCbg~3`eysKfazs>YlCG>*4bfqjrn>p_dwCRQlf*B<@<=$J-QqXT!ha` zs$@%XE2v86k$5O5Z4iz}x=)o#RiV1x!VyFAup#-h^oztHL)BnVwfns__lR{$B54uw zr1(=IZIa%?95hQOC6eG4>7-RROEsA(iB2Akw@%5WVXCQx(F*^`CGM}+y)7eC?wt(= z=E7i`e)VW@RR8Re80&D1^>pm{s-fzJp_svv?@8 zcqFr8D6?WDbJY-jTQ&`D*?CtY=^|wUy5arNl?%*`3IR-IVea0hY8j+g+1xkU>PS>X z06J!n1nYYXCZz)UWeP#Rs+BwBAwJ#9Ts2VdFq3@fc4U$)IO~We88G26kW#qsVE@Z_ r*)?ofiNl!RBIm}&PKQ0)RSQMVq=*6^;&aG95 delta 2147 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 diff --git a/recruitment/migrations/__pycache__/0002_trainingmaterial.cpython-312.pyc b/recruitment/migrations/__pycache__/0002_trainingmaterial.cpython-312.pyc deleted file mode 100644 index a68d9e15c070245e9fe2122f432bcaeec5b4f35d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1796 zcmah}O>7%Q6rNq%oApl`J9Xm53UPp_iLEGhNkLF5l+a{TN)n{R36d|PwP$Rvvp;5c zoz}esq#ii-MmTW=#fKa@mJ>+5>uXuofTG zdKmfX7eHKVwU8D$pnE_>3G2WJ#)h59E_UfAW`7-V=D`CE|z-l)q<{x9#E%bOm? zLu0Mz3F}$t$uXBXGmP09A2|8C%bOj>!?D`jRef!Ii0!bEd2ogl%jex=Z|3G29|HzZTRs!1ZbT<#W>RLPV?nMCutNU>Vk5>2c-8dgGi zfv}&frTru#HcSncbWDwigzLJbhPSc9@evA-$A1>O%i#{kg!3*_uNEoIqz0?8VHGeELB!%iUlVO61-Ox^&ZUQN2Uk) zy`9aTQlJ^~;OH97PF_-aVo1<*ELGG`>BVrUCaM*Uu&79Q_n&FIApGun9&Yb#Zjz8z z$Gsl%130HqfL9N)RZYR!vRK6!WmogN*#l8*RB3XJ>_F*cFS}2c7STJfe^>phTBo1g!l?<}m?3oF0!tKEPv&V9MrjeuavG0)ii z%vtR1KVlPBBJ=dHlgQYK%#Z$G=Bxs=RK1-rtf+YwyJ00W$2U94jGfG!mfFcXR`kQO zSkjtaJQh0Bi}v*5>FxIP`&RUWv)CKQN5_ZX9esOrns28(V#1nAA5V6s()LvP)Nifq zwWs#2=;xGcrIwEmJE>(mwfrpJP6<|Y!`0>-ZO%^RPSLaS&(cp)N7%Q8{f+=_0d|C{ zEmSR~@ecqhBd~va%LM?l8*CSV*nPG;#>cN+1j4~k*Ec%Oef2SrfyIwJWq~D>U)7Xu-=+yNw h40Fx_=FQ*0?C)UVf{QcU(@-ZmXGiB=0xGyZ{sRkp%O-vg{6rNq%%lZef!C*iXXo?byB1{sh#{CmCVUzNcN?t>y%F<}<9qb9~U3Yd( zLN2LPspniOpfG=Z)l zH8_RTP$85X>M6Qd-wpUQ8z>8D>C|N&qy;Y9#Br!uw$mbyRB4%M4z*01OI1rJhF!W) zfKa^4oV5hks)A<`6IFo)RIw1udGEP=0D(;fsjoGl!5tZq$#8PS=Pu9int&QCL~`So zr9KUNA^0S9K$Ww>6;TZXZlW(PqDHdWc`egC1fC5YzvQ7zV`58xV0dkrm;d z5x~s70W<2|lLW+-{)oaz?&|A1xnv*NLLb@U>$3jdSI4q}6)`iQj%US;z{b@SOO+?m zlRUiL%YaiEltE5J87Z+kb*jX4cx-uj`39yYb*N_Wc%ErMo8@iIAW02E--KzyiN9{2- zh*@?je4u2R4wwMqP|?uLeI7ZWI zTdRC{Z6|*p@2KlJy#3kT^(`JdM^Iw(=pE0u+ismQw_)(uC$zilM@8q_+LIs@WlY@7`VR>5ZvJu5%gqF=sh?S&2)XcKQMZL&n&kfKXxU8<{@q?YM zEgrFIq}MaXFt#1&A0=?D!)USY5F6g05p4(o3ZvkFnxnM5(+Pz$Rlm}T1&q6gWO(N zZ7!_7kk>k)KvMc@s}n=v(Y8F(l4nj5@BE$^dv?%HEw)mNKLvlCZ+w9pCTphbM%+0` zOdMTpPc62l7LQBKsrMW44^9$OM@oD8dTaXn@k(?0b|aoWNxXG*@cq;8o*w6$vpyzu zG~S*}woXO%|$URSi-nq5BDpYQ!bf2M6^x2f#5 z72H&CTd6daN~2o;8zECr#8>Cb+&!^_P~yJW8J3enuR_sqq!Sn%k-pwww|fpr%Y4!g z-;!Qj@*Db6FNW+Uz<9K~59PJzXI=RGgqNURX8AsL)G diff --git a/recruitment/migrations/__pycache__/0003_candidate_updated_at_job_updated_at_and_more.cpython-311.pyc b/recruitment/migrations/__pycache__/0003_candidate_updated_at_job_updated_at_and_more.cpython-311.pyc deleted file mode 100644 index 699d7a587a9a881a17f3a3fc69faa523de34e82d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1107 zcmbtTJ8#rL5Z<+Yj%_$8SU`A$CPF7n5eLw95fTyt2|*eX3OB3G?Q+?}k7MoQlr9AY zWxD)>AVdl}{zgDoL|f2M(K$-0RLuGw2?+%eyY}pSJ3BKw-`F4Pbq~RKGk16GyMfS8 z4aTE3QVteD*+L949HRtBI58pvBLh7}%y^HO$#KUVJ8gsZd4eL7Suasg`=!l+p}a)2 zB`rjj=E_bo#^by-_SCC80tY`p*+Lven4!pExQ!#zK-}t#F9oTY-myDVBOk=9o!T~r z^zaVHj{WC#PDPmd?+DKMBec!PVJ?v3Dfh*g4WQkG}a+BV!X>!#?zMIxzsII&LhU2=+M&Au>Kfsv@8-{ z?I|zo@=>!tp#$BKqbyv>xy-|a%05kL+^4Y!moiD$R#Nc}ETUKsPY@9ve=i|W@_7NGty@>d{A6JreZ<6sxvIs26MRcx2&tl0Dh O)3^7v;qWikD(`Qy0v4|T diff --git a/recruitment/migrations/__pycache__/0003_candidate_updated_at_job_updated_at_and_more.cpython-312.pyc b/recruitment/migrations/__pycache__/0003_candidate_updated_at_job_updated_at_and_more.cpython-312.pyc deleted file mode 100644 index 6b5a7918a925a1aec6ce53bbe8ef1615232b6dff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1022 zcmb_a&ubGw6n?Y2+3v1JVo<9#UZe!}(v6C@QYeUmXfNipmtmTjCL8xhoZUroQ|Q5q z&|CioX%GG%o+3iR9QEWakQBj_Gn>T3LP5bfy!pO2?>*l8=6x!c9gyd2`)lX32JlUh z#VO6fWJiKypg>Uw5%N)_`5FQZo&ePjf$9u(%|+7kKGA2`*ZYQB`mTtp2`38LoMb@~ zr^1X9%EGj@%mJ|HWHOcD7#R47g0E53M!v2AGrC2?t0^Gcpz6)+Uis6n7&T5yCurtB zH5W}?SZVFQRkHrIQd{?}zU?}~e!kF13U-OJ7SDq$VsR#}HyVxmIO8OUgSZ`$jPZbk z!fuh622@hv#>-!xD~LJt4|l!E~SrEX>KT5ek40;1`#WK!by5; zz5*X$qJHM*f!9eQ<{gj@W7OMizVKcWl6T|~skbt}w_F}iD)9jSo*OU6#&VifDy5OF zbGFs%bG4?0Q6POU%^{3UujP%w~}_a*OpdHG&Ob8{YoasTtD?umiW7Y!z( z_RAS1cvfb-Vs#t zJS&u)<}pi(_LPHARSs;724Id*3ke({VMJJ%kr85HwQ75_=LusUN--m=HM7_F=UFYX zw{SGGWnRd3{)_Eih8>#1jXdFX>cOmXpG|Z))7pVDb-~)A2KsEl( z`T^|*b>)zXK#1}Pfdpm3z@H`LMM)E#1ke>i4!I~~!ZViT`Z#8Nmc=Y8k~n9C_GoNjs7d4J5d?!6mP)1 zLqi+6cZQ~M-G2Ra=ppyosk3zAEDaV`2Uk}H{^F^>e&Vlxw2uAFuQQhG{SmW#iJ0Jm zn1zOKzughblbUt|OSy56W}SQ^KB&a5Bpz3-RU5~yfTx@X;}&jx{ X!ofHD2DaaOr;WAa#@crTpkn_7UK0X> diff --git a/recruitment/migrations/__pycache__/0004_remove_candidate_status_candidate_applied.cpython-311.pyc b/recruitment/migrations/__pycache__/0004_remove_candidate_status_candidate_applied.cpython-311.pyc deleted file mode 100644 index 7843763971cfd2161879432100d347616c2dcdbc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 971 zcmZuvzi-n(6uz?^$97UtA|z<3K&mKe7@8n5R!A@u3DFFoGI%*%bJx_7e}uEssuDv6 z2F7mv4+5z9V~Ug^x|NB|RWfzrofC(ka<)Ie=kL9{Pv7&ml@$lU8g4#2zM~=ZOC|X# z%!A1;1Q&=QhJ6%Z7YCZFVWgoqh-qIC(>d4xhOcA=|f`xqA%f@t*pY#GpH!Q zmtrU16)|&I9AM~xXSRmczk=JEYcm@pJJR0IwSw@H;4RVfl7NSad|t2DUyv3Jna60t zNw2G3jL?L1qQm7BN=Oh1F6~9NG~q<2-Qte` jsg5xQ?YMe{wr}65xr)sc-G*~#wEE;)5!3&$*|~oJWB~pW diff --git a/recruitment/migrations/__pycache__/0004_remove_candidate_status_candidate_applied.cpython-312.pyc b/recruitment/migrations/__pycache__/0004_remove_candidate_status_candidate_applied.cpython-312.pyc deleted file mode 100644 index 5c2f438b1ca6c244570837d6d009988be7ccba69..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 887 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 Yj?e!d?c<}b5_K_G6LWuXpm^T@0K%kXDF6Tf diff --git a/recruitment/migrations/__pycache__/0006_jobposting_alter_candidate_options_alter_job_options_and_more.cpython-312.pyc b/recruitment/migrations/__pycache__/0006_jobposting_alter_candidate_options_alter_job_options_and_more.cpython-312.pyc deleted file mode 100644 index ab445a7a25a7072e82f3d2ba60ffceab42dd6ce3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13587 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 diff --git a/recruitment/migrations/__pycache__/0006_jobposting_alter_candidate_options_alter_job_options_and_more.cpython-313.pyc b/recruitment/migrations/__pycache__/0006_jobposting_alter_candidate_options_alter_job_options_and_more.cpython-313.pyc deleted file mode 100644 index 8ba679460aad98e2ad378662acb0b61c81719190..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12593 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 QyuVHNxBZt5&j_#o1IOevK>z>% diff --git a/recruitment/migrations/__pycache__/0007_alter_jobposting_status.cpython-312.pyc b/recruitment/migrations/__pycache__/0007_alter_jobposting_status.cpython-312.pyc deleted file mode 100644 index 35501e491d801102d7a44f186ec134c86f7e1e1f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 952 zcmY*X&rcIU6n-q64grpYmM-U?r4-IiM>`c2`_D9{_8hg-a z!oedq?w&O8pLpT~nWLV#H3Bj5>stAT48m;`5FCJjI^j^KoHR*YqagHFUhvfvz%sbnGg{aF*A?S>6L{e(;RY{q z{it*}xYm(5ED%pFbuD{LnlFa6VWDG*aFdRog(Ax2$;oxck(Pt^;GIAq9(SC# z9Tuoq#kgpTh>OVeMVhFwORK6Hw5m=?bS0QIkM+5<;$WaU-eOTRp65GxH}Vej3z}77dF)+8vb5N5=~8kZDZwwj eji#p&LjD*)>F0@o^}zeU!Q-pD>_0yl`&q{ z2=rG093YIa_84tyT-(&SeihB5MTGUs2pe^+W{;C5`nEB|+-RAeb)pPUmu@F&aVnxT z$)w#$Ll$SjBnP3=$mq8L9H2Vl8b(~l8aJ@+Yuv0`wQ{kev0$78Gzp`S3P#fIpr?@^0ws``&yu()u1 z@!IkEOULE;qw?ZmdGYJqZ-nmE^d3TWJy5C(KMJUQ{hfY_(CmBtv|u`J&#=q($4!1? z{Hblvluo!ylUBMEHU`5Q3}{%4>U$V_6Ob(4A5yT&Z-J@7&aQyy8Jed3vytZgu}hl$ R#XXw2{(a{9Uj)V=`#>3+ohDD6pw z3Lbmw-BYFg1NuJ*LO^KPqn>&TwngydyiG#l!3UZ7{eGF5%$s@nn#-vO&ehTn^Ba%Q zPez6(H2@dO01gpBgtL*uRXK;R@*LvPQ$+ZELbz8^n_15o!nZQ4T`c0l7E@aEK_Xas*X*!Zo?7z#}TQl7`1q5VS$qcT(%xzdBM8^$vW3kweoY=_i0T3)T~1)=3OjUdEf6vXOCinHygW?O+tiGjlk z)JfHB>~6=R8`-ulz%1GP3>P~TG-gu`i`pcX`o(mS<&-yzD;01)ZiK*eak_4LR-FcM zn$QN0>=3%byM|5OW@!3sn;Uv2mW`xK!-!SGfUYB(0?r!7+X&mNbH)g5Ql?LD9U5fZ~d@Da>D>Pbjh>JKf3KT`hl*KhyFZEq_!w6~AkbF4Ll-vdCL3a<(JSCXqM0+8m3V z>u7UFQ@;>ee8cw;s__xuN@j%k)-D!3kW@px(8G;9+ ziHSE8FT4Z3flpxq7swpEc;dE*#;et{Y?cFd(p6toS5>ONs?$QjLU2|;|EPag5&9{O z&N0rw=`4UX!7p)_qU?fzm2o0-_BJ_2moIjt?#?Xp}_4Q1-@4`0& z8`zvtab`w?{NjZ%8qPxg;Dv97gK+MJf-T$wmGU!&tmLSo2Ny)XcFFEda;u$x9ZN3Y zr#*sIMa-iH^P^;BYHI2}pfHg${+gMQL1zywEu}P^Y`b4vcpC{7}yi z@P8wpY`zt8Pf{U4_zuJ;)G|?Sx}~Xu=7*J*g>nOj+2Moi@X?i9NBuXBibIFRiG$+A z-r6^PzxePZqvx!%sL_M$Xc~1jjT$>Bj_nQpLTLK6+Cr$Ja;dh}9jV@{CG7;EfqAW6 zq0mz_KQ4>goqnF$dXjTDsb32w-AX!wl=ybXlC*a09Y9I;L3^;X;x3p9+;9X$OH&l( ZuZa}KM0I8`yZM8GOGXp diff --git a/recruitment/migrations/__pycache__/0009_candidate_slug_job_slug_jobposting_slug_and_more.cpython-312.pyc b/recruitment/migrations/__pycache__/0009_candidate_slug_job_slug_jobposting_slug_and_more.cpython-312.pyc deleted file mode 100644 index 594a7528bcc46b1b4d85d7a4cf676cc99ae175a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2171 zcmc&!&1)M+6rcUjdbP4_dF|qY@cWD{cf&_fG$i;3$(X+v5&5Oi5anipy1{ZM9i z+c*T;LJmFVmcOCchyDq^_hOZR#9RvPDK~+WOHX~XD>)`sa;d5JF!SEL-~Qg`%MT(%w<}}LX3w87ofVjY>%^gXFs#5~ag@Vb{aTmgw{%H` zH)bkIYzli{YQI0mrnBk8%7L0&-k6o~Tr=Lme$iTHSJZS51c9o0KgoOof=?WA?zi(9~4nz+T9-|2eJ@(V) z?)D246A}6jDo#NZ>OKwkgbB<`Xx#^4_z*UemN3%Ldys;d{2q8ciop$O0FH*&T3+Q$ z6S_PTh5H`(OlTOIuwKU}Dha1vh>-^9oqN<5rAJW|1OPI8VKq3QK}P?`x|Pcx(FD_; zq-helVf2Gb8RIiDTr2I!9CGm8T+YGf2%G_LJ5$1Rv*=t`SgwoFraquN>ADY6>dT0w z#-IZsgRtR2%;f_n%uU9&vrJ}Kn}*HEg@*}*arS_ztS*c!&sa=bx*tL%4W)bp9-U~$P5@Erp{rtv(F85m@WAJllTvXkSAndkm4O>ps91lPhSr# zQoQnu)iW2m=0bn|YJX~A@Yi}HF9q-&bruE~!Xh6u1$`|Uf zy@C16ZmTaR^rH0!&y@?}S-Kz|=Yn{a{|nCtvd)WLbFn{mR}K6GJ<~rnpygw diff --git a/recruitment/migrations/__pycache__/0009_candidate_slug_job_slug_jobposting_slug_and_more.cpython-313.pyc b/recruitment/migrations/__pycache__/0009_candidate_slug_job_slug_jobposting_slug_and_more.cpython-313.pyc deleted file mode 100644 index 06259de5a721b87a3ea65c2e8dc08912827080f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2136 zcmcgs&2Jk;6rcU{dgCiq zmQn1?YHKy?TrnTkbm_)nn-LMF372-91~lTWLa|t@V`lV=uA(32k(usm%<%QP#>_*j zQJFRr&Jo=6f-6pixc>Wma zK~vg!>0Hh=;Fi<)euuC^-@T{$k<-jnu4Z>3{ev*3V|m)8lUHpKW7Vv%1vepB*vtgw z7_*nbYy>}&yxvJ;S`T?l!l>S5=@D%SUMKJ$6Owhnj@PH4Qh)Yj)&Vrz_$dakf`CHF zQ(^+9TmVJDbuqfx{esyLIbReO`H6g@ovu&4h~GRy8iyu5TN zURE!~OYKs;to=tXD`(EiUfzr4+n}UMqghT@pf*?LBH>=IGB&;_$O4U5^V_;ou$h)RP5Su?zWhHZ}r~H&g}l$-1I=LiWN-v7EtB6`O`Wx+Eb-;=CVHiH4 zBbM=)vl3~MRAV~Lk8Z#$FUmL@w_M3+nhTWfjYC=)OHrlu(wt*LH50C?f9P+>9&I?K z(xb}As{|FkMd_!CC0eN&#~EfEvr&wN&?A!lcbMj%@p+61mtH=@>-qeEg>LNMn_!Zs z7<^@f*@IE+ZteQ|(7QtF`!D_NW7(NQAXwt5AtFJJa&4qr{CO8Td0~Jo7cEEj0 zYSXyme0f!S;NJh{UG(bnZ`h9Gskp1C`eabtQ=v8qAxj6ygDa;`obTSn*8cg{{t^^v-2VYi(W|%s diff --git a/recruitment/migrations/__pycache__/0010_remove_candidate_name.cpython-313.pyc b/recruitment/migrations/__pycache__/0010_remove_candidate_name.cpython-313.pyc deleted file mode 100644 index fa50f3161e28e75833a1621cf7dad79bc257ce20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 727 zcmYjPy>HYo9Q`@Dq)Dz7<)gGhsDi3XB-DhVLlNr8P)a2(3&Tm4FEKe^llZU`BsL@@ zW|oS-fjoFIXozz*y|Vm*Sy?xS93ZdiT~?G_6w?}W~^At6#h$#Owz#w(dFwE&Ak$9nbx z`XEpO!b*^^6DvZZ(|3C7tA-ZqE!asXagK~;EpdgHuZ5oS-^{CAyIL4psw-$J8djII zs?}i}$459NRmL(>Q!I-n$0I&ifH9XftMZm>87{e?%3nBCry?cQ%LXOSXn_qACdD6c z7W&G=vl)z4fVDMi3aars#vd9|7_DY^Fn-U3tP57riksgV9n&hKRm!LoCOp;c(UO0p zuNW;d74R{=O-^lLENh)&ib-7yHfU-pF%~AEsqUcOMMGZFh{=+$A{q-mqG>H7qWd`^ z%~1Pfv=T|Qyp|}ApT}6tDz9W@wtX=EB+Nz41{17&riZUEalwC!Cbsp!{d_tJz`uX# z?f&w1ueSHD?r#5eY(JRT&OP_biP)Ok&q7=I*@#p*Kgb5N^R{c7L$tDo8Y%B(8{o0n k(Nw=rkdO5+u@OQyE}*CX+%9sz1(%!qKR5SpK$DsKKR$cFD*ylh diff --git a/recruitment/migrations/__pycache__/0011_alter_candidate_stage.cpython-312.pyc b/recruitment/migrations/__pycache__/0011_alter_candidate_stage.cpython-312.pyc deleted file mode 100644 index b9294cd6007e5651e618225130664a0e570a6e0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 897 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 diff --git a/recruitment/migrations/__pycache__/0012_form_formsubmission_uploadedfile.cpython-313.pyc b/recruitment/migrations/__pycache__/0012_form_formsubmission_uploadedfile.cpython-313.pyc deleted file mode 100644 index 25b721753217d7ff8755ae164f7d97328511270b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3314 zcmcgvO>Eo96{e^kQ$MyP$3L-ROLC$(mb#YYjTBT>b~lb=C$ST!YdQu}s32%@EOSGV z>X6FD?xjG19*bNG_?TmROHXxA^)W|MJhz z`9TK}1w^VB0=UE+#LxwZOAcZf5LZ9o!`)>B5b0is>ZP@r_w8%LJ#5(?wol%-_0A1H zT4sxEp5w>(%Xv@1!;hD}AIwqwqjPix;<{Mhi3`+o^_>Jn?)^BRR%ksWC~rOqn2R%= z0>n?GFh9j#<*${!pl1N|O#fd!uYa_j(-1}Pn!nMl`58bIda9M-vraYs?1Mf&>H3%j zM5?EclbX)~;-^wG&lgVBoGY_=FCOPV#qs*hOpyd1pLDMy4hTa(3u9EnE!k)w)gbXg zVQx+k6$4?RCaRJwi3SpML#!j>ThefYu(GtiMA(P-GCmR!TZSgoFanT7!c8nUM7$$B zM>`~_BP@%Gyo*TW1;U$}js#U~AmTSE<42rs7LML2BLDCSeKbH7qx2YlU0> zO+{3ngChgCYDNnqu=Po3OKd3y33WFWL<7t&4^{hG5G9F(T20DYa_?~tN4Q6VvMz`< zLw7-9{nCfJJ>cY1+ z8?vqgbuy@*js+khl89q4TuLM)Hz`ewbau8v@&IPp??I0dHN{@EXF8F|`NG*Lp*lB^)YIROZ=bR;>OZ-H@llzJ3e z4o=Tsf0n=A$X}Q8Aa2k#3ZP6(!*X3#MMa=%=ypf{r7prQ#F3nY&PWqK#p%28A5%Yr zfCRMB<7;sF3p{JD5KeFkMG#0x5a9XRQV@(Ig7BM`sL(xOHYflCtQ(4~B2^Ov?4vY> z^{>TdQ{03F5^5q1w@60rBNZyJ_VAbUZlQGdqv`89)0*hy zC1gaP2h@;jQ1AwpH(LhML6VRsxa+bGlsUV4FIM>|4eXx^rp>0Kf#WKtvm`;ER-a6!lZ0<&z zyYXkvp1EVq-1#Rr-|>5g1HXIJi7>%SHkW8~iNn~~zhWb=Uf5&V_E>h`_cm?*N-$My zjp=68IE-E1o3`WGc0Bv0X2pMDMk|N0#Or{aDzsCDH-?qEZAL#kj7{uq*@;{`kpol0 zHBIilu#-32$(skmR&vRV-am|;n)cVN=LWAla+(?TL@syjPhM$ zzMag!k*s9JjNS%8_eSmUYSRR_)S;RoXBS?l8+e!q;rJSou(N5{qT0md`+4U_tonfX32=Lx(D+0nEW LP5+01iR0scc$htv diff --git a/recruitment/migrations/__pycache__/0013_candidate_criteria_checklist_candidate_match_score_and_more.cpython-312.pyc b/recruitment/migrations/__pycache__/0013_candidate_criteria_checklist_candidate_match_score_and_more.cpython-312.pyc deleted file mode 100644 index 41656b96218afa995a964d8c6d2cfaab1d69ce1d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1250 zcmb7Dzi$&U6t*vyYwnVwaw=kIDG)VCw=@OTs!|aGQ9&8nDU0QvUy@7iNATSVx`EUI ziKQF=LQyj?^Di((s+7nhOl*-_gv5k>>CvK=3f}PiefINbzxV9V)6*7`HVnVC-xU!0 zsz`3d6L7RD!F$9I!#)ad0|#0|!$?Dq5z}@ND*)~o`KHtHKuzBR)+#=V1^nR!!6t>XbAL99+B^mBh#2#Gdfq!OrAid zL#bap&?dBRPW~McJkyhV2kU1**r(2c(PpPFh$~zTjTA0uB zip%nsIk-Iak^sU))Rvd;-XqP32bqi0?ZAs;*&34e{D?AOP0t5mx-?`SqX`Jx?czZcv&VU9XO=)<$-9@6OP!4(#gw?8oHL zUOAr9P3wH*!pN?v$lAcJ?LWLMa{dp^Lwo5jiZ?EfyM4_z-mLSRc`_T0E=<;;VJli< z+gY=+7ERJ!P+?i@Er~>FWzz9gUX@h+n|NNjaRFoe!$8fgM7f<{XVaq_j#56#DoLn`1tj>^UeU^ zSUJTgoq_(k1RsD8eC-ivXjE(HRKEe{Kn?i%Jn)UCwq+Hh;e1c#Q-d09(=DAS=<33W zNt+^0(u4^sPD32AKy4Lc{0#KxHFancP|XKa_cdzxx~EaIS=y=;!NXZz#qiDM*w*xL ztw3_G)U%|DJprQsxNChPH{jp!eg9pQD0fPeFwHu8s~;(J27EQ)*WWOC`BO-TO`854p0)3 z5OFN30VNz$f?&|WK{q0dZ_BKuod_jeF&5$$$|CL>QbVO1Oi+x4ncGr};3yR1G2%f7 zvLL0{)v3}+24qnrY{n^0+PuSDZLsb<$EcfN#xVN?Hr+{4hIvK^g#)2HA&aoY6$qbY zC{m|LZwkT|p^Qf)!AYvNL)^njh?9U|Mpeg&@XROzcPaR-iJ}fUBloyV!){ZXKkE(Nr)!IR|wm0*I?^oBpjhVLdXVmpPs(w(d z@7@1*)Z$34{p#|$nXa7|b91(8y=l-|arsTx6n40al6JZr?&SLAstrC*ReKP7OCnKT q8+64wtxH$_9spaE=G4$M?WYAa_q(;AS?`_0>81VYr5`{#Ir|s#GCR8f diff --git a/recruitment/migrations/__pycache__/0013_formfield_formstage_remove_formsubmission_form_and_more.cpython-312.pyc b/recruitment/migrations/__pycache__/0013_formfield_formstage_remove_formsubmission_form_and_more.cpython-312.pyc deleted file mode 100644 index 4c63586aecc784b7905976532eb023d0e2b8d984..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8277 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 diff --git a/recruitment/migrations/__pycache__/0014_source_jobposting_source.cpython-312.pyc b/recruitment/migrations/__pycache__/0014_source_jobposting_source.cpython-312.pyc deleted file mode 100644 index d3c978ad88fd5b1337f5f31a3547f56a7beef469..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1843 zcmZuy&2Jk;6rcU@+TJ*+?Iv;ElxC|$!1fTQ1OZYJs%e{w(gtXZpjKhE*_n7Z*$;Pi z-Nq3TAoakpH+tX?043Zxazx@{OO+DM1q7#Za+M$?PQ2N%sik%;y?I~r-f!M}GyZjQ zQb+Lp_~;M!FBPFbxiI=NL*{4|m~RnASn^R*f>rkAKxrz0+EgVZqiYB&4-i&~vXw>~ z1rY0=BGzW6E18)mTv#(@rUzb&+KCs1G1Gzw6F+u@qo9*R;V6`Nc9Ldp%2;YiO+`jT zeNiqfV{X&7rp7}F9;@)nU~NCU2Pfs`#tP0RB^{e|g+f z@L1hHu?I-`w<)(2KvKk|@8tdRXm^TvT6m08d=gKmQD?`sf(OJiP}joN>E~@*g%{|~ zyg+yMc^#g`mHktDny~CwM;Kdjv)Dat&awQ>QFowK6O=f#<0SzJ6Lx8N`NE3j*dg|? zoe;~RUP7p6TaHVdZQqNNF=JpSj%&qEM2Q7EtN<9Mtw$Z|5GH%LvC8E4u9zw-*qtPT zSOh|1HqoYDVAHO(O}Z=}^YFg6OIYC^p&L<5tk4b!Q#l2AO1-hZTdlX-z6Y=pqd{$F z+Y4L9dN)o;z&)^h^XPXb{G=h*rZWl+;=_4H4@j04cKW6w}PA3@_f8=D@D z6QkYPfPT0HFR=pnTSNbNw>;L+C6U+ESZ2ew!)=y#iQl#ovXelCJHF5IQE0*SBndQt z5})T04Um%v>ZYfcH`Rz^X3}G>nI)F9Qnh6<-GbiZj!%FuSk~Q+?ep$&36nMnF$o=y z#FW1kY~pe{2RHenK>1x|g?GJH9VTRz7m(#IyEYZ<8mhmUMqYb zCP>3ucG!xTj5k;=Jqf%zEVq8OVXb|9;|9~CHW@xeKcFMXhyJ})bEAONHf@&>T!R6t zZQFLog$amjW5ugId&FvRFJ8AqF|B8P9cq@^UCM7;O0vMj3-DMxKm!fs???khp4Ps) zG0;(d{u})ucebB9dswReUYhAu&Of|&P&wbPoc~GvWwF<^dLeyWiF?K5uvF<)%}28b zRkL3;dn=#xZil_sqTUx@4iNf4z9Szabow(Hgwp5oVd8*-(vFaJgsrZmwz`tqt_$h90^4sZEx!25B^4l_tgFXa z6+q0D%i7o1>6@df!Gu;tBbV^TlK9718g-Li05_KZ-<}RqIy<85Z}2E-sJFOd?rkxR q@6d}N@@G4q2QpA3NjlPybnZ9w>ali8(jMvu#l?Pc@oxk|8sI-zNBgY+ diff --git a/recruitment/migrations/__pycache__/0014_source_jobposting_source.cpython-313.pyc b/recruitment/migrations/__pycache__/0014_source_jobposting_source.cpython-313.pyc deleted file mode 100644 index 350f33476ffbc9b1b6871f46a11b8e17f56f2edb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1859 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 AlK=n! diff --git a/recruitment/migrations/__pycache__/0015_hiringagency_candidate_submitted_by_agency_and_more.cpython-313.pyc b/recruitment/migrations/__pycache__/0015_hiringagency_candidate_submitted_by_agency_and_more.cpython-313.pyc deleted file mode 100644 index b1ea43d2d9e97178f0a681f858c83eb3f9502e95..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2717 zcmcImO-vg{6khMz#x_5(!Tgzk4Y(wR1QU_8p{gp8!~_WWW1v!6n$_Anu{W%Do!K=6 zSCuMN>N%HIsF(KG-ZM6NJ}HIQ)1TgM&F3d@UdWx$X$W1-*DjT$G5k=qB!%&?k%tNQwx^ zy(TR?-VPn`{+h&l;>o%ao;@bqONca(*Rn*hHPf)DH*cy~w=x{a+h9XD_*rDDuQ@9d z5xIzj#H5S3*F4K@%?5nTVu46nmJjWlATZ~FuNSo--;DdJi2Q)-YyvcffC~Vw6}8Ps zfNDP#*`tqPo)HNf5r|=n`x*M1t!1SErr+3B$UitvhcM75(MVyre z024U{bKdbXcm`sKA(DO+MKR=0y3p{Xghpm0$oTmaeU73ycpEx#4l=$LTpoFQZn@(G zUHk;y*xNev4jMxj(8U=qN}LhbIGQ*ku1o(*WS1ebD4LvUVUZ;z5=KeVot;Wtq5ivv zjNfa4EkO;m5}YAL&CX-Prh`*cSFXyIStJ=OKQ+?@)3P-q+tARqd5wTLo5e^*5+G1f^J%yK&q&MTU}_YWu%BI#v%Hc35&oN3@aRx`9^6Q?cB#tD}LpdQ1tu~mvL z7&az`qQ@LLrlifH9kX*drZ{P6_@n+D)(f(YpW8Ih$b+od30EUEhPf##s!9XJg35Bl z=X_4uV6N28Qyb%nD4lB-HEbm$zLBox49W$)NEDs=Ork=LjVz!-Y%AU;8rD^dwwMKe zx%o4Sp=xYl+GQ2fdCg`aq_>C51|GM^iJJzFnMd3Cx{W|fv#IBe)8LWB z2(}7veQRkQ$DWuZ=5QBM5j)<8qqlRK6(gn&v;*%}qJ^`7-4|q>H5074#G1>jVRZWu z9*G|6lbr}&_SAD7&S(A!tn);lxfQOFyP-;cKx4N`M113~a&p7gB?w;$`(D96voDEZ?-xt^0m0u@^9@yf zL-kPfk5KoEjau(`wRilb`&GRBv0OGtrPnG4?RuzpyQkKlsP-pz&~CWAqE!0R+URt3boyod)pYsOd}Y)q2hDn@Z+om3nW#o4cH+C!mB{UKaK51&uSUjq!n-4t zNU9v1tA`@nbKl+n_Wn-1a{j$?@cMsH<=J#4k|_t(dT4NaqZXa6MyGefmFQeKc)LmU za-|ZzQ4ZeR?+S!F_WOk4srrTM^}*5Y`8O@@?v6JDo&Lc7n6uY`s&Am)J5mpg)jRuY zouk#x(I4VFE4v^4`sk-ewbW`QwOUI(uB0ByDtcvuDc?1%c9P@&%_7P8$sxL zD1mG6$}`Blj@Co5Ca>l9KL>-9xWMdI#ZSb)S@&23bJjT$<`U+T!6k!Bn_Svt=5x}L z1l>bvopmK?!OenLbn_slhdRAqE|U4f<4$;KKj-hHnx5qU%_a{?Ol~kr`j6(F0&{AL z^M%otyINpC-v_*GKO{>a0)+%C3eCRca=8w?f@}D9;o_g(xXb$@Pz%N@!T4VS2#$k) E0lvY@4*&oF diff --git a/recruitment/migrations/__pycache__/0016_alter_source_options_hiringagency_address_and_more.cpython-312.pyc b/recruitment/migrations/__pycache__/0016_alter_source_options_hiringagency_address_and_more.cpython-312.pyc deleted file mode 100644 index a5f483724748c2c7982fb6fa02440e4fe92471fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2610 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 diff --git a/recruitment/migrations/__pycache__/0017_alter_jobposting_hiring_agency.cpython-313.pyc b/recruitment/migrations/__pycache__/0017_alter_jobposting_hiring_agency.cpython-313.pyc deleted file mode 100644 index 4ec6bb95cb045105414d27b11fecaed10aa9407f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1028 zcmZuvO-~a+7@qy;(r(*`1tT${t8$ya{PZ2gBAZ#5N`_4FNa=)~4Sy*kmUbxXp-BfNjYzvx(JeJDo z@_mq{{_U?h$V$T&57Bs(C2MWBZ$LPN7^(BQH02keNV7!e+$0 zLoU4RAxQLEP%aE;%4B9wJE8OhkC?Kdy6i7ZAzhh<)33hGzIbov7CCe;z3s}<31fdI5ONp_nMPsEVy@i*OIRF0uRaK3-!ot>uJG(SK`@r>?S(VEZ zHlCJygvb;or$uO*im=&(rVt|LA#n&BDe8B4m-(UW(lGK9!H-xgl|F@iOlhwJdD5S1 zm_HdsA4pyskvySoMDU2UmE=t50m%+6NDRjpG;mM}8w1OncRuY5TvVF7EG}LY7q9L= zySnRL)fO&m%NMofpD#`Z2yK}=CS32$V}13_ZR-}HxrTK+W0%~4<|>Br@pVqchIj(10b4$VV_+GE@z+5{{kKywoUiWX?9#8< Kr9TLiEc+iWP$s|t diff --git a/recruitment/migrations/__pycache__/0018_alter_jobposting_hiring_agency.cpython-312.pyc b/recruitment/migrations/__pycache__/0018_alter_jobposting_hiring_agency.cpython-312.pyc deleted file mode 100644 index a339fa62e2f3d2432a20760523060211ef303cce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 972 zcmah{%}*0S6n`_jUAjxFSWPrhbQ1_+FD#z)V9>^h#sCLJLmJIy+8MfA_M^^jm2%RA zgGX-s0bVrlpLpT~nJXu6O~9CVa%Q(p;p8MU@Ap3EH}B2QYSjX{R=%D3bqsK-l+h{; z!P$}o`#^!B5F*q-5pG}v7@h;gyFfLDI>snzEDy8-H?+R)lzu72!NQ7yHYZt-#Hlc% zgt9PgjdK7dhsv2R!9Fl(APNmkQ5!Wh3{3CjgfFImq(PO>=v=vMR~pr6i5hf*mJiK? z;gb%n5jk14+@EwR!dxBkk|ZZNYw=!?MJ&$5%;Mtx2ObGC#=TC`>?Uaz#BI+HxDuqz z;#OZ+V~?m_a;@*wpKZ(Bn1pr_Y;%@&<@9erwWo$bW70yCgnR+pan7~;g zDjykdCMnA;jwVN=#!>k7JgT%Au#m1frYL*4-SdRyc`~jSGKnjm_n}8Z6{|GLx-6!$ z9|23bn!d2=s%^`v3fGn4>MDu*>xnvZtFV$T8~%qMaHa0J%Ws%86S^HC}zQrD;7m$-MV_f9K76uU{&;2+r3Z7p;np(1j9)$GQgn zbpR(QM4|Q)ZE8&0)S2#~IkbR6{SFF^npU-kK_mXa7+_{JP2ajyg0D-r9XA;fah7sv zx3h>QyfKPFsCX^(BLF9;hL{#2riU6cLOsx!S+lA`pRqV7#R$#XM0I*hc@4p4g?2a* z7D6X<*Q{`I&45f!SY&Rqlwg7T;4=&p6FBz5%mQ^BCC8+{@aFX%c-$+y101;M{_-bTJ0cZbAVUF@D!2 ziSh<%3gf+)agoF+O*3VVXosc|v?!*Wsg00sMRjsRC1$2lOl^_$XeU!N*Gf0*(BY2E zV$22XO9K-jSX}QyZ!l)F5ZH%{Bnetsn+7p&lQ;=FEZe6I!2<&KfRJtr;&?FDw_vn@ z0Sxxhe+IkKIbv!la-sm=1@am7Y~(!Y8Tu{z6`=Q##Q;Nt@Y9 zRL?t?cWY3L`u@Pz10)NN2lH5G3m|H6`CTAAL({ZBHq!iGc2TpxxM$N#Kc|;|BM|cF Ezi_i7B>(^b diff --git a/recruitment/migrations/__pycache__/0019_merge_20251006_1224.cpython-312.pyc b/recruitment/migrations/__pycache__/0019_merge_20251006_1224.cpython-312.pyc deleted file mode 100644 index 7591704921d19d8ca8d1cd227ddc8554f7588415..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 606 zcmYjPF>ljA6n`5R#KhT76yEUO_nqJS?mpjr+uilS#-Fd(=_vuYuE{34Yp{B5 z!4+`eBnLraLcoESz@1CrE|OViGq9~++!n{qq7!s~)g&Os7g?fMnaM&=w!L80+F0GQ z^$HMT!Xb7z;ZEYjZUS*<;RYSkKikX)j=809qN=PESd`{CiiVHrR4OseFy{@@B}2NeUJeV(3eOFDYo#^{EUBc3X{#)|1 zce3odcfAjAck^p0DXCu+}9`%FMT euxaTMLT)@D4}W_-;(hXe4EDbd_HV$FX8Iq#-=HP{ diff --git a/recruitment/migrations/__pycache__/0019_merge_20251006_1224.cpython-313.pyc b/recruitment/migrations/__pycache__/0019_merge_20251006_1224.cpython-313.pyc deleted file mode 100644 index 180c2e83e8299b9d078f9e5c650edea02ec2aa17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 673 zcmYjPO>fgc5S_IXH!)OHg-U=p6zIj5Itdg3s`>*0^nfMAq0(p*Z=4ObH_Wb)dP73u z%%u{4fgi#T-~`%hPrXG7y|d1T!b&^)o_FSH{ATCd+ab91{paPl&j2oKvR=&R8}VxVTypdf2Tfo;E8>s$q{BJ%7F5<{w_DMV@Pai`OLf+I!6 zNQyjNAZ>UikVK(AiRFiCP)My^FAIviOtDZTB9FG5rhV*0o+HnVAe^YdRB0p249Ak{ z!-U{TtD9ShBT3rivJ|DNuTwDO^Xpm2 zc7rc{+Fj?KM!s#Q6JBQOFda}m_N7qW?=tPSL$-CibmoNi9Ca@Z^aB@WK4a`U0QT^2 U&|<;2@b}KaubqQyaAZ;a49M`+V=a_uhA2Y;8Fp*V{k8r!E5crAW7WE3kMW!6k$c zqSr7)6g`1Gcm|>N2ts{~E{smFexK+qrdn#ay=z5WB%C5kX~eUtWbrx|pgUl3Ccj?7 z7$^#XY9XR}sCkGQwiTVV$*(y`&E%mA@9S$1*fJLg>Z>^z@(UAoHtpwSDk? L```v7S*rg7^Y)`` diff --git a/recruitment/migrations/__pycache__/0021_source_api_key_source_api_secret_source_description_and_more.cpython-313.pyc b/recruitment/migrations/__pycache__/0021_source_api_key_source_api_secret_source_description_and_more.cpython-313.pyc deleted file mode 100644 index 53f32bd32b409210e66848272a55ee93cbc593be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4812 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 g=H)UnG)?<{9 diff --git a/recruitment/migrations/__pycache__/0023_alter_jobposting_application_url_and_more.cpython-313.pyc b/recruitment/migrations/__pycache__/0023_alter_jobposting_application_url_and_more.cpython-313.pyc deleted file mode 100644 index fbfeec0f848455d689aacf089b6e1d97a8b55a66..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1265 zcmaJ&&tCA@(PsYc`7iM?U=!OU!% zaH>>^b5#jd{RZ$Y_y`G?MAJhLaA+=-kwIMf&#tW?f;!U7{GY%7bJA>j2+mLcy&nB- zBJ@f#vs0TAliNT%MF9$oHN*}0%{6n?;?}Co?JhcpmQY|Vpupa+`X$;7p!%;{)z51~ zqgOlB%#S@&c}YCvM8;Vvl#^r;Wg@H$t9Ne7O#TJpDcUF_b2Biw6_~!k?TuQ0{$q!V z*113?^?v)ax?11_wGFp_`na}#<}2BHsw=D|XOWvHm9$7cyBmjsaPE!CWxE zVrqZi#&9Z5%Fe_5YcOEwbQbaN7 z-sEHulf$SgrykKwQZNZfWE(S@4&~@MtVCNia0!dC@-T)l1*1UEWBjNfOosxlh4E(0 zg=BF`(@d))n$t9*X&6(%^{y%Jrf$z|ofWsWpaFH4ta73)k`6OvhZ(25rIqubyg#c@ zx!;dS<*K|ar?Ukx7Pxv1V(mz^%A4dB1bfib)!=FqK!@!^^oG#}(+<}ngqgO=y16y7GE|N56)gXIJtDtIrpdkhyTpp{bqgl0p3l-ezLunY`;e+HEx-2s;}hk zR@_|^3QLW^93zw%>sol~p82M3yWXehmjHdgv-GmF^z6GAVz0ASSvBW6&Tp&y%UP~H zN1dtKzpT5ze6&{lBG@Q*s*DEZ7|YRBmFhNEIA3YQ#<$gS+~7T64Y)!Bj4i`3CJr(# Z{DZE%bxs=2@7{j<@?QJ$I|NJ#@B#G~PNM(- diff --git a/recruitment/migrations/__pycache__/0024_fieldresponse_created_at_fieldresponse_slug_and_more.cpython-313.pyc b/recruitment/migrations/__pycache__/0024_fieldresponse_created_at_fieldresponse_slug_and_more.cpython-313.pyc deleted file mode 100644 index f5967821110625cb9c7ce0b57ccdfad4582ba3fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4902 zcmdT|OK%%h6rLH|U zZXzLb@VWQbpKFf?IqnbEsedASjolBR@hzuvDu0V3y#E&V-XRi(zHlqDC=zioN}}W3 zFgL-ep>v!XUJ-LWb!7+d>!F}cq#~b+Y_rb0DS^r*qewK@uq}s*C0oa)Q#cUfxbeNt z?r#!9v*IHmg36PSDr9&PUWw%5jRHZNVF4u3R!CqjvJ%VnH%sM!i|0SN;payil~-Oc zSBly>t`xOBuKHduSA8Ais;^D1`d=_t{T<}0zfG9>*0B>~z1-}R;OPU$MGVNh z=l3(&QSv7}*VghQZQ36_nS5rL45$~#U~xQkk;dMs*Ff7bAO)(TGXxiiXSgM7xio$4 z+H0>P&2%wA>vq0uJFa0Bkyb97M!_$gkVj0USvo4&1k=Q-flZxYrwm0ErgDK`&BZ#> z+@%e9Ht39NZYo6Mn&;ZcvL7K$*J)J8tD0xJH2x5iyzO9QX(han3PX{`3Nyb;!)%a7 zd>gc<3}!HSh*4cO?3iA08)`LC4KKnfN7Bp0Wv{I7;ogv!gEoULP^k{vm!z>(o0I}Pe$#QaBBotz)ba8q!*QUx zq;b}Faj9&AQW^pxw|QnJ!NyU2Vq>s@`SbzXsW3^f)iK+Gt(q8A#0h4q^nez@wP}}O zxp=RdHSHo*oHdPL{g7eNu{~12DS@!6)!)GPPzVoE3Hgc;qB4SW)IAeJJC4u;Pcs?k z(CbEM)gX>*8Wy%}Hm&0_wsdS24D1kAVN+>Z*B5*T2>aWc1B^=soFf~fqQ0(KMVm%E z*DxI_xiGU~TR;eS0qqTD5&p!*7Guq!f}W?MPp(6|bKqlkX%==BXiL0j;Uya$L09sb zVPr>Vr`6f%xp^v2Gq(+P7;0%J?3^qF1E<;goJ+atJ^y=7wfA^BTuA}+EB9AJ62PMt4i{TlKf$AGx_V4 zU#?VV?o?*(RA=s1X6|mSKddN^YGV`6Vv(4<6F)3FR8w98*@}{^DpxDY)v9u%qTJY= z+fqN=((+sP?H!K$lAjm0lpE0MTM(W_!=UA81mVqWMR~t@)kGUOLG~1I9!Btg$9bs@ zK0)>r_&ki@C_Z1V^$za)=XVc&T=@CsPdBUC+m-C?YIeDjU9M*DRkHWC%+J8TriG7$ zXW(WZ3oZQ>be#_F)6vp!?~dC2E2n}Ow4A`!g;TKwT8_0f_Cy-14Z%q?teV^WyrL{M z-uYImnmGzq9rmN6bRFiPag`JLf>*?^7s*@oz?q8Cvq2(B>-lu>pH8}-8px|Gx)1El z`&lTxpM*x5@(m3j75xiJ-T&MG diff --git a/recruitment/migrations/__pycache__/__init__.cpython-311.pyc b/recruitment/migrations/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 6c581a176de2ff14374f22f091f6a55daeca4d6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 179 zcmZ3^%ge<81RcCu86f&Gh=2h`DC095kTIPhg&~+hlhJP_LlF~@{~09t%S}JDIJKx) zKR2 diff --git a/recruitment/migrations/__pycache__/__init__.cpython-313.pyc b/recruitment/migrations/__pycache__/__init__.cpython-313.pyc index f41c21065ada0a9725ccb7e7a4f0f176cd67ccfb..b67d53b93f0a33df30615d946798251409282d7f 100644 GIT binary patch delta 19 ZcmZ3^xSWyuGcPX}0}v>8J)g)u2LLeG1wQ}) delta 19 ZcmZ3^xSWyuGcPX}0}xzme>RbO4gfUw1?~U< diff --git a/recruitment/models.py b/recruitment/models.py index 40ede85..4b3a97b 100644 --- a/recruitment/models.py +++ b/recruitment/models.py @@ -11,8 +11,10 @@ from django.urls import reverse class Profile(models.Model): - profile_image=models.ImageField(null=True,blank=True,upload_to='profile_pic/') - user=models.OneToOneField(User,on_delete=models.CASCADE,related_name='profile') + profile_image = models.ImageField(null=True, blank=True, upload_to="profile_pic/") + user = models.OneToOneField(User, on_delete=models.CASCADE, related_name="profile") + + class Base(models.Model): created_at = models.DateTimeField(auto_now_add=True, verbose_name=_("Created at")) updated_at = models.DateTimeField(auto_now=True, verbose_name=_("Updated at")) @@ -105,8 +107,9 @@ class JobPosting(Base): # Status Fields STATUS_CHOICES = [ ("DRAFT", "Draft"), - ("PUBLISHED", "Published"), + ("ACTIVE", "Active"), ("CLOSED", "Closed"), + ("CANCELLED", "Cancelled"), ("ARCHIVED", "Archived"), ] status = models.CharField( @@ -165,6 +168,18 @@ class JobPosting(Base): "External agency responsible for sourcing candidates for this role" ), ) + cancel_reason = models.TextField( + blank=True, + help_text=_("Reason for canceling the job posting"), + verbose_name=_("Cancel Reason"), + ) + cancelled_by = models.CharField( + max_length=100, + blank=True, + help_text=_("Name of person who cancelled this job"), + verbose_name=_("Cancelled By"), + ) + cancelled_at = models.DateTimeField(null=True, blank=True) class Meta: ordering = ["-created_at"] @@ -197,7 +212,7 @@ class JobPosting(Base): else: next_num = 1 - self.internal_job_id = f"{prefix}-{year}-{next_num:04d}" + self.internal_job_id = f"{prefix}-{year}-{next_num:06d}" super().save(*args, **kwargs) @@ -260,8 +275,11 @@ class Candidate(Base): last_name = models.CharField(max_length=255, verbose_name=_("Last Name")) email = models.EmailField(verbose_name=_("Email")) phone = models.CharField(max_length=20, verbose_name=_("Phone")) - address = models.TextField(max_length=200,verbose_name=_("Address")) + address = models.TextField(max_length=200, verbose_name=_("Address")) resume = models.FileField(upload_to="resumes/", verbose_name=_("Resume")) + is_resume_parsed = models.BooleanField( + default=False, verbose_name=_("Resume Parsed") + ) parsed_summary = models.TextField(blank=True, verbose_name=_("Parsed Summary")) applied = models.BooleanField(default=False, verbose_name=_("Applied")) stage = models.CharField( @@ -331,6 +349,7 @@ class Candidate(Base): if self.resume: return self.resume.size return 0 + def clean(self): """Validate stage transitions""" # Only validate if this is an existing record (not being created) @@ -376,6 +395,14 @@ class Candidate(Base): old_stage = self.__class__.objects.get(pk=self.pk).stage return self.STAGE_SEQUENCE.get(old_stage, []) + @property + def submission(self): + return FormSubmission.objects.filter(template__job=self.job).first() + @property + def responses(self): + if self.submission: + return self.submission.responses.all() + return [] def __str__(self): return self.full_name @@ -449,7 +476,7 @@ class FormTemplate(Base): User, on_delete=models.CASCADE, related_name="form_templates" ) is_active = models.BooleanField( - default=True, help_text="Whether this template is active" + default=False, help_text="Whether this template is active" ) class Meta: @@ -595,6 +622,9 @@ class FormField(Base): if self.order < 0: raise ValidationError("Order must be a positive integer") + def __str__(self): + return f"{self.stage.template.name} - {self.stage.name} - {self.label}" + class FormSubmission(Base): """ @@ -658,16 +688,19 @@ class FieldResponse(Base): if self.uploaded_file: return True return False + @property def get_file(self): if self.is_file: return self.uploaded_file return None + @property def get_file_size(self): if self.is_file: return self.uploaded_file.size return 0 + @property def display_value(self): """Return a human-readable representation of the response value""" @@ -885,9 +918,7 @@ class InterviewSchedule(Base): job = models.ForeignKey( JobPosting, on_delete=models.CASCADE, related_name="interview_schedules" ) - candidates = models.ManyToManyField( - Candidate, related_name="interview_schedules" - ) + candidates = models.ManyToManyField(Candidate, related_name="interview_schedules") start_date = models.DateField(verbose_name=_("Start Date")) end_date = models.DateField(verbose_name=_("End Date")) working_days = models.JSONField( @@ -895,9 +926,7 @@ class InterviewSchedule(Base): ) # Store days of week as [0,1,2,3,4] for Mon-Fri start_time = models.TimeField(verbose_name=_("Start Time")) end_time = models.TimeField(verbose_name=_("End Time")) - breaks = models.ManyToManyField( - BreakTime, blank=True, related_name="schedules" - ) + breaks = models.ManyToManyField(BreakTime, blank=True, related_name="schedules") interview_duration = models.PositiveIntegerField( verbose_name=_("Interview Duration (minutes)") ) diff --git a/recruitment/signals.py b/recruitment/signals.py index 89ec37c..2c6edb1 100644 --- a/recruitment/signals.py +++ b/recruitment/signals.py @@ -24,6 +24,8 @@ import asyncio @receiver(post_save, sender=models.Candidate) def score_candidate_resume(sender, instance, created, **kwargs): + if instance.is_resume_parsed: + return try: # Get absolute file path file_path = instance.resume.path @@ -108,12 +110,12 @@ def score_candidate_resume(sender, instance, created, **kwargs): instance.weaknesses = result1.get('weaknesses', '') instance.criteria_checklist = result1.get('criteria_checklist', {}) - + instance.is_resume_parsed = True # Save only scoring-related fields to avoid recursion instance.save(update_fields=[ 'match_score', 'strengths', 'weaknesses', - 'criteria_checklist','parsed_summary' + 'criteria_checklist','parsed_summary', 'is_resume_parsed' ]) logger.info(f"Successfully scored resume for candidate {instance.id}") diff --git a/recruitment/utils.py b/recruitment/utils.py index fdfa198..d925ad8 100644 --- a/recruitment/utils.py +++ b/recruitment/utils.py @@ -535,4 +535,19 @@ def get_available_time_slots(schedule, breaks=None): current_date += timedelta(days=1) print(f"Total slots generated: {len(slots)}") - return slots \ No newline at end of file + return slots + + + +def json_to_markdown_table(data_list): + if not data_list: + return "" + + headers = data_list[0].keys() + markdown = "| " + " | ".join(headers) + " |\n" + markdown += "| " + " | ".join(["---"] * len(headers)) + " |\n" + + for row in data_list: + values = [str(row.get(header, "")) for header in headers] + markdown += "| " + " | ".join(values) + " |\n" + return markdown \ No newline at end of file diff --git a/recruitment/views.py b/recruitment/views.py index 9ab9d48..794ce67 100644 --- a/recruitment/views.py +++ b/recruitment/views.py @@ -11,17 +11,40 @@ from django.db.models import Q from django.urls import reverse from django.conf import settings from django.utils import timezone -from .forms import ZoomMeetingForm,JobPostingForm,FormTemplateForm,InterviewScheduleForm,BreakTimeFormSet +from .forms import ( + ZoomMeetingForm, + JobPostingForm, + FormTemplateForm, + InterviewScheduleForm, + BreakTimeFormSet, +) from rest_framework import viewsets from django.contrib import messages from django.core.paginator import Paginator from .linkedin_service import LinkedInService from .serializers import JobPostingSerializer, CandidateSerializer from django.shortcuts import get_object_or_404, render, redirect -from django.views.generic import CreateView,UpdateView,DetailView,ListView -from .utils import create_zoom_meeting, delete_zoom_meeting, update_zoom_meeting,schedule_interviews,get_available_time_slots +from django.views.generic import CreateView, UpdateView, DetailView, ListView +from .utils import ( + create_zoom_meeting, + delete_zoom_meeting, + update_zoom_meeting, + schedule_interviews, + get_available_time_slots, +) from django.views.decorators.csrf import ensure_csrf_cookie -from .models import FormTemplate, FormStage, FormField,FieldResponse,FormSubmission,InterviewSchedule,BreakTime, ZoomMeeting, Candidate, JobPosting +from .models import ( + FormTemplate, + FormStage, + FormField, + FieldResponse, + FormSubmission, + InterviewSchedule, + BreakTime, + ZoomMeeting, + Candidate, + JobPosting, +) import logging from datastar_py.django import ( DatastarResponse, @@ -29,13 +52,14 @@ from datastar_py.django import ( read_signals, ) -logger=logging.getLogger(__name__) +logger = logging.getLogger(__name__) class JobPostingViewSet(viewsets.ModelViewSet): queryset = JobPosting.objects.all() serializer_class = JobPostingSerializer + class CandidateViewSet(viewsets.ModelViewSet): queryset = Candidate.objects.all() serializer_class = CandidateSerializer @@ -43,9 +67,9 @@ class CandidateViewSet(viewsets.ModelViewSet): class ZoomMeetingCreateView(CreateView): model = ZoomMeeting - template_name = 'meetings/create_meeting.html' + template_name = "meetings/create_meeting.html" form_class = ZoomMeetingForm - success_url = '/' + success_url = "/" def form_valid(self, form): instance = form.save(commit=False) @@ -53,82 +77,85 @@ class ZoomMeetingCreateView(CreateView): topic = instance.topic if instance.start_time < timezone.now(): messages.error(self.request, "Start time must be in the future.") - return redirect('/create-meeting/', status=400) + return redirect("/create-meeting/", status=400) start_time = instance.start_time.isoformat() + "Z" duration = instance.duration result = create_zoom_meeting(topic, start_time, duration) if result["status"] == "success": - instance.meeting_id = result['meeting_details']['meeting_id'] - instance.join_url = result['meeting_details']['join_url'] - instance.host_email = result['meeting_details']['host_email'] - instance.zoom_gateway_response = result['zoom_gateway_response'] + instance.meeting_id = result["meeting_details"]["meeting_id"] + instance.join_url = result["meeting_details"]["join_url"] + instance.host_email = result["meeting_details"]["host_email"] + instance.zoom_gateway_response = result["zoom_gateway_response"] instance.save() messages.success(self.request, result["message"]) - return redirect('/', status=201) + return redirect("/", status=201) else: messages.error(self.request, result["message"]) - return redirect('/', status=400) + return redirect("/", status=400) except Exception as e: - return redirect('/', status=500) + return redirect("/", status=500) + class ZoomMeetingListView(ListView): model = ZoomMeeting - template_name = 'meetings/list_meetings.html' - context_object_name = 'meetings' + template_name = "meetings/list_meetings.html" + context_object_name = "meetings" paginate_by = 10 def get_queryset(self): - queryset = super().get_queryset().order_by('-start_time') + queryset = super().get_queryset().order_by("-start_time") # Handle search - search_query = self.request.GET.get('search', '') + search_query = self.request.GET.get("search", "") if search_query: queryset = queryset.filter( - Q(topic__icontains=search_query) | - Q(meeting_id__icontains=search_query) + Q(topic__icontains=search_query) | Q(meeting_id__icontains=search_query) ) return queryset def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) - context['search_query'] = self.request.GET.get('search', '') + context["search_query"] = self.request.GET.get("search", "") return context + class ZoomMeetingDetailsView(DetailView): model = ZoomMeeting - template_name = 'meetings/meeting_details.html' - context_object_name = 'meeting' + template_name = "meetings/meeting_details.html" + context_object_name = "meeting" + class ZoomMeetingUpdateView(UpdateView): model = ZoomMeeting form_class = ZoomMeetingForm - context_object_name = 'meeting' - template_name = 'meetings/update_meeting.html' - success_url = '/' + context_object_name = "meeting" + template_name = "meetings/update_meeting.html" + success_url = "/" def form_valid(self, form): instance = form.save(commit=False) updated_data = { - 'topic': instance.topic, - 'start_time': instance.start_time.isoformat() + "Z", - 'duration': instance.duration + "topic": instance.topic, + "start_time": instance.start_time.isoformat() + "Z", + "duration": instance.duration, } if instance.start_time < timezone.now(): messages.error(self.request, "Start time must be in the future.") - return redirect(f'/update-meeting/{instance.pk}/', status=400) + return redirect(f"/update-meeting/{instance.pk}/", status=400) result = update_zoom_meeting(instance.meeting_id, updated_data) if result["status"] == "success": instance.save() messages.success(self.request, result["message"]) - return redirect(reverse('meeting_details', kwargs={'pk': instance.pk})) + return redirect(reverse("meeting_details", kwargs={"pk": instance.pk})) else: messages.error(self.request, result["message"]) - return redirect(reverse('meeting_details', kwargs={'pk': instance.pk})) + return redirect(reverse("meeting_details", kwargs={"pk": instance.pk})) + def ZoomMeetingDeleteView(request, pk): meeting = get_object_or_404(ZoomMeeting, pk=pk) @@ -140,13 +167,13 @@ def ZoomMeetingDeleteView(request, pk): messages.success(request, result["message"]) else: messages.error(request, result["message"]) - return redirect('/') + return redirect("/") except Exception as e: messages.error(request, str(e)) - return redirect('/') + return redirect("/") -#Job Posting +# Job Posting # def job_list(request): # """Display the list of job postings order by creation date descending""" # jobs=JobPosting.objects.all().order_by('-created_at') @@ -154,7 +181,7 @@ def ZoomMeetingDeleteView(request, pk): # # Filter by status if provided # print(f"the request is: {request} ") # status=request.GET.get('status') -# print(f"DEBUG: Status filter received: {status}") +# print(f"DEBUG: Status filter received: {status}") # if status: # jobs=jobs.filter(status=status) @@ -170,147 +197,159 @@ def ZoomMeetingDeleteView(request, pk): def create_job(request): """Create a new job posting""" - - if request.method=='POST': - form=JobPostingForm(request.POST,is_anonymous_user=not request.user.is_authenticated) - #to check user is authenticated or not + if request.method == "POST": + form = JobPostingForm( + request.POST, is_anonymous_user=not request.user.is_authenticated + ) + # to check user is authenticated or not if form.is_valid(): try: - job=form.save(commit=False) + job = form.save(commit=False) if request.user.is_authenticated: - job.created_by=request.user.get_full_name() or request.user.username + job.created_by = ( + request.user.get_full_name() or request.user.username + ) else: - job.created_by=request.POST.get('created_by','').strip() + job.created_by = request.POST.get("created_by", "").strip() if not job.created_by: - job.created_by="University Administrator" + job.created_by = "University Administrator" job.save() - messages.success(request,f'Job "{job.title}" created successfully!') - return redirect('job_list') + messages.success(request, f'Job "{job.title}" created successfully!') + return redirect("job_list") except Exception as e: logger.error(f"Error creating job: {e}") - messages.error(request,f"Error creating job: {e}") + messages.error(request, f"Error creating job: {e}") else: - messages.error(request, f'Please correct the errors below.{form.errors}') + messages.error(request, f"Please correct the errors below.{form.errors}") else: - form=JobPostingForm(is_anonymous_user=not request.user.is_authenticated) - return render(request,'jobs/create_job.html',{'form':form}) + form = JobPostingForm(is_anonymous_user=not request.user.is_authenticated) + return render(request, "jobs/create_job.html", {"form": form}) - - -def edit_job(request,slug): +def edit_job(request, slug): """Edit an existing job posting""" - if request.method=='POST': - job=get_object_or_404(JobPosting,slug=slug) - form=JobPostingForm(request.POST,instance=job,is_anonymous_user=not request.user.is_authenticated) + if request.method == "POST": + job = get_object_or_404(JobPosting, slug=slug) + form = JobPostingForm( + request.POST, + instance=job, + is_anonymous_user=not request.user.is_authenticated, + ) if form.is_valid(): try: - job=form.save(commit=False) + job = form.save(commit=False) if request.user.is_authenticated: - job.created_by=request.user.get_full_name() or request.user.username + job.created_by = ( + request.user.get_full_name() or request.user.username + ) else: - job.created_by=request.POST.get('created_by','').strip() + job.created_by = request.POST.get("created_by", "").strip() if not job.created_by: - job.created_by="University Administrator" + job.created_by = "University Administrator" job.save() - messages.success(request,f'Job "{job.title}" updated successfully!') - return redirect('job_list') + messages.success(request, f'Job "{job.title}" updated successfully!') + return redirect("job_list") except Exception as e: logger.error(f"Error updating job: {e}") - messages.error(request,f"Error updating job: {e}") + messages.error(request, f"Error updating job: {e}") else: - messages.error(request, 'Please correct the errors below.') + messages.error(request, "Please correct the errors below.") else: - job=get_object_or_404(JobPosting,slug=slug) - form=JobPostingForm(instance=job,is_anonymous_user=not request.user.is_authenticated) - return render(request,'jobs/edit_job.html',{'form':form,'job':job}) + job = get_object_or_404(JobPosting, slug=slug) + form = JobPostingForm( + instance=job, is_anonymous_user=not request.user.is_authenticated + ) + return render(request, "jobs/edit_job.html", {"form": form, "job": job}) + def job_detail(request, slug): """View details of a specific job""" job = get_object_or_404(JobPosting, slug=slug) # Get all candidates for this job, ordered by most recent - candidates = job.candidates.all().order_by('-created_at') + candidates = job.candidates.all().order_by("-created_at") # Count candidates by stage for summary statistics total_candidates = candidates.count() - applied_count = candidates.filter(stage='Applied').count() - interview_count = candidates.filter(stage='Interview').count() - offer_count = candidates.filter(stage='Offer').count() + applied_count = candidates.filter(stage="Applied").count() + interview_count = candidates.filter(stage="Interview").count() + offer_count = candidates.filter(stage="Offer").count() context = { - 'job': job, - 'candidates': candidates, - 'total_candidates': total_candidates, - 'applied_count': applied_count, - 'interview_count': interview_count, - 'offer_count': offer_count, + "job": job, + "candidates": candidates, + "total_candidates": total_candidates, + "applied_count": applied_count, + "interview_count": interview_count, + "offer_count": offer_count, } - return render(request, 'jobs/job_detail.html', context) + return render(request, "jobs/job_detail.html", context) # job detail facing the candidate: -def job_detail_candidate(request,slug): - job=get_object_or_404(JobPosting,slug=slug) - return render(request,'jobs/job_detail_candidate.html',{'job':job}) +def job_detail_candidate(request, slug): + job = get_object_or_404(JobPosting, slug=slug) + return render(request, "jobs/job_detail_candidate.html", {"job": job}) -def post_to_linkedin(request,slug): + +def post_to_linkedin(request, slug): """Post a job to LinkedIn""" - job=get_object_or_404(JobPosting,slug=slug) - if job.status!='ACTIVE': - messages.info(request,'Only active jobs can be posted to LinkedIn.') - return redirect('job_list') + job = get_object_or_404(JobPosting, slug=slug) + if job.status != "ACTIVE": + messages.info(request, "Only active jobs can be posted to LinkedIn.") + return redirect("job_list") - if request.method=='POST': + if request.method == "POST": try: # Check if user is authenticated with LinkedIn - if 'linkedin_access_token' not in request.session: - messages.error(request,'Please authenticate with LinkedIn first.') - return redirect('linkedin_login') + if "linkedin_access_token" not in request.session: + messages.error(request, "Please authenticate with LinkedIn first.") + return redirect("linkedin_login") # Clear previous LinkedIn data for re-posting - job.posted_to_linkedin=False - job.linkedin_post_id='' - job.linkedin_post_url='' - job.linkedin_post_status='' - job.linkedin_posted_at=None + job.posted_to_linkedin = False + job.linkedin_post_id = "" + job.linkedin_post_url = "" + job.linkedin_post_status = "" + job.linkedin_posted_at = None job.save() # Initialize LinkedIn service - service=LinkedInService() - service.access_token=request.session['linkedin_access_token'] + service = LinkedInService() + service.access_token = request.session["linkedin_access_token"] # Post to LinkedIn - result=service.create_job_post(job) - if result['success']: + result = service.create_job_post(job) + if result["success"]: # Update job with LinkedIn info - job.posted_to_linkedin=True - job.linkedin_post_id=result['post_id'] - job.linkedin_post_url=result['post_url'] - job.linkedin_post_status='SUCCESS' - job.linkedin_posted_at=timezone.now() + job.posted_to_linkedin = True + job.linkedin_post_id = result["post_id"] + job.linkedin_post_url = result["post_url"] + job.linkedin_post_status = "SUCCESS" + job.linkedin_posted_at = timezone.now() job.save() - messages.success(request,'Job posted to LinkedIn successfully!') + messages.success(request, "Job posted to LinkedIn successfully!") else: - error_msg=result.get('error','Unknown error') - job.linkedin_post_status=f'ERROR: {error_msg}' + error_msg = result.get("error", "Unknown error") + job.linkedin_post_status = f"ERROR: {error_msg}" job.save() - messages.error(request,f'Error posting to LinkedIn: {error_msg}') + messages.error(request, f"Error posting to LinkedIn: {error_msg}") except Exception as e: logger.error(f"Error in post_to_linkedin: {e}") - job.linkedin_post_status = f'ERROR: {str(e)}' + job.linkedin_post_status = f"ERROR: {str(e)}" job.save() - messages.error(request, f'Error posting to LinkedIn: {e}') + messages.error(request, f"Error posting to LinkedIn: {e}") + + return redirect("job_detail", slug=job.slug) - return redirect('job_detail', slug=job.slug) def linkedin_login(request): """Redirect to LinkedIn OAuth""" - service=LinkedInService() - auth_url=service.get_auth_url() + service = LinkedInService() + auth_url = service.get_auth_url() """ It creates a special URL that: Sends the user to LinkedIn to log in @@ -323,31 +362,31 @@ def linkedin_login(request): def linkedin_callback(request): """Handle LinkedIn OAuth callback""" - code=request.GET.get('code') + code = request.GET.get("code") if not code: - messages.error(request,'No authorization code received from LinkedIn.') - return redirect('job_list') + messages.error(request, "No authorization code received from LinkedIn.") + return redirect("job_list") try: - service=LinkedInService() - #get_access_token(code)->It makes a POST request to LinkedIn’s token endpoint with parameters - access_token=service.get_access_token(code) - request.session['linkedin_access_token']=access_token - request.session['linkedin_authenticated']=True + service = LinkedInService() + # get_access_token(code)->It makes a POST request to LinkedIn’s token endpoint with parameters + access_token = service.get_access_token(code) + request.session["linkedin_access_token"] = access_token + request.session["linkedin_authenticated"] = True settings.LINKEDIN_IS_CONNECTED = True - messages.success(request,'Successfully authenticated with LinkedIn!') + messages.success(request, "Successfully authenticated with LinkedIn!") except Exception as e: logger.error(f"LinkedIn authentication error: {e}") - messages.error(request,f'LinkedIn authentication failed: {e}') + messages.error(request, f"LinkedIn authentication failed: {e}") - return redirect('job_list') + return redirect("job_list") -#applicant views -def applicant_job_detail(request,slug): +# applicant views +def applicant_job_detail(request, slug): """View job details for applicants""" - job=get_object_or_404(JobPosting,slug=slug,status='ACTIVE') - return render(request,'jobs/applicant_job_detail.html',{'job':job}) + job = get_object_or_404(JobPosting, slug=slug, status="ACTIVE") + return render(request, "jobs/applicant_job_detail.html", {"job": job}) # Form Preview Views @@ -582,16 +621,17 @@ def applicant_job_detail(request,slug): # - @ensure_csrf_cookie def form_builder(request, template_id=None): """Render the form builder interface""" context = {} if template_id: - template = get_object_or_404(FormTemplate, id=template_id, created_by=request.user) - context['template_id'] = template.id - context['template_name'] = template.name - return render(request,'forms/form_builder.html',context) + template = get_object_or_404( + FormTemplate, id=template_id, created_by=request.user + ) + context["template_id"] = template.id + context["template_name"] = template.name + return render(request, "forms/form_builder.html", context) @csrf_exempt @@ -600,13 +640,15 @@ def save_form_template(request): """Save a new or existing form template""" try: data = json.loads(request.body) - template_name = data.get('name', 'Untitled Form') - stages_data = data.get('stages', []) - template_id = data.get('template_id') + template_name = data.get("name", "Untitled Form") + stages_data = data.get("stages", []) + template_id = data.get("template_id") if template_id: # Update existing template - template = get_object_or_404(FormTemplate, id=template_id, created_by=request.user) + template = get_object_or_404( + FormTemplate, id=template_id, created_by=request.user + ) template.name = template_name template.save() # Clear existing stages and fields @@ -614,50 +656,48 @@ def save_form_template(request): else: # Create new template template = FormTemplate.objects.create( - name=template_name, - created_by=request.user + name=template_name, created_by=request.user ) # Create stages and fields for stage_order, stage_data in enumerate(stages_data): stage = FormStage.objects.create( template=template, - name=stage_data['name'], + name=stage_data["name"], order=stage_order, - is_predefined=stage_data.get('predefined', False) + is_predefined=stage_data.get("predefined", False), ) - for field_order, field_data in enumerate(stage_data['fields']): - options = field_data.get('options', []) + for field_order, field_data in enumerate(stage_data["fields"]): + options = field_data.get("options", []) if not isinstance(options, list): options = [] - file_types = field_data.get('fileTypes', '') - max_file_size = field_data.get('maxFileSize', 5) + file_types = field_data.get("fileTypes", "") + max_file_size = field_data.get("maxFileSize", 5) FormField.objects.create( stage=stage, - label=field_data.get('label', ''), - field_type=field_data.get('type', 'text'), - placeholder=field_data.get('placeholder', ''), - required=field_data.get('required', False), + label=field_data.get("label", ""), + field_type=field_data.get("type", "text"), + placeholder=field_data.get("placeholder", ""), + required=field_data.get("required", False), order=field_order, - is_predefined=field_data.get('predefined', False), + is_predefined=field_data.get("predefined", False), options=options, file_types=file_types, - max_file_size=max_file_size + max_file_size=max_file_size, ) - return JsonResponse({ - 'success': True, - 'template_id': template.id, - 'message': 'Form template saved successfully!' - }) + return JsonResponse( + { + "success": True, + "template_id": template.id, + "message": "Form template saved successfully!", + } + ) except Exception as e: - return JsonResponse({ - 'success': False, - 'error': str(e) - }, status=400) + return JsonResponse({"success": False, "error": str(e)}, status=400) @require_http_methods(["GET"]) @@ -669,38 +709,46 @@ def load_form_template(request, template_id): for stage in template.stages.all(): fields = [] for field in stage.fields.all(): - fields.append({ - 'id': field.id, - 'type': field.field_type, - 'label': field.label, - 'placeholder': field.placeholder, - 'required': field.required, - 'options': field.options, - 'fileTypes': field.file_types, - 'maxFileSize': field.max_file_size, - 'predefined': field.is_predefined - }) - stages.append({ - 'id': stage.id, - 'name': stage.name, - 'predefined': stage.is_predefined, - 'fields': fields - }) + fields.append( + { + "id": field.id, + "type": field.field_type, + "label": field.label, + "placeholder": field.placeholder, + "required": field.required, + "options": field.options, + "fileTypes": field.file_types, + "maxFileSize": field.max_file_size, + "predefined": field.is_predefined, + } + ) + stages.append( + { + "id": stage.id, + "name": stage.name, + "predefined": stage.is_predefined, + "fields": fields, + } + ) - return JsonResponse({ - 'success': True, - 'template': { - 'id': template.id, - 'name': template.name, - 'description': template.description, - 'is_active': template.is_active, - 'job': template.job_id if template.job else None, - 'stages': stages + return JsonResponse( + { + "success": True, + "template": { + "id": template.id, + "name": template.name, + "description": template.description, + "is_active": template.is_active, + "job": template.job_id if template.job else None, + "stages": stages, + }, } - }) + ) + + def form_templates_list(request): """List all form templates for the current user""" - query = request.GET.get('q', '') + query = request.GET.get("q", "") templates = FormTemplate.objects.filter(created_by=request.user) if query: @@ -708,154 +756,176 @@ def form_templates_list(request): Q(name__icontains=query) | Q(description__icontains=query) ) - templates = templates.order_by('-created_at') + templates = templates.order_by("-created_at") paginator = Paginator(templates, 10) # Show 10 templates per page - page_number = request.GET.get('page') + page_number = request.GET.get("page") page_obj = paginator.get_page(page_number) form = FormTemplateForm() - form.fields['job'].queryset = JobPosting.objects.filter(form_template__isnull=True) - context = { - 'templates': page_obj, - 'query': query, - 'form': form - } - return render(request, 'forms/form_templates_list.html', context) + form.fields["job"].queryset = JobPosting.objects.filter(form_template__isnull=True) + context = {"templates": page_obj, "query": query, "form": form} + return render(request, "forms/form_templates_list.html", context) def create_form_template(request): """Create a new form template""" - if request.method == 'POST': + if request.method == "POST": form = FormTemplateForm(request.POST) if form.is_valid(): template = form.save(commit=False) template.created_by = request.user template.save() - messages.success(request, f'Form template "{template.name}" created successfully!') - return redirect('form_templates_list') + messages.success( + request, f'Form template "{template.name}" created successfully!' + ) + return redirect("form_templates_list") else: form = FormTemplateForm() - return render(request, 'forms/create_form_template.html', {'form': form}) + return render(request, "forms/create_form_template.html", {"form": form}) + @require_http_methods(["GET"]) def list_form_templates(request): """List all form templates for the current user""" templates = FormTemplate.objects.filter(created_by=request.user).values( - 'id', 'name', 'description', 'created_at', 'updated_at' + "id", "name", "description", "created_at", "updated_at" ) - return JsonResponse({ - 'success': True, - 'templates': list(templates) - }) + return JsonResponse({"success": True, "templates": list(templates)}) + @require_http_methods(["DELETE"]) def delete_form_template(request, template_id): """Delete a form template""" template = get_object_or_404(FormTemplate, id=template_id, created_by=request.user) template.delete() - return JsonResponse({'success': True, 'message': 'Form template deleted successfully!'}) - + return JsonResponse( + {"success": True, "message": "Form template deleted successfully!"} + ) def form_wizard_view(request, template_id): """Display the form as a step-by-step wizard""" template = get_object_or_404(FormTemplate, id=template_id, is_active=True) - job_id=template.job.internal_job_id - return render(request, 'forms/form_wizard.html', {'template_id': template_id,'job_id':job_id}) -@require_http_methods(["POST"]) + job_id = template.job.internal_job_id + return render( + request, + "forms/form_wizard.html", + {"template_id": template_id, "job_id": job_id}, + ) + + +@require_http_methods(["GET", "POST"]) def submit_form(request, template_id): """Handle form submission""" - try: - template = get_object_or_404(FormTemplate, id=template_id) - - # # Create form submission - # print({key: value for key, value in request.POST.items()}) - # first_name = next((value for key, value in request.POST.items() if key == 'First Name'), None) - # last_name = next((value for key, value in request.POST.items() if key == 'Last Name'), None) - # email = next((value for key, value in request.POST.items() if key == 'Email Address'), None) - # phone = next((value for key, value in request.POST.items() if key == 'Phone Number'), None) - # address = next((value for key, value in request.POST.items() if key == 'Address'), None) - # resume = next((value for key, value in request.POST.items() if key == 'Resume Upload'), None) - # print(first_name, last_name, email, phone, address, resume) - # create candidate - - submission = FormSubmission.objects.create(template=template) - # Process field responses - for field_id, value in request.POST.items(): - if field_id.startswith('field_'): - actual_field_id = field_id.replace('field_', '') - try: - field = FormField.objects.get(id=actual_field_id, stage__template=template) - FieldResponse.objects.create( - submission=submission, - field=field, - value=value if value else None - ) - except FormField.DoesNotExist: - continue - - # Handle file uploads - for field_id, uploaded_file in request.FILES.items(): - if field_id.startswith('field_'): - actual_field_id = field_id.replace('field_', '') - try: - field = FormField.objects.get(id=actual_field_id, stage__template=template) - FieldResponse.objects.create( - submission=submission, - field=field, - uploaded_file=uploaded_file - ) - except FormField.DoesNotExist: - continue + print("request method", request.method) + if request.method == "POST": try: - first_name = submission.responses.get(field__label="First Name") - last_name = submission.responses.get(field__label="Last Name") - email = submission.responses.get(field__label="Email Address") - phone = submission.responses.get(field__label="Phone Number") - address = submission.responses.get(field__label="Address") - resume = submission.responses.get(field__label="Resume Upload") + template = get_object_or_404(FormTemplate, id=template_id) - submission.applicant_name = f"{first_name.display_value} {last_name.display_value}" - submission.applicant_email = email.display_value - submission.save() - Candidate.objects.create( - first_name=first_name.display_value, - last_name=last_name.display_value, - email=email.display_value, - phone=phone.display_value, - address=address.display_value, - resume=resume.get_file if resume.is_file else None, - job=submission.template.job + # # Create form submission + # print({key: value for key, value in request.POST.items()}) + # first_name = next((value for key, value in request.POST.items() if key == 'First Name'), None) + # last_name = next((value for key, value in request.POST.items() if key == 'Last Name'), None) + # email = next((value for key, value in request.POST.items() if key == 'Email Address'), None) + # phone = next((value for key, value in request.POST.items() if key == 'Phone Number'), None) + # address = next((value for key, value in request.POST.items() if key == 'Address'), None) + # resume = next((value for key, value in request.POST.items() if key == 'Resume Upload'), None) + # print(first_name, last_name, email, phone, address, resume) + # create candidate + + submission = FormSubmission.objects.create(template=template) + # Process field responses + for field_id, value in request.POST.items(): + if field_id.startswith("field_"): + actual_field_id = field_id.replace("field_", "") + try: + field = FormField.objects.get( + id=actual_field_id, stage__template=template + ) + FieldResponse.objects.create( + submission=submission, + field=field, + value=value if value else None, + ) + except FormField.DoesNotExist: + continue + + # Handle file uploads + for field_id, uploaded_file in request.FILES.items(): + if field_id.startswith("field_"): + actual_field_id = field_id.replace("field_", "") + try: + field = FormField.objects.get( + id=actual_field_id, stage__template=template + ) + FieldResponse.objects.create( + submission=submission, + field=field, + uploaded_file=uploaded_file, + ) + except FormField.DoesNotExist: + continue + try: + first_name = submission.responses.get(field__label="First Name") + last_name = submission.responses.get(field__label="Last Name") + email = submission.responses.get(field__label="Email Address") + phone = submission.responses.get(field__label="Phone Number") + address = submission.responses.get(field__label="Address") + resume = submission.responses.get(field__label="Resume Upload") + + submission.applicant_name = ( + f"{first_name.display_value} {last_name.display_value}" + ) + submission.applicant_email = email.display_value + submission.save() + Candidate.objects.create( + first_name=first_name.display_value, + last_name=last_name.display_value, + email=email.display_value, + phone=phone.display_value, + address=address.display_value, + resume=resume.get_file if resume.is_file else None, + job=submission.template.job, + ) + except Exception as e: + logger.error(f"Candidate creation failed,{e}") + pass + return JsonResponse( + { + "success": True, + "message": "Form submitted successfully!", + "submission_id": submission.id, + } ) except Exception as e: - logger.error(f"Candidate creation failed,{e}") - pass - return JsonResponse({ - 'success': True, - 'message': 'Form submitted successfully!', - 'submission_id': submission.id - }) - except Exception as e: - return JsonResponse({ - 'success': False, - 'error': str(e) - }, status=400) + return JsonResponse({"success": False, "error": str(e)}, status=400) + else: + # Handle GET request - this should not happen for form submission + return JsonResponse( + {"success": False, "error": "GET method not allowed for form submission"}, + status=405, + ) -def form_template_submissions_list(request, template_slug): + +def form_template_submissions_list(request, slug): """List all submissions for a specific form template""" - template = get_object_or_404(FormTemplate, slug=template_slug, created_by=request.user) + template = get_object_or_404(FormTemplate, slug=slug) - submissions = FormSubmission.objects.filter(template=template).order_by('-submitted_at') + submissions = FormSubmission.objects.filter(template=template).order_by( + "-submitted_at" + ) # Pagination paginator = Paginator(submissions, 10) # Show 10 submissions per page - page_number = request.GET.get('page') + page_number = request.GET.get("page") page_obj = paginator.get_page(page_number) - return render(request, 'forms/form_template_submissions_list.html', { - 'template': template, - 'page_obj': page_obj - }) + return render( + request, + "forms/form_template_submissions_list.html", + {"template": template, "page_obj": page_obj}, + ) + def form_submission_details(request, template_id, submission_id): """Display detailed view of a specific form submission""" @@ -866,59 +936,66 @@ def form_submission_details(request, template_id, submission_id): submission = get_object_or_404(FormSubmission, id=submission_id, template=template) # Get all stages with their fields - stages = template.stages.prefetch_related('fields').order_by('order') + stages = template.stages.prefetch_related("fields").order_by("order") # Get all responses for this submission, ordered by field order - responses = submission.responses.select_related('field').order_by('field__order') + responses = submission.responses.select_related("field").order_by("field__order") # Group responses by stage stage_responses = {} for stage in stages: stage_responses[stage.id] = { - 'stage': stage, - 'responses': responses.filter(field__stage=stage) + "stage": stage, + "responses": responses.filter(field__stage=stage), } - return render(request, 'forms/form_submission_details.html', { - 'template': template, - 'submission': submission, - 'stages': stages, - 'responses': responses, - 'stage_responses': stage_responses - }) + return render( + request, + "forms/form_submission_details.html", + { + "template": template, + "submission": submission, + "stages": stages, + "responses": responses, + "stage_responses": stage_responses, + }, + ) + def schedule_interviews_view(request, job_id): - job = get_object_or_404(Job, id=job_id) + job = get_object_or_404(JobPosting, id=job_id) - if request.method == 'POST': + if request.method == "POST": form = InterviewScheduleForm(job_id, request.POST) break_formset = BreakTimeFormSet(request.POST) # Check if this is a confirmation request - if 'confirm_schedule' in request.POST: + if "confirm_schedule" in request.POST: # Get the schedule data from session - schedule_data = request.session.get('interview_schedule_data') + schedule_data = request.session.get("interview_schedule_data") if not schedule_data: messages.error(request, "Session expired. Please try again.") - return redirect('schedule_interviews', job_id=job_id) + return redirect("schedule_interviews", job_id=job_id) # Create the interview schedule schedule = InterviewSchedule.objects.create( - job=job, - created_by=request.user, - **schedule_data + job=job, created_by=request.user, **schedule_data ) # Add candidates to the schedule - candidates = Candidate.objects.filter(id__in=schedule_data['candidate_ids']) + candidates = Candidate.objects.filter(id__in=schedule_data["candidate_ids"]) schedule.candidates.set(candidates) # Add break times to the schedule - if 'breaks' in schedule_data and schedule_data['breaks']: - for break_data in schedule_data['breaks']: + if "breaks" in schedule_data and schedule_data["breaks"]: + for break_data in schedule_data["breaks"]: break_time = BreakTime.objects.create( - start_time=datetime.strptime(break_data['start_time'], '%H:%M:%S').time(), - end_time=datetime.strptime(break_data['end_time'], '%H:%M:%S').time() + start_time=datetime.strptime( + break_data["start_time"], "%H:%M:%S" + ).time(), + end_time=datetime.strptime( + break_data["end_time"], "%H:%M:%S" + ).time(), ) schedule.breaks.add(break_time) @@ -926,40 +1003,42 @@ def schedule_interviews_view(request, job_id): try: scheduled_count = schedule_interviews(schedule) messages.success( - request, - f"Successfully scheduled {scheduled_count} interviews." + request, f"Successfully scheduled {scheduled_count} interviews." ) # Clear the session data - if 'interview_schedule_data' in request.session: - del request.session['interview_schedule_data'] - return redirect('job_detail', pk=job_id) + if "interview_schedule_data" in request.session: + del request.session["interview_schedule_data"] + return redirect("job_detail", pk=job_id) except Exception as e: - messages.error( - request, - f"Error scheduling interviews: {str(e)}" - ) - return redirect('schedule_interviews', job_id=job_id) + messages.error(request, f"Error scheduling interviews: {str(e)}") + return redirect("schedule_interviews", job_id=job_id) # This is the initial form submission if form.is_valid() and break_formset.is_valid(): # Get the form data - candidates = form.cleaned_data['candidates'] - start_date = form.cleaned_data['start_date'] - end_date = form.cleaned_data['end_date'] - working_days = form.cleaned_data['working_days'] - start_time = form.cleaned_data['start_time'] - end_time = form.cleaned_data['end_time'] - interview_duration = form.cleaned_data['interview_duration'] - buffer_time = form.cleaned_data['buffer_time'] + candidates = form.cleaned_data["candidates"] + start_date = form.cleaned_data["start_date"] + end_date = form.cleaned_data["end_date"] + working_days = form.cleaned_data["working_days"] + start_time = form.cleaned_data["start_time"] + end_time = form.cleaned_data["end_time"] + interview_duration = form.cleaned_data["interview_duration"] + buffer_time = form.cleaned_data["buffer_time"] # Process break times breaks = [] for break_form in break_formset: - if break_form.cleaned_data and not break_form.cleaned_data.get('DELETE'): - breaks.append({ - 'start_time': break_form.cleaned_data['start_time'].isoformat(), - 'end_time': break_form.cleaned_data['end_time'].isoformat() - }) + if break_form.cleaned_data and not break_form.cleaned_data.get( + "DELETE" + ): + breaks.append( + { + "start_time": break_form.cleaned_data[ + "start_time" + ].isoformat(), + "end_time": break_form.cleaned_data["end_time"].isoformat(), + } + ) # Create a temporary schedule object (not saved to DB) temp_schedule = InterviewSchedule( @@ -970,16 +1049,22 @@ def schedule_interviews_view(request, job_id): start_time=start_time, end_time=end_time, interview_duration=interview_duration, - buffer_time=buffer_time + buffer_time=buffer_time, ) # Create temporary break time objects temp_breaks = [] for break_data in breaks: - temp_breaks.append(BreakTime( - start_time=datetime.strptime(break_data['start_time'], '%H:%M:%S').time(), - end_time=datetime.strptime(break_data['end_time'], '%H:%M:%S').time() - )) + temp_breaks.append( + BreakTime( + start_time=datetime.strptime( + break_data["start_time"], "%H:%M:%S" + ).time(), + end_time=datetime.strptime( + break_data["end_time"], "%H:%M:%S" + ).time(), + ) + ) # Get available slots available_slots = get_available_time_slots(temp_schedule, temp_breaks) @@ -987,57 +1072,59 @@ def schedule_interviews_view(request, job_id): if len(available_slots) < len(candidates): messages.error( request, - f"Not enough available slots. Required: {len(candidates)}, Available: {len(available_slots)}" + f"Not enough available slots. Required: {len(candidates)}, Available: {len(available_slots)}", + ) + return render( + request, + "interviews/schedule_interviews.html", + {"form": form, "break_formset": break_formset, "job": job}, ) - return render(request, 'interviews/schedule_interviews.html', { - 'form': form, - 'break_formset': break_formset, - 'job': job - }) # Create a preview schedule preview_schedule = [] for i, candidate in enumerate(candidates): slot = available_slots[i] - preview_schedule.append({ - 'candidate': candidate, - 'date': slot['date'], - 'time': slot['time'] - }) + preview_schedule.append( + {"candidate": candidate, "date": slot["date"], "time": slot["time"]} + ) # Save the form data to session for later use schedule_data = { - 'start_date': start_date.isoformat(), - 'end_date': end_date.isoformat(), - 'working_days': working_days, - 'start_time': start_time.isoformat(), - 'end_time': end_time.isoformat(), - 'interview_duration': interview_duration, - 'buffer_time': buffer_time, - 'candidate_ids': [c.id for c in candidates], - 'breaks': breaks + "start_date": start_date.isoformat(), + "end_date": end_date.isoformat(), + "working_days": working_days, + "start_time": start_time.isoformat(), + "end_time": end_time.isoformat(), + "interview_duration": interview_duration, + "buffer_time": buffer_time, + "candidate_ids": [c.id for c in candidates], + "breaks": breaks, } - request.session['interview_schedule_data'] = schedule_data + request.session["interview_schedule_data"] = schedule_data # Render the preview page - return render(request, 'interviews/preview_schedule.html', { - 'job': job, - 'schedule': preview_schedule, - 'start_date': start_date, - 'end_date': end_date, - 'working_days': working_days, - 'start_time': start_time, - 'end_time': end_time, - 'breaks': breaks, - 'interview_duration': interview_duration, - 'buffer_time': buffer_time - }) + return render( + request, + "interviews/preview_schedule.html", + { + "job": job, + "schedule": preview_schedule, + "start_date": start_date, + "end_date": end_date, + "working_days": working_days, + "start_time": start_time, + "end_time": end_time, + "breaks": breaks, + "interview_duration": interview_duration, + "buffer_time": buffer_time, + }, + ) else: form = InterviewScheduleForm(job_id=job_id) break_formset = BreakTimeFormSet() - return render(request, 'interviews/schedule_interviews.html', { - 'form': form, - 'break_formset': break_formset, - 'job': job - }) + return render( + request, + "interviews/schedule_interviews.html", + {"form": form, "break_formset": break_formset, "job": job}, + ) diff --git a/recruitment/views_frontend.py b/recruitment/views_frontend.py index f323882..427f744 100644 --- a/recruitment/views_frontend.py +++ b/recruitment/views_frontend.py @@ -1,5 +1,8 @@ +import json from django.shortcuts import render, get_object_or_404 from django.http import JsonResponse + +from recruitment.utils import json_to_markdown_table from . import models from django.utils.translation import get_language from . import forms @@ -19,6 +22,8 @@ from datastar_py.django import ( ServerSentEventGenerator as SSE, read_signals, ) +# from rich import print +from rich.markdown import CodeBlock class JobListView(LoginRequiredMixin, ListView): model = models.JobPosting @@ -41,7 +46,7 @@ class JobListView(LoginRequiredMixin, ListView): # Filter for non-staff users if not self.request.user.is_staff: queryset = queryset.filter(status='Published') - + status=self.request.GET.get('status') if status: queryset=queryset.filter(status=status) @@ -49,7 +54,7 @@ class JobListView(LoginRequiredMixin, ListView): return queryset def get_context_data(self, **kwargs): - + context = super().get_context_data(**kwargs) context['search_query'] = self.request.GET.get('search', '') context['lang'] = get_language() @@ -201,6 +206,7 @@ def training_list(request): def candidate_detail(request, slug): + from rich.json import JSON candidate = get_object_or_404(models.Candidate, slug=slug) try: parsed = ast.literal_eval(candidate.parsed_summary) @@ -212,6 +218,8 @@ def candidate_detail(request, slug): if request.user.is_staff: stage_form = forms.CandidateStageForm(candidate=candidate) + # parsed = JSON(json.dumps(parsed), indent=2, highlight=True, skip_keys=False, ensure_ascii=False, check_circular=True, allow_nan=True, default=None, sort_keys=False) + parsed = json_to_markdown_table([parsed]) return render(request, 'recruitment/candidate_detail.html', { 'candidate': candidate, 'parsed': parsed, @@ -219,7 +227,7 @@ def candidate_detail(request, slug): }) def candidate_update_stage(request, slug): - """Handle HTMX stage update requests""" + """Handle HTMX stage update requests""" try: if not request.user.is_staff: return render(request, 'recruitment/partials/error.html', {'error': 'Permission denied'}, status=403) @@ -293,7 +301,7 @@ class TrainingListView(LoginRequiredMixin, ListView): template_name = 'recruitment/training_list.html' context_object_name = 'materials' paginate_by = 10 - + def get_queryset(self): queryset = super().get_queryset() diff --git a/templates/forms/form_template_submissions_list.html b/templates/forms/form_template_submissions_list.html index 6cdec8a..6ab346a 100644 --- a/templates/forms/form_template_submissions_list.html +++ b/templates/forms/form_template_submissions_list.html @@ -1,100 +1,331 @@ -{% extends "base.html" %} +{% extends 'base.html' %} +{% load static i18n crispy_forms_tags %} +{% load partials %} -{% block title %}Submissions for {{ template.name }}{% endblock %} +{% block title %}Submissions for {{ template.name }} - ATS{% endblock %} + +{% block customCSS %} + +{% endblock %} {% block content %} - {% endif %} {% else %} -
- - - -

No submissions found

-

There are no submissions for this form template yet.

- +
+ +

{% trans "No Submissions Found" %}

+

+ {% trans "There are no submissions for this form template yet." %} +

+ + {% trans "Back to Templates" %} +
{% endif %}
diff --git a/templates/forms/form_templates_list.html b/templates/forms/form_templates_list.html index b9b2e24..df3a47a 100644 --- a/templates/forms/form_templates_list.html +++ b/templates/forms/form_templates_list.html @@ -231,65 +231,118 @@ {% if templates %} -
- {% for template in templates %} -
-
-
-

{{ template.name }}

- {{ template.job }} -
- {{ template.created_at|date:"M d, Y" }} - {{ template.updated_at|timesince }} {% trans "ago" %} -
-
-
+
+ {# View Switcher #} + {% include "includes/_list_view_switcher.html" with list_id="form-templates-list" %} - {# Content area - includes stats and description #} -
-
-
-
{{ template.get_stage_count }}
-
{% trans "Stages" %}
-
-
-
{{ template.get_field_count }}
-
{% trans "Fields" %}
-
+ {# Card View (Default) #} +
+ {% for template in templates %} +
+
+
+

{{ template.name }}

+ {{ template.job }} +
+ {{ template.created_at|date:"M d, Y" }} + {{ template.updated_at|timesince }} {% trans "ago" %}
-

- {% if template.description %} - {{ template.description|truncatewords:20 }} - {% else %} - {% trans "No description provided" %} - {% endif %} -

+
- {# Action area - visually separated with pt-2 border-top #} -
-
+ {# Content area - includes stats and description #} +
+
+
+
{{ template.get_stage_count }}
+
{% trans "Stages" %}
+
+
+
{{ template.get_field_count }}
+
{% trans "Fields" %}
+
+
+

+ {% if template.description %} + {{ template.description|truncatewords:20 }} + {% else %} + {% trans "No description provided" %} + {% endif %} +

+
- - {% trans "Preview" %} - - - {% trans "Edit" %} - - - {% trans "Submissions" %} - - + {# Action area - visually separated with pt-2 border-top #} +
+ {% endfor %} +
+ + {# Table View #} +
+
+ + + + + + + + + + + + + + {% for template in templates %} + + + + + + + + + + {% endfor %} + +
{% trans "Template Name" %}{% trans "Job" %}{% trans "Stages" %}{% trans "Fields" %}{% trans "Created" %}{% trans "Last Updated" %}{% trans "Actions" %}
{{ template.name }}{{ template.job }}{{ template.get_stage_count }}{{ template.get_field_count }}{{ template.created_at|date:"M d, Y" }}{{ template.updated_at|date:"M d, Y" }} +
+ + + + + + + + + + +
+
+
- {% endfor %}
{% if templates.has_other_pages %} @@ -371,4 +424,4 @@
-{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/templates/forms/form_wizard.html b/templates/forms/form_wizard.html index d24d8a9..251a6ff 100644 --- a/templates/forms/form_wizard.html +++ b/templates/forms/form_wizard.html @@ -1,1283 +1,1325 @@ {% load static i18n %} - + - - - - {% translate "Application Form" %} - - - - - - - - - -
-
-
-
-
- -
-
- +