From c4d401469f219b224a1d0e1358f62641c88537ad Mon Sep 17 00:00:00 2001 From: Faheed Date: Wed, 29 Oct 2025 02:16:19 +0300 Subject: [PATCH] participants models --- recruitment/__pycache__/forms.cpython-312.pyc | Bin 31802 -> 33591 bytes .../__pycache__/models.cpython-312.pyc | Bin 60904 -> 62223 bytes recruitment/__pycache__/urls.cpython-312.pyc | Bin 12633 -> 13530 bytes recruitment/__pycache__/views.cpython-312.pyc | Bin 93558 -> 94735 bytes .../views_frontend.cpython-312.pyc | Bin 24589 -> 27564 bytes recruitment/forms.py | 51 ++- recruitment/migrations/0006_participants.py | 24 ++ ...s_created_at_participants_slug_and_more.py | 30 ++ .../0008_rename_job_participants_jobs.py | 18 + .../0009_jobposting_assigned_users.py | 20 + .../0010_remove_jobposting_assigned_users.py | 17 + .../0011_jobposting_internal_participant.py | 20 + .../0012_remove_participants_jobs_and_more.py | 29 ++ ...obposting_external_participant_and_more.py | 33 ++ recruitment/models.py | 32 ++ recruitment/urls.py | 8 + recruitment/views.py | 40 +- recruitment/views_frontend.py | 68 +++ templates/base.html | 14 +- templates/jobs/job_detail.html | 3 + .../participants/participants_create.html | 137 ++++++ .../participants/participants_detail.html | 295 +++++++++++++ templates/participants/participants_list.html | 395 ++++++++++++++++++ .../recruitment/candidate_interview_view.html | 64 ++- 24 files changed, 1287 insertions(+), 11 deletions(-) create mode 100644 recruitment/migrations/0006_participants.py create mode 100644 recruitment/migrations/0007_participants_created_at_participants_slug_and_more.py create mode 100644 recruitment/migrations/0008_rename_job_participants_jobs.py create mode 100644 recruitment/migrations/0009_jobposting_assigned_users.py create mode 100644 recruitment/migrations/0010_remove_jobposting_assigned_users.py create mode 100644 recruitment/migrations/0011_jobposting_internal_participant.py create mode 100644 recruitment/migrations/0012_remove_participants_jobs_and_more.py create mode 100644 recruitment/migrations/0013_remove_jobposting_external_participant_and_more.py create mode 100644 templates/participants/participants_create.html create mode 100644 templates/participants/participants_detail.html create mode 100644 templates/participants/participants_list.html diff --git a/recruitment/__pycache__/forms.cpython-312.pyc b/recruitment/__pycache__/forms.cpython-312.pyc index 4c46da24b7d91601890e0a9bc930bf93b0c22d24..8e0f6cc8719d67d1b7a80f8e0306567bab27302e 100644 GIT binary patch delta 8106 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 diff --git a/recruitment/__pycache__/urls.cpython-312.pyc b/recruitment/__pycache__/urls.cpython-312.pyc index 5e3fefcced44c35d9b6aef4b7a020635a5538862..9a77a66975ebbd9ab23cdc5cf42db8cd2f9a6884 100644 GIT binary patch delta 1584 zcmZ{kOKcle6ox(a6i9+Y8z&)tXA6wm zRaTJ@Qp&K1#KsF2l^TNEv=wZkNG!WxE*a^n7LgD_tf!m82E@H*Hl`Mq{b_vufBtjM z%xIowTZP^yMq{^*e70wp!f(Mly+iu#bN9WDv)y`~$mH*dhV^}^VGv&5-|xC-phlhU z4g=b^L^}ZOphNqPXidS2B4v7z3-(6(fpEOogc-fRuF zSEpgG&iV{Y+F4(Q!8+?RFb~vwHp|6Qrdk!HaredO7vx?uYS%Ki^?YTuj!w%uk7^gtYM=c8U0PG!p2lXQu@(7Vx{V{Zrz!#9mn1PHv5p-*L;=g zJ;^UURwgOgJVQ1x^%0ZYW!n?6BZM5G=BmO@sivf~;4u^1y2tu9*c@PUHU=;kL0m+R z#ufIG>I7{Vw2{Uvc8wv|m^`(tu$NUXDIGzpmS=<{{p}egfxh3GpMdziCw1aWzLCp^!kwi3{d2@O=zE>+Uih@Sy>pEKDfuJ8HoI;yQ?q zy)$@7KtqBYfeW=kQW}tQ1pGyyGcsX1mj`$$Oz%|{_;r}}`vHi<_80^wSlD~wcmPkX zpve_EdrM)r)c4`hf3~QplgAM}okr7X`O3D!*3~68DV;xWuS3Eb^^pBS*b+mQ7`DtJ z%j}8eT{)3a*sPk?l0MRsoDB!&<`6fBxdh@8C)|SkK~Z5pQ8St?tJz$QYuG)H-1FGI zgxpIf?qzxPy26&#oMy{|EzuRYyN3Bi#4ln#h4|D7zbfZoeo^yX(c=Esb`@;5d&-}a G_rSkvw+Z$D delta 918 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�gW2pwQ9V$*Axct#+`tC9F#plfQ}oy7O$|MkYe}XU{>CT zQOpl>#!MYTM|`~OKouH`y|{_fuUX?%HD5-FC%t*q88HSkOKCJXw#D@Q6~VFqi@Od? z68%%eO_9#2!Y*!&{CcWbUXMVo$EndMH2^#UFb`afL1`4gcz|2cHW8%>1hjti7>!>J z1?52WFy(Y&j_jBwa+mxV3%h~*2ugPX0~2Wd=*eVIe{sY#_amGb&C%z({XDK<8=h7M zB%TLol+v3x<0&I zM8ptCx;>*V7VfMb#B8nK8r za-c?hD6-g?!6m(T*b-SgS5#RT_4|=q=86^ij|gDZmL!i#?KceCW}scq<*28 zm;100MPiK*CnGIaiphf>!U6%<*3*z$hU8^mi=4PplwZwsw4ienfCS+8 z&gmF+3jy*WkP*2?R~z1~2WcV0j`(o7#nZ4p5ZI_+ICNA0AG#(i7Wv7U-IxSy(KThH zzE)I-mm-^Mg{|sCYCCAs(&$Ra@1dU&>er21xm7oqXCgnX6_xrG2}c#C)E=8KLAlSM z4F*APoalXYKqk22*U$%xl&=t3#;+?l#fTk45x=7MomAp`Di8&iJTmE`hy1xNw>y^K z(MMCJU%p1Of7^BQGSMG5KW`o=>^iz!>@j6Q0Ca%n`=4hbOY6k&JTRFMpi1Y`6e_d6 zsQM*z{2XL{h|%IJ0!OYX+vyt6R^JDdK<5#CiVip;+xjKN)x*NZX|Nf%u*Jr;ec ze=5?xnlfx%4v{0PMV0j>Oq9TS**bd5fqx&x zzD>7F<^H({D9xSR`!PQgqAP(&>ifI6(;yRIVb|N&h>@@YdaT%0yhd~+_m6J_ z`4X*+y>MhLaZRWDXlAcpyGGt$D~h9+&EI#5#k7H!I7RgS-Pi-HwsMT^<1qNFv=bfw z{2a!naS(Wi0QlI@fD$`#7wsgDlJpEd(CpDH*KP5-=|zxcc7;NeRoaQkgsYsy??fye zHi~_iZa=`q=7H8Tm;_)$*YfK{tH^3X>l4&q|AlOcyyX&ArgJX9iN9HB zm`y2#M^tCYE6`)nS&vNfh#Hez71`<$72&Iaw;J8ab#?RQH7NCqF6M5~-+*T8b?2th zAy;r?P+ACnh?N#>}M<@hW=nLf`B8XWRM@uYJH!09^pj0)*cLd>7yY zfKLI&!j#4XOa|bWx(iTR46p*A9$*y!emB7{^d+8`^Yd)^J(Td|m|p?QAE9&-0PiK` zn*eVCyeHNZ{0c>WUW4a3QozP?0R{pT0N`bVtN^G27y-a1wTUQQ27o(!c@+R(D&ppm zuNU-lp^ALFPLx>rcz_I?6IppEGNMTo7ac~!5ddU?oKbOtqZLMK8bsbzc-S12oSPtj zkcin5@si_*gvVqbqHm9N5FzgiVvauOUruVLmv1xWH-twFCIz32ywW6=6k3JpFG;jN8W delta 16980 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 diff --git a/recruitment/__pycache__/views_frontend.cpython-312.pyc b/recruitment/__pycache__/views_frontend.cpython-312.pyc index cfe62c980bcc14be35f3cacbbabc62f342278f78..8f09ef6c5ecae5872406b7423bae7a4880f75803 100644 GIT binary patch delta 2063 zcmaKtYfMvT7{|}s(n6usUZ58!Py~7*T&>(`nSd6k3h}ZGbk^D)wXU}HoH{1at!5^g zEX%Sz%d!t9+p@WcxC?1^F&mK(H$RwdFv!5pO^xo;mPKM0mwj-1pHnogW}Y;^zVGw= z&w2mP`#$Y?b()-CB#JBf`MC_eCVEN0v;B32o}8Mr6io zX2d1LJ89fOCc<-89o9WXumU?jvGi z>y0;yhwNlLezN%lF^o$#b5{CD&W7kftfLs0z$-cfI9j{N-T1NAZDQ#KOkIG*j(&LG zp@JW*GHCDoQ~DK#x4}EM8tD`cr(n0EhfKi-js@vO3|xd4o%Q4*tg{&4vh#Q83aiT}~{R<`;Qjo3&c$NT&~k2ezGxo_Z2*G_T;mR)Aecd4Wdle{m?vE29Z>b`FY zxdhAo=g2KMJUVz<5aS2|3{ zqv5DGn0mCIyNTKBh#QDX#E*#E;Bz|_zu|B_1z$t~lWsj+cI(Og_zm}aQjwU%U*2*~ zLcgK@nehP$p<+B=PKoG8gb~XW3F$#Lx;YH7ke7=Fe1V9U*19pkN1qO`qhl43v}k?$#1o{Ny8Y3E!Gt_5 z4$DfT=tBZKD^|m_VUt+Ib;Bo3TKIRZRuRpoc7*Gw=zJD56dT}5kqlakRd7;T1gF;) zz_lg~B#Ms>W=~M7cx`2DIcY6L4|Y|^dyw^b0={r4>J5Z=Em@>9?C*ZRNoyXm|FB& z^PI-KsHvON)Gcc4a~k`+rfF8*1ZT80@LJ2!T<$Y;@i_&2q%-7Kr8(ij(`t~}s1@!D z%zxc#6qOS2>YH5#JY<9tjn>la-zS(Qxq4AvHYYEOtzRl=i)~sevd(7dmed6?cQQ*Q zX}D(=OLTV_3eJg(8VH}33LbIVfle*xw6OU2=9IN^0@GGKbjWuMW!UTCSZ|a?d;dJao=;E- z_P8x{!OZimtI)!Ax!zcc#s+XB)D#J2`ZmDF=2Bp-t2R`k2w_L}HIKPhX%|(NIh7?g zuv9<`xvDOGdu(1^9dj>f+l~*Wim6N$Gh*@7WfZeL;$JC-tHNa-v-*bBUYO~UGow)W z?{r&ni0DCU*vFY0`y^|z!L-e`ruCmHNqp-{nZQUo?{A7mvt}WZ5K%4D-Eg zkWHOLLY3A5yzrNivEe4aAoZL0!#*F&^Lq~mgGcICS|yj;fG6NW^f3@pH~W?pR_@Ki)+umkYwm6*`7s= xvnBPP79|-vO3Edqola-hte+lBGIWwONd>`5giex5Nh;FVJAL3Usxb-;^B)o8S5^Q3 delta 537 zcmZ2;ow4@-Bj0IWUM>b8;H~+WQSUvGPlAzaqdGS;OC_VG)#feC0mh7)n_10U7$r1W z{fabz3X3#Bgf)n81QME)7g|Iz6E_47WqRDuRBe5(!KCz&nxaiBYzhRK@~QD*z%qK}0@?cnc(MvE`j;D82) tD>&?afeiT%B7`S9X3BD_0!;xThT`Xpn=>;XGje}qQfDk=EV2WN0RTXAos$3n diff --git a/recruitment/forms.py b/recruitment/forms.py index d9989d1..81e2e3f 100644 --- a/recruitment/forms.py +++ b/recruitment/forms.py @@ -10,7 +10,7 @@ import re from .models import ( ZoomMeeting, Candidate,TrainingMaterial,JobPosting, FormTemplate,InterviewSchedule,BreakTime,JobPostingImage, - Profile,MeetingComment,ScheduledInterview,Source + Profile,MeetingComment,ScheduledInterview,Source,Participants ) # from django_summernote.widgets import SummernoteWidget from django_ckeditor_5.widgets import CKEditor5Widget @@ -649,3 +649,52 @@ class CandidateExamDateForm(forms.ModelForm): +#participants form +class ParticipantsForm(forms.ModelForm): + """Form for creating and editing Participants""" + + class Meta: + model = Participants + fields = ['name', 'email', 'phone', 'designation'] + widgets = { + 'name': forms.TextInput(attrs={ + 'class': 'form-control', + 'placeholder': 'Enter participant name', + 'required': True + }), + 'email': forms.EmailInput(attrs={ + 'class': 'form-control', + 'placeholder': 'Enter email address', + 'required': True + }), + 'phone': forms.TextInput(attrs={ + 'class': 'form-control', + 'placeholder': 'Enter phone number' + }), + 'designation': forms.TextInput(attrs={ + 'class': 'form-control', + 'placeholder': 'Enter designation' + }), + # 'jobs': forms.CheckboxSelectMultiple(), + } + + +class ParticipantsSelectForm(forms.ModelForm): + """Form for selecting Participants""" + + participants=forms.ModelMultipleChoiceField( + queryset=Participants.objects.all(), + widget=forms.CheckboxSelectMultiple, + required=False, + label=_("Select Participants")) + + users=forms.ModelMultipleChoiceField( + queryset=User.objects.all(), + widget=forms.CheckboxSelectMultiple, + required=False, + label=_("Select Users")) + + class Meta: + model = JobPosting + fields = ['participants','users'] # No direct fields from Participants model + \ No newline at end of file diff --git a/recruitment/migrations/0006_participants.py b/recruitment/migrations/0006_participants.py new file mode 100644 index 0000000..db585d3 --- /dev/null +++ b/recruitment/migrations/0006_participants.py @@ -0,0 +1,24 @@ +# Generated by Django 5.2.7 on 2025-10-28 12:12 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('recruitment', '0005_alter_jobposting_linkedin_post_formated_data'), + ] + + operations = [ + migrations.CreateModel( + name='Participants', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=255, verbose_name='Participant Name')), + ('email', models.EmailField(max_length=254, verbose_name='Email')), + ('phone', models.CharField(blank=True, max_length=20, verbose_name='Phone')), + ('designation', models.CharField(blank=True, max_length=100, verbose_name='Designation')), + ('job', models.ManyToManyField(blank=True, related_name='participants', to='recruitment.jobposting')), + ], + ), + ] diff --git a/recruitment/migrations/0007_participants_created_at_participants_slug_and_more.py b/recruitment/migrations/0007_participants_created_at_participants_slug_and_more.py new file mode 100644 index 0000000..fc89f39 --- /dev/null +++ b/recruitment/migrations/0007_participants_created_at_participants_slug_and_more.py @@ -0,0 +1,30 @@ +# Generated by Django 5.2.7 on 2025-10-28 12:14 + +import django_extensions.db.fields +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('recruitment', '0006_participants'), + ] + + operations = [ + migrations.AddField( + model_name='participants', + name='created_at', + field=models.DateTimeField(auto_now_add=True, default=None, verbose_name='Created at'), + preserve_default=False, + ), + migrations.AddField( + model_name='participants', + name='slug', + field=django_extensions.db.fields.RandomCharField(blank=True, editable=False, length=8, unique=True, verbose_name='Slug'), + ), + migrations.AddField( + model_name='participants', + name='updated_at', + field=models.DateTimeField(auto_now=True, verbose_name='Updated at'), + ), + ] diff --git a/recruitment/migrations/0008_rename_job_participants_jobs.py b/recruitment/migrations/0008_rename_job_participants_jobs.py new file mode 100644 index 0000000..4bea33f --- /dev/null +++ b/recruitment/migrations/0008_rename_job_participants_jobs.py @@ -0,0 +1,18 @@ +# Generated by Django 5.2.7 on 2025-10-28 13:06 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('recruitment', '0007_participants_created_at_participants_slug_and_more'), + ] + + operations = [ + migrations.RenameField( + model_name='participants', + old_name='job', + new_name='jobs', + ), + ] diff --git a/recruitment/migrations/0009_jobposting_assigned_users.py b/recruitment/migrations/0009_jobposting_assigned_users.py new file mode 100644 index 0000000..1ec5f0b --- /dev/null +++ b/recruitment/migrations/0009_jobposting_assigned_users.py @@ -0,0 +1,20 @@ +# Generated by Django 5.2.7 on 2025-10-28 16:41 + +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('recruitment', '0008_rename_job_participants_jobs'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.AddField( + model_name='jobposting', + name='assigned_users', + field=models.ManyToManyField(blank=True, related_name='assigned_jobs', to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/recruitment/migrations/0010_remove_jobposting_assigned_users.py b/recruitment/migrations/0010_remove_jobposting_assigned_users.py new file mode 100644 index 0000000..3b7548d --- /dev/null +++ b/recruitment/migrations/0010_remove_jobposting_assigned_users.py @@ -0,0 +1,17 @@ +# Generated by Django 5.2.7 on 2025-10-28 17:12 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('recruitment', '0009_jobposting_assigned_users'), + ] + + operations = [ + migrations.RemoveField( + model_name='jobposting', + name='assigned_users', + ), + ] diff --git a/recruitment/migrations/0011_jobposting_internal_participant.py b/recruitment/migrations/0011_jobposting_internal_participant.py new file mode 100644 index 0000000..e051508 --- /dev/null +++ b/recruitment/migrations/0011_jobposting_internal_participant.py @@ -0,0 +1,20 @@ +# Generated by Django 5.2.7 on 2025-10-28 20:42 + +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('recruitment', '0010_remove_jobposting_assigned_users'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.AddField( + model_name='jobposting', + name='internal_participant', + field=models.ManyToManyField(blank=True, help_text='Internal staff involved in the recruitment process for this job', related_name='internal_participant_jobs', to=settings.AUTH_USER_MODEL, verbose_name='Internal Participant'), + ), + ] diff --git a/recruitment/migrations/0012_remove_participants_jobs_and_more.py b/recruitment/migrations/0012_remove_participants_jobs_and_more.py new file mode 100644 index 0000000..799ee52 --- /dev/null +++ b/recruitment/migrations/0012_remove_participants_jobs_and_more.py @@ -0,0 +1,29 @@ +# Generated by Django 5.2.7 on 2025-10-28 21:30 + +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('recruitment', '0011_jobposting_internal_participant'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.RemoveField( + model_name='participants', + name='jobs', + ), + migrations.AddField( + model_name='jobposting', + name='external_participant', + field=models.ManyToManyField(blank=True, help_text='External participants involved in the recruitment process for this job', related_name='jobs', to='recruitment.participants', verbose_name='External Participant'), + ), + migrations.AlterField( + model_name='jobposting', + name='internal_participant', + field=models.ManyToManyField(blank=True, help_text='Internal staff involved in the recruitment process for this job', related_name='jobs', to=settings.AUTH_USER_MODEL, verbose_name='Internal Participant'), + ), + ] diff --git a/recruitment/migrations/0013_remove_jobposting_external_participant_and_more.py b/recruitment/migrations/0013_remove_jobposting_external_participant_and_more.py new file mode 100644 index 0000000..e830392 --- /dev/null +++ b/recruitment/migrations/0013_remove_jobposting_external_participant_and_more.py @@ -0,0 +1,33 @@ +# Generated by Django 5.2.7 on 2025-10-28 22:20 + +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('recruitment', '0012_remove_participants_jobs_and_more'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.RemoveField( + model_name='jobposting', + name='external_participant', + ), + migrations.RemoveField( + model_name='jobposting', + name='internal_participant', + ), + migrations.AddField( + model_name='jobposting', + name='participants', + field=models.ManyToManyField(blank=True, help_text='External participants involved in the recruitment process for this job', related_name='jobs_participating', to='recruitment.participants', verbose_name='External Participant'), + ), + migrations.AddField( + model_name='jobposting', + name='users', + field=models.ManyToManyField(blank=True, help_text='Internal staff involved in the recruitment process for this job', related_name='jobs_assigned', to=settings.AUTH_USER_MODEL, verbose_name='Internal Participant'), + ), + ] diff --git a/recruitment/models.py b/recruitment/models.py index f651e57..a258a42 100644 --- a/recruitment/models.py +++ b/recruitment/models.py @@ -36,6 +36,7 @@ class Profile(models.Model): class JobPosting(Base): # Basic Job Information + JOB_TYPES = [ ("FULL_TIME", "Full-time"), ("PART_TIME", "Part-time"), @@ -51,6 +52,19 @@ class JobPosting(Base): ("HYBRID", "Hybrid"), ] + users=models.ManyToManyField( + User, + blank=True,related_name="jobs_assigned", + verbose_name=_("Internal Participant"), + help_text=_("Internal staff involved in the recruitment process for this job"), + ) + + participants=models.ManyToManyField('Participants', + blank=True,related_name="jobs_participating", + verbose_name=_("External Participant"), + help_text=_("External participants involved in the recruitment process for this job"), + ) + # Core Fields title = models.CharField(max_length=200) department = models.CharField(max_length=100, blank=True) @@ -1264,6 +1278,8 @@ class ScheduledInterview(Base): related_name="scheduled_interviews", db_index=True ) + + job = models.ForeignKey( "JobPosting", on_delete=models.CASCADE, related_name="scheduled_interviews", db_index=True ) @@ -1298,3 +1314,19 @@ class ScheduledInterview(Base): models.Index(fields=['interview_date', 'interview_time']), models.Index(fields=['candidate', 'job']), ] + + + +class Participants(Base): + """Model to store Participants details""" + name = models.CharField(max_length=255, verbose_name=_("Participant Name")) + email= models.EmailField(verbose_name=_("Email")) + phone = models.CharField(max_length=20, blank=True, verbose_name=_("Phone")) + designation = models.CharField( + max_length=100, blank=True, verbose_name=_("Designation") + ) + + def __str__(self): + return f"{self.name} - {self.email}" + + \ No newline at end of file diff --git a/recruitment/urls.py b/recruitment/urls.py index 1c63b71..805da73 100644 --- a/recruitment/urls.py +++ b/recruitment/urls.py @@ -144,4 +144,12 @@ urlpatterns = [ path('meetings//comments//delete/', views.delete_meeting_comment, name='delete_meeting_comment'), path('meetings//set_meeting_candidate/', views.set_meeting_candidate, name='set_meeting_candidate'), + + + #participants urls + path('participants/', views_frontend.ParticipantsListView.as_view(), name='participants_list'), + path('participants/create/', views_frontend.ParticipantsCreateView.as_view(), name='participants_create'), + path('participants//', views_frontend.ParticipantsDetailView.as_view(), name='participants_detail'), + path('participants//update/', views_frontend.ParticipantsUpdateView.as_view(), name='participants_update'), + path('participants//delete/', views_frontend.ParticipantsDeleteView.as_view(), name='participants_delete'), ] diff --git a/recruitment/views.py b/recruitment/views.py index c2d9331..029d172 100644 --- a/recruitment/views.py +++ b/recruitment/views.py @@ -33,7 +33,8 @@ from .forms import ( StaffUserCreationForm, MeetingCommentForm, ToggleAccountForm, - LinkedPostContentForm + LinkedPostContentForm, + ParticipantsSelectForm ) from easyaudit.models import CRUDEvent, LoginEvent, RequestEvent @@ -1421,7 +1422,42 @@ def candidate_update_status(request, slug): @login_required def candidate_interview_view(request,slug): job = get_object_or_404(JobPosting,slug=slug) - context = {"job":job,"candidates":job.interview_candidates,'current_stage':'Interview'} + + if request.method == "POST": + form = ParticipantsSelectForm(request.POST, instance=job) + print(form.errors) + + if form.is_valid(): + + # Save the main instance (JobPosting) + job_instance = form.save(commit=False) + job_instance.save() + + # MANUALLY set the M2M relationships based on submitted data + job_instance.participants.set(form.cleaned_data['participants']) + job_instance.users.set(form.cleaned_data['users']) + + messages.success(request, "Interview participants updated successfully.") + return redirect("candidate_interview_view", slug=job.slug) + + else: + # 🛑 FIX: Explicitly pass the initial data for M2M fields + initial_data = { + 'participants': job.participants.all(), + 'users': job.users.all(), + } + form = ParticipantsSelectForm(instance=job, initial=initial_data) + + else: + form = ParticipantsSelectForm(instance=job) + + + context = { + "job":job, + "candidates":job.interview_candidates, + 'current_stage':'Interview', + 'form':form + } return render(request,"recruitment/candidate_interview_view.html",context) @login_required diff --git a/recruitment/views_frontend.py b/recruitment/views_frontend.py index 4e97d0e..a7b0b8c 100644 --- a/recruitment/views_frontend.py +++ b/recruitment/views_frontend.py @@ -522,3 +522,71 @@ def update_candidate_status(request, job_slug, candidate_slug, stage_type, statu # Removed incorrect JobDetailView class. # The job_detail view is handled by function-based view in recruitment.views + + +#participants views +class ParticipantsListView(LoginRequiredMixin, ListView): + model = models.Participants + template_name = 'participants/participants_list.html' + context_object_name = 'participants' + paginate_by = 10 + + def get_queryset(self): + queryset = super().get_queryset() + + # Handle search + search_query = self.request.GET.get('search', '') + if search_query: + queryset = queryset.filter( + Q(name__icontains=search_query) | + Q(email__icontains=search_query) | + Q(phone__icontains=search_query) | + Q(designation__icontains=search_query) + ) + + # Filter for non-staff users + if not self.request.user.is_staff: + return models.Participants.objects.none() # Restrict for non-staff + + return queryset.order_by('-created_at') + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context['search_query'] = self.request.GET.get('search', '') + return context +class ParticipantsDetailView(LoginRequiredMixin, DetailView): + model = models.Participants + template_name = 'participants/participants_detail.html' + context_object_name = 'participant' + slug_url_kwarg = 'slug' + +class ParticipantsCreateView(LoginRequiredMixin, SuccessMessageMixin, CreateView): + model = models.Participants + form_class = forms.ParticipantsForm + template_name = 'participants/participants_create.html' + success_url = reverse_lazy('job_list') + success_message = 'Participant created successfully.' + + # def get_initial(self): + # initial = super().get_initial() + # if 'slug' in self.kwargs: + # job = get_object_or_404(models.JobPosting, slug=self.kwargs['slug']) + # initial['jobs'] = [job] + # return initial + + + +class ParticipantsUpdateView(LoginRequiredMixin, SuccessMessageMixin, UpdateView): + model = models.Participants + form_class = forms.ParticipantsForm + template_name = 'participants/participants_create.html' + success_url = reverse_lazy('job_list') + success_message = 'Participant updated successfully.' + slug_url_kwarg = 'slug' + +class ParticipantsDeleteView(LoginRequiredMixin, SuccessMessageMixin, DeleteView): + model = models.Participants + + success_url = reverse_lazy('participants_list') # Redirect to the participants list after success + success_message = 'Participant deleted successfully.' + slug_url_kwarg = 'slug' \ No newline at end of file diff --git a/templates/base.html b/templates/base.html index 333d46d..41da997 100644 --- a/templates/base.html +++ b/templates/base.html @@ -223,16 +223,18 @@ - {% comment %}

{% endcomment %} + {% comment %}