From 63b67e9a9a6583b02690bf3b050faa23d40246b0 Mon Sep 17 00:00:00 2001 From: Gabriel Augendre Date: Mon, 21 May 2018 23:12:35 +0200 Subject: [PATCH] Wrapping up --- manuels/admin.py | 17 ++++++- manuels/forms.py | 2 + manuels/migrations/0003_auto_20180521_2225.py | 24 ++++++++++ manuels/migrations/0004_auto_20180521_2226.py | 19 ++++++++ manuels/migrations/0005_auto_20180521_2230.py | 17 +++++++ manuels/migrations/0006_auto_20180521_2307.py | 18 +++++++ manuels/models.py | 31 ++++++++++-- manuels/templates/manuels/add_book.html | 11 ++--- manuels/templates/manuels/base.html | 5 ++ manuels/templates/manuels/list_books.html | 47 +++++++++++++++++++ manuels/urls.py | 5 +- manuels/views.py | 36 ++++++++++++-- 12 files changed, 211 insertions(+), 21 deletions(-) create mode 100644 manuels/migrations/0003_auto_20180521_2225.py create mode 100644 manuels/migrations/0004_auto_20180521_2226.py create mode 100644 manuels/migrations/0005_auto_20180521_2230.py create mode 100644 manuels/migrations/0006_auto_20180521_2307.py create mode 100644 manuels/templates/manuels/list_books.html diff --git a/manuels/admin.py b/manuels/admin.py index 8c38f3f..60c3b32 100644 --- a/manuels/admin.py +++ b/manuels/admin.py @@ -1,3 +1,18 @@ from django.contrib import admin -# Register your models here. +from manuels.models import Teacher, Book, Level + + +@admin.register(Teacher) +class TeacherAdmin(admin.ModelAdmin): + pass + + +@admin.register(Level) +class LevelAdmin(admin.ModelAdmin): + pass + + +@admin.register(Book) +class BookAdmin(admin.ModelAdmin): + pass diff --git a/manuels/forms.py b/manuels/forms.py index d62297a..5d878a2 100644 --- a/manuels/forms.py +++ b/manuels/forms.py @@ -7,3 +7,5 @@ class AddBookForm(forms.ModelForm): class Meta: model = Book fields = '__all__' + + add_another = forms.BooleanField(label='Ajouter un autre livre', required=False) diff --git a/manuels/migrations/0003_auto_20180521_2225.py b/manuels/migrations/0003_auto_20180521_2225.py new file mode 100644 index 0000000..eb0dbbd --- /dev/null +++ b/manuels/migrations/0003_auto_20180521_2225.py @@ -0,0 +1,24 @@ +# Generated by Django 2.0.5 on 2018-05-21 20:25 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('manuels', '0002_auto_20180521_2154'), + ] + + operations = [ + migrations.AlterField( + model_name='book', + name='level', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='manuels.Level', verbose_name='classe'), + ), + migrations.AlterField( + model_name='book', + name='teacher', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='manuels.Teacher', verbose_name='enseignant'), + ), + ] diff --git a/manuels/migrations/0004_auto_20180521_2226.py b/manuels/migrations/0004_auto_20180521_2226.py new file mode 100644 index 0000000..fd14e5e --- /dev/null +++ b/manuels/migrations/0004_auto_20180521_2226.py @@ -0,0 +1,19 @@ +# Generated by Django 2.0.5 on 2018-05-21 20:26 + +from django.db import migrations, models +import manuels.models + + +class Migration(migrations.Migration): + + dependencies = [ + ('manuels', '0003_auto_20180521_2225'), + ] + + operations = [ + migrations.AlterField( + model_name='book', + name='isbn', + field=models.CharField(max_length=20, validators=[manuels.models.isbn_validator], verbose_name='ISBN/EAN'), + ), + ] diff --git a/manuels/migrations/0005_auto_20180521_2230.py b/manuels/migrations/0005_auto_20180521_2230.py new file mode 100644 index 0000000..2d4bf22 --- /dev/null +++ b/manuels/migrations/0005_auto_20180521_2230.py @@ -0,0 +1,17 @@ +# Generated by Django 2.0.5 on 2018-05-21 20:30 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('manuels', '0004_auto_20180521_2226'), + ] + + operations = [ + migrations.AlterModelOptions( + name='level', + options={'verbose_name': 'classe', 'verbose_name_plural': 'classes'}, + ), + ] diff --git a/manuels/migrations/0006_auto_20180521_2307.py b/manuels/migrations/0006_auto_20180521_2307.py new file mode 100644 index 0000000..af37595 --- /dev/null +++ b/manuels/migrations/0006_auto_20180521_2307.py @@ -0,0 +1,18 @@ +# Generated by Django 2.0.5 on 2018-05-21 21:07 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('manuels', '0005_auto_20180521_2230'), + ] + + operations = [ + migrations.AlterField( + model_name='book', + name='previously_acquired', + field=models.BooleanField(choices=[(True, 'Oui'), (False, 'Non')], verbose_name="manuel acquis précédemment par l'élève"), + ), + ] diff --git a/manuels/models.py b/manuels/models.py index 5b99660..a8f5992 100644 --- a/manuels/models.py +++ b/manuels/models.py @@ -20,13 +20,19 @@ class Teacher(models.Model): def full_name(self): return f'{self.first_name} {self.last_name}' + def __str__(self): + return self.full_name + class Level(models.Model): class Meta: verbose_name = 'classe' - verbose_name_plural = 'classe' + verbose_name_plural = 'classes' name = models.CharField('nom', max_length=10) + def __str__(self): + return self.name + def isbn_validator(value): regex = re.compile(r'(\d-?){10,13}X?') @@ -38,14 +44,29 @@ class Book(models.Model): class Meta: verbose_name = 'livre' verbose_name_plural = 'livres' - teacher = models.ForeignKey(to=Teacher, on_delete=models.SET_NULL, null=True) - level = models.ForeignKey(to=Level, on_delete=models.SET_NULL, null=True) + + 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) field = models.CharField('matière', max_length=100) title = models.TextField('titre') authors = models.TextField('auteurs') editor = models.CharField('éditeur', max_length=200) collection = models.CharField('collection', max_length=200, blank=True) publication_year = models.PositiveIntegerField('année de publication') - isbn = models.TextField('ISBN/EAN', validators=[isbn_validator]) + isbn = models.CharField('ISBN/EAN', max_length=20, validators=[isbn_validator]) price = models.PositiveIntegerField('prix') - previously_acquired = models.BooleanField("manuel acquis précédemment par l'élève", blank=True) + YES_NO_CHOICE = ( + (True, 'Oui'), + (False, 'Non'), + ) + 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): + if self.previously_acquired: + return '✅' + else: + return '🚫' + + def __str__(self): + return f'{self.title} ({self.authors}) - {self.isbn}' diff --git a/manuels/templates/manuels/add_book.html b/manuels/templates/manuels/add_book.html index 232afc1..84a1a3d 100644 --- a/manuels/templates/manuels/add_book.html +++ b/manuels/templates/manuels/add_book.html @@ -2,17 +2,12 @@ {% load bootstrap4 %} -{% block title %}Ajouter un livre{% endblock %} - {% block content %}
- Bienvenue {{ teacher.full_name }} -
-
-
-
-
+

