onboard/board/views.py
2021-07-28 21:03:35 -06:00

213 lines
6.5 KiB
Python

from django.shortcuts import render
from django.urls import reverse_lazy, reverse
from django.views.generic.base import TemplateView
from django.views.generic.edit import FormView, CreateView, UpdateView, DeleteView
from django.views.generic.detail import DetailView
from django.views.generic.list import ListView
from django.contrib.auth.mixins import LoginRequiredMixin
from django.db.models import (Exists, OuterRef,
Prefetch, Subquery, Count, Sum, F, Q, Value)
from django.db.models.functions import Length, Upper
from .models import Employee, LogEntry, Todo, Event
from .forms import (
EmployeeForm,
EmployeePreCreateForm,
EmployeeArchiveForm,
LogEntryForm,
TodoForm,
TodoCreateForm,
EventForm,
)
class SearchResultsView(ListView):
model = Employee
template_name_suffix = '_search_results'
def get_queryset(self):
query = self.request.GET.get('q')
object_list = Employee.objects.filter(
Q(first_name__icontains=query) | Q(last_name__icontains=query)
)
return object_list
# Employees
class EmployeeListView(LoginRequiredMixin, ListView):
model = Employee
queryset = Employee.objects.filter(archived=False).order_by('hire_date').annotate(
todos_total=Count('todo'),
todos_completed=Count('pk', filter=Q(todo__completed=True)),
)
class EmployeeArchivedView(LoginRequiredMixin, ListView):
model = Employee
paginate_by = 100
template_name_suffix = '_archived'
queryset = Employee.objects.filter(archived=True)
class EmployeePreCreateView(LoginRequiredMixin, FormView):
template_name = 'board/employee_pre_form.html'
form_class = EmployeePreCreateForm
def form_valid(self, form):
form.filter_onboarding_email()
return super().form_valid(form)
def get_success_url(self):
return reverse('employee-list')
class EmployeeCreateView(LoginRequiredMixin, CreateView):
model = Employee
template_name_suffix = '_create_form'
form_class = EmployeeForm
class EmployeeDetailView(LoginRequiredMixin, DetailView):
model = Employee
class EmployeeUpdateView(LoginRequiredMixin, UpdateView):
model = Employee
form_class = EmployeeForm
success_url = reverse_lazy('employee-list')
class EmployeeArchiveView(LoginRequiredMixin, UpdateView):
model = Employee
form_class = EmployeeArchiveForm
template_name_suffix = '_archive_form'
success_url = reverse_lazy('employee-list')
class EmployeeDeleteView(LoginRequiredMixin, DeleteView):
model = Employee
success_url = reverse_lazy('employee-list')
# LogEntries
class LogEntryListView(LoginRequiredMixin, ListView):
model = LogEntry
pk_url_kwarg = 'entry_pk'
class LogEntryCreateView(LoginRequiredMixin, CreateView):
model = LogEntry
pk_url_kwarg = 'entry_pk'
template_name_suffix = '_create_form'
form_class = LogEntryForm
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['employee'] = Employee.objects.get(pk=self.kwargs['pk'])
return context
def form_valid(self, form):
form.instance.employee = Employee.objects.get(pk=self.kwargs['pk'])
return super().form_valid(form)
def get_success_url(self):
return reverse('employee-detail', kwargs={'pk': self.kwargs['pk']})
class LogEntryDetailView(LoginRequiredMixin, DetailView):
model = LogEntry
pk_url_kwarg = 'entry_pk'
class LogEntryUpdateView(LoginRequiredMixin, UpdateView):
model = LogEntry
pk_url_kwarg = 'entry_pk'
form_class = LogEntryForm
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['employee'] = Employee.objects.get(pk=self.kwargs['pk'])
return context
def get_success_url(self):
return reverse('employee-detail', kwargs={'pk': self.kwargs['pk']})
class LogEntryDeleteView(LoginRequiredMixin, DeleteView):
model = LogEntry
pk_url_kwarg = 'entry_pk'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['employee'] = Employee.objects.get(pk=self.kwargs['pk'])
return context
def get_success_url(self):
return reverse('employee-detail', kwargs={'pk': self.kwargs['pk']})
# Todos
class TodoListView(LoginRequiredMixin, ListView):
model = Todo
pk_url_kwarg = 'todo_pk'
class TodoCreateView(LoginRequiredMixin, CreateView):
model = Todo
pk_url_kwarg = 'todo_pk'
template_name_suffix = '_create_form'
form_class = TodoCreateForm
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['employee'] = Employee.objects.get(pk=self.kwargs['pk'])
return context
def form_valid(self, form):
form.instance.employee = Employee.objects.get(pk=self.kwargs['pk'])
return super().form_valid(form)
def get_success_url(self):
return reverse('employee-detail', kwargs={'pk': self.kwargs['pk']})
class TodoDetailView(LoginRequiredMixin, DetailView):
model = Todo
pk_url_kwarg = 'todo_pk'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['employee'] = Employee.objects.get(pk=self.kwargs['pk'])
return context
class TodoUpdateView(LoginRequiredMixin, UpdateView):
model = Todo
pk_url_kwarg = 'todo_pk'
form_class = TodoForm
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['employee'] = Employee.objects.get(pk=self.kwargs['pk'])
return context
class TodoDeleteView(LoginRequiredMixin, DeleteView):
model = Todo
pk_url_kwarg = 'todo_pk'
def get_success_url(self):
return reverse('todo-deleted', kwargs={'pk': self.kwargs['pk']})
class TodoDeleteDoneView(LoginRequiredMixin, TemplateView):
template_name = 'board/item_deleted.html'
# Events
class EventListView(LoginRequiredMixin, ListView):
model = Event
paginate_by = 100
ordering = ('-date', '-time')
class EventCreateView(LoginRequiredMixin, CreateView):
model = Event
template_name_suffix = '_create_form'
form_class = EventForm
success_url = reverse_lazy('profile-detail')
class EventDetailView(LoginRequiredMixin, DetailView):
model = Event
class EventUpdateView(LoginRequiredMixin, UpdateView):
model = Event
form_class = EventForm
class EventDeleteView(LoginRequiredMixin, DeleteView):
model = Event
success_url = reverse_lazy('profile-detail')