from datetime import timedelta from typing import Any from django.contrib import messages from django.contrib.auth.mixins import LoginRequiredMixin from django.core.exceptions import ImproperlyConfigured from django.urls import reverse_lazy from django.utils import timezone from django.views.generic import CreateView, ListView, TemplateView, UpdateView from django.views.generic.edit import FormMixin from notes.models import Note, User # Create your views here. class HomePageView(LoginRequiredMixin, TemplateView): template_name = "notes/home.html" def get_context_data(self, **kwargs: Any) -> dict[str, Any]: ctx = super().get_context_data(**kwargs) ctx["notes"] = self.request.user.alive_received_notes ctx["archive"] = self.request.user.expired_received_notes[:5] ctx["alive_created"] = self.request.user.alive_created_notes return ctx class NoteView(LoginRequiredMixin, ListView): # TODO: Add pagination to the template template_name = "notes/note_list.html" show_from = True show_to = True def get_title(self): if not hasattr(self, "title"): raise ImproperlyConfigured( "Set a `title` attribute on subclass or override `get_title(self)`" ) return self.title def get_context_data(self, **kwargs: Any) -> dict[str, Any]: ctx = super().get_context_data(**kwargs) ctx["title"] = self.get_title() ctx["show_from"] = self.show_from ctx["show_to"] = self.show_to return ctx class ArchiveView(NoteView): title = "Archive" show_to = False def get_queryset(self): return self.request.user.expired_received_notes class SentNotesView(NoteView): title = "Sent Notes" show_from = False def get_queryset(self): return self.request.user.all_created_notes class PostNoteView(LoginRequiredMixin, CreateView): model = Note fields = ["to_user", "note"] success_url = reverse_lazy("post-a-note") def get_form(self, form_class=None): form = super().get_form(form_class) form.fields["to_user"].queryset = self.request.user.allowed_notes_to.all() return form def form_valid(self, form): self.object = note = form.save(commit=False) note.expiry = timezone.now() + timedelta(seconds=note.to_user.expiry_seconds) note.from_user = self.request.user note.save() messages.success(self.request, "Note has been posted!") return FormMixin.form_valid(self, form) class ProfileView(LoginRequiredMixin, UpdateView): model = User fields = ["first_name", "last_name", "allow_notes_from", "expiry_seconds"] success_url = reverse_lazy("profile") def get_object(self): return self.request.user def form_valid(self, form): ret = super().form_valid(form) messages.success(self.request, "Profile has been updated!") return ret