From 0c3f942161b822ae25c9b2bf01c5a695979774af Mon Sep 17 00:00:00 2001 From: Faheed Date: Thu, 13 Nov 2025 14:05:00 +0300 Subject: [PATCH] career page logic --- .../__pycache__/settings.cpython-312.pyc | Bin 8593 -> 8593 bytes recruitment/__pycache__/forms.cpython-312.pyc | Bin 67017 -> 67515 bytes .../__pycache__/models.cpython-312.pyc | Bin 85226 -> 86367 bytes recruitment/__pycache__/urls.cpython-312.pyc | Bin 18460 -> 18302 bytes recruitment/__pycache__/views.cpython-312.pyc | Bin 146139 -> 149254 bytes recruitment/forms.py | 43 +- .../0012_interviewschedule_interview_topic.py | 18 + .../migrations/0013_onsitemeeting_and_more.py | 45 ++ .../migrations/0014_onsitemeeting_status.py | 18 + ...alter_scheduledinterview_onsite_meeting.py | 19 + recruitment/models.py | 27 +- recruitment/templatetags/url_extras.py | 19 + recruitment/urls.py | 11 +- recruitment/views.py | 168 ++++- templates/applicant/application_detail.html | 198 +++-- templates/applicant/career.html | 286 ++++--- .../partials/candidate_facing_base.html | 33 +- templates/base.html | 10 +- templates/includes/paginator.html | 80 +- templates/interviews/delete_interview.html | 0 templates/interviews/detail_interview.html | 708 ++++++++++++++++++ templates/interviews/interview_list.html | 267 +++++++ .../interviews/onsite_interview_list.html | 432 ----------- templates/interviews/update_interview.html | 0 templates/jobs/job_detail.html | 3 + templates/participants/participants_list.html | 2 +- templates/recruitment/agency_list.html | 2 +- templates/recruitment/candidate_list.html | 2 +- 28 files changed, 1719 insertions(+), 672 deletions(-) create mode 100644 recruitment/migrations/0012_interviewschedule_interview_topic.py create mode 100644 recruitment/migrations/0013_onsitemeeting_and_more.py create mode 100644 recruitment/migrations/0014_onsitemeeting_status.py create mode 100644 recruitment/migrations/0015_alter_scheduledinterview_onsite_meeting.py create mode 100644 recruitment/templatetags/url_extras.py create mode 100644 templates/interviews/delete_interview.html create mode 100644 templates/interviews/detail_interview.html create mode 100644 templates/interviews/interview_list.html delete mode 100644 templates/interviews/onsite_interview_list.html create mode 100644 templates/interviews/update_interview.html diff --git a/NorahUniversity/__pycache__/settings.cpython-312.pyc b/NorahUniversity/__pycache__/settings.cpython-312.pyc index b1e307ca3c51ab2119b2006d6be017fa63c65c00..a700acdec960c44910858b405abb0b4a1f41e64c 100644 GIT binary patch delta 20 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 xngS>%&=M*LauWPJg@i=j_$_y3dqc8~x7 delta 13120 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 diff --git a/recruitment/__pycache__/models.cpython-312.pyc b/recruitment/__pycache__/models.cpython-312.pyc index 649b7893466e7a7d608a3ca106741a28ebf6f207..a99202ca6862ba3a17c5b3feb01ed9d9707a6b91 100644 GIT binary patch delta 10446 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 delta 9717 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 KSne|hI{pvmT`bc8 diff --git a/recruitment/__pycache__/urls.cpython-312.pyc b/recruitment/__pycache__/urls.cpython-312.pyc index 3222e0f0d4eab0ad943da52be5f052b9cf8c9f12..c68f7e674c18b4975b44a14f7b2720a8c18f00f0 100644 GIT binary patch delta 3404 zcmZveTTENY8OMF>0i5hYqD@S=*<6Cn&0vf%HyeYEjSZMP26MlfTOfp6xFxt-sTJ*N zBeL^Q9`=E>53$-xaYP^J)8;W%rS^<++EJrsrK(z~Z<$p4(njibJYT4yZV;IBpWlDJ z8GkeL&H3_J`p*L??f0pvmsR}7IC^aEy1yC3{SJtvv*sm6j^ zG;bfq^|%Q=K2s-^OOocSGTAKgrW^iWU;32>Iy{urs)#ffh@j;zyp>Y&@bB00)0FEx zYQ{xK{vW?iu_j{WYZs*?{8MdNQ}{jl?s0DDdtt*o><69rTkSUz!Y?nq<fi{_$Rzv(I(a zl18)qPmwU1{#o+K{k?yeygmEk##PB`SYDgiv^Y0cwig-_A1=$>+Rp8jwdpy_?A=Yv z%d4DE@~6p*=Cel`Uu9~#N)GWKtA3>3(BWR2LArtO*j6P2{@PY3<(+A&OC?-oUsZ4T z@t5{${3p9Zy)lSWYaZj@*8Et#v5%d#`)NPmbKLke@$p0cf&W_D?|jN1B>uPgn=2|6 z(@2u^N|hsiuf0;`zEWi|w63|L{tMC`eR4EGQ%gx|X*^p&jZCwSZ`Bn@>-a%kW=+EL z=3`aTCHayiuA^2zvHIn%DFsclRKd~&yLlRVJn?Aa+^ir!yRwd7)n!EmzAkV{%udVP zq|7Y`Miey4bb@7Yc9eDOqt{L3x+&JBAP377#2|W=$F`}(M=U-$IH90PmMd7EV7aF{ znr|ohcG($JP$$b5tU$1WQy(pK;F0>vtv5xpNiLzR(Ecs z4O66Him6nKQoH(Fl`5%2%}RvDjDK0LPbnAA75ESJh7^leXpdP%Llw?w zFsNMop6kR&rdS#+_LJg^EY=IwAec4oqP8hwgITnQS$NgVAuLW| zsfef1$`Gjx$zxjz+GdS{xdgMs4b<94tbOwEhJrR(lVDy6f7g&>@kv6pO2V3bGC}n& zqIXe!E77;U&9U#_$7uG>}d{sfW*)Z5f{?8`& z&njq+jRKuY&?Egx63r+k8O5@tNkPqQ8sH3c%{w(du6R@tKU7dFo0VX77V#5jo@R+} z^*2t#w8+m2*iCYAJuU7e#hvoNoPr{36{6h+Tp$!`wBW>EoxY9p!WDStqqY{zEAEdXovZLwmJcev(Q1RI^@0u z1uZf^;J}AFw*hU(`L1+r2Z&%om^wjpT};V9>&Hp`xIA~DpnI$vXb(PcnY_Iq2Ekf$ zo<{4&NZpt`D`r0gGz`=hpP=>;Vjq#G_Y}0xhJlXZZ(OGGaS&5rtv|O@$2f6}^OGBq z{&!}k!8C*Gn)K0G5cAN(8n;thh}d{)#Lx>s7lBsCBebTU)bz_En+n=uOF&mXOjm(! z0d<^*XyXWJU~ryCsB4X@>$ApUo5X<;GZo36y1smO_!c`DkiNTI?Pjoc1lw_91Qx)W5 z+raMPHFx^h4v1Z0%sGzyZ0+G%%%PxKwg+TiknH0S)s+xk$-6^)0PvoGhQx`skPM4# zhtmP@5dY1ceklr~8GYf=Y2D&3d()2f9(_dzh#(T_$~pz&0RE_DP89 zD~Y}`9!=cen*g@}^2$jI?4-bc-mRb@+vcgt@#a9Pc5%K}r`-epK6ZK2qX!^7Nh14( z( ziSb+2%x#2Rbb-qpi_nSyso;A(qM&)!4Rjx$w;HquAnxI>TXVJdK^)>Ff37B)ypFs4 zrWCPtJSn)`Z&+vn6-W`oi%TF(9K5oM;M`BT9jC34=MJ@ S0r8gEDd?vkZ9L&`&;JF@&^yrp delta 3235 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≷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%0DSpZFQmB4Pt4t2CToOh>01Ot<Eet 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 HfrkGBC6`4) diff --git a/recruitment/forms.py b/recruitment/forms.py index 3d33c2a..76bbfc9 100644 --- a/recruitment/forms.py +++ b/recruitment/forms.py @@ -11,7 +11,7 @@ from .models import ( ZoomMeeting, Candidate,TrainingMaterial,JobPosting, FormTemplate,InterviewSchedule,BreakTime,JobPostingImage, Profile,MeetingComment,ScheduledInterview,Source,HiringAgency, - AgencyJobAssignment, AgencyAccessLink,Participants + AgencyJobAssignment, AgencyAccessLink,Participants,OnsiteMeeting ) # from django_summernote.widgets import SummernoteWidget from django_ckeditor_5.widgets import CKEditor5Widget @@ -1594,24 +1594,29 @@ KAAUH HIRING TEAM -class InterviewScheduleLocationForm(forms.ModelForm): - class Meta: - model=InterviewSchedule - fields=['location'] - widgets={ - 'location': forms.TextInput(attrs={'placeholder': 'Enter Interview Location'}), - } +# class OnsiteLocationForm(forms.ModelForm): +# class Meta: +# model= +# fields=['location'] +# widgets={ +# 'location': forms.TextInput(attrs={'placeholder': 'Enter Interview Location'}), +# } - - - - - - - - - - - \ No newline at end of file +class OnsiteMeetingForm(forms.ModelForm): + class Meta: + model = OnsiteMeeting + fields = ['topic', 'start_time', 'duration', 'timezone', 'location', 'status'] + widgets = { + 'topic': forms.TextInput(attrs={'placeholder': 'Enter the Meeting Topic', 'class': 'form-control'}), + 'start_time': forms.DateTimeInput( + attrs={'type': 'datetime-local', 'class': 'form-control'} + ), + 'duration': forms.NumberInput( + attrs={'min': 15, 'placeholder': 'Duration in minutes', 'class': 'form-control'} + ), + 'location': forms.TextInput(attrs={'placeholder': 'Physical location', 'class': 'form-control'}), + 'timezone': forms.TextInput(attrs={'class': 'form-control'}), + 'status': forms.Select(attrs={'class': 'form-control'}), + } \ No newline at end of file diff --git a/recruitment/migrations/0012_interviewschedule_interview_topic.py b/recruitment/migrations/0012_interviewschedule_interview_topic.py new file mode 100644 index 0000000..fbf21b7 --- /dev/null +++ b/recruitment/migrations/0012_interviewschedule_interview_topic.py @@ -0,0 +1,18 @@ +# Generated by Django 5.2.7 on 2025-11-10 09:27 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('recruitment', '0011_alter_scheduledinterview_zoom_meeting'), + ] + + operations = [ + migrations.AddField( + model_name='interviewschedule', + name='interview_topic', + field=models.CharField(blank=True, null=True), + ), + ] diff --git a/recruitment/migrations/0013_onsitemeeting_and_more.py b/recruitment/migrations/0013_onsitemeeting_and_more.py new file mode 100644 index 0000000..4cb09d6 --- /dev/null +++ b/recruitment/migrations/0013_onsitemeeting_and_more.py @@ -0,0 +1,45 @@ +# Generated by Django 5.2.7 on 2025-11-10 13:00 + +import django.db.models.deletion +import django_extensions.db.fields +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('recruitment', '0012_interviewschedule_interview_topic'), + ] + + operations = [ + migrations.CreateModel( + name='OnsiteMeeting', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created at')), + ('updated_at', models.DateTimeField(auto_now=True, verbose_name='Updated at')), + ('slug', django_extensions.db.fields.RandomCharField(blank=True, editable=False, length=8, unique=True, verbose_name='Slug')), + ('topic', models.CharField(max_length=255, verbose_name='Topic')), + ('start_time', models.DateTimeField(db_index=True, verbose_name='Start Time')), + ('duration', models.PositiveIntegerField(verbose_name='Duration')), + ('timezone', models.CharField(max_length=50, verbose_name='Timezone')), + ('location', models.CharField(blank=True, null=True)), + ], + options={ + 'abstract': False, + }, + ), + migrations.RemoveField( + model_name='interviewschedule', + name='interview_topic', + ), + migrations.RemoveField( + model_name='interviewschedule', + name='location', + ), + migrations.AddField( + model_name='scheduledinterview', + name='onsite_meeting', + field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='interview', to='recruitment.onsitemeeting'), + ), + ] diff --git a/recruitment/migrations/0014_onsitemeeting_status.py b/recruitment/migrations/0014_onsitemeeting_status.py new file mode 100644 index 0000000..78270f1 --- /dev/null +++ b/recruitment/migrations/0014_onsitemeeting_status.py @@ -0,0 +1,18 @@ +# Generated by Django 5.2.7 on 2025-11-10 13:20 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('recruitment', '0013_onsitemeeting_and_more'), + ] + + operations = [ + migrations.AddField( + model_name='onsitemeeting', + name='status', + field=models.CharField(blank=True, db_index=True, default='waiting', max_length=20, null=True, verbose_name='Status'), + ), + ] diff --git a/recruitment/migrations/0015_alter_scheduledinterview_onsite_meeting.py b/recruitment/migrations/0015_alter_scheduledinterview_onsite_meeting.py new file mode 100644 index 0000000..3127c6b --- /dev/null +++ b/recruitment/migrations/0015_alter_scheduledinterview_onsite_meeting.py @@ -0,0 +1,19 @@ +# Generated by Django 5.2.7 on 2025-11-10 13:55 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('recruitment', '0014_onsitemeeting_status'), + ] + + operations = [ + migrations.AlterField( + model_name='scheduledinterview', + name='onsite_meeting', + field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='onsite_interview', to='recruitment.onsitemeeting'), + ), + ] diff --git a/recruitment/models.py b/recruitment/models.py index a4c54d2..bd25ec7 100644 --- a/recruitment/models.py +++ b/recruitment/models.py @@ -731,6 +731,27 @@ class TrainingMaterial(Base): def __str__(self): return self.title +class OnsiteMeeting(Base): + class MeetingStatus(models.TextChoices): + WAITING = "waiting", _("Waiting") + STARTED = "started", _("Started") + ENDED = "ended", _("Ended") + CANCELLED = "cancelled",_("Cancelled") + # Basic meeting details + topic = models.CharField(max_length=255, verbose_name=_("Topic")) + start_time = models.DateTimeField(db_index=True, verbose_name=_("Start Time")) # Added index + duration = models.PositiveIntegerField( + verbose_name=_("Duration") + ) # Duration in minutes + timezone = models.CharField(max_length=50, verbose_name=_("Timezone")) + location=models.CharField(null=True,blank=True) + status = models.CharField( + db_index=True, max_length=20, # Added index + null=True, + blank=True, + verbose_name=_("Status"), + default=MeetingStatus.WAITING, + ) class ZoomMeeting(Base): class MeetingStatus(models.TextChoices): @@ -1613,7 +1634,6 @@ class InterviewSchedule(Base): verbose_name="Interview Meeting Type" ) - location=models.CharField(null=True,blank=True,default='Remote') job = models.ForeignKey( JobPosting, on_delete=models.CASCADE, related_name="interview_schedules", db_index=True @@ -1673,6 +1693,11 @@ class ScheduledInterview(Base): ZoomMeeting, on_delete=models.CASCADE, related_name="interview", db_index=True, null=True, blank=True ) + + onsite_meeting= models.OneToOneField( + OnsiteMeeting, on_delete=models.CASCADE, related_name="onsite_interview", db_index=True, + null=True, blank=True + ) schedule = models.ForeignKey( InterviewSchedule, on_delete=models.CASCADE, related_name="interviews",null=True,blank=True, db_index=True ) diff --git a/recruitment/templatetags/url_extras.py b/recruitment/templatetags/url_extras.py new file mode 100644 index 0000000..3c46e0a --- /dev/null +++ b/recruitment/templatetags/url_extras.py @@ -0,0 +1,19 @@ +from django import template + +register = template.Library() + +@register.simple_tag +def add_get_params(request_get, *args): + """ + Constructs a GET query string by preserving all current + parameters EXCEPT 'page', which is handled separately. + """ + params = request_get.copy() + + # Remove the page parameter to prevent it from duplicating or interfering + if 'page' in params: + del params['page'] + + # Return the URL-encoded string (e.g., department=IT&employment_type=FULL_TIME) + # The template prepends the '&' and the 'page=X' + return params.urlencode() \ No newline at end of file diff --git a/recruitment/urls.py b/recruitment/urls.py index ad838ea..794e2c5 100644 --- a/recruitment/urls.py +++ b/recruitment/urls.py @@ -14,6 +14,7 @@ urlpatterns = [ path('jobs//update/', views.edit_job, name='job_update'), # path('jobs//delete/', views., name='job_delete'), path('jobs//', views.job_detail, name='job_detail'), + path('jobs//download/cvs/', views.job_cvs_download, name='job_cvs_download'), path('careers/',views.kaauh_career,name='kaauh_career'), @@ -234,8 +235,14 @@ urlpatterns = [ path('jobs//candidates/compose_email/', views.compose_candidate_email, name='compose_candidate_email'), path('interview/partcipants//',views.create_interview_participants,name='create_interview_participants'), path('interview/email//',views.send_interview_email,name='send_interview_email'), - path('interview/schedule/location//',views.schedule_interview_location_form,name='schedule_interview_location_form'), - path('interview/list',views.InterviewListView,name='interview_list') + + + + # # --- SCHEDULED INTERVIEW URLS (New Centralized Management) --- + # path('interview/list/', views.InterviewListView.as_view(), name='interview_list'), + # path('interviews//', views.ScheduledInterviewDetailView.as_view(), name='scheduled_interview_detail'), + # path('interviews//update/', views.ScheduledInterviewUpdateView.as_view(), name='update_scheduled_interview'), + # path('interviews//delete/', views.ScheduledInterviewDeleteView.as_view(), name='delete_scheduled_interview'), ] diff --git a/recruitment/views.py b/recruitment/views.py index 6cb373f..c77b52e 100644 --- a/recruitment/views.py +++ b/recruitment/views.py @@ -1,5 +1,8 @@ import json +import io +import zipfile +from django.core.paginator import Paginator from django.utils.translation import gettext as _ from django.contrib.auth.models import User from django.contrib.auth.decorators import login_required @@ -21,6 +24,7 @@ from django.db.models import F, IntegerField, Count, Avg, Sum, Q, ExpressionWrap from django.db.models.functions import Cast, Coalesce, TruncDate from django.db.models.fields.json import KeyTextTransform from django.db.models.expressions import ExpressionWrapper +from django.urls import reverse_lazy from django.db.models import Count, Avg, F,Q from .forms import ( CandidateExamDateForm, @@ -44,7 +48,7 @@ from .forms import ( CandidateEmailForm, SourceForm, InterviewEmailForm, - InterviewScheduleLocationForm + ) from easyaudit.models import CRUDEvent, LoginEvent, RequestEvent from rest_framework import viewsets @@ -53,7 +57,7 @@ from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger 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 django.views.generic import CreateView, UpdateView, DetailView, ListView,DeleteView from .utils import ( create_zoom_meeting, delete_zoom_meeting, @@ -194,20 +198,17 @@ class ZoomMeetingListView(LoginRequiredMixin, ListView): context["candidate_name_filter"] = self.request.GET.get("candidate_name", "") return context -@login_required -def InterviewListView(request): - interview_type=request.GET.get('interview_type','Remote') - print(interview_type) - if interview_type=='Onsite': - meetings=ScheduledInterview.objects.filter(schedule__interview_type=interview_type) - else: - meetings=ZoomMeeting.objects.all() - print(meetings) - return render(request, "meetings/list_meetings.html",{ - 'meetings':meetings, - 'current_interview_type':interview_type - }) +# @login_required +# def InterviewListView(request): +# # interview_type=request.GET.get('interview_type','Remote') +# # print(interview_type) +# interview_type='Onsite' +# meetings=ScheduledInterview.objects.filter(schedule__interview_type=interview_type) +# return render(request, "meetings/list_meetings.html",{ +# 'meetings':meetings, +# }) + # search_query = request.GET.get("q", "") # Renamed from 'search' to 'q' for consistency # if search_query: # interviews = interviews.filter( @@ -239,7 +240,10 @@ class ZoomMeetingDetailsView(LoginRequiredMixin, DetailView): def get_context_data(self, **kwargs): context=super().get_context_data(**kwargs) meeting = self.object - interview=meeting.interview + try: + interview=meeting.interview + except Exception as e: + print(e) candidate = interview.candidate job=meeting.get_job @@ -402,10 +406,13 @@ def edit_job(request, slug): SCORE_PATH = 'ai_analysis_data__analysis_data__match_score' HIGH_POTENTIAL_THRESHOLD=75 +from django.contrib.sites.shortcuts import get_current_site @login_required def job_detail(request, slug): """View details of a specific job""" job = get_object_or_404(JobPosting, slug=slug) + current_site=get_current_site(request) + print(current_site) # Get all candidates for this job, ordered by most recent applicants = job.candidates.all().order_by("-created_at") @@ -556,6 +563,60 @@ def job_detail(request, slug): } return render(request, "jobs/job_detail.html", context) + + +ALLOWED_EXTENSIONS = ('.pdf', '.docx') + +def job_cvs_download(request,slug): + + job = get_object_or_404(JobPosting,slug=slug) + entries=Candidate.objects.filter(job=job) + + + # 2. Create an in-memory byte stream (BytesIO) + zip_buffer = io.BytesIO() + + # 3. Create the ZIP archive + with zipfile.ZipFile(zip_buffer, 'w', zipfile.ZIP_DEFLATED) as zf: + + for entry in entries: + # Check if the file field has a file + if not entry.resume: + continue + + # Get the file name and check extension (case-insensitive) + file_name = entry.resume.name.split('/')[-1] + file_name_lower = file_name.lower() + + if file_name_lower.endswith(ALLOWED_EXTENSIONS): + try: + # Open the file object (rb is read binary) + file_obj = entry.resume.open('rb') + + # *** ROBUST METHOD: Read the content and write it to the ZIP *** + file_content = file_obj.read() + + # Write the file content directly to the ZIP archive + zf.writestr(file_name, file_content) + + file_obj.close() + + except Exception as e: + # Log the error but continue with the rest of the files + print(f"Error processing file {file_name}: {e}") + continue + + # 4. Prepare the response + zip_buffer.seek(0) + + # 5. Create the HTTP response + response = HttpResponse(zip_buffer.read(), content_type='application/zip') + + # Set the header for the browser to download the file + response['Content-Disposition'] = 'attachment; filename=f"all_cvs_for_{job.title}.zip"' + + return response + @login_required def job_image_upload(request, slug): #only for handling the post request @@ -612,6 +673,20 @@ def edit_linkedin_post_content(request,slug): +JOB_TYPES = [ + ("FULL_TIME", "Full-time"), + ("PART_TIME", "Part-time"), + ("CONTRACT", "Contract"), + ("INTERNSHIP", "Internship"), + ("FACULTY", "Faculty"), + ("TEMPORARY", "Temporary"), +] + +WORKPLACE_TYPES = [ + ("ON_SITE", "On-site"), + ("REMOTE", "Remote"), + ("HYBRID", "Hybrid"), +] def kaauh_career(request): @@ -621,8 +696,48 @@ def kaauh_career(request): status='ACTIVE', form_template__is_active=True ) + selected_department=request.GET.get('department','') + department_type_keys=active_jobs.exclude( + department__isnull=True + ).exclude(department__exact='' + ).values_list( + 'department', + flat=True + ).distinct().order_by('department') + + if selected_department and selected_department in department_type_keys: + active_jobs=active_jobs.filter(department=selected_department) + selected_workplace_type=request.GET.get('workplace_type','') + print(selected_workplace_type) + selected_job_type = request.GET.get('employment_type', '') + + job_type_keys = active_jobs.values_list('job_type', flat=True).distinct() + workplace_type_keys=active_jobs.values_list('workplace_type',flat=True).distinct() + if selected_job_type and selected_job_type in job_type_keys: + active_jobs=active_jobs.filter(job_type=selected_job_type) + if selected_workplace_type and selected_workplace_type in workplace_type_keys: + active_jobs=active_jobs.filter(workplace_type=selected_workplace_type) - return render(request,'applicant/career.html',{'active_jobs':active_jobs}) + JOBS_PER_PAGE=10 + paginator = Paginator(active_jobs, JOBS_PER_PAGE) + page_number = request.GET.get('page', 1) + + try: + page_obj = paginator.get_page(page_number) + except EmptyPage: + page_obj = paginator.page(paginator.num_pages) + + total_open_roles=active_jobs.all().count() + + + return render(request,'applicant/career.html',{'active_jobs': page_obj.object_list, + 'job_type_keys':job_type_keys, + 'selected_job_type':selected_job_type, + 'workplace_type_keys':workplace_type_keys, + 'selected_workplace_type':selected_workplace_type, + 'selected_department':selected_department, + 'department_type_keys':department_type_keys, + 'total_open_roles': total_open_roles,'page_obj': page_obj}) # job detail facing the candidate: def application_detail(request, slug): @@ -4131,18 +4246,19 @@ def send_interview_email(request, slug): -def schedule_interview_location_form(request,slug): - schedule=get_object_or_404(InterviewSchedule,slug=slug) - if request.method=='POST': - form=InterviewScheduleLocationForm(request.POST,instance=schedule) - form.save() - return redirect('list_meetings') - else: - form=InterviewScheduleLocationForm(instance=schedule) - return render(request,'interviews/schedule_interview_location_form.html',{'form':form,'schedule':schedule}) +# def schedule_interview_location_form(request,slug): +# schedule=get_object_or_404(InterviewSchedule,slug=slug) +# if request.method=='POST': +# form=InterviewScheduleLocationForm(request.POST,instance=schedule) +# form.save() +# return redirect('list_meetings') +# else: +# form=InterviewScheduleLocationForm(instance=schedule) +# return render(request,'interviews/schedule_interview_location_form.html',{'form':form,'schedule':schedule}) def onsite_interview_list_view(request): onsite_interviews=ScheduledInterview.objects.filter(schedule__interview_type='Onsite') return render(request,'interviews/onsite_interview_list.html',{'onsite_interviews':onsite_interviews}) + diff --git a/templates/applicant/application_detail.html b/templates/applicant/application_detail.html index 64465e6..ac319ea 100644 --- a/templates/applicant/application_detail.html +++ b/templates/applicant/application_detail.html @@ -1,172 +1,216 @@ -{% extends 'applicant/partials/candidate_facing_base.html'%} +{% extends 'applicant/partials/candidate_facing_base.html' %} {% load static i18n %} {% block content %} - +{% if messages %} +
+
+ {# Use responsive columns matching the main content block for alignment #} +
+ {% for message in messages %} + + {% endfor %} +
+
+
+ {% endif %} + + {# ================================================= #} + {# DJANGO MESSAGE BLOCK - Placed directly below the main navbar #} + {# ================================================= #} + + {# ================================================= #} + + {% block content %} + {% endblock content %} + diff --git a/templates/base.html b/templates/base.html index 0463281..404faaa 100644 --- a/templates/base.html +++ b/templates/base.html @@ -208,7 +208,11 @@ {% trans "Sign Out" %} - + + {% comment %} + + {% trans "Sign Out" %} + {% endcomment %} {% endif %} @@ -255,7 +259,7 @@ - + {% endcomment %}