Files
JooL_website/apps/careers/views.py
2026-05-12 16:54:38 +00:00

68 lines
2.2 KiB
Python

from django.db import IntegrityError
from django.shortcuts import get_object_or_404, redirect
from django.views.generic import DetailView, FormView, ListView, TemplateView
from .forms import JobApplicationForm
from .models import JobApplication, JobOffer
class JobListView(ListView):
template_name = 'careers/job_list.html'
context_object_name = 'jobs'
def get_queryset(self):
qs = JobOffer.objects.filter(status=JobOffer.Status.PUBLISHED)
dept = self.request.GET.get('dept')
if dept:
qs = qs.filter(department=dept)
return qs
def get_context_data(self, **kwargs):
ctx = super().get_context_data(**kwargs)
ctx['departments'] = JobOffer.Department.choices
ctx['active_dept'] = self.request.GET.get('dept', '')
return ctx
class JobDetailView(DetailView):
template_name = 'careers/job_detail.html'
context_object_name = 'job'
def get_object(self):
return get_object_or_404(JobOffer, slug=self.kwargs['slug'], status=JobOffer.Status.PUBLISHED)
class ApplyView(FormView):
template_name = 'careers/apply.html'
form_class = JobApplicationForm
def dispatch(self, request, *args, **kwargs):
self.job = get_object_or_404(JobOffer, slug=kwargs['slug'], status=JobOffer.Status.PUBLISHED)
if not self.job.is_open:
return redirect('careers:job_detail', slug=self.job.slug)
return super().dispatch(request, *args, **kwargs)
def get_context_data(self, **kwargs):
ctx = super().get_context_data(**kwargs)
ctx['job'] = self.job
return ctx
def form_valid(self, form):
application = form.save(commit=False)
application.job = self.job
try:
application.save()
except IntegrityError:
form.add_error('email', 'Vous avez déjà postulé à cette offre avec cet email.')
return self.form_invalid(form)
return redirect('careers:apply_success', slug=self.job.slug)
class ApplySuccessView(TemplateView):
template_name = 'careers/apply_success.html'
def get_context_data(self, **kwargs):
ctx = super().get_context_data(**kwargs)
ctx['job'] = get_object_or_404(JobOffer, slug=self.kwargs['slug'])
return ctx