Allow books and supplies editing + refactor. Close #1
This commit is contained in:
parent
8c54fce37e
commit
796d1874da
7 changed files with 83 additions and 23 deletions
|
@ -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)
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
<div class="col-12">
|
||||
<h1>Bienvenue {{ teacher.full_name }}</h1>
|
||||
<h2>
|
||||
{% block title %}Ajouter {{ item }}{% endblock %}
|
||||
{% block title %}{{ verb }} {{ item }}{% endblock %}
|
||||
<a href="{% url 'list_books' teacher.pk %}" class="btn btn-secondary">Retour à la liste des {{ item_plural }}</a>
|
||||
</h2>
|
||||
{% if message_template %}
|
||||
|
|
|
@ -6,6 +6,10 @@
|
|||
<title>Manuels - {% block title %}{% endblock %}</title>
|
||||
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css"
|
||||
integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
|
||||
|
||||
<script defer src="https://use.fontawesome.com/releases/v5.0.13/js/all.js"
|
||||
integrity="sha384-xymdQtn1n3lH2wcu0qhcdaOpQwyoarkgLVxC/wZ5q7h9gHtxICrpcaSUfygqZGOe"
|
||||
crossorigin="anonymous"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container-fluid">
|
||||
|
|
|
@ -31,7 +31,7 @@
|
|||
<tr>
|
||||
<th scope="col">#</th>
|
||||
<th scope="col">Classe</th>
|
||||
<th scope="col">Matière</th>
|
||||
<th scope="col">Discipline</th>
|
||||
<th scope="col">Titre</th>
|
||||
<th scope="col">Auteurs</th>
|
||||
<th scope="col">Éditeur</th>
|
||||
|
@ -45,7 +45,7 @@
|
|||
<tbody>
|
||||
{% for book in books %}
|
||||
<tr>
|
||||
<th scope="row">{{ forloop.counter }}</th>
|
||||
<th scope="row"><a href="{% url 'edit_book' teacher_pk=book.teacher.pk pk=book.pk %}"><i class="fas fa-edit"></i></a></th>
|
||||
<td>{{ book.level }}</td>
|
||||
<td>{{ book.field }}</td>
|
||||
<td>{{ book.title }}</td>
|
||||
|
@ -73,16 +73,16 @@
|
|||
<tr>
|
||||
<th scope="col">#</th>
|
||||
<th scope="col">Classe</th>
|
||||
<th scope="col">Matière</th>
|
||||
<th scope="col">Disciplines</th>
|
||||
<th scope="col">Liste de fournitures</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for supply in supplies %}
|
||||
<tr>
|
||||
<th scope="row">{{ forloop.counter }}</th>
|
||||
<th scope="row"><a href="{% url 'edit_supplies' teacher_pk=supply.teacher.pk pk=supply.pk %}"><i class="fas fa-edit"></i></a></th>
|
||||
<td>{{ supply.level }}</td>
|
||||
<td>{{ supply.field }}</td>
|
||||
<td>{{ supply.fields }}</td>
|
||||
<td>{{ supply.supplies|linebreaksbr }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
|
|
|
@ -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/<uuid:pk>/add_book', AddBookView.as_view(), name='add_book'),
|
||||
path('teacher/<uuid:pk>/add_supplies', AddSuppliesView.as_view(), name='add_supplies'),
|
||||
path('teacher/<uuid:pk>', ListBooksView.as_view(), name='list_books'),
|
||||
path('teacher/<uuid:teacher_pk>/book/<int:pk>', EditBookView.as_view(), name='edit_book'),
|
||||
path('teacher/<uuid:teacher_pk>/supplies/<int:pk>', EditSuppliesView.as_view(), name='edit_supplies'),
|
||||
path('clear', clear_teacher_view, name='clear_teacher'),
|
||||
]
|
||||
|
|
|
@ -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']
|
||||
|
|
Loading…
Reference in a new issue