diff --git a/functional_tests/__init__.py b/functional_tests/__init__.py deleted file mode 100644 index a53c62e..0000000 --- a/functional_tests/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -def main(): - pass - - -if __name__ == '__main__': - main() diff --git a/functional_tests/test.py b/functional_tests/test.py deleted file mode 100644 index 6d3f98d..0000000 --- a/functional_tests/test.py +++ /dev/null @@ -1,54 +0,0 @@ -import time - -from django.test import LiveServerTestCase -from selenium import webdriver -from selenium.common.exceptions import WebDriverException - -MAX_WAIT = 10 - - -class NewVisitorTest(LiveServerTestCase): - def setUp(self): - self.browser = webdriver.Firefox() - - def tearDown(self): - self.browser.quit() - - def test_can_start_a_list_and_retrieve_it_later(self): - # Edith has received a mail from her librarian about a website - # she can use to tell the books she needs. She goes - # to check out its homepage - self.browser.get(self.live_server_url) - - # She notices the page title and header mention "manuels" - self.assertIn('Manuels', self.browser.title) - - # She is invited to enter her contact information (first name, - # last name and phone number) - # She types "Edith" into the first name text box - - # She types "Doe" as her last name - - # She types "0612345678" as her phone number - - # When she hits enter, the page updates, and now the page displays - # her contact info on top and a form to enter book data - - # Edith wonders whether the site will remember her books. Then she sees - # that the site has generated a unique URL for her -- there is some - # explanatory text to that effect. - - # She visits that URL - her books list is still there. - - # Satisfied, she goes back to sleep - self.fail('Finish the test!') - - def wait_for(self, fn): - start_time = time.time() - while True: - try: - return fn() - except (AssertionError, WebDriverException) as e: - if time.time() - start_time > MAX_WAIT: - raise e - time.sleep(0.5) diff --git a/manuels/forms.py b/manuels/forms.py new file mode 100644 index 0000000..e69de29 diff --git a/manuels/migrations/0001_initial.py b/manuels/migrations/0001_initial.py index 390161b..018ac42 100644 --- a/manuels/migrations/0001_initial.py +++ b/manuels/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.0.5 on 2018-05-21 18:07 +# Generated by Django 2.0.5 on 2018-05-21 19:16 from django.db import migrations, models @@ -15,6 +15,9 @@ class Migration(migrations.Migration): name='Teacher', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('first_name', models.CharField(max_length=100)), + ('last_name', models.CharField(max_length=100)), + ('phone_number', models.CharField(max_length=10)), ], ), ] diff --git a/manuels/migrations/0002_auto_20180521_2154.py b/manuels/migrations/0002_auto_20180521_2154.py new file mode 100644 index 0000000..76a8fd8 --- /dev/null +++ b/manuels/migrations/0002_auto_20180521_2154.py @@ -0,0 +1,74 @@ +# Generated by Django 2.0.5 on 2018-05-21 19:54 + +from django.db import migrations, models +import django.db.models.deletion +import manuels.models + + +class Migration(migrations.Migration): + + dependencies = [ + ('manuels', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='Book', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('field', models.CharField(max_length=100, verbose_name='matière')), + ('title', models.TextField(verbose_name='titre')), + ('authors', models.TextField(verbose_name='auteurs')), + ('editor', models.CharField(max_length=200, verbose_name='éditeur')), + ('collection', models.CharField(blank=True, max_length=200, verbose_name='collection')), + ('publication_year', models.PositiveIntegerField(verbose_name='année de publication')), + ('isbn', models.TextField(validators=[manuels.models.isbn_validator], verbose_name='ISBN/EAN')), + ('price', models.PositiveIntegerField(verbose_name='prix')), + ('previously_acquired', models.BooleanField(verbose_name="manuel acquis précédemment par l'élève")), + ], + options={ + 'verbose_name': 'livre', + 'verbose_name_plural': 'livres', + }, + ), + migrations.CreateModel( + name='Level', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=10, verbose_name='nom')), + ], + options={ + 'verbose_name': 'classe', + 'verbose_name_plural': 'classe', + }, + ), + migrations.AlterModelOptions( + name='teacher', + options={'verbose_name': 'enseignant', 'verbose_name_plural': 'enseignants'}, + ), + migrations.AlterField( + model_name='teacher', + name='first_name', + field=models.CharField(max_length=100, verbose_name='prénom'), + ), + migrations.AlterField( + model_name='teacher', + name='last_name', + field=models.CharField(max_length=100, verbose_name='nom'), + ), + migrations.AlterField( + model_name='teacher', + name='phone_number', + field=models.CharField(max_length=10, verbose_name='numéro de téléphone'), + ), + migrations.AddField( + model_name='book', + name='level', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='manuels.Level'), + ), + migrations.AddField( + model_name='book', + name='teacher', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='manuels.Teacher'), + ), + ] diff --git a/manuels/models.py b/manuels/models.py index 8b6a3c7..ad6fa3e 100644 --- a/manuels/models.py +++ b/manuels/models.py @@ -1,6 +1,51 @@ +import re + +from django.core.exceptions import ValidationError from django.db import models class Teacher(models.Model): - # first_name = models.CharField() - pass + class Meta: + verbose_name = 'enseignant' + verbose_name_plural = 'enseignants' + first_name = models.CharField('prénom', max_length=100) + last_name = models.CharField('nom', max_length=100) + phone_number = models.CharField('numéro de téléphone', max_length=10) + + def get_absolute_url(self): + from django.urls import reverse + return reverse('add_book', args=[str(self.id)]) + + @property + def full_name(self): + return f'{self.first_name} {self.last_name}' + + +class Level(models.Model): + class Meta: + verbose_name = 'classe' + verbose_name_plural = 'classe' + name = models.CharField('nom', max_length=10) + + +def isbn_validator(value): + regex = re.compile(r'(\d-?){10,13}X?') + if not regex.match(value): + raise ValidationError("%(value)s n'est pas un ISBN valide.", params={'value': value}) + + +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) + 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]) + price = models.PositiveIntegerField('prix') + previously_acquired = models.BooleanField("manuel acquis précédemment par l'élève") diff --git a/manuels/templates/manuels/add_book.html b/manuels/templates/manuels/add_book.html new file mode 100644 index 0000000..cef75ab --- /dev/null +++ b/manuels/templates/manuels/add_book.html @@ -0,0 +1,13 @@ +{% extends 'manuels/base.html' %} + +{% load bootstrap4 %} + +{% block title %}Ajouter un livre{% endblock %} + +{% block content %} +
+
+ Bienvenue {{ teacher.full_name }} +
+
+{% endblock %} \ No newline at end of file diff --git a/manuels/templates/manuels/base.html b/manuels/templates/manuels/base.html index a2637c3..4f5e472 100644 --- a/manuels/templates/manuels/base.html +++ b/manuels/templates/manuels/base.html @@ -3,6 +3,8 @@ Manuels - {% block title %}{% endblock %} +
diff --git a/manuels/templates/manuels/home_page.html b/manuels/templates/manuels/home_page.html index 9587e5f..76228f4 100644 --- a/manuels/templates/manuels/home_page.html +++ b/manuels/templates/manuels/home_page.html @@ -1,6 +1,19 @@ {% extends 'manuels/base.html' %} + +{% load bootstrap4 %} + {% block title %}Accueil{% endblock %} {% block content %} - +
+
+
+ {% csrf_token %} + {% bootstrap_form form %} + {% buttons %} + + {% endbuttons %} +
+
+
{% endblock %} \ No newline at end of file diff --git a/manuels/tests.py b/manuels/tests.py deleted file mode 100644 index e145d66..0000000 --- a/manuels/tests.py +++ /dev/null @@ -1,7 +0,0 @@ -from django.test import TestCase - - -class HomePageTest(TestCase): - def test_home_page_returns_correct_html(self): - response = self.client.get('/') - self.assertTemplateUsed(response, 'manuels/home_page.html') diff --git a/manuels/urls.py b/manuels/urls.py new file mode 100644 index 0000000..3029e67 --- /dev/null +++ b/manuels/urls.py @@ -0,0 +1,7 @@ +from django.urls import path + +from manuels.views import AddBookView + +urlpatterns = [ + path('teacher//', AddBookView.as_view(), name='add_book') +] diff --git a/manuels/views.py b/manuels/views.py index 6c320c0..f5e0e47 100644 --- a/manuels/views.py +++ b/manuels/views.py @@ -1,9 +1,20 @@ -from django.views.generic import CreateView +from django.shortcuts import get_object_or_404 +from django.views.generic import CreateView, FormView, TemplateView from manuels.models import Teacher class HomePageView(CreateView): model = Teacher - fields = [] + fields = ['first_name', 'last_name', 'phone_number'] template_name = 'manuels/home_page.html' + + +class AddBookView(TemplateView): + template_name = 'manuels/add_book.html' + + def get_context_data(self, **kwargs): + context = super().get_context_data() + context['teacher'] = get_object_or_404(Teacher, pk=self.kwargs['id']) + + return context diff --git a/manuels_collection/urls.py b/manuels_collection/urls.py index 9d3d849..0029d65 100644 --- a/manuels_collection/urls.py +++ b/manuels_collection/urls.py @@ -14,11 +14,12 @@ Including another URLconf 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ from django.contrib import admin -from django.urls import path +from django.urls import path, include from manuels.views import HomePageView urlpatterns = [ path('admin/', admin.site.urls), path('', HomePageView.as_view(), name='home_page'), + path('', include('manuels.urls')), ]