From 7709be07019a7cbf236160df822e5bf68d906ca6 Mon Sep 17 00:00:00 2001 From: Gabriel Augendre Date: Tue, 22 May 2018 10:13:51 +0200 Subject: [PATCH] Add supplies management + fix "previously acquired" --- manuels/admin.py | 8 +++- manuels/forms.py | 12 +++++- .../migrations/0005_suppliesrequirement.py | 29 +++++++++++++ manuels/migrations/0006_auto_20180522_1009.py | 18 ++++++++ manuels/models.py | 22 +++++++++- .../manuels/{add_book.html => add_item.html} | 2 +- manuels/templates/manuels/base.html | 1 + ...st_books.html => list_books_supplies.html} | 32 ++++++++++++++- manuels/urls.py | 5 ++- manuels/views.py | 41 +++++++++++++++---- 10 files changed, 153 insertions(+), 17 deletions(-) create mode 100644 manuels/migrations/0005_suppliesrequirement.py create mode 100644 manuels/migrations/0006_auto_20180522_1009.py rename manuels/templates/manuels/{add_book.html => add_item.html} (89%) rename manuels/templates/manuels/{list_books.html => list_books_supplies.html} (68%) diff --git a/manuels/admin.py b/manuels/admin.py index 0bdc621..ca23fb3 100644 --- a/manuels/admin.py +++ b/manuels/admin.py @@ -1,6 +1,6 @@ from django.contrib import admin -from manuels.models import Teacher, Book, Level, Editor +from manuels.models import Teacher, Book, Level, Editor, SuppliesRequirement @admin.register(Teacher) @@ -35,3 +35,9 @@ class BookAdmin(admin.ModelAdmin): @admin.register(Editor) class EditorAdmin(admin.ModelAdmin): pass + + +@admin.register(SuppliesRequirement) +class SuppliesRequirementAdmin(admin.ModelAdmin): + list_display = ['teacher', 'level', 'supplies'] + readonly_fields = ['created_at', 'updated_at'] diff --git a/manuels/forms.py b/manuels/forms.py index 5d878a2..23e907c 100644 --- a/manuels/forms.py +++ b/manuels/forms.py @@ -1,6 +1,6 @@ from django import forms -from manuels.models import Book, Teacher +from manuels.models import Book, SuppliesRequirement class AddBookForm(forms.ModelForm): @@ -8,4 +8,12 @@ class AddBookForm(forms.ModelForm): model = Book fields = '__all__' - add_another = forms.BooleanField(label='Ajouter un autre livre', required=False) + add_another = forms.BooleanField(label='Ajouter un autre livre', required=False, initial=True) + + +class AddSuppliesForm(forms.ModelForm): + class Meta: + model = SuppliesRequirement + fields = '__all__' + + add_another = forms.BooleanField(label="Ajouter d'autres fournitures", required=False, initial=True) diff --git a/manuels/migrations/0005_suppliesrequirement.py b/manuels/migrations/0005_suppliesrequirement.py new file mode 100644 index 0000000..f604619 --- /dev/null +++ b/manuels/migrations/0005_suppliesrequirement.py @@ -0,0 +1,29 @@ +# Generated by Django 2.0.5 on 2018-05-22 07:34 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('manuels', '0004_auto_20180522_0148'), + ] + + operations = [ + migrations.CreateModel( + name='SuppliesRequirement', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='créé le')), + ('updated_at', models.DateTimeField(auto_now=True, verbose_name='mis à jour le')), + ('supplies', models.TextField(verbose_name='fournitures')), + ('level', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='manuels.Level', verbose_name='classe')), + ('teacher', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='manuels.Teacher', verbose_name='enseignant')), + ], + options={ + 'verbose_name': 'demande de fournitures', + 'verbose_name_plural': 'demandes de fournitures', + }, + ), + ] diff --git a/manuels/migrations/0006_auto_20180522_1009.py b/manuels/migrations/0006_auto_20180522_1009.py new file mode 100644 index 0000000..d9b79ae --- /dev/null +++ b/manuels/migrations/0006_auto_20180522_1009.py @@ -0,0 +1,18 @@ +# Generated by Django 2.0.5 on 2018-05-22 08:09 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('manuels', '0005_suppliesrequirement'), + ] + + operations = [ + migrations.AlterField( + model_name='book', + name='previously_acquired', + field=models.BooleanField(choices=[(True, 'Oui'), (False, 'Non')], default=False, verbose_name="manuel acquis précédemment par l'élève"), + ), + ] diff --git a/manuels/models.py b/manuels/models.py index ddf5846..537c929 100644 --- a/manuels/models.py +++ b/manuels/models.py @@ -80,10 +80,15 @@ class Book(BaseModel): isbn = models.CharField('ISBN/EAN', max_length=20, validators=[isbn_validator]) price = models.PositiveIntegerField('prix') YES_NO_CHOICE = ( - (True, 'Oui'), (False, 'Non'), + (True, 'Oui'), + ) + previously_acquired = models.BooleanField( + "manuel acquis précédemment par l'élève", + choices=YES_NO_CHOICE, + blank=False, + default=False, ) - previously_acquired = models.BooleanField("manuel acquis précédemment par l'élève", choices=YES_NO_CHOICE, blank=False) @property def previously_acquired_emoji(self): @@ -94,3 +99,16 @@ class Book(BaseModel): def __str__(self): return f'{self.title} ({self.authors}) - {self.isbn}' + + +class SuppliesRequirement(BaseModel): + class Meta: + verbose_name = 'demande de fournitures' + verbose_name_plural = 'demandes de fournitures' + + teacher = models.ForeignKey(verbose_name='enseignant', to=Teacher, on_delete=models.SET_NULL, null=True) + level = models.ForeignKey(verbose_name='classe', to=Level, on_delete=models.SET_NULL, null=True) + supplies = models.TextField('fournitures') + + def __str__(self): + return f'{self.supplies} pour {self.level} ({self.teacher})' diff --git a/manuels/templates/manuels/add_book.html b/manuels/templates/manuels/add_item.html similarity index 89% rename from manuels/templates/manuels/add_book.html rename to manuels/templates/manuels/add_item.html index bb7853f..c00113b 100644 --- a/manuels/templates/manuels/add_book.html +++ b/manuels/templates/manuels/add_item.html @@ -7,7 +7,7 @@

