Add supplies management + fix "previously acquired"

This commit is contained in:
Gabriel Augendre 2018-05-22 10:13:51 +02:00
parent 53285953ad
commit 7709be0701
10 changed files with 153 additions and 17 deletions

View file

@ -1,6 +1,6 @@
from django.contrib import admin 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) @admin.register(Teacher)
@ -35,3 +35,9 @@ class BookAdmin(admin.ModelAdmin):
@admin.register(Editor) @admin.register(Editor)
class EditorAdmin(admin.ModelAdmin): class EditorAdmin(admin.ModelAdmin):
pass pass
@admin.register(SuppliesRequirement)
class SuppliesRequirementAdmin(admin.ModelAdmin):
list_display = ['teacher', 'level', 'supplies']
readonly_fields = ['created_at', 'updated_at']

View file

@ -1,6 +1,6 @@
from django import forms from django import forms
from manuels.models import Book, Teacher from manuels.models import Book, SuppliesRequirement
class AddBookForm(forms.ModelForm): class AddBookForm(forms.ModelForm):
@ -8,4 +8,12 @@ class AddBookForm(forms.ModelForm):
model = Book model = Book
fields = '__all__' 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)

View file

@ -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',
},
),
]

View file

@ -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"),
),
]

View file

@ -80,10 +80,15 @@ class Book(BaseModel):
isbn = models.CharField('ISBN/EAN', max_length=20, validators=[isbn_validator]) isbn = models.CharField('ISBN/EAN', max_length=20, validators=[isbn_validator])
price = models.PositiveIntegerField('prix') price = models.PositiveIntegerField('prix')
YES_NO_CHOICE = ( YES_NO_CHOICE = (
(True, 'Oui'),
(False, 'Non'), (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 @property
def previously_acquired_emoji(self): def previously_acquired_emoji(self):
@ -94,3 +99,16 @@ class Book(BaseModel):
def __str__(self): def __str__(self):
return f'{self.title} ({self.authors}) - {self.isbn}' 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})'

View file

@ -7,7 +7,7 @@
<div class="col-12"> <div class="col-12">
<h1>Bienvenue {{ teacher.full_name }}</h1> <h1>Bienvenue {{ teacher.full_name }}</h1>
<h2> <h2>
{% block title %}Ajouter un livre{% endblock %} {% block title %}Ajouter {{ item }}{% endblock %}
<a href="{% url 'list_books' teacher.pk %}" class="btn btn-secondary">Retour à la liste</a> <a href="{% url 'list_books' teacher.pk %}" class="btn btn-secondary">Retour à la liste</a>
</h2> </h2>
<form action="" method="post" class="form"> <form action="" method="post" class="form">

View file

@ -2,6 +2,7 @@
<html lang="fr"> <html lang="fr">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<title>Manuels - {% block title %}{% endblock %}</title> <title>Manuels - {% block title %}{% endblock %}</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css"
integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous"> integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">

View file

@ -2,6 +2,8 @@
{% load bootstrap4 %} {% load bootstrap4 %}
{% block title %}Livres et fournitures demandés{% endblock %}
{% block content %} {% block content %}
<div class="row"> <div class="row">
<div class="col-12"> <div class="col-12">
@ -21,7 +23,7 @@
<div class="row"> <div class="row">
<div class="col-12"> <div class="col-12">
<h2> <h2>
{% block title %}Liste des livres demandés{% endblock %} Liste des livres demandés
<a href="{% url 'add_book' pk=teacher.pk %}" class="btn btn-primary">Ajouter un livre</a> <a href="{% url 'add_book' pk=teacher.pk %}" class="btn btn-primary">Ajouter un livre</a>
</h2> </h2>
<table class="table table-hover table-sm"> <table class="table table-hover table-sm">
@ -60,4 +62,32 @@
</table> </table>
</div> </div>
</div> </div>
<div class="row">
<div class="col-12">
<h2>
Liste des fournitures demandées
<a href="{% url 'add_supplies' pk=teacher.pk %}" class="btn btn-primary">Ajouter des fournitures</a>
</h2>
<table class="table table-hover table-sm">
<thead>
<tr>
<th scope="col">#</th>
<th scope="col">Classe</th>
<th scope="col">Matière</th>
<th scope="col">Liste de fournitures</th>
</tr>
</thead>
<tbody>
{% for supply in supplies %}
<tr>
<th scope="row">{{ forloop.counter }}</th>
<td>{{ supply.level }}</td>
<td>{{ supply.field }}</td>
<td>{{ supply.supplies|linebreaksbr }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
{% endblock %} {% endblock %}

View file

@ -1,9 +1,10 @@
from django.urls import path 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 = [ urlpatterns = [
path('teacher/<uuid:pk>/add', AddBookView.as_view(), name='add_book'), 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:pk>', ListBooksView.as_view(), name='list_books'),
path('clear', clear_teacher_view, name='clear_teacher'), path('clear', clear_teacher_view, name='clear_teacher'),
] ]

View file

@ -8,8 +8,8 @@ from django.template.loader import render_to_string
from django.urls import reverse from django.urls import reverse
from django.views.generic import CreateView, ListView from django.views.generic import CreateView, ListView
from manuels.forms import AddBookForm from manuels.forms import AddBookForm, AddSuppliesForm
from manuels.models import Teacher, Book from manuels.models import Teacher, Book, SuppliesRequirement
class HomePageView(CreateView): class HomePageView(CreateView):
@ -62,18 +62,27 @@ class BaseTeacherView:
class ListBooksView(BaseTeacherView, ListView): class ListBooksView(BaseTeacherView, ListView):
model = Book model = Book
template_name = 'manuels/list_books.html' template_name = 'manuels/list_books_supplies.html'
context_object_name = 'books' 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): def get_queryset(self):
return Book.objects.filter(teacher=self.teacher) return Book.objects.filter(teacher=self.teacher)
class AddBookView(BaseTeacherView, CreateView): class AddItemView(BaseTeacherView, CreateView):
model = Book
template_name = 'manuels/add_book.html'
form_class = AddBookForm
add_another = False 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): def get_initial(self):
return { return {
@ -92,11 +101,27 @@ class AddBookView(BaseTeacherView, CreateView):
def get_success_url(self): def get_success_url(self):
messages.success(self.request, f'"{self.object}" a été ajouté.') messages.success(self.request, f'"{self.object}" a été ajouté.')
if self.add_another: if self.add_another:
return reverse('add_book', args=[str(self.teacher.pk)]) return reverse(self.success_target, args=[str(self.teacher.pk)])
else: else:
return reverse('list_books', args=[str(self.teacher.pk)]) 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): def clear_teacher_view(request):
if request.session['teacher_pk']: if request.session['teacher_pk']:
del request.session['teacher_pk'] del request.session['teacher_pk']