From 796d1874da84a17149f578831238e5d6f2aca146 Mon Sep 17 00:00:00 2001 From: Gabriel Augendre Date: Thu, 31 May 2018 19:11:01 +0200 Subject: [PATCH] Allow books and supplies editing + refactor. Close #1 --- manuels/forms.py | 18 +++++- manuels/models.py | 4 ++ manuels/templates/manuels/add_item.html | 2 +- manuels/templates/manuels/base.html | 4 ++ .../manuels/list_books_supplies.html | 10 +-- manuels/urls.py | 5 +- manuels/views.py | 63 +++++++++++++++---- 7 files changed, 83 insertions(+), 23 deletions(-) diff --git a/manuels/forms.py b/manuels/forms.py index 1a72a5e..45a2957 100644 --- a/manuels/forms.py +++ b/manuels/forms.py @@ -3,19 +3,31 @@ from django import forms from manuels.models import Book, SuppliesRequirement -class AddBookForm(forms.ModelForm): +class EditBookForm(forms.ModelForm): class Meta: model = Book + fields = ['teacher', 'level', 'field', 'no_book', 'title', 'authors', 'editor', 'publication_year', + 'isbn', 'price', 'previously_acquired', 'comments'] + + no_book = forms.BooleanField(label='Pas de livre pour cette classe/matière', required=False, initial=False) + + +class AddBookForm(EditBookForm): + class Meta(EditBookForm.Meta): fields = ['teacher', 'level', 'field', 'no_book', 'title', 'authors', 'editor', 'publication_year', 'isbn', 'price', 'previously_acquired', 'comments', 'add_another'] add_another = forms.BooleanField(label='Ajouter un autre livre', required=False, initial=True) - no_book = forms.BooleanField(label='Pas de livre pour cette classe/matière', required=False, initial=False) -class AddSuppliesForm(forms.ModelForm): +class EditSuppliesForm(forms.ModelForm): class Meta: model = SuppliesRequirement exclude = ['done'] + +class AddSuppliesForm(forms.ModelForm): + class Meta(EditSuppliesForm.Meta): + pass + add_another = forms.BooleanField(label="Ajouter d'autres fournitures", required=False, initial=True) diff --git a/manuels/models.py b/manuels/models.py index 9ff2cbb..7b04beb 100644 --- a/manuels/models.py +++ b/manuels/models.py @@ -154,6 +154,10 @@ class Book(BaseModel): def __str__(self): return f'{self.title} ({self.authors}) - {self.isbn}' + def get_absolute_url(self): + from django.urls import reverse + return reverse('edit_book', kwargs={'teacher_pk': str(self.teacher.pk), 'pk': str(self.pk)}) + class SuppliesRequirement(BaseModel): class Meta: diff --git a/manuels/templates/manuels/add_item.html b/manuels/templates/manuels/add_item.html index c3d9140..8199a84 100644 --- a/manuels/templates/manuels/add_item.html +++ b/manuels/templates/manuels/add_item.html @@ -8,7 +8,7 @@

Bienvenue {{ teacher.full_name }}

- {% block title %}Ajouter {{ item }}{% endblock %} + {% block title %}{{ verb }} {{ item }}{% endblock %} Retour à la liste des {{ item_plural }}

