|
3 | 3 | from typing import Any |
4 | 4 |
|
5 | 5 | from django.contrib.auth.mixins import LoginRequiredMixin |
6 | | -from django.db.models import CharField, F, QuerySet, Value |
| 6 | +from django.db.models import CharField, F, Prefetch, QuerySet, Value |
7 | 7 | from django.http import HttpResponse, HttpResponseRedirect |
| 8 | +from django.shortcuts import get_object_or_404 |
8 | 9 | from django.urls import reverse_lazy |
9 | | -from django.views.generic import DetailView, RedirectView |
| 10 | +from django.views.generic import CreateView, DetailView, ListView, RedirectView |
10 | 11 | from django.views.generic.detail import SingleObjectMixin |
11 | 12 | from django.views.generic.edit import FormMixin, ProcessFormView |
12 | 13 | from django_filters.views import FilterView |
|
19 | 20 | from tickets.tables import TicketTable |
20 | 21 |
|
21 | 22 | from .filters import TeamFilterset |
22 | | -from .models import Team, TeamComment |
| 23 | +from .forms import TeamAttendanceLogForm |
| 24 | +from .models import Team, TeamAttendanceEvent, TeamComment |
23 | 25 | from .srcomp import srcomp |
24 | | -from .tables import TeamTable |
| 26 | +from .tables import TeamAttendanceListTable, TeamAttendanceOverviewTable, TeamTable |
25 | 27 |
|
26 | 28 |
|
27 | 29 | class TicketDetailRedirectView(RedirectView): |
@@ -172,3 +174,42 @@ def get_entries(self) -> QuerySet[Any]: |
172 | 174 |
|
173 | 175 | def get_context_data(self, **kwargs: Any) -> dict[str, Any]: |
174 | 176 | return super().get_context_data(entries=self.get_entries(), **kwargs) |
| 177 | + |
| 178 | + |
| 179 | +class TeamAttendanceView(LoginRequiredMixin, SingleTableMixin, ListView): |
| 180 | + model = Team |
| 181 | + table_class = TeamAttendanceOverviewTable |
| 182 | + |
| 183 | + def get_queryset(self) -> QuerySet[Any]: |
| 184 | + return Team.objects.all().prefetch_related( |
| 185 | + Prefetch( |
| 186 | + "team_attendance_events", |
| 187 | + TeamAttendanceEvent.objects.order_by("-created_at")[:1], |
| 188 | + to_attr="latest_event", |
| 189 | + ) |
| 190 | + ) |
| 191 | + |
| 192 | + |
| 193 | +class TeamAttendanceFormView(LoginRequiredMixin, CreateView): |
| 194 | + model = TeamAttendanceEvent |
| 195 | + form_class = TeamAttendanceLogForm |
| 196 | + slug_field = "tla" |
| 197 | + |
| 198 | + def get_success_url(self) -> str: |
| 199 | + return reverse_lazy("teams:team_list_attendance") |
| 200 | + |
| 201 | + def get_initial(self) -> dict[str, Any]: |
| 202 | + return {"team": get_object_or_404(Team, tla=self.kwargs["slug"])} |
| 203 | + |
| 204 | + def get_context_data(self, **kwargs: Any) -> dict[str, Any]: |
| 205 | + context_data = super().get_context_data(**kwargs) |
| 206 | + context_data["team"] = context_data["form"].initial["team"] |
| 207 | + context_data["events"] = ( |
| 208 | + TeamAttendanceEvent.objects.filter(team=context_data["team"]).order_by("-created_at").all() |
| 209 | + ) |
| 210 | + context_data["table"] = TeamAttendanceListTable(context_data["events"]) |
| 211 | + return context_data |
| 212 | + |
| 213 | + def form_valid(self, form: TeamAttendanceLogForm) -> HttpResponse: |
| 214 | + form.instance.user = self.request.user |
| 215 | + return super().form_valid(form) |
0 commit comments