Bienvenue {{ teacher.full_name }}

- {% block title %}Ajouter un livre{% endblock %} + {% block title %}Ajouter {{ item }}{% endblock %} Retour à la liste

diff --git a/manuels/templates/manuels/base.html b/manuels/templates/manuels/base.html index 9ea01c1..7926781 100644 --- a/manuels/templates/manuels/base.html +++ b/manuels/templates/manuels/base.html @@ -2,6 +2,7 @@ + Manuels - {% block title %}{% endblock %} diff --git a/manuels/templates/manuels/list_books.html b/manuels/templates/manuels/list_books_supplies.html similarity index 68% rename from manuels/templates/manuels/list_books.html rename to manuels/templates/manuels/list_books_supplies.html index 76a8d16..71f54c7 100644 --- a/manuels/templates/manuels/list_books.html +++ b/manuels/templates/manuels/list_books_supplies.html @@ -2,6 +2,8 @@ {% load bootstrap4 %} +{% block title %}Livres et fournitures demandés{% endblock %} + {% block content %}
@@ -21,7 +23,7 @@

- {% block title %}Liste des livres demandés{% endblock %} + Liste des livres demandés Ajouter un livre

@@ -60,4 +62,32 @@
+
+
+

+ Liste des fournitures demandées + Ajouter des fournitures +

+ + + + + + + + + + + {% for supply in supplies %} + + + + + + + {% endfor %} + +
#ClasseMatièreListe de fournitures
{{ forloop.counter }}{{ supply.level }}{{ supply.field }}{{ supply.supplies|linebreaksbr }}
+
+
{% endblock %} \ No newline at end of file diff --git a/manuels/urls.py b/manuels/urls.py index 28fbd32..201c205 100644 --- a/manuels/urls.py +++ b/manuels/urls.py @@ -1,9 +1,10 @@ from django.urls import path -from manuels.views import AddBookView, ListBooksView, clear_teacher_view +from manuels.views import AddBookView, ListBooksView, clear_teacher_view, AddSuppliesView urlpatterns = [ - path('teacher//add', AddBookView.as_view(), name='add_book'), + 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('clear', clear_teacher_view, name='clear_teacher'), ] diff --git a/manuels/views.py b/manuels/views.py index 1868eae..c7a9e89 100644 --- a/manuels/views.py +++ b/manuels/views.py @@ -8,8 +8,8 @@ from django.template.loader import render_to_string from django.urls import reverse from django.views.generic import CreateView, ListView -from manuels.forms import AddBookForm -from manuels.models import Teacher, Book +from manuels.forms import AddBookForm, AddSuppliesForm +from manuels.models import Teacher, Book, SuppliesRequirement class HomePageView(CreateView): @@ -62,18 +62,27 @@ class BaseTeacherView: class ListBooksView(BaseTeacherView, ListView): model = Book - template_name = 'manuels/list_books.html' + template_name = 'manuels/list_books_supplies.html' context_object_name = 'books' + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context['supplies'] = SuppliesRequirement.objects.filter(teacher=self.teacher) + return context + def get_queryset(self): return Book.objects.filter(teacher=self.teacher) -class AddBookView(BaseTeacherView, CreateView): - model = Book - template_name = 'manuels/add_book.html' - form_class = AddBookForm +class AddItemView(BaseTeacherView, CreateView): add_another = False + item_text = None + success_target = None + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context['item'] = self.item_text + return context def get_initial(self): return { @@ -92,11 +101,27 @@ class AddBookView(BaseTeacherView, CreateView): def get_success_url(self): messages.success(self.request, f'"{self.object}" a été ajouté.') if self.add_another: - return reverse('add_book', args=[str(self.teacher.pk)]) + return reverse(self.success_target, args=[str(self.teacher.pk)]) else: return reverse('list_books', args=[str(self.teacher.pk)]) +class AddBookView(AddItemView): + model = Book + template_name = 'manuels/add_item.html' + form_class = AddBookForm + success_target = 'add_book' + item_text = 'un livre' + + +class AddSuppliesView(AddItemView): + model = SuppliesRequirement + template_name = 'manuels/add_item.html' + form_class = AddSuppliesForm + success_target = 'add_supplies' + item_text = 'des fournitures' + + def clear_teacher_view(request): if request.session['teacher_pk']: del request.session['teacher_pk']