from django.views.generic import CreateView, ListView, UpdateView, DeleteView from django.views.generic.detail import DetailView from django.views.generic.base import View, RedirectView from django.utils.decorators import method_decorator from django.contrib.auth.decorators import login_required from django.shortcuts import get_object_or_404, render, redirect from django.urls import reverse, reverse_lazy from rest_framework import viewsets from rest_framework.response import Response from rest_framework.decorators import list_route from rest_framework import permissions from .serializers import NoteSerializer, NotebookSerializer from .models import Note, Notebook from .forms import NoteForm @method_decorator(login_required, name='dispatch') class LoggedInViewWithUser(View): def get_form_kwargs(self, **kwargs): kwargs = super().get_form_kwargs(**kwargs) kwargs.update({'user': self.request.user}) return kwargs class NoteListView(LoggedInViewWithUser, ListView): model = Note def get_queryset(self): if not self.request.user.is_anonymous: return Note.objects.filter(owner=self.request.user) def get_template_names(self): # print("IP Address for debug-toolbar: " + self.request.META['REMOTE_ADDR']) if not self.request.user.is_anonymous: return ['notes/notes_list.html'] else: return ['sell.html'] class NoteListRedirectView(RedirectView, LoggedInViewWithUser): def get_redirect_url(self, *args, **kwargs): return reverse_lazy("notes:note-list", kwargs={"user": self.request.user.username}) class NoteDetailView(UpdateView, LoggedInViewWithUser): model = Note form_class = NoteForm template_name = 'notes/notes_detail.html' def get_queryset(self): if not self.request.user.is_anonymous: return Note.objects.filter(owner=self.request.user) def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context['notes_list'] = Note.objects.filter(owner=self.request.user) return context class NoteCreateView(CreateView, LoggedInViewWithUser): model = Note form_class = NoteForm template_name = 'notes/notes_create.html' def form_valid(self, form): form.instance.owner = self.request.user self.object = form.save() return super(NoteCreateView, self).form_valid(form) def get_success_url(self): return reverse_lazy('notes:note-detail', kwargs={'user': self.request.user.username, 'slug': self.object.slug}) class IsOwnerOrDeny(permissions.BasePermission): """ Custom permission to only allow owners to post to their endpoint """ def has_object_permission(self, request, view, obj): # Write permissions are only allowed to the owner of the snippet. return obj.owner == request.user class NoteViewSet(viewsets.ModelViewSet): """ API endpoint that allows notes to be viewed or edited. """ serializer_class = NoteSerializer permission_classes = (permissions.IsAuthenticated,) def get_queryset(self): return Note.objects.filter(owner=self.request.user).order_by('-date_created') def perform_create(self, serializer): serializer.save(owner=self.request.user) def get_object(self): obj = get_object_or_404(self.get_queryset(), pk=self.kwargs["pk"]) if obj.is_public: return obj else: self.check_object_permissions(self.request, obj) return obj class NotebookViewSet(viewsets.ModelViewSet): """ API endpoint that allows botebook to be viewed or edited. """ serializer_class = NotebookSerializer def get_queryset(self): return Notebook.objects.filter(owner=self.request.user).order_by('-date_created') def perform_create(self, serializer): serializer.save(owner=self.request.user)