Bienvenue {{ teacher.full_name }}

+

{% block title %}Ajouter un livre{% endblock %}

+ {% csrf_token %} {% bootstrap_form form %} {% buttons %} diff --git a/manuels/templates/manuels/base.html b/manuels/templates/manuels/base.html index 4f5e472..9ea01c1 100644 --- a/manuels/templates/manuels/base.html +++ b/manuels/templates/manuels/base.html @@ -8,6 +8,11 @@
+ {% for message in messages %} + + {% endfor %} {% block content %} {% endblock %}
diff --git a/manuels/templates/manuels/list_books.html b/manuels/templates/manuels/list_books.html new file mode 100644 index 0000000..d6344ec --- /dev/null +++ b/manuels/templates/manuels/list_books.html @@ -0,0 +1,47 @@ +{% extends 'manuels/base.html' %} + +{% load bootstrap4 %} + +{% block content %} +
+
+

Bienvenue {{ teacher.full_name }}

+

{% block title %}Liste des livres demandés{% endblock %}

+ Ajouter un livre + + + + + + + + + + + + + + + + + + {% for book in books %} + + + + + + + + + + + + + + {% endfor %} + +
#ClasseMatièreTitreAuteursÉditeurCollectionAnnée de publicationISBNPrixDéjà acheté par l'élève
{{ forloop.counter }}{{ book.level }}{{ book.field }}{{ book.title }}{{ book.authors }}{{ book.editor }}{{ book.collection }}{{ book.publication_year }}{{ book.isbn }}{{ book.price }}{{ book.previously_acquired_emoji }}
+
+
+{% endblock %} \ No newline at end of file diff --git a/manuels/urls.py b/manuels/urls.py index 3029e67..d5289b5 100644 --- a/manuels/urls.py +++ b/manuels/urls.py @@ -1,7 +1,8 @@ from django.urls import path -from manuels.views import AddBookView +from manuels.views import AddBookView, ListBooksView urlpatterns = [ - path('teacher//', AddBookView.as_view(), name='add_book') + path('teacher//add', AddBookView.as_view(), name='add_book'), + path('teacher//', ListBooksView.as_view(), name='list_books'), ] diff --git a/manuels/views.py b/manuels/views.py index 18bb258..28272af 100644 --- a/manuels/views.py +++ b/manuels/views.py @@ -1,5 +1,7 @@ +from django.contrib import messages from django.shortcuts import get_object_or_404 -from django.views.generic import CreateView, FormView, TemplateView +from django.urls import reverse +from django.views.generic import CreateView, ListView from manuels.forms import AddBookForm from manuels.models import Teacher, Book @@ -11,10 +13,7 @@ class HomePageView(CreateView): template_name = 'manuels/home_page.html' -class AddBookView(CreateView): - model = Book - template_name = 'manuels/add_book.html' - form_class = AddBookForm +class BaseTeacherView: teacher = None def dispatch(self, request, *args, **kwargs): @@ -27,6 +26,22 @@ class AddBookView(CreateView): return context + +class ListBooksView(BaseTeacherView, ListView): + model = Book + template_name = 'manuels/list_books.html' + context_object_name = 'books' + + 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 + add_another = False + def get_initial(self): return { 'teacher': self.teacher @@ -36,3 +51,14 @@ class AddBookView(CreateView): form = super().get_form(form_class) 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) + + 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.id)]) + else: + return reverse('list_books', args=[str(self.teacher.id)])