diff --git a/recruitment/tasks.py b/recruitment/tasks.py index d67bdec..511aa8f 100644 --- a/recruitment/tasks.py +++ b/recruitment/tasks.py @@ -888,11 +888,12 @@ def generate_and_save_cv_zip(job_posting_id): # 4. Save the generated zip buffer to the JobPosting model zip_buffer.seek(0) - zip_filename = f"all_cvs_for_{job.title}.zip" + now = str(timezone.now()) + zip_filename = f"all_cvs_for_{job.slug}_{job.title}_{now}.zip" # Use ContentFile to save the bytes stream into the FileField job.cv_zip_file.save(zip_filename, ContentFile(zip_buffer.read())) job.zip_created = True # Assuming you added a BooleanField for tracking completion job.save() - return f"Successfully created zip for Job ID {job_posting_id}" \ No newline at end of file + return f"Successfully created zip for Job ID {job.slug} {job_posting_id}" \ No newline at end of file diff --git a/recruitment/views.py b/recruitment/views.py index 7c5545b..65b5ceb 100644 --- a/recruitment/views.py +++ b/recruitment/views.py @@ -157,6 +157,29 @@ class PersonListView(StaffRequiredMixin, ListView): model = Person template_name = "people/person_list.html" context_object_name = "people_list" + def get_queryset(self): + queryset=super().get_queryset() + gender=self.request.GET.get('gender') + if gender: + queryset=queryset.filter(gender=gender) + + nationality=self.request.GET.get('nationality') + if nationality: + queryset=queryset.filter(nationality=nationality) + + return queryset + def get_context_data(self, **kwargs): + context=super().get_context_data(**kwargs) + # We query the base model to ensure we list ALL options, not just those currently displayed. + nationalities = self.model.objects.values_list('nationality', flat=True).filter( + nationality__isnull=False + ).distinct().order_by('nationality') + + nationality=self.request.GET.get('nationality') + context['nationality']=nationality + context['nationalities']=nationalities + return context + class PersonCreateView(CreateView): @@ -653,7 +676,8 @@ def request_cvs_download(request, slug): View to initiate the background task. """ job = get_object_or_404(JobPosting, slug=slug) - + job.zip_created = False + job.save(update_fields=["zip_created"]) # Use async_task to run the function in the background # Pass only simple arguments (like the job ID) async_task('recruitment.tasks.generate_and_save_cv_zip', job.id) @@ -3222,7 +3246,7 @@ def set_meeting_candidate(request, slug): @staff_user_required def agency_list(request): """List all hiring agencies with search and pagination""" - search_query = request.GET.get("q", "") + search_query = request.GET.get("search", "") agencies = HiringAgency.objects.all() if search_query: diff --git a/recruitment/views_frontend.py b/recruitment/views_frontend.py index 0c97a4d..e9c4fb7 100644 --- a/recruitment/views_frontend.py +++ b/recruitment/views_frontend.py @@ -64,9 +64,9 @@ class JobListView(LoginRequiredMixin, StaffRequiredMixin, ListView): # 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) + status_filter = self.request.GET.get('status') + if status_filter: + queryset = queryset.filter(status=status_filter) return queryset @@ -74,6 +74,7 @@ class JobListView(LoginRequiredMixin, StaffRequiredMixin, ListView): context = super().get_context_data(**kwargs) context['search_query'] = self.request.GET.get('search', '') context['lang'] = get_language() + context['status_filter']=self.request.GET.get('status') return context @@ -156,15 +157,13 @@ class ApplicationListView(LoginRequiredMixin, StaffRequiredMixin, ListView): search_query = self.request.GET.get('search', '') job = self.request.GET.get('job', '') stage = self.request.GET.get('stage', '') - # if search_query: - # queryset = queryset.filter( - # Q(first_name__icontains=search_query) | - # Q(last_name__icontains=search_query) | - # Q(email__icontains=search_query) | - # Q(phone__icontains=search_query) | - # Q(stage__icontains=search_query) | - # Q(job__title__icontains=search_query) - # ) + if search_query: + queryset = queryset.filter( + Q(person__first_name__icontains=search_query) | + Q(person__last_name__icontains=search_query) | + Q(person__email__icontains=search_query) | + Q(person__phone__icontains=search_query) + ) if job: queryset = queryset.filter(job__slug=job) if stage: diff --git a/templates/includes/document_list.html b/templates/includes/document_list.html index ea5dfda..481d94f 100644 --- a/templates/includes/document_list.html +++ b/templates/includes/document_list.html @@ -1,15 +1,16 @@ {% load static %} {% load file_filters %} +{% load i18n %}
-
Documents
+
{% trans "Documents" %}
@@ -18,7 +19,7 @@ @@ -102,7 +103,7 @@ @@ -112,7 +113,7 @@ type="button" class="btn btn-sm btn-outline-danger" onclick="confirmDelete({{ document.id }}, '{{ document.file.name|filename|default:"Document" }}')" - title="Delete" + title="{% trans "Delete" %}" > @@ -123,8 +124,8 @@ {% else %}
-

No documents uploaded yet.

-

Click "Upload Document" to add files for this candidate.

+

{% trans "No documents uploaded yet." %}

+

{% trans "Click \"Upload Document\" to add files for this candidate." %}

{% endif %}
@@ -139,7 +140,8 @@