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')