From bb30f917db74e7f8b180157084f43b70762f2c34 Mon Sep 17 00:00:00 2001 From: Sofiane Lasri <alasri250@gmail.com> Date: Wed, 31 May 2023 11:08:30 +0200 Subject: [PATCH] =?UTF-8?q?TP8=20termin=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- webpizza/applipizza/forms.py | 9 ++- .../applipizza/migrations/0002_pizza_image.py | 18 +++++ webpizza/applipizza/models.py | 7 +- .../static/applipizza/css/styles.css | 10 +++ .../formulaireModificationPizza.html | 78 +++++++++++++++++++ .../templates/applipizza/pizza.html | 32 ++++---- .../templates/applipizza/pizzas.html | 4 +- webpizza/applipizza/views.py | 75 ++++++++++++++---- webpizza/webpizza/settings.py | 2 + webpizza/webpizza/urls.py | 8 ++ 10 files changed, 206 insertions(+), 37 deletions(-) create mode 100644 webpizza/applipizza/migrations/0002_pizza_image.py create mode 100644 webpizza/applipizza/templates/applipizza/formulaireModificationPizza.html diff --git a/webpizza/applipizza/forms.py b/webpizza/applipizza/forms.py index 42ebb81..d1f7062 100644 --- a/webpizza/applipizza/forms.py +++ b/webpizza/applipizza/forms.py @@ -1,6 +1,6 @@ from django.forms import ModelForm -from applipizza.models import Ingredient, Composition +from applipizza.models import Ingredient, Composition, Pizza class IngredientForm(ModelForm): @@ -11,4 +11,9 @@ class IngredientForm(ModelForm): class CompositionForm(ModelForm): class Meta: model = Composition - fields = ['ingredient', 'quantite'] \ No newline at end of file + fields = ['ingredient', 'quantite'] + +class PizzaForm(ModelForm): + class Meta: + model = Pizza + fields = ['nom', 'prix', 'image'] diff --git a/webpizza/applipizza/migrations/0002_pizza_image.py b/webpizza/applipizza/migrations/0002_pizza_image.py new file mode 100644 index 0000000..82247ea --- /dev/null +++ b/webpizza/applipizza/migrations/0002_pizza_image.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2 on 2023-05-23 09:38 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('applipizza', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='pizza', + name='image', + field=models.ImageField(blank=True, null=True, upload_to='images/'), + ), + ] diff --git a/webpizza/applipizza/models.py b/webpizza/applipizza/models.py index 463778d..7fe83fb 100644 --- a/webpizza/applipizza/models.py +++ b/webpizza/applipizza/models.py @@ -1,3 +1,4 @@ +from django.core.validators import validate_image_file_extension from django.db import models @@ -7,8 +8,9 @@ class Ingredient(models.Model): id = models.AutoField(primary_key=True) nom = models.CharField(max_length=50, verbose_name="Nom de l'ingrédient") - def __str__(self) -> str: - return self.nom + +def __str__(self) -> str: + return self.nom # Pizza @@ -16,6 +18,7 @@ class Pizza(models.Model): id = models.AutoField(primary_key=True) nom = models.CharField(max_length=50, verbose_name="Nom de la pizza") prix = models.FloatField(verbose_name="Prix de la pizza") + image = models.ImageField(upload_to='images/', validators=[validate_image_file_extension]) def __str__(self) -> str: return self.nom diff --git a/webpizza/applipizza/static/applipizza/css/styles.css b/webpizza/applipizza/static/applipizza/css/styles.css index 34727ea..4f99233 100644 --- a/webpizza/applipizza/static/applipizza/css/styles.css +++ b/webpizza/applipizza/static/applipizza/css/styles.css @@ -95,6 +95,12 @@ header { margin-top: 1rem; } +.white-bg { + background-color: white; + border-radius: 5px; + padding: .5rem; +} + .page-content .container { box-sizing: border-box; background-color: white; @@ -102,6 +108,10 @@ header { padding: .5rem; } +.page-content .container.no-padding { + padding: 0; +} + footer { background-color: #EFEFEF; left: 0; diff --git a/webpizza/applipizza/templates/applipizza/formulaireModificationPizza.html b/webpizza/applipizza/templates/applipizza/formulaireModificationPizza.html new file mode 100644 index 0000000..d0f66c4 --- /dev/null +++ b/webpizza/applipizza/templates/applipizza/formulaireModificationPizza.html @@ -0,0 +1,78 @@ +{% extends 'applipizza/base.html' %} + +{% load static %} + +{% block title %} + Lasri Del Arte - Pizza {{ pizza }} +{% endblock %} + +{% block content %} + <div class="container"> + <h2>Modifier la pizza {{ pizza }}</h2> + <p>Ici vous pouvez modifier la pizza.</p> + + <h3>Ajouter un ingrédient</h3> + <form action="/pizza/{{ pizza.id }}/update/post" method="post" enctype="multipart/form-data" class="form-stacked"> + {% csrf_token %} + {% for field in form %} + {% if field.errors %} + <div class="clearfix error"> + <label for="{{ field.id_for_label }}">{{ field.label }}</label> + <div class="input"> + {{ field }} + <span class="help-inline"> + {% for error in field.errors %} + {{ error }} + {% endfor %} + </span> + </div> + {% else %} + <div class="clearfix"> + <label for="{{ field.id_for_label }}">{{ field.label }}</label> + <div class="input"> + {{ field }} + </div> + </div> + {% endif %} + {% endfor %} + <div class="actions"> + <input type="submit" value="Enregistrer" class="btn success"> + <button type="reset" class="btn">Annuler</button> + </div> + </form> + </div> +{% endblock %} + +{% block javascripts %} + <script type="text/javascript" src="{% static 'applipizza/js/bootstrap-alerts.js' %}"></script> + <script type="text/javascript" src="{% static 'applipizza/js/jquery.tablesorter.min.js' %}"></script> + <script type="text/javascript"> + $(document).ready(function () { + $('#composition').tablesorter({sortList: [[0, 1]]}); + }); + + var form = $('form'); + var formRequiredFields = form.find('input[required]'); + var formSubmitButton = form.find('input[type=submit]'); + + // We disable form validation + form.attr('novalidate', 'novalidate'); + form.submit(function (e) { + formRequiredFields.each(function () { + if ($(this).val() == '') { + console.log('empty'); + e.preventDefault(); + $(this).parent().append('<span class="help-inline">Ce champ est obligatoire</span>'); + $(this).parent().parent().addClass('error'); + } else { + if ($(this).parent().find('span.help-inline').length > 0) { + $(this).parent().find('span.help-inline').remove(); + $(this).parent().parent().removeClass('error'); + } + } + }); + }); + // We disable the submit button + //formSubmitButton.attr('disabled', 'disabled'); + </script> +{% endblock %} \ No newline at end of file diff --git a/webpizza/applipizza/templates/applipizza/pizza.html b/webpizza/applipizza/templates/applipizza/pizza.html index 3f1235a..34f68d9 100644 --- a/webpizza/applipizza/templates/applipizza/pizza.html +++ b/webpizza/applipizza/templates/applipizza/pizza.html @@ -8,6 +8,20 @@ {% block content %} <div class="container"> + {% if status %} + {% if status == 'success' %} + <div class="alert-message success" data-alert> + <a class="close" href="#">×</a> + <p><strong>Opération réussie !</strong></p> + </div> + {% endif %} + {% if status == 'error' %} + <div class="alert-message error" data-alert> + <a class="close" href="#">×</a> + <p><strong>Erreur !</strong> L'opération a échouée.</p> + </div> + {% endif %} + {% endif %} <h2>Pizza {{ pizza }}</h2> <p>Une délicieuse pizza traditionnelle.</p> @@ -30,20 +44,6 @@ </tbody> </table> - {% if status %} - {% if status == 'success' %} - <div class="alert-message success" data-alert> - <a class="close" href="#">×</a> - <p><strong>Enregistré !</strong> L'ingrédient {{ nomIngredient }} a bien été ajouté.</p> - </div> - {% endif %} - {% if status == 'error' %} - <div class="alert-message error" data-alert> - <a class="close" href="#">×</a> - <p><strong>Erreur !</strong> L'ingrédient n'a pas pu être ajouté.</p> - </div> - {% endif %} - {% endif %} <h3>Ajouter un ingrédient</h3> <form action="/pizza/{{ pizza.id }}/addIngredient" method="post" class="form-stacked"> {% csrf_token %} @@ -69,8 +69,10 @@ {% endif %} {% endfor %} <div class="actions"> - <input type="submit" value="Ajouter" class="btn primary"> + <input type="submit" value="Ajouter" class="btn success"> <button type="reset" class="btn">Annuler</button> + <a href="/pizza/{{ pizza.id }}/update" class="btn info">Modifier la pizza</a> + <a href="/pizza/{{ pizza.id }}/delete" class="btn danger">Supprimer la pizza</a> </div> </form> </div> diff --git a/webpizza/applipizza/templates/applipizza/pizzas.html b/webpizza/applipizza/templates/applipizza/pizzas.html index 8ceba09..5b75430 100644 --- a/webpizza/applipizza/templates/applipizza/pizzas.html +++ b/webpizza/applipizza/templates/applipizza/pizzas.html @@ -15,7 +15,9 @@ {% for p in pizzas %} <div class="card"> <div class="header"> - <img class="logo" src="{% static 'applipizza/img/margherita.jpg' %}" alt="{{ p.nom }}"> + <div class="logo"> + <img src="{% get_media_prefix %}{{ p.image }}" alt="{{ p.nom }}"> + </div> </div> <div class="body"> <h5>{{ p.nom }}</h5> diff --git a/webpizza/applipizza/views.py b/webpizza/applipizza/views.py index 4b12dc5..a1e15ff 100644 --- a/webpizza/applipizza/views.py +++ b/webpizza/applipizza/views.py @@ -1,6 +1,6 @@ from django.shortcuts import render from applipizza.models import Pizza, Ingredient, Composition -from applipizza.forms import IngredientForm, CompositionForm +from applipizza.forms import IngredientForm, CompositionForm, PizzaForm # Create your views here. def pizzas(request): @@ -13,21 +13,7 @@ def pizzas(request): def pizza(request, id): - formulaire = CompositionForm() - - pizza = Pizza.objects.get(id=id) - composition = Composition.objects.filter(pizza_id=id) - compositionArray = [] - for c in composition: - compositionArray.append([Ingredient.objects.get(id=c.ingredient_id).nom, c.quantite]) - pizza.composition = compositionArray - - return render( - request, - 'applipizza/pizza.html', - {'pizza': pizza, 'form': formulaire} - ) - + return viewPizza(request, id) def formulaireCreationIngredient(request): formulaire = IngredientForm() @@ -74,8 +60,63 @@ def ajouterIngredientDansPizza(request, id): composition = Composition(ingredient=ingredient, quantite=quantite, pizza=pizza) composition.save() + return viewPizza(request, id, 'success') + +def supprimerPizza(request, id): + pizza = Pizza.objects.get(id=id) + + pizza.delete() + composition = Composition.objects.filter(pizza_id=id) + composition.delete() + pizzas = Pizza.objects.all() + return render( + request, + 'applipizza/pizzas.html', + {'pizzas': pizzas} + ) + +def modifierPizza(request, id): + pizza = Pizza.objects.get(id=id) + formulaire = PizzaForm(instance = pizza) + return render( + request, + 'applipizza/formulaireModificationPizza.html', + {'pizza': pizza, 'form': formulaire} + ) + +def traitementFormulaireModificationPizza(request, id): + pizza = Pizza.objects.get(id=id) + form = PizzaForm(request.POST, request.FILES) + + if form.is_valid(): + pizza.nom = form.cleaned_data['nom'] + pizza.prix = form.cleaned_data['prix'] + pizza.image = request.FILES['image'] + pizza.save() + + return viewPizza(request, id, 'success') + else: + return viewPizza(request, id, 'error') + +def viewPizza(request, id, status=None): + formulaire = CompositionForm() + + pizza = Pizza.objects.get(id=id) + composition = Composition.objects.filter(pizza_id=id) + compositionArray = [] + for c in composition: + compositionArray.append([Ingredient.objects.get(id=c.ingredient_id).nom, c.quantite]) + pizza.composition = compositionArray + + if status==None: + return render( + request, + 'applipizza/pizza.html', + {"pizza": pizza, 'form': formulaire} + ) + else: return render( request, 'applipizza/pizza.html', - {"pizza": pizza, "status": "success"} + {"pizza": pizza, 'form': formulaire, 'status': status} ) \ No newline at end of file diff --git a/webpizza/webpizza/settings.py b/webpizza/webpizza/settings.py index 83da29b..51b5d88 100644 --- a/webpizza/webpizza/settings.py +++ b/webpizza/webpizza/settings.py @@ -126,3 +126,5 @@ STATIC_URL = 'static/' # https://docs.djangoproject.com/en/4.2/ref/settings/#default-auto-field DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' +MEDIA_ROOT = BASE_DIR/'media' +MEDIA_URL = '/media/' \ No newline at end of file diff --git a/webpizza/webpizza/urls.py b/webpizza/webpizza/urls.py index 5f12bdf..2c66790 100644 --- a/webpizza/webpizza/urls.py +++ b/webpizza/webpizza/urls.py @@ -17,12 +17,20 @@ Including another URLconf from django.contrib import admin from django.urls import path from applipizza import views +from django.conf import settings # new +from django.urls import path, include # new +from django.conf.urls.static import static # new urlpatterns = [ path('admin/', admin.site.urls), path('pizzas/', views.pizzas), path('pizza/<int:id>', views.pizza), path('pizza/<int:id>/addIngredient', views.ajouterIngredientDansPizza), + path('pizza/<int:id>/update', views.modifierPizza), + path('pizza/<int:id>/update/post', views.traitementFormulaireModificationPizza), + path('pizza/<int:id>/delete', views.supprimerPizza), path('ingredients/add', views.formulaireCreationIngredient), path('ingredients/add/post', views.creerIngredient), ] + +urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) #new \ No newline at end of file -- GitLab