diff options
Diffstat (limited to 'apps/notes')
-rw-r--r-- | apps/notes/forms.py | 11 | ||||
-rw-r--r-- | apps/notes/models.py | 4 | ||||
-rw-r--r-- | apps/notes/serializers.py | 4 | ||||
-rw-r--r-- | apps/notes/urls.py | 6 | ||||
-rw-r--r-- | apps/notes/views.py | 62 |
5 files changed, 84 insertions, 3 deletions
diff --git a/apps/notes/forms.py b/apps/notes/forms.py index a7a4f8d..c1df176 100644 --- a/apps/notes/forms.py +++ b/apps/notes/forms.py @@ -1,7 +1,7 @@ from django import forms from django.utils.translation import ugettext_lazy as _ -from .models import Note +from .models import Note, Notebook class NoteForm(forms.ModelForm): @@ -15,3 +15,12 @@ class NoteForm(forms.ModelForm): def __init__(self, *args, **kwargs): self.user = kwargs.pop("user", None) super(NoteForm, self).__init__(*args, **kwargs) + + +class NotebookForm(NoteForm): + class Meta: + model = Notebook + fields = ['name'] + labels = { + "name": _("Notebook Name"), + } diff --git a/apps/notes/models.py b/apps/notes/models.py index 83766a9..c0b23ce 100644 --- a/apps/notes/models.py +++ b/apps/notes/models.py @@ -33,6 +33,10 @@ class Notebook(models.Model): self.slug = unique_slug_generator(self) super(Notebook, self).save() + @cached_property + def get_absolute_url(self): + return reverse("notes:notebook-detail", kwargs={"user": self.owner.username, "slug": self.slug}) + class Note(models.Model): unique_id = models.UUIDField(default=uuid.uuid4, editable=False) diff --git a/apps/notes/serializers.py b/apps/notes/serializers.py index 2fbcc1f..daef52e 100644 --- a/apps/notes/serializers.py +++ b/apps/notes/serializers.py @@ -13,6 +13,8 @@ class NoteSerializer(TaggitSerializer, serializers.ModelSerializer): class NotebookSerializer(serializers.HyperlinkedModelSerializer): + json_absolute_url = serializers.URLField(source='get_absolute_url', read_only=True) + class Meta: model = Notebook - fields = ('name',) + fields = ('name', 'json_absolute_url') diff --git a/apps/notes/urls.py b/apps/notes/urls.py index ccfcc9e..a79c7cd 100644 --- a/apps/notes/urls.py +++ b/apps/notes/urls.py @@ -5,12 +5,18 @@ from .views import ( NoteCreateView, NoteListView, NoteListRedirectView, + NotebookListView, + NotebookDetailView, + NoteTagView, ) app_name = "notes" urlpatterns = [ path(r'create/', NoteCreateView.as_view(), name='note-create',), + path(r'<str:user>/tagged/<slug>', NoteTagView.as_view(), name='note-tag',), + path(r'<str:user>/notebooks/<slug>', NotebookDetailView.as_view(), name='notebook-detail',), + path(r'<str:user>/notebooks/', NotebookListView.as_view(), name='notebook-list',), path(r'<str:user>/<slug>', NoteDetailView.as_view(), name='note-detail',), path(r'<str:user>/', NoteListView.as_view(), name='note-list',), path(r'', NoteListRedirectView.as_view(), name='note-redirect',), diff --git a/apps/notes/views.py b/apps/notes/views.py index b971390..d885ad9 100644 --- a/apps/notes/views.py +++ b/apps/notes/views.py @@ -13,7 +13,7 @@ from rest_framework import permissions from .serializers import NoteSerializer, NotebookSerializer from .models import Note, Notebook -from .forms import NoteForm +from .forms import NoteForm, NotebookForm @method_decorator(login_required, name='dispatch') @@ -40,6 +40,35 @@ class NoteListView(LoggedInViewWithUser, ListView): return ['sell.html'] +class NoteTagView(LoggedInViewWithUser, ListView): + model = Note + template_name = 'notes/notes_list.html' + + def get_queryset(self): + ''' + This can generate a crazy amount of joins if there's a lot of tags + have to keep an eye on it. Would be better to do: + from django.db.models import Q + from functools import reduce + from operator import and_, or_ + #query = reduce(and_, (Q(tags__slug=t) for t in self.tag_list)) + # Note.objects.filter(query, owner=self.request.user) + But that doesn't work for some reason. + ''' + if not self.request.user.is_anonymous: + self.tag_list = [x.strip() for x in self.kwargs['slug'].split("+")] + qs = Note.objects.filter(owner=self.request.user) + for tag in self.tag_list: + qs = qs.filter(tags__slug=tag) + return qs + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context['notes_list'] = Note.objects.filter(owner=self.request.user) + context['tags'] = self.tag_list + return context + + class NoteListRedirectView(RedirectView, LoggedInViewWithUser): def get_redirect_url(self, *args, **kwargs): @@ -75,6 +104,34 @@ class NoteCreateView(CreateView, LoggedInViewWithUser): return reverse_lazy('notes:note-detail', kwargs={'user': self.request.user.username, 'slug': self.object.slug}) +class NotebookListView(CreateView, LoggedInViewWithUser): + model = Notebook + form_class = NotebookForm + template_name = 'notes/notebook_create.html' + + def get_queryset(self): + if not self.request.user.is_anonymous: + return Notebook.objects.filter(owner=self.request.user) + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context['notebook_list'] = Notebook.objects.filter(owner=self.request.user) + context['notes_list'] = Note.objects.filter(owner=self.request.user).select_related() + return context + + +class NotebookDetailView(DetailView, LoggedInViewWithUser): + model = Notebook + + def get_object(self): + return get_object_or_404(self.get_queryset().select_related(), owner=self.request.user, slug=self.kwargs["slug"]) + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context['notes_list'] = Note.objects.filter(owner=self.request.user).select_related() + return context + + class IsOwnerOrDeny(permissions.BasePermission): """ Custom permission to only allow owners to post to their endpoint @@ -118,3 +175,6 @@ class NotebookViewSet(viewsets.ModelViewSet): def perform_create(self, serializer): serializer.save(owner=self.request.user) + + def get_menu_data(self, serializer): + return Notebook.objects.filter(owner=self.request.user).order_by('-name')[:1] |