ipv6-dot-work/jobs/views.py

128 lines
4.3 KiB
Python

from django.urls import reverse_lazy
from django.http import HttpResponseRedirect
from django.contrib import messages
from django.views.generic import (View, TemplateView, ListView, CreateView,
DetailView)
from django.views.generic.detail import SingleObjectMixin
from rules.contrib.views import PermissionRequiredMixin
from .models import Job, Application, Question
from .forms import JobForm, QuestionFormSet, ApplicationForm, AnswerForm
class Index(TemplateView):
template_name = 'jobs/index.html'
class JobList(ListView):
context_object_name = 'jobs'
model = Job
class JobDetail(DetailView):
context_object_name = 'job'
model = Job
class JobRenew(PermissionRequiredMixin, SingleObjectMixin, View):
model = Job
permission_required = 'jobs.change_job'
http_method_names = ['post']
def post(self, request, *args, **kwargs):
job = self.get_object()
job.renew()
messages.add_message(
request, messages.SUCCESSS,
'Job has been renewed until {}.'.format(
job.expires.isoformat(' ', 'seconds')))
return HttpResponseRedirect(job.get_absolute_url())
class JobCreate(CreateView):
model = Job
form_class = JobForm
success_url = reverse_lazy("jobs:list")
def get(self, request, *args, **kwargs):
self.object = None
form = self.get_form(self.get_form_class())
question_form = QuestionFormSet()
return self.render_to_response(
self.get_context_data(form=form, question_form=question_form))
def post(self, request, *args, **kwargs):
self.object = None
form_class = self.get_form_class()
form = self.get_form(form_class)
question_form = QuestionFormSet(self.request.POST)
if (form.is_valid() and question_form.is_valid()):
return self.form_valid(form, question_form)
else:
return self.form_invalid(form, question_form)
def form_valid(self, form, question_form):
self.object = form.save(commit=False)
self.object.posted_by = self.request.user
self.object.save()
question_form.instance = self.object
question_form.save()
return HttpResponseRedirect(self.get_success_url())
def form_invalid(self, form, question_form):
return self.render_to_response(
self.get_context_data(form=form, question_form=question_form))
class ApplicationCreate(CreateView):
# TODO: restrict users from re-application
model = Application
form_class = ApplicationForm
success_url = reverse_lazy("jobs:list")
def get_question_queryset(self):
# filter questions for particular job and order it so same queryset
# can be used stably as initial params for GET and POST requests
return Question.objects.filter(
job_id=self.kwargs['job_pk']).order_by('id')
def get_answer_formset(self, *args):
questions = self.get_question_queryset()
return AnswerForm.inlineformset_factory(extra=questions.count())(
initial=[{
'question': q.id
} for q in questions], *args)
def get(self, request, *args, **kwargs):
self.object = None
form = self.get_form(self.get_form_class())
answer_form = self.get_answer_formset()
return self.render_to_response(
self.get_context_data(form=form, answer_form=answer_form))
def post(self, request, *args, **kwargs):
self.object = None
form_class = self.get_form_class()
form = self.get_form(form_class)
answer_form = self.get_answer_formset(self.request.POST)
if (form.is_valid() and answer_form.is_valid()):
return self.form_valid(form, answer_form)
else:
return self.form_invalid(form, answer_form)
def form_valid(self, form, answer_form):
self.object = form.save(commit=False)
self.object.applicant = self.request.user
self.object.job = Job.objects.get(id=self.kwargs['job_pk'])
self.object.save()
answer_form.instance = self.object
answer_form.save()
return HttpResponseRedirect(self.get_success_url())
def form_invalid(self, form, answer_form):
return self.render_to_response(
self.get_context_data(form=form, answer_form=answer_form))