{% if message_template %} diff --git a/manuels/templates/manuels/base.html b/manuels/templates/manuels/base.html index 8d5287d..47808e8 100644 --- a/manuels/templates/manuels/base.html +++ b/manuels/templates/manuels/base.html @@ -6,6 +6,10 @@ Manuels - {% block title %}{% endblock %} + +
diff --git a/manuels/templates/manuels/list_books_supplies.html b/manuels/templates/manuels/list_books_supplies.html index 71f54c7..38e9671 100644 --- a/manuels/templates/manuels/list_books_supplies.html +++ b/manuels/templates/manuels/list_books_supplies.html @@ -31,7 +31,7 @@ # Classe - Matière + Discipline Titre Auteurs Éditeur @@ -45,7 +45,7 @@ {% for book in books %} - {{ forloop.counter }} + {{ book.level }} {{ book.field }} {{ book.title }} @@ -73,16 +73,16 @@ # Classe - Matière + Disciplines Liste de fournitures {% for supply in supplies %} - {{ forloop.counter }} + {{ supply.level }} - {{ supply.field }} + {{ supply.fields }} {{ supply.supplies|linebreaksbr }} {% endfor %} diff --git a/manuels/urls.py b/manuels/urls.py index 201c205..0b91b38 100644 --- a/manuels/urls.py +++ b/manuels/urls.py @@ -1,10 +1,13 @@ from django.urls import path -from manuels.views import AddBookView, ListBooksView, clear_teacher_view, AddSuppliesView +from manuels.views import AddBookView, ListBooksView, clear_teacher_view, AddSuppliesView, EditBookView,\ + EditSuppliesView urlpatterns = [ path('teacher//add_book', AddBookView.as_view(), name='add_book'), path('teacher//add_supplies', AddSuppliesView.as_view(), name='add_supplies'), path('teacher/', ListBooksView.as_view(), name='list_books'), + path('teacher//book/', EditBookView.as_view(), name='edit_book'), + path('teacher//supplies/', EditSuppliesView.as_view(), name='edit_supplies'), path('clear', clear_teacher_view, name='clear_teacher'), ] diff --git a/manuels/views.py b/manuels/views.py index ee9f33a..e7332d4 100644 --- a/manuels/views.py +++ b/manuels/views.py @@ -1,9 +1,10 @@ from django.contrib import messages +from django.contrib.auth.mixins import PermissionRequiredMixin from django.shortcuts import get_object_or_404, redirect from django.urls import reverse -from django.views.generic import CreateView, ListView +from django.views.generic import CreateView, ListView, UpdateView -from manuels.forms import AddBookForm, AddSuppliesForm +from manuels.forms import AddBookForm, AddSuppliesForm, EditBookForm, EditSuppliesForm from manuels.models import Teacher, Book, SuppliesRequirement import logging @@ -31,9 +32,10 @@ class HomePageView(CreateView): class BaseTeacherView: teacher = None + teacher_field = 'pk' def dispatch(self, request, *args, **kwargs): - self.teacher = get_object_or_404(Teacher, pk=self.kwargs['pk']) + self.teacher = get_object_or_404(Teacher, pk=self.kwargs[self.teacher_field]) request.session['teacher_pk'] = str(self.teacher.pk) return super().dispatch(request, *args, **kwargs) @@ -58,18 +60,21 @@ class ListBooksView(BaseTeacherView, ListView): return Book.objects.filter(teacher=self.teacher) -class AddItemView(BaseTeacherView, CreateView): +class ItemView(BaseTeacherView): add_another = False item_text = None item_text_plural = None success_target = None message_template = None + template_name = 'manuels/add_item.html' + verb = None def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context['item'] = self.item_text context['item_plural'] = self.item_text_plural context['message_template'] = self.message_template + context['verb'] = self.verb return context def get_initial(self): @@ -82,9 +87,9 @@ class AddItemView(BaseTeacherView, CreateView): form.fields['teacher'].queryset = Teacher.objects.filter(pk=self.teacher.pk) return form - def form_valid(self, form): - self.add_another = form.cleaned_data['add_another'] - return super().form_valid(form) + +class AddItemView(ItemView, CreateView): + verb = 'Ajouter' def get_success_url(self): messages.success(self.request, f'"{self.object}" a été ajouté.') @@ -93,26 +98,58 @@ class AddItemView(BaseTeacherView, CreateView): else: return reverse('list_books', args=[str(self.teacher.pk)]) + def form_valid(self, form): + self.add_another = form.cleaned_data['add_another'] + return super().form_valid(form) -class AddBookView(AddItemView): + +class BookView: model = Book - template_name = 'manuels/add_item.html' - form_class = AddBookForm success_target = 'add_book' item_text = 'un livre' item_text_plural = 'livres' -class AddSuppliesView(AddItemView): +class AddBookView(BookView, AddItemView): + form_class = AddBookForm + + +class SuppliesView: model = SuppliesRequirement - template_name = 'manuels/add_item.html' - form_class = AddSuppliesForm success_target = 'add_supplies' item_text = 'des fournitures' item_text_plural = 'fournitures' message_template = 'manuels/supplies_message.html' +class AddSuppliesView(SuppliesView, AddItemView): + form_class = AddSuppliesForm + + +class EditItemView(ItemView, UpdateView): + template_name = 'manuels/add_item.html' + teacher_field = 'teacher_pk' + item_text = None + item_text_plural = None + message_template = None + verb = 'Modifier' + + def get_queryset(self): + return self.model.objects.filter(teacher=self.teacher) + + def get_success_url(self): + messages.success(self.request, f'"{self.object}" a été modifié.') + return reverse('list_books', args=[str(self.teacher.pk)]) + + +class EditBookView(BookView, EditItemView): + form_class = EditBookForm + + +class EditSuppliesView(SuppliesView, EditItemView): + form_class = EditSuppliesForm + + def clear_teacher_view(request): if request.session['teacher_pk']: del request.session['teacher_